Hallo, ich habe eine Frage zu MC-Programmierung. Also ich bin der Anfänger in dieser Sache. Wollte mal mit 8 Bit Timer mich auseinandersetzten. Ich wollte das eine LED in 10 sek. sich schaltet. Ich habe Timer0 so initialisiert, laut Datenblatt war eine Formel mit die ich ein OCRR0 Wert ermittelt habe -für eine Millisikunde soll der Wert bei OCR0=125-1 liegen. Mit Hilfe der Integer wert habe ich dann diese Millisekunden gespeichert. NAch der überprüfung mit einer Stopuhr stellte sich heraus,dass der Wert nich mit 10 sek übereinstimmt, sondern mit 5 sek. Wie kann dass man erklären? Man Quellqode sieche unten: #include <avr/io.h> #include <avr/interrupt.h> #define F_CPU 16000000UL //Variablen fu"r die Zeit volatile unsigned int millisekunden; volatile unsigned int sekunde; volatile unsigned int minute; volatile unsigned int stunde; // Bitmanipulation //x = Port y = Pin #define BitSetzen(x,y) (x|=(1<<y)) //Bit setzen #define BitLoeschen(x,y) (x&=~(1<<y)) //Bit loeschen #define TestBit(a,b) (a&(1<<b)) //Bit Zustand lesen int main(void){ //Initilisation der LEDs Port PORTA = 0xFF; DDRA = 0xFF; // // Timer 0 konfigurieren TCCR0 = (1<<CS00)|(1<<CS01)|(1<<WGM01); // CTC Modus+ prescaller 64 OCR0 = 125-1; // Compare Interrupt erlauben TIMSK |= (1<<OCIE0); // Global Interrupts aktivieren sei(); while(1) { } } SIGNAL(SIG_OUTPUT_COMPARE0) { millisekunden++; if (millisekunden==10000) BitLoeschen(PORTA,PIN0); }
Hi Ein 8Bit-Timer hat bei Vorteiler 64 und 16MHz eine Overflow-Time von 512µs. Damit kannst du keine 1 ms erreichen. MfG Spess
> #define F_CPU 16000000UL [..] > TCCR0 = (1<<CS00)|(1<<CS01)|(1<<WGM01); // CTC Modus+ prescaller 64 > OCR0 = 125-1; F_CPU /prescaler /(OCR +1) == 16MHz /64 /(125 -1 +1) == 2000 Also 2000 Interrupts pro Sekunde oder eben alle 0.5ms. HTH
Die Formel auf die Du Dich vermutlich beziehst, ist in meinem Datenblatt beschrieben als "The waveform frequency is defined by the following equation:" f_OCnx = f_clkI/O / (2 · N · (1 + OCRnx)) Beachte, dass das die Formel ist, um die Freqenz der nach der darüber beschriebenen Methode erzeugten Wellenform zu berechnen. Die Wellenform beinhaltet aber zwei (gleichlange) Perioden mit Pegel 1 resp. 0, zwischen denen bei einem Timerinterrupt getoggelt wird. D.h. pro Wellenform hast Du zwei Interrupts, die Interrupts fallen also mit der doppelten Frequenz an. Viele Grüße, Simon
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.