Forum: Mikrocontroller und Digitale Elektronik Timer von eine sekunde wie macht man dass


von patrick (Gast)


Lesenswert?

Hallo leute ich möschte eine timer machen der alle sekunden genau ein 
interrupt auslöst!!!

Ich benutze ein ATmega8. Ich habe ein CLOCK von 16 MHz.

Und er wäre gut wenn er genau alle sekunden den interrupt gibt!!

Könnte mir jemanden da helfen??

von Power (Gast)


Lesenswert?

So:
1
TCCR1A = 0b00000000;
2
TCCR1B = _BV(ICES1)|_BV(WGM12)|_BV(CS12)|_BV(CS10)|_BV(ICNC1);// Prescaler /1024, CTC - Mode 
3
TCNT1 = 0;    // Timer rücksetzen
4
  
5
OCR1A = 15624;    // OCR1A = 15625 (16MHz / 1024 / 15625 = 1s)

Beispiel vom Mega 32, Bits nochmal kontrollieren!

von Power (Gast)


Lesenswert?

Achso, vergessen:
1
TIMSK = BV(OCIE1A);  // Timer starten
2
SREG |= (1<<SREG_I);  // globalen Interrupt freigeben

Die ISR heißt:
1
SIGNAL (SIG_OUTPUT_COMPARE1A)   // Sekundentimer
2
{
3
  // Code hier wird 1x pro sec. ausgeführt
4
}

von Hannes L. (hannes)


Lesenswert?

in der Codesammlung nach 'genaue Sekunde' suchen...

...

von Erik (Gast)


Lesenswert?

Das Problem hatte ich auch schon mal...

Beitrag "Interrupt jede Sekunde (ATTINY26)"

von Power (Gast)


Lesenswert?

Nochmal.
Die Innitialisierung von Timer1.
1
TCCR1A = 0b00000000;
2
TCCR1B = _BV(WGM12)|_BV(CS12)|_BV(CS10);// Prescaler /1024, CTC - Mode 
3
TCNT1 = 0;    // Timer rücksetzen
4
  
5
OCR1A = 15624;    // OCR1A = 15625 (16MHz / 1024 / 15625 = 1s)
6
7
TIMSK = _BV(OCIE1A);  // Output-Compare-INT freigeben
8
SREG |= (1<<SREG_I);  // globalen Interrupt freigeben

und die ISR (ausserhalb der main-Funktion):
1
SIGNAL (SIG_OUTPUT_COMPARE1A)   // Sekundentimer
2
{
3
  // Code hier wird 1x pro sec. ausgeführt
4
}

Probier's aus, das funktioniert sicher!

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.