"We are back" « oc.at

C-Control mit C/C++ programmieren / Arduino

Lukas 08.08.2007 - 19:16 21032 53
Posts

Lukas

Here to stay
Avatar
Registered: Feb 2004
Location: ~
Posts: 1883
Zitat von Burschi1620
is ja schon fast eine bösgemeinte frage, auch wenn ichs nur gut mein. Aber - hauptprogramm void/int main() hast eh gemacht und die funktionen aufgerufen? Das beispiel programm zeigt auch keine libraries (aber die sind vermutlich eh da, sonst hättest net compilieren können, da hätte er bestimt beim delay geschrien)

hmm, ich muss ehrlich gestehen nein, allerdings dachte ich, dass es nicht noetig ist, da der bootloader schon diesen part uebernimmt, ich versuche es gleich nocheinmal damit :)

Zitat

Kann man das teil auf standalone betrieb jumpern?

puh, muss man nachsehen, die jumperungen sind bisschen komisch beschrieben, aber auch das will ich mal checken :)

that

Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11343
Zitat von Burschi1620
Aber - hauptprogramm void/int main() hast eh gemacht und die funktionen aufgerufen? Das beispiel programm zeigt auch keine libraries

Das alles erfindet die Arduino-IDE automatisch dazu.


Ich selbst habs bisher nur am Notebook unter Windows ausprobiert (noch die 0008er Version), da ging jedenfalls alles. Zu dem Compilerproblem kann ich dir (@Lukas) daher leider nichts sagen.

Marcellus

OC Addicted
Avatar
Registered: Mar 2005
Location: ~
Posts: 1755
ASSEMBLER :D

Nein damit will ich gar nicht erst anfangen, ich persöhnlich hasse diesen pic assembler, wie umständlich kann man ein programm eigentlich schreiben?

Die main muss nicht dabei sein, ich geh mal davon aus, dass du ein programm haben wirst, dass die gesamte avr init usw drinnen hat auch dazugelinkt wird, aus dem grund kannst du wahrscheinlich sogar nicht einmal eine main funktion aufmachen.

Probier einfach mal ein programm zu schreiben mit einer main funktion, bin gespannt, ob er meckert.

Burschi1620

24/7 Santa Claus
Avatar
Registered: Apr 2004
Location: Drüber da Donau
Posts: 6792
edit: wah! g0t pwnt by That, vergiss die hälfte die unten steht. Warum kann das teil das selbst machen? Woher weiß das teil wann ich welche fnkt aufrufe? Kann mir das gerade net vorstellen (geschweige denn die sinnhaftigkeeit)

du knöderl :p :D

http://www.galileo-press.de/openboo...1.htm#Xxx999328
Ich mag dir nix aufdrücken, aber gut zum anfang wenn man mal was gschwind braucht.

Was du wissen solltest: Mikrocontroller C is bissl primitiver als normales C und C selbst is noch ne ecke primitiver als C++. Also stell dich schonmal auf unschöne lösungen ein.

anfangs musst du mal bibliotheken hinzufügen (wird eh die IDE für dich machen nehm ich an)
Dann kannst du bei mikrocontroller meistens noch irgendwelche spezifischen Bits setzen. Ich glaub bei den atmels sind das die "Fuse bits" oder so. Da kann zb der brownout, der quarztakt, ob du das programm wieder auslesen kannst aus der CPU oder ähnliches festgelegt werden.
Die kommen ganz oben.

Und dann kannst du nach C manier programmieren.
Funktionen deklarieren oben mit einem strichpunkt abschließend und unterm main() füllen, oder du schreibst sie gleich oben. (Solltest du des net wissen -> Modulares Programmieren in C)

Sprich du brauchst mal sowas:
Code:
openfkt();

void main()
{
       ....code....  
       openfkt();
}

openfkt()
{
     int blubb=0;
}
So sollte das in etwa aussehen (oder in deinem programm schreibst einfach das main() unter den funktionen)


Die aufgabe des bootloaders ist nun folgende (ich hoffe ich erklärs richtig)
Der bootloader ist selbst ein programm der am anfang der CPU steht und als erstes ausgeführt wird. Der bootloader sorgt dafür dass die verbindung mit der IDE hergestellt werden kann und übermittelt on-the-fly daten von IDE zur cpu.
Beim standalone betrieb wäre der Flash nur mit deinem programm voll und er beginnt sofort mit deinem programm. (sprich du kannst am usb port anstecken was du willst, wenn du ihm nix programmiert hast wird sich nix tun)
--> Also solltest du den prozessor irgendwann in einem gerät löschen bedenke dass der bootloader auch weg ist und du ihn nichtmehr mit der IDE kommunizieren lassen kannst. Du musst vorher den bootloader wieder einspielen.

Lukas

Here to stay
Avatar
Registered: Feb 2004
Location: ~
Posts: 1883
gut, ehrlich gesagt moechte ich die arduino ide nicht verwenden, gluecklicherweise gibt es eine vorgeschrieben makefile fuer den betrieb von der CLI aus... anscheinend hat diese noch ein wenig probleme (aufeinmal kA wieso...) die includes zu finden (obwohl sie da sind :p) aber da wird man sicher etwas zusammenfrickeln koennen

Marcellus

OC Addicted
Avatar
Registered: Mar 2005
Location: ~
Posts: 1755
Und wieso genau ist Microcontroller C primitiver als ansi c89?

Mal abgesehen davon hab ich bereits oben hingeschrieben, dass du sowohl in der ide, als auch per make file gegen andere sourcecodes auch noch verlinken kannst, also ist es nicht umbedingt gesagt, dass du einen main() überhaupt reinschreiben darfst.

Lukas

Here to stay
Avatar
Registered: Feb 2004
Location: ~
Posts: 1883
eine main darf ich nicht reinschreiben, das ist der output -> http://nopaste.info/2489036b47.html

bis auf ein #include "WProgram.h" (wie die makefile es verlangt) genau der selbe source wie das von mir gepostet tutorial...

wie gehabt, die LED blinkt nicht, hm wo koennte da der fehler liegen? ich sehe naemlich (noch) keinen :p

Marcellus

OC Addicted
Avatar
Registered: Mar 2005
Location: ~
Posts: 1755
Led verpolt?
Kommt er überhaupt bis zum Ausführen des Programms?

Lukas

Here to stay
Avatar
Registered: Feb 2004
Location: ~
Posts: 1883
led passt, sonst wuerde sie beim restarten oder anstecken des boards nicht kurz dreimal blinken...

ich glaube ja, dass er nicht zum ausfuehren des programms kommt... :/ das ist mein problem

deswegen tippe ich darauf, aber ich werde leider net wirklich schlau aus dieser FAQ:

Zitat
Why doesn't my sketch start when I power up or reset the Arduino board?
Most likely because you are sending serial data to the board when it firsts turns on. During the first few seconds, the bootloader (a program pre-burned onto the chip on the board) listens for the computer to send it a new sketch to be uploaded to the board. After a few seconds without communication, the bootloader will time out and start the sketch that's already on the board. If you continue to send data to the bootloader, it will never time out and your sketch will never start. You'll either need to find a way to stop serial data from arriving for the first few seconds when the board powers (e.g. by enabling the chip that sends the data from within your setup() function) or burn your sketch onto the board with an external programmer, replacing the bootloader.

Burschi1620

24/7 Santa Claus
Avatar
Registered: Apr 2004
Location: Drüber da Donau
Posts: 6792
Zitat von Marcellus
Und wieso genau ist Microcontroller C primitiver als ansi c89?
nunja, ich hab mittlerweile Keil-C Pic-C und ein wenig atmel C hinter mir und hab bemerkt dass sowohl die standard libraries immer anders sind und auch nicht immer vollzählig bestückt sind als auch die controllerspezifischen befehle teilweise recht primitiv sind und mich persönlich oft verwirren.

Abgesehen davon kann man sich sowas wie rekursive funktionen sowieso in die haar schmieren bei den meisten µcontroller C compiler sowie andere dinge. (PIC-C (CCS heißt die ide) kann zb keinen String einer funktion übergeben wenn der string nicht in einer variable steht. Das heißt ich darf bei meiner lcd output funktion immer den text in eine variable schreiben um ihn dann erst der output funktion übergeben zu können -.-)


@Lukas, was is die setup funktion?

Marcellus

OC Addicted
Avatar
Registered: Mar 2005
Location: ~
Posts: 1755
Wenn dein rechner probiert mit dem board verbindung aufzunehmen wird das programm, dass auf dem board drauf ist nicht ausgeführt. Hast du irgendwas laufen, dass probiert mit dem board zu kommunizieren?

Gibts irgendeinen arduino daemon oä? Wenn nicht probier ganz einfach mal dein board an einen anderen rechner anzuhängen, der sich mit der hardware nicht auskennt.

Das ist alles was das faq sagt

Hast du die led sicher richtig reingesteckt?

int ledPin = 13; => langer haxn auf den 13. pin und den kurzen auf gnd

edit zwecks doppelpostvermeidung

Du programmierst in so einem fall nicht pic c sondern das eingeschränkte c, dass der compiler kann, wenn du dir zumbeispiel den hi-tech compiler anschaust wirst du feststellen, dass der ziemlich alles kann, was c89 vorschreibt.

Natürlich kann ein cc5x gratis compiler nix dagegen, aber pics werden normal nur im massenproduktionen verwendent, weil du mit einem atmel bei einer kleineren stückzahl mit einem atmel besser dran bist. Und bei solchen stückzahlen fällt der c compiler eh nicht ins gewicht.

Ich hatte auch schon das vergnügen ein struct array aufbauen zu müssen, weil der cc5x keine mehrdimensionalen arrays checkt.

Im übrigen solltest du rekursionen und dergleichen genausowenig auf einem x86 verwenden, deswegen sollte dich der unterschied eh nicht so stören :p .
Bearbeitet von Marcellus am 14.08.2007, 00:40

Lukas

Here to stay
Avatar
Registered: Feb 2004
Location: ~
Posts: 1883
Zitat von Burschi1620
@Lukas, was is die setup funktion?

da werden vars und dergleichen initialisert.. ist arduino style (siehe http://www.arduino.cc/en/Reference/HomePage)

Zitat von Lukas
(ja, die led is am pin 13 und am GRND mit dem kurzen haxen, sie blinkt ja 3 mal kurz beim start)

;)

edit: selbiges wie immer, auch bei anderen pc's, kann sein, dass er das programm doch nicht ueberspielt hat obwohl eigentlich alles darauf hindeutet, dass er es hat, da auch die TX RX leds am board leuchten wenn ich es uploade...

edit2:

Zitat
There is a known startup bug with the Arduino NG that makes it look like it's lost its program. This happens when the RX pin floats and the bootloder thinks it's about to receive a program. The solution is a 10K or 4.7K resitor from the RX pin to ground.

hm, wie sieht ein 10K ohm wiederstand aus? welche farbkennzeichnung hat ein solcher?
Bearbeitet von Lukas am 14.08.2007, 02:05

Lukas

Here to stay
Avatar
Registered: Feb 2004
Location: ~
Posts: 1883
sooodala :) ich habs hinbekommen, man muss da was ganz eigenes machen... eine int main in der init(); setup(); und for(;;) loop(); drinnen steht :p etwas gewoehnungsbeduerftig aber es funktioniert ;) juhuuu jetz kanns losgehen... :D

edit: anstatt mit dem naechsten problemchen aufzutauchen kann ich gleich eine erfolgsmeldung nachschieben :)

http://www.arduino.cc/playground/Interfacing/LinuxTTY

kommunikation mit dem geraet funktioniert super ueber screen... 1 und 2 schalten mir meine led ein und aus :p ideal

Code:
#include "ide/trunk/targets/arduino/WProgram.h"

int ledPin = 13;

int main()
{

init();
setup();
for (;;)
	loop();

return 0;
}




void setup()
{
	Serial.begin(9600);
	pinMode(ledPin, OUTPUT);
}

void loop()
{
	if(Serial.available() > 0)
{
	int incoming = Serial.read();

	if( (char)incoming == '1')
	{
	digitalWrite(ledPin, HIGH);
	Serial.println("on");
	}

	if( (char)incoming == '2')
	{
	digitalWrite(ledPin, LOW);
	Serial.println("off");
	}
}


}
Bearbeitet von Lukas am 14.08.2007, 04:36

Burschi1620

24/7 Santa Claus
Avatar
Registered: Apr 2004
Location: Drüber da Donau
Posts: 6792
lol ich versteh des programm net :D
du machst ne endlosschleife (for(;;)) und er ruft trotzdem loop(); auf?

Lukas

Here to stay
Avatar
Registered: Feb 2004
Location: ~
Posts: 1883
solange ich kein semikolon hinter for(;; ) mache sollte die naechste zeile doch als der auszufuehrende code in der endlosschleife sein, so muesste es sein, sonst wuerde es ja nicht funktionieren...

edit: wobei ich ja normalerweise while(true) verwende, das hab ich aber aus dem arduino makefile bsp. ist mir auch nicht wirklich bekannt dieser stil einer endlosschleife...
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz