Wir haben in der Schule mit AVR-Studio angefangen, das Projekt war eine LED am board zum leuchten zu bringen. Ich habs geschrieben, jedoch werden die while Befehle übersprungen. DANKE Quellcode: #include <avr/io.h> int main(void) { DDRC = 1; unsigned long i; for(;;) { PORTC = PORTC & 254; i=0; while(i<=1000) { i++; } PORTC = PORTC | 1; i=0; while(i<=5000) { i++; } } return 0; }
logisch deine schleife tut ja nix... daher schmeißt der compiler das raus.. schau mal nach delay_ms( und F_CPU nciht vergessen)
aber unser lehrer hat uns das so erklärt, Das soll als verzögerung dienen: while(i<=1000) { i++; } Damit es mehrmals blinkt: while(i<=5000) { i++; }
Das liegt daran, dass der Compiler die while-Schleifen wegoptimiert, weil da ja nix weiter passiert. Mach einfach mal ein "volatile" vor unsigned long i; Ein richtiges volatile bewirkt Wunder! ;-)
AVR Studio problem schrieb: > aber unser lehrer hat uns das so erklärt, Dann soll er mal das Tutorial lesen...
Bei alten Compilerversionen hat das ja auch funktioniert. Mittlerweile ist der Compiler so optimiert, dass offensichtlich funktionsloser Code entfernt wird. Wenn man das Warten braucht, muss man entsprechend programmieren: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Warteschleifen_.28delay.h.29
Du kannst ja mal deinen Lehrer fragen, warum das hier funktioniert:
1 | volatile unsigned long i; |
2 | |
3 | ////
|
4 | |
5 | while(i<=1000) |
6 | {
|
7 | i++; |
8 | }
|
Oliver
wie mach ich das die 2te LED anfangt zu blinken?? also wie muss ichs ändern damit ich eine beliebige diode zum blinken bringen kann?
Normalerweise schreibt man die Portzugriffe etwas übersichtlicher. Statt DDRC = 1 nimmt man z.B. DDRC |= (1 << 0), d.h. Bit 0 wird ein Ausgang, ohne die anderen Bits in DDRC zu ändern. Pins Ein/Ausschalten macht man auch eher nicht mit PORTC = PORTC | 1 und PORTC = PORTC & 254. Wenn ein Pin eingeschaltet werden soll: PORTC |= (1 << n), wobei n zwischen 0 und 7 liegt. Zum Ausschalten: PORTC &= ~(1 << n). Macht das ganze etwas übersichtlicher und man braucht nicht lang rumrechnen, wenn andere Pins des Ports unangetastet bleiben sollen.
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.