mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Uhrentakt mit 32,768 Quarz und Timer2 am AT90CAN128 ungenau


Autor: Dietmar Kunst (kunsti)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe wie im ATMEL-Datenblatt an einen AT90CAN128 zwischen TOSC1 
(19)und TOSC2 (18) einen 32,768kHz Quarz, beide Leitungen mit je einem 
Kondensator gegen Masse angeschlossen und versucht, mit dem TIMER2 einen 
genauen  Sekundentakt zu erzeugen.

Das ganze funktioniert auch, ist aber extrem ungenau, d.h. in 2Minuten 
geht die Uhr 1s nach.

In der ISR(TIMER2_COMP_vect) - Interrupt-Funktion zähle ich die 
Sekunden, Minuten, Stunden hoch.
Ein extremes Abspecken des Programmcodes (nur Sekundenabarbeitung) hilft 
auch nicht weiter. Am Quarz oder den Kondensatoren liegt es sicherlich 
auch nicht, da habe ich verschiedene Typen und Kapazitäten ausprobiert 
habe.
Vielleicht liegt der Fehler in der Initiailisierung des TIMER2?

void rtc_init(void)
{
  // enable extern pulsing via quartz
  ASSR=(1<<AS2);
  /* setup RTC for 1s-interrupt
     extern-clock: 32.768 Hz
     prescaler: 256
     ctc-mode: preset 127
     -->   --> 128 32.768/256pulses/s --> preset 128
  */
  OCR2A=128;
  TCNT2=0;
  TCCR2A=(1<<WGM21) | (1<<CS22) | (1<<CS21);
  // enable overflow compare interrupt
  TIMSK2=(1<<OCIE2A);
}
Ein Funkuhrempfänger oder die in den Foren mehrfach beschriebene Nutzung 
des TIMER1 (ms-Takt) wäre eine Alternative, trotzdem würde ich gern die 
Ursache wissen, da diese Anwendung sehr einfach ist und in einigen 
Datenblättern als real-time-clock beschrieben ist.

Vielleicht kennt jemand den Fehler?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Dietmar Kunst (kunsti)

>Das ganze funktioniert auch, ist aber extrem ungenau, d.h. in 2Minuten
>geht die Uhr 1s nach.

Dann sit was faul. Das sind fast 1%!

>In der ISR(TIMER2_COMP_vect) - Interrupt-Funktion zähle ich die
>Sekunden, Minuten, Stunden hoch.

Warum nicht im Überlauf?

>auch nicht, da habe ich verschiedene Typen und Kapazitäten ausprobiert
>habe.

Was hast du denn da jetzt dran? Die Kapazitäten sind vom Quarz abhängig. 
Ausserdem können einige AVRs an die Pins interne Kapazitäten per [[AVR 
Fuses]] zuschalten.

>  OCR2A=128;

Dir ist hoffentlich klar, dass dein Interrupt eine Periode von 129!!! 
Takten hat? Denn der zählt von 0..128.

;-)

MFG
Falk

Autor: Dietmar Kunst (kunsti)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Falk!

Vielen Dank für deine schnelle Hilfe!

Ich glaub' das letzere war's!
Blöder Anfängerfehler!
Der Gedanke war mir auch schon mal gekommen, hatte ihn aber nicht weiter 
verfolgt.

Die Uhr läuft jetzt mit OCR2A=127 fast eine halbe Stunde und es sieht 
auf jeden Fall besser aus ;-), genaues kann ich erst morgen sagen.

Ist es nicht egal, welchen Interrupt man nimmt? Überlauf oder Compare?

Mit den Kapazitäten hast du natürlich recht. Aber da hab' ich darauf 
geachtet, dass die Kapazität wie im Datenblatt des Quarzes gefordert 
angeschlossen ist.
Im Moment habe ich zwei 12pF Kondensatoren dran. Aber Danke für den 
Tipp.

Bei den Fuses-Bits habe ich bisher noch nicht geschaut.
Ich programmiere den AT90CAN128 mit AVR-Studio.
Welches BIT ist dann da relevant?

VG
Kunsti

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die angeblichen internen Kondensatoren die man zuschalten kann 
funktionieren nicht. Das ist ein bekannter BUG bei (fast ?) allen AVRs. 
Einfach mal in den Errats zu dem µC nachschauen ob der Chip gerade eine 
Ausnahmen ist.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Dietmar Kunst (kunsti)

>Ist es nicht egal, welchen Interrupt man nimmt? Überlauf oder Compare?

Jain. Wenn man mit dem Sleep Mode Strom sparen will, nimmt man den 
Überlauf, weil der die geringstmögliche Frequenz bietet. Ansonsten ist 
es gleichwertig.

>Ich programmiere den AT90CAN128 mit AVR-Studio.
>Welches BIT ist dann da relevant?

Gibt es bei dem AVR nicht.

MFG
Falk

Autor: Dietmar Kunst (kunsti)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank Falk und Ulrich!
Damit sind meine Fragen erst mal beantwortet. Die Uhr läuft mittlerweile 
über 2 Stunden und ich kann noch keine Verspätung feststellen. Ich lasse 
sie mal bis Montag in Ruhe und werde dann den Überlauf-Interrupt 
ausprobieren.

VG
Kunsti

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wenn du deine Uhr richtig schön kalibrieren willst, schau mal hier 
rein

AVR - Die genaue Sekunde / RTC

MFG
Falk

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.