Forum: Compiler & IDEs Timer1 Interrupt


von Simon (Gast)


Lesenswert?

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.

von Simon (Gast)


Lesenswert?

oder vielleicht bin ich nur zu ungeduldig,

wieviele sekunden muss ich da warten bei 11059200 Hz

von Justus S. (jussa)


Lesenswert?

sei() fehlt

von Simon (Gast)


Lesenswert?

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

von holger (Gast)


Lesenswert?

>ich zaehle bis 10799 hoch, das muesste doch ne sekunde sein

Nicht wenn der Quarz nicht läuft. Fuses ok?

von Simon (Gast)


Lesenswert?

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.

von holger (Gast)


Lesenswert?

>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.

von Lowtzow .. (lowtzow)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Stefan E. (sternst)


Lesenswert?

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.

von Lowtzow .. (lowtzow)


Lesenswert?

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

von gast (Gast)


Lesenswert?

Danke,

wieso soll ich TCNT1 wieder vorgeben, ich wollte das eigentlich im CTC 
mode machen

von gast (Gast)


Lesenswert?

Was mich bisle wundert
wenn ich OCR1A auf 100 setze, bleibt die Zeit unveraendert

von Stefan E. (sternst)


Lesenswert?

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.

von gast (Gast)


Lesenswert?

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

von Lowtzow .. (lowtzow)


Lesenswert?

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
}

von Stefan E. (sternst)


Lesenswert?

Du enablest den Overflow-Interrupt, aber du aktivierst nicht den 
CTC-Mode. Also nochmal ins Datenblatt schauen, und zwar konkret nach den 
WGM-Bits.

von gast (Gast)


Lesenswert?

jetzt funzt das, sogar genau ne sekunde.

aber WGM.... ich dachte immer das waere nur fuer PWM

von Lowtzow .. (lowtzow)


Lesenswert?

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
Noch kein Account? Hier anmelden.