Hi, ich wollte mal ein sinnvollen Beitrag reinstellen, nicht von mir sondern von Atmel, aber was solls. Vielleicht gibt es noch mehr Leute, die gerne in C programmieren und sich mit den AVR-funktionen nicht auskennen, wie ich, und etwas "rumspielen" wollen. Was macht das Programm? init() dürfte klar sein, das kann man auch aus der ioXXXX.h rauslesen. -man gibt den prescaler an main() ist auch noch verständlich: -init(): initialisiert den timer0 (TCCR0) und definiert DDRB als Ausgang (DDRB = 0xFF) -while(1): auch verständlich, eine Endlosschleife -PORTB++: von PortB0-Bx, also alle Ports der Reihe nach dann gehts bei mir aber schon los! delay(): wenn ich delay weglasse, dann leuten alle LEDs kann mir jemand erklären, was ############################# void delay(void){ while (!(TIFR&0x02)); TIFR = 0x02; // Clearing overflow flag }* ############################# macht? ...Verzögerung solange bis TIFR&0x02 erreicht ist... so verstehe ich das... dann habe ich in ->mikrocontroller.net->artikel->C für AVR nachgelesen: TIFR: Timer/Counter Interrupt Flag Register 0x02 -> 1.Bit = 1 entspricht TOVR: Timer/Counter Interrupt Flag Register "Das Flag wird automatisch gelöscht, wenn der zugehörige Interrupt-Vektor aufgerufen wird. Es kann jedoch auch gelöscht werden, indem eine logische 1 (!) in das entsprechende Bit geschrieben wird." Also die Verzögerung solange bis ??? hier setzt es aus bei mir... Kann mir jemand TIFR=&0x02 erklären, was da passiert. Danke
Wenn Du Delay weglässt, geht alles halt "etwas" schneller. Jede Diode geht dann %50 an und 50% aus, und zwar so schnell, dass Du es nicht mehr siehst. ############################# void delay(void){ while (!(TIFR&0x02)); TIFR = 0x02; // Clearing overflow flag }* ############################# while (!(TIFR&0x02)); wartet, bis Timer überläuft, dann wird das Flag 02 in Reg. TIFR gesetzt. Übersetzt heisst die Zeile: "Während Flag 2 in TIFR Null ist, tue ... nichts. Stefan
jetzt spiele ich schon ne ganze weile herum... Habe meinen 4433 mit 4MHz getaktet, aber ich würde das ganze gerne nochmal langsamer ablaufen lassen. Kann ich da nicht noch den 16bit Timer einsetzen um die (4MHz/1024) nochmal durch 2 zu teilen? Was brauche ich da für einen Ansatz?
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.