Hallo, ich hab da ein paar Probleme mit WinAVR. Der Compiler läuft zwar ohne Probleme, aber die Programme tun nicht annähernt das was sie sollten. z.B.: #include <io.h> #include <inttypes.h> void delay(uint16_t lauf); void delay(uint16_t lauf) { while (--lauf); } int main( void ) { DDRB = 0xff; // PORTB auf Output PORTB = 0x00; // Alles aus while (1){ PORTB= 0x01; delay(8000); PORTB= 0x02; delay(8000); } } =============================================== Das Programm soll eigentlich LEDs an PortB zum blinken bringen. Leider erzeugt der Compiler ein Programm welchen einfach nur in den ersten beiden Befehlen springt (hab ich mit dem AVR-Studio getestet.) Wenn ich das Programm ohne funktion scheibe, (also den delay in die while-schleife packe) funktionierts. nächstes Beispiel: while (1) { PORTB= 0x01; for (i=0;i>=40000;i++) for (j=0;j>=2;j++); PORTB= 0x02; for (i=0;i>=40000;i++) for (j=0;j>=2;j++); } Hier werden die verschachtelten for-Schleifen einfach ignoriert. Wenn ich statt einer for-Schleife eine while-Schleife nehme, funktioniert es. Ich hab keine Ahnung wodran das liegt. Kann mir jemand helfen?
Das hatte ich auch schon. Der Compiler optimiert deine Schleifen weg. http://www.mikrocontroller.net/forum/read-2-27687.html mfg werner
ich hab die Variable als "volatile" deklariert. Also sollte daran nicht liegen. Wenn ich zwei einzelne Schleifen habe, läuft das ohne Probleme. Und mit ner while-Schlife auch.
ich glaub ich bin etwas weiter gekommen. zum 1. Problem: Es scheint, dass WinAVR immer die erst funktion als "main" annimmt und dadurch eine Endlosschleife ganz am Anfang erzeugt. Schreib ich meine delay funktion unter main, taucht das Problem nicht auf. scheint wohl ein Bug zu sein, oder so. zum 2. Problem: unter irgendwelchen, mir noch unbekannten Gründen optimiert der Compiler die Scheifen wirklich weg.
Nein, der Compiler nimmt nur das als main(), wo auch main() drüber steht. Außerdem besitzt main() selbst keine Endlosschleife, sondern eine solche befindet sich in der Bibliotheksfunktion _exit(), die bei Bedarf angesprungen wird, wenn Dein main() ein return macht. Ja, Schleifen werden wegoptimiert. Benutze die Makros aus <avr/delay.h>, um gezielte und definierte Verzögerungen zu erhalten. Ansonsten: benutzt Dein Makefile zum Linken auch die korrekte -mmcu Option?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.