ISR (TIMER1_COMPA_vect) { lcd_putc('X'); } // Timer init OCR1A = 10799; TCNT1 = 0; TCCR1B |= (1<<CS12)|(1<<CS10); // 1024 pre TIMSK |= (1<<OCIE1A); Habe ich da irgendwas vergessen? Timer1 und prescaler 1024, soll interupt ausloesen.
oder vielleicht bin ich nur zu ungeduldig, wieviele sekunden muss ich da warten bei 11059200 Hz
Danke. Ist aktiviert, da ich INT0 noch verwende. Funzt jetzt auch, aber ich hab da irgendwas um die 10 sekunden. sollte doch ansich 4 sekunden werden 11059200 / 1024 = 10800 ich zaehle bis 10799 hoch, das muesste doch ne sekunde sein
>ich zaehle bis 10799 hoch, das muesste doch ne sekunde sein
Nicht wenn der Quarz nicht läuft. Fuses ok?
Der muss doch laufen.. ich hab da noch nen UART am laufen der auch saubere zeichen liefert. Ext Crystal/Resonator High Freq startup 16K + 64 ms sind eingestellt.
>Der muss doch laufen.. ich hab da noch nen UART am laufen der auch >saubere zeichen liefert. Gibt es noch weitere wichtige Informationen? >Funzt jetzt auch, aber ich hab da irgendwas um die 10 sekunden. >sollte doch ansich 4 sekunden werden Der Fehler liegt in Zeile 42 vom Code.
hallo ich komme auch auf eine sekunde du musst jedoch in der isr OCR1A = 10799; reinschreiben #
1 | ISR (TIMER1_COMPA_vect) { |
2 | OCR1A = 10799; |
3 | lcd_putc('X'); |
4 | }
|
5 | |
6 | // Timer init
|
7 | OCR1A = 10799; |
8 | TCNT1 = 0; |
9 | TCCR1B |= (1<<CS12)|(1<<CS10); // 1024 pre |
10 | TIMSK |= (1<<OCIE1A); |
mfg
Simon schrieb: > ich zaehle bis 10799 hoch, das muesste doch ne sekunde sein An sich schon. Der Interrupt sollte bei 1 Sekunde kommen, kommt aber bei irgendwas um die 10 Sekunden. Macht einen Faktor so um die 10. Dein AVR wird ab Werk mit ca. 1Mhz getaktet. Du hast einen Quarz drann der bei irgendwas um die 10Mhz liegt. Macht ebenfalls einen Faktor 10.
Lowtzow .... schrieb:
> du musst jedoch in der isr OCR1A = 10799; reinschreiben
Wozu soll das gut sein? Wenn sich der OCR Wert nicht verändert, muss er
auch nicht neu geschrieben werden.
stimmt auch wieder, ich hätte es sowieso mit CTC mode gemacht (genauer), wenn du schon so arbeitest würde ich es so schreiben (meine methode)
1 | ISR(TIMER1_OVF_vect) { |
2 | TCNT1 = 54737; //65536-10799 |
3 | lcd_putc('X'); |
4 | }
|
5 | |
6 | // Timer init
|
7 | |
8 | TCNT1 = 54737; |
9 | TCCR1B |= (1<<CS12)|(1<<CS10); // 1024 pre |
10 | TIMSK |= (1<<TOIE1); |
mfg
Danke, wieso soll ich TCNT1 wieder vorgeben, ich wollte das eigentlich im CTC mode machen
Was mich bisle wundert wenn ich OCR1A auf 100 setze, bleibt die Zeit unveraendert
gast schrieb: > wieso soll ich TCNT1 wieder vorgeben, ich wollte das eigentlich im CTC > mode machen Dann solltest du aber den Timer auch im CTC-Modus laufen lassen, und nicht im Normal-Modus.
OCR1A = 10799; TCNT1 = 0; TCCR1B |= (1<<CS12)|(1<<CS10); // 1024 pre Aber tue ich das hier nicht? -> TIMSK |= (1<<OCIE1A); er springt ja auch den COMPA vect an
versuchs mal mit dem ;-)
1 | ISR(TIMER1_COMPA_vect){ |
2 | |
3 | // dein code
|
4 | }
|
5 | |
6 | int main(void) |
7 | {
|
8 | //Timer1 config anfang***********************************************
|
9 | TIMSK |= (1<<OCIE1A); //Timer 1 Output Compare A Match Interrupt Enable |
10 | OCR1A = 10799; // von 0 bis zu diesem Wert wird gezählt => 1sek |
11 | TCCR1B |= (1<<CS12) | (1<<CS10) |(1<<WGM12); //CTC MODE & 1024Teiler |
12 | sei (); //Globale Interrupts freigeben |
13 | //Timer1 config ende***************************************************
|
14 | |
15 | |
16 | // restliche main blabla
|
17 | |
18 | }
|
Du enablest den Overflow-Interrupt, aber du aktivierst nicht den CTC-Mode. Also nochmal ins Datenblatt schauen, und zwar konkret nach den WGM-Bits.
jetzt funzt das, sogar genau ne sekunde. aber WGM.... ich dachte immer das waere nur fuer PWM
ctc ist halt ganz genau, weil da beginnt der timer von 0 genau beim überlauf! da bist du vielleicht erst bei der ersten programmcode zeile deiner isr (wenn überhaupt). mfg
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.