100ms Interrupt mit 16bit-Timer Atmega16

OP #2639088
Lesenswert?

Guten Abend

Ich benötige einen ziemlich genauen Sekunden Takt bei meinem Atmega16.

Dazu wollte ich den 12MHz Quarz und einen Timer verwenden.

Hier mein Vorgehen:

Atmega hat keinen ClkDiv aktiviert.

Timer1 bekommt seinen Takt mittels 64x Vorteiler (CS11 & CS10)
Dannach habe ich 187,5KHz bzw. 187500Hz

Nun konfiguriere ich den Timer für den CTC Modus (WGM12)
Setze die Obergrenze auf einen zehntel also auf 18750 - 1
OCR1A = 18749

Im interrupt zähle ich nun auf 10, da ein Durchgang ja 100ms entspricht.

Doch leider blinkt die LED mit weitaus mehr als 1Sekunde.

Ein Interrupt durchgang entspricht ca. 350ms (mit Oszi gemessen)

Hier mein Code
1
void init_timer(void)
2
{
3
  TCCR1A |= (1<<WGM12);  //CTC
4
  TCCR1B |= (1<<CS11) | (1<<CS10); // 64Div = 187,5 KHz (mit Variable /10 = 18.75KHz);
5
  TIMSK |= (1<<OCIE1A); //Int für OC1A
6
  OCR1A = 18750 - 1;
7
}

Was ist hier nur falsch?

danke schonmal
Gast #2639149
Lesenswert?

Claudio Hediger schrieb:
> Timer1 bekommt seinen Takt mittels 64x Vorteiler (CS11 & CS10)
> Dannach habe ich 187,5KHz bzw. 187500Hz

Bei deinen 187,500 kHz kannst du guten Gewissens zwei Nullen streichen. 
So genau ist dein Quarz nicht. Falls du Uhrgenauigkeit brauchst, wirst 
du um einen Abgleich z.B. per Softwarealgorithmus nicht drumrum kommen.
OP #2639224
Lesenswert?

... schrieb:
> Claudio Hediger schrieb:
>> Ich benötige einen ziemlich genauen Sekunden Takt bei meinem Atmega16.
>
> Im Titel schreibst du "100 ms". Was denn nun.

Im Titel habe ich geschrieben "100ms Interrupt"

Und es ging hier auch um einen 100ms Interrupt.
Mit diesem wird dann die genaue Sekunde erzeugt.

Wolfgang schrieb:
> Bei deinen 187,500 kHz kannst du guten Gewissens zwei Nullen streichen.
> So genau ist dein Quarz nicht. Falls du Uhrgenauigkeit brauchst, wirst
> du um einen Abgleich z.B. per Softwarealgorithmus nicht drumrum kommen.

Vielen Dank für den Tipp :)

Ich habe bereit eine RTC in meinem Projekt. Von dieser werde ich von 
Zeit zu Zeit synchronisieren :)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren