Ich benutze einen 2560, 16AU 16MHz (AVRStudio 4.13 mit GCC). Mit Timer0 soll ein genauer 1s Takt generiert werden. Der folgende Code zeigt das Problem: der Befehl clearbit(TIFR0, OCF0A) sollte das Bit OCF0A löschen, tut er aber nicht. Der Zähler "timer" läuft dann viel zu schnell. Wenn ich dagegen das Bit setze, wird es gelöscht (auskommentierte Zeilen), und der Zähler läuft schön im 1s Takt. Der Simulator zeigt genau das gleiche Verhalten. Deshalb: Verstehe ich etwas falsch? include <avr\io.h> //vereinfachtes Setzen eines Bits #define setbit(ADRESSE,BIT) (ADRESSE |= (1<<BIT)) //vereinfachtes Loeschen eines Bits #define clearbit(ADRESSE,BIT) (ADRESSE &= ~(1<<BIT)) //vereinfachtes Testen eines Bits #define checkbit(ADRESSE,BIT) (ADRESSE & (1<<BIT)) // 1 second timer on PortC // ------------------------------------------------------------------- int main(void) { uint32_t timer = 0; uint16_t r = 0, o = 0; DDRC = 0xFF; // PORTC is output PORTC = 0x00; OCR0A = 250; // 16000000Hz / (250*256) = 250Hz setbit(TCCR0B, CS02); //prescaler 256 setbit(TCCR0A, WGM01); // set bit WGM01: CTC mode (2) while(1) { if(checkbit(TIFR0, OCF0A)) // returns a TRUE once every 4 ms { //setbit(TIFR0, OCF0A); clearbit(TIFR0, OCF0A); //setbit(TIFR0, OCF0A); timer += 4; // count milliseconds } // calculate the time in seconds... r = timer / 1000L; // ...and write this value to the LED strip if(r != o) // new value in r? { o = r; // memorize old value PORTC = 0x0FF & r; } } return 0; // never reached !! }
So soll es sein. AVR-Interrupt-Flags werden gelöscht indem man eine 1 reinschreibt. clearbit tut genau das Gegenteil: es löscht alle gesetzten Flags mit Ausnahme des gewünschten Bits. Doku lesen, genauer.
Tatsächlich. Ich hatte glatt übersehen dass ich es hier eigentlich mit einem Interruptflag zu tun habe. Vielen Dank.
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.