Forum: Mikrocontroller und Digitale Elektronik 100ms Interrupt mit 16bit-Timer Atmega16


von C. H. (hedie)


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

von Stefan E. (sternst)


Lesenswert?

Claudio Hediger schrieb:
> Was ist hier nur falsch?

Das hier:
1
  TCCR1A |= (1<<WGM12);  //CTC

von C. H. (hedie)


Lesenswert?

Stefan Ernst schrieb:
> Claudio Hediger schrieb:
>> Was ist hier nur falsch?
>
> Das hier:  TCCR1A |= (1<<WGM12);  //CTC

Aber steht doch so im DB http://www.atmel.com/Images/doc2466.pdf auf 
Seite 112

Oder sehe ich da was falsch?

von Stefan E. (sternst)


Lesenswert?

Dann schau doch bitte mal als nächstes auf Seite 110 und 113 nach.

von C. H. (hedie)


Lesenswert?

Stefan Ernst schrieb:
> Dann schau doch bitte mal als nächstes auf Seite 110 und 113 nach.

misst! Das Bit befindet sich im 1B Register :) Vielen Dank! :)

von ... (Gast)


Lesenswert?

Claudio Hediger schrieb:
> Ich benötige einen ziemlich genauen Sekunden Takt bei meinem Atmega16.

Im Titel schreibst du "100 ms". Was denn nun.

Es ist immer wieder gut, das Rad mal neu zu erfinden, auch wenn es hier 
schon 774 Threads zum Thema "genaue Sekunde" gibt, z.B. von Peter D.:
Beitrag "Die genaue Sekunde / RTC"

von Wolfgang (Gast)


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.

von C. H. (hedie)


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 :)

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.