Forum: Mikrocontroller und Digitale Elektronik Der Timer0 läuft 2Hz zu langsam


von Markus G. (mark_avr)


Lesenswert?

Hallo Zusammen...

Hier meine Frage oder Problem - vieleicht auch Verständnis Problem.

Der Timer läuft zu langsam.
Am Multimeter werden mir 499Hz angezeigt.
In Summe macht das einen Zeitversatz von 1,5 Minuten bei ca. 8 Stunden.

Denke am Multimeter müssten 500Hz stehen. (2x wegen Port Toggle = 
1000Hz)
Ich denke die Register des Timers sind nicht ganz richtig eingestellt.
Finde aber nicht wo der Fehler ist.
Habt Ihr eine Idee? Oder liegt das Problem wo anders?

Hier mal der Code:
1
void Timer_Init(void)
2
{
3
       //ATMega 328p / 8MHz
4
       // 8-Bit TimerTC0 für 1ms Takt 
5
       TCCR0A |= (1<<WGM01);                   //CTC
6
       TIMSK0 |= (1<<OCIE0A);                  //compare match
7
       TCCR0B |= (1<<CS01)|(1<<CS00);          // prescaler 64
8
       OCR0A = 0x7C;                           // 0x7C aus Calc. = 124
9
       //TCNT0 = 0x83;
10
       
11
       sei();
12
}
13
14
ISR (TIMER0_COMPA_vect)
15
{
16
       // Timer0 erzeugt einen 1ms interrupt
17
       
18
       static uint8_t z_MS;              
19
       PORTB ^= ( 1 <<  5); // Toggle Port
20
       
21
       z_MS++;
22
       //run all 10ms
23
       if (z_MS == 10)
24
       {
25
             z_MS = 0;
26
             aaa();
27
       }
28
}
Vielen Dank

Grüße

Mark

von spess53 (Gast)


Lesenswert?

Hi

>Der Timer läuft zu langsam.

Von wo kommt der Takt?

MfG Spess

von H.Joachim S. (crazyhorse)


Lesenswert?

Markus G. schrieb:
> Oder liegt das Problem wo anders?

Am Messgerät?
Hast du mal eine Langzeitmessung gemacht?
Was erzeugt die 8MHz?

von MiWi (Gast)


Lesenswert?

Markus G. schrieb:
> Hallo Zusammen...
>
> Hier meine Frage oder Problem - vieleicht auch Verständnis Problem.
>
> Der Timer läuft zu langsam.
> Am Multimeter werden mir 499Hz angezeigt.

Und das unbekannte Multimeter ist über jeden Zweifel bei diesen Daten 
erhaben?

Da Dir offensichtlich ein richtiger Frequemzzähler fehlt eine 
Hilfsmethode um dem Fehler auf die Spur zu kommen:

Was zeigt ein um den Faktor 10 reduzierter SW - Zyklus für eine 
Schwebung mit den 50Hz der Netzfrquenz um das MM zu verifizieren?

von Michael B. (laberkopp)


Lesenswert?

Markus G. schrieb:
> Am Multimeter werden mir 499Hz angezeigt.
> Denke am Multimeter müssten 500Hz stehen.

Das ist doch Super, kaum 0.2% Abweichung.

von Reiner Gast (Gast)


Lesenswert?

Markus G. schrieb:
> // 8-Bit TimerTC0 für 1ms Takt

Wenn Du den internen RC Oszillator benutzt, dann muss der ggf. etwas 
justiert werden, weil der nicht allzu genau läuft.

Suche mal im Datenblatt nach: OSCCAL – Oscillator Calibration Register

von Markus G. (mark_avr)


Lesenswert?

Die 8Mhz kommen vom Quarz.

Ja, Langzeitmessung gemacht. 8 Stunden bringen ca. 1,5 Minuten 
Abweichung.

Ja das Multimeter läuft recht gut. Auch wenn ich den Timer umstelle auf 
einen anderen Takt ist hier immer eine kleine Abweichung nach unten.

Multimeter an Netzspannung 50,00Hz. (gerade nochmal getestet)

von Achim S. (Gast)


Lesenswert?

was passiert bei deinem Aufruf von aaa() in der Timer-ISR?

Etwas, das eventuell länger als 1ms dauert und deshalb den rechtzeitigen 
Aufruf der nächsten Timer-ISR verhindert? Das könnte ebenfalls zu einer 
reduzierten Toggle-Frequenz führen.

von Markus G. (mark_avr)


Lesenswert?

Achim S. schrieb:
> was passiert bei deinem Aufruf von aaa() in der Timer-ISR?

nicht wildes, auch ohne aaa() bleint der Takt gleich, schon gestestet.

> Etwas, das eventuell länger als 1ms dauert und deshalb den rechtzeitigen
> Aufruf der nächsten Timer-ISR verhindert? Das könnte ebenfalls zu einer
> reduzierten Toggle-Frequenz führen.

von H.Joachim S. (crazyhorse)


Lesenswert?

Dann läuft der Quarz falsch. Richtigen Typ bei den fuses ausgewählt? 
Glaub aber nicht, dass man den soweit weg bekommt mit falscher 
Einstellung. Überhaupt auf Quarz gefused?

Der Mega328 hat einen CLKO. Wenn aktiviert, kannst du dort die 
Oszillatorfrequenz messen ohne den selbst zu beeinflussen.

Dürfte aber nichts bringen, Programm ist richtig. Wirklich Quarz oder 
Resonator? Das käme dann hin mit 0,2% Abweichung.

von Ingo Less (Gast)


Lesenswert?

Markus G. schrieb:
> Am Multimeter werden mir 499Hz angezeigt.
Ein Multimeter is dafür auch völlig ungeeignet um präzise und genau zu 
messen.

> Ich denke die Register des Timers sind nicht ganz richtig eingestellt.
Nee, sieht gut aus

> Finde aber nicht wo der Fehler ist.
>> Am Multimeter

von Stefan K. (stefan64)


Lesenswert?

Achim S. schrieb:
> Etwas, das eventuell länger als 1ms dauert und deshalb den rechtzeitigen
> Aufruf der nächsten Timer-ISR verhindert? Das könnte ebenfalls zu einer
> reduzierten Toggle-Frequenz führen.

Das oder die Interrupts werden an einer anderen Stelle für mindestens 
1ms gesperrt. Das kann z.B. ein anderer Interrupt mit einer Laufzeit > 
1ms sein. Oder ein Sperren der Interrupts in main().

Oder ist ev. zwar ein Quarz angeschlossen, aber die Fuses nicht darauf 
eingestellt?

Gruß, Stefan

von Markus G. (mark_avr)


Angehängte Dateien:

Lesenswert?

Stefan K. schrieb:



> Das oder die Interrupts werden an einer anderen Stelle für mindestens
> 1ms gesperrt. Das kann z.B. ein anderer Interrupt mit einer Laufzeit >
> 1ms sein. Oder ein Sperren der Interrupts in main().

Ja Uart auch bei abgeklemmter Schnittstelle bleibt der Takt gleich.

> Oder ist ev. zwar ein Quarz angeschlossen, aber die Fuses nicht darauf
> eingestellt?

Dennke ist OK. hier der Einstellungen der Fuses.

von Wolfgang R. (Firma: www.wolfgangrobel.de) (mikemcbike)


Lesenswert?

Quarz falsch kapazitiv belastet und deswegen verstimmt?

Was sagt der Frequenzzähler denn zur Quarzfrequenz?

Was sagt das Datenblatt des Quarzes?

von Achim S. (Gast)


Lesenswert?

Markus G. schrieb:
> Dennke ist OK. hier der Einstellungen der Fuses.

Irgendwo muss der Fehler ja liegen.

Ich würde mal versuchen, mit einem hochimpedanten Tastkopf am Quarz zu 
messen, ob er tastächlich läuft. Klar verschiebt die Tastkopfkapazität 
evtl. die Frequenz ein wenig, aber vielleicht kannst du trotzdem 
ansatzweise erkennen, ob er auf 8 MHz schwingt oder hier schon eine zu 
niedrige Frequenz anliegt.

Dann mit dem Oszi an den GPIO und versuchen zu messen, ob die 
Rechteckfrequenz wirklich regelmäßig zu langsam ist, oder ob du 
eigentlich 500Hz hast und ab und zu einen "Aussetzer" wegen nicht 
korrekt abgearbeiteter ISR. Hier kann der Trigger auf Netzfrequenz 
vielleicht auch helfen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Wolfgang R. schrieb:
> Was sagt das Datenblatt des Quarzes?

... bzgl. Lastkapazität? Und welche Kondensatoren sind tatsächlich am 
Quarz verbaut?

von Oliver S. (oliverso)


Lesenswert?

Achim S. schrieb:
> Ich würde mal versuchen, mit einem hochimpedanten Tastkopf am Quarz zu
> messen, ob er tastächlich läuft. Klar verschiebt die Tastkopfkapazität
> evtl. die Frequenz ein wenig, aber vielleicht kannst du trotzdem
> ansatzweise erkennen, ob er auf 8 MHz schwingt oder hier schon eine zu
> niedrige Frequenz anliegt.

Na ja, was soll er da schon mit dem Multimeter messen.

Quarz auslöten, und schauen, ob der Prozessor trotzdem läuft. Wenn nein, 
läuft der am Quarz.

Kondensatoren prüfen, anderen Quarz besorgen, Uhrenquarz verwenden.

Oliver

von Markus G. (mark_avr)


Lesenswert?

Danke für Eure Hilfe und Tipps.

Es sieht wohl so aus das der Quarz und die Hardware nicht einen 100% 
Takt raus geben.

Hab mal die CKOUT Fuse gesetzt und siehe da es kommen nur 7,961Mhz raus.
Bei verschidenen Boards auch noch unterschiedlich.

Denke der Fehler ist gefunden.

Gibt es einen Workaround oder heist das zwangsläfig neu Hardware?

von Yalu X. (yalu) (Moderator)


Lesenswert?

Markus G. schrieb:
> Am Multimeter werden mir 499Hz angezeigt.

Ein Messfehler von ±1 in der letzten angezeigten Stelle ist normal.
Schau mal, das die Gebrauchsanleitung deines Multimeters dazu aussagt.
Ich bin sicher, der dort spezifizierte Fehler ist größer. Je nach
implementiertem Messverfahren wird der Messwerte evtl. abgerundet, so
dass auch 499,999Hz noch als 499Hz angezeigt wird.

> In Summe macht das einen Zeitversatz von 1,5 Minuten bei ca. 8 Stunden.

Hast du das hochgerechnet oder tatsächlich gemessen? Wenn letzteres: Wie
hast du das gemessen?

Edit:

Ich habe das abgeschickt, bevor ich deinen letzten Beitrag gelsen habe.

Markus G. schrieb:
> Hab mal die CKOUT Fuse gesetzt und siehe da es kommen nur 7,961Mhz raus.
> Bei verschidenen Boards auch noch unterschiedlich.

Das erklärt den Fehler natürlich.

Die Frage ist nur: Ist es der verwendete Quarz, der so ungenau ist, oder
deine Frequenzmessung? Hast du auch die 7,961MHz mit dem Multimeter
gemessen?

: Bearbeitet durch Moderator
von Stefan F. (Gast)


Lesenswert?

Markus G. schrieb:
> Bei verschidenen Boards auch noch unterschiedlich.

Um welche Boards handelt es sich denn?
benenne es und zeige zusätzlich ein Foto.

von Stone (Gast)


Lesenswert?

>Gibt es einen Workaround oder heist das zwangsläfig neu Hardware?
Was ist denn genau dein Ziel das du erreichen möchtest?
Für ein Projekt oder Serienproduktion?

von Achim S. (Gast)


Lesenswert?

Oliver S. schrieb:
> Na ja, was soll er da schon mit dem Multimeter messen.

Mit dem Multimeter natürlich gar nichts. Ich dachte es würde aus meinem 
Beitrag klar, dass ich von einer Oszilloskopmessung spreche. Sorry dass 
ich das nicht gleich im ersten Satz explizit hingeschrieben habe.

Markus G. schrieb:
> Hab mal die CKOUT Fuse gesetzt und siehe da es kommen nur 7,961Mhz raus.
> Bei verschidenen Boards auch noch unterschiedlich.

das passt gut für den internen Oszillator, für einen Betrieb mit 
externem Quarz habe ich sowas noch nie erlebt.

Ich empfehle immer noch direkt nachzuprüfen, ob wirklich der externe 
Quarz verwendet wird (durch direktes Nachmessen am Quarz oder mit dem 
von Oliver vorgeschlagenen Weg, den externen Quarz zu entfernen und zu 
sehen, ob der µC trotzdem weiter läuft).

von Markus G. (mark_avr)


Lesenswert?

Hab gerade nochmal alles mit dem Oszilloskop gegen geprüft.
An PIN PB0 gemessen.(CKOUT)
Takt OZ 7,96413 MHz
Takt MM 7,961 MHz

Board ist: Pro Mini Modul 3,3V 8MHz Arduino  link
https://eckstein-shop.de/Pro-Mini-Modul-33V-8MHz-Arduino-kompatibel-Partial-kit
Würde gerne einen Betriebsstundenzähler und Datenlogger damit 
realisieren.


Achim S. schrieb:
> Ich empfehle immer noch direkt nachzuprüfen, ob wirklich der externe
> Quarz verwendet wird (durch direktes Nachmessen am Quarz oder mit dem
> von Oliver vorgeschlagenen Weg, den externen Quarz zu entfernen und zu
> sehen, ob der µC trotzdem weiter läuft).

Leider für mich nicht möglich da viel zu klein für mein Werkzeug.
Gibt es noch einen weg zu prüfen ob der Exteren Quarz verwendet wird?
Über verstellen der Fuses, vieleicht?

von Stefan F. (Gast)


Lesenswert?

Die Arduino kompatiblen Board haben fast alle nur einen 
Keramik-Resonator, für den wäre deine gemessene Abweichung völlig 
normal.

Im Shop steht zwar, dass es ein "Quarzoszillator" sei, aber so kleine 
Quarze habe ich noch nie gesehen.

Im Shop von Sparkfun steht zum gleichen Artikel "ATmega328 running at 
8MHz with external resonator (0.5% tolerance)", das zu deiner Messung 
passt.

Das Foro von Reichelt passt auch dazu: 
https://www.reichelt.de/smd-resonator-8-00-mhz-cstcc-8-00-p42491.html
Oder hier eins von Farnell: 
https://uk.farnell.com/murata/cstce8m00g52-r0/resonator-ceramic-8mhz-smd/dp/2443268

Ich bin ziemlich sicher, dass das Bauteil auf deinem Board ein Resonator 
ist.

von Stone (Gast)


Lesenswert?

>Würde gerne einen Betriebsstundenzähler und Datenlogger damit
>realisieren.

Wenn es genau werden soll und es nicht super billig sein muss
RV-8803-C7 kannst du auch gleich dazu nutzen den µC zu wecken.

von Udo S. (urschmitt)


Lesenswert?

Markus G. schrieb:
> Hab gerade nochmal alles mit dem Oszilloskop gegen geprüft.
> An PIN PB0 gemessen.(CKOUT)
> Takt OZ 7,96413 MHz
> Takt MM 7,961 MHz

Und wie genau misst dein Oszi Zeiten?
Wie hoch ist der max. Zeitbasisfehler + Ablesefehler?

von bingo (Gast)


Lesenswert?

Stefanus F. schrieb:
> aber so kleine
> Quarze habe ich noch nie gesehen.

Die gibt es z.B. 2x2mm klein

von H.Joachim S. (crazyhorse)


Lesenswert?

Leute, ihr könnt aufhören...
Das ist ein Resonator (wie schon vermutet), und damit die Abweichung 
völlig im Rahmen.

von ... (Gast)


Lesenswert?

Udo S. schrieb:
> Und wie genau misst dein Oszi Zeiten?
> Wie hoch ist der max. Zeitbasisfehler + Ablesefehler?

Soweit ich es verstehe, hat der TO nach 8 Stunden einen Zeitversatz von 
1,5  Minuten festgestellt. Die Zeitbasis war wohl eine Uhr. Also 
komplett unabhängig vom Multimeter oder Oszi.

Es ist schon merkwürdig, wenn alle drei Messmethoden den gleichen 
Messfehler zeigen.

Da es sich aber um einen Resonator handelt, ist der Zeitversatz geklärt.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Stefanus F. schrieb:
> Ich bin ziemlich sicher, dass das Bauteil auf deinem Board ein Resonator
> ist.

Ja, die Dinger mit drei Anschlüssen sind Keramikresonatoren, Quarze
haben nur zwei Anschlüsse.

Die Keramikresonatoren sind etwas billiger als Quarze und für Dinge wie
UART-Taktung u.ä. genau genug. Für Uhren und vergleichbare Anwendungen
sind sie aber zu ungenau.

Übrigens sind auch Schwingquarze Resonatoren, aber eben aus einem
anderen Material gefertigt als diejenigen aus Keramik.

: Bearbeitet durch Moderator
von Gerhard (Gast)


Lesenswert?

Wenn wir von den gemessenen 7,96413 MHz ausgehen, dann ist die Differenz 
pro Interrupt 7964,13 - 8000 = -35,87 Takte. Da der Timertakt 8000000/64 
1/s beträgt fehlen also 35,87/64 = 0,56 Timertakte. Mann kann also z.B. 
alle 25sec 14 Timertakte überspringen: TCNT0 += 14;
Siehe auch
Beitrag "Die genaue Sekunde / RTC"

Gerhard

von g457 (Gast)


Lesenswert?

> Siehe auch Beitrag "Die genaue Sekunde / RTC"

Das müsste er dann aber für jedes Modul erneut machen. Einfacher ist es, 
wenn man..
- die Hardware gemäß den Anforderungen aussucht/baut
oder
- die Anforderungen an die bereits vorhandene Hardware anpasst
oder
- einen Reality-Check bei willkürlichen Anforderungen durchführt und 
feststellt, dass sie einer Überarbeitung bedürfen

HTH

von Gerhard (Gast)


Lesenswert?

zu
Beitrag "Re: Der Timer0 läuft 2Hz zu langsam"
es muss heissen
alle 25 Interrupts und nicht "alle 25sec"
Gerhard

von Rainer V. (a_zip)


Lesenswert?

Markus G. schrieb:
> Ja das Multimeter läuft recht gut. Auch wenn ich den Timer umstelle auf
> einen anderen Takt ist hier immer eine kleine Abweichung nach unten.
>
> Multimeter an Netzspannung 50,00Hz. (gerade nochmal getestet)

Hallo, die Messungen haben mich erst ein wenig irritiert...aber da ja 
nun wohl klar ist, dass der Keramikresonator "schuld" ist und ein 
individueller Abgleich bei X? Boards nicht in Frage kommt, dann bleibt 
doch nur, da mal einen Quarz dran zu friemeln. Wenn dann der Fehler über 
Stunden oder Tage signifikant kleiner wird, dann ist das wohl die 
Lösung! Habe aber trotzdem meine Zweifel, ob das so ganz ohne 
"Software-Tricks" besser werden kann...
Gruß und viel Erfolg, Rainer

von S. R. (svenska)


Lesenswert?

Es bleibt die Frage offen, wieviele Platinen er herstellen will. Für ein 
Einzelstück wird die Abweichung gemessen, direkt in den Code gegossen 
und fertig. Für eine handvoll Platinen würde ich das genauso machen, 
aber die Abweichung ins EEPROM schreiben und von dort lesen.

Und für irgendwas größeres ist ein Arduino vermutlich sowieso die 
falsche Wahl.

von Wolfgang (Gast)


Lesenswert?

Rainer V. schrieb:
> ...aber da ja nun wohl klar ist, dass der Keramikresonator "schuld" ist
> und ein individueller Abgleich bei X? Boards nicht in Frage kommt, …

Komisch, dass Atmel sogar Register für induviduellen Abgleich vorsieht, 
wenn soetwas nicht in Frage kommt. Was spricht dagegen, nach dem 
Aufspielen des Codes den µC an ein GPS mit 1pps zu hängen, damit er sich 
seine Kalibrierung holt und sich im EEPORM ablegt?

von Temperaturdrift (Gast)


Lesenswert?

> Was spricht dagegen, ... den µC an ein GPS mit 1pps zu hängen

Temperaturdrift und Langzeitdrift. Die Frequenz ändert sich andauernd 
und du musst den Abgleich jedes mal neu machen, wenn sich die Temperatur 
ändert.

von Toto mit Harry (Gast)


Lesenswert?

Vor allem bringt das alles garnix.. fragt sich ja auch noch ob ein 
Crystal die benötigte Abweichung bringt.

Bei bestenfalls 20ppm bei 20-25° ohne große Schwankungen kommt man auf 
10Sekunden abweichung die Stunde.

Ich denke das wird je nach anwendungsfall noch weiter abdriften.

von Toto mit Harry (Gast)


Lesenswert?

Temperaturdrift schrieb:
>> Was spricht dagegen, ... den µC an ein GPS mit 1pps zu hängen

Garnix.

> Temperaturdrift und Langzeitdrift. Die Frequenz ändert sich andauernd
> und du musst den Abgleich jedes mal neu machen, wenn sich die Temperatur
> ändert.

Nee.. man benutzt direkt das PPS Signal als "Volle Sekunde" Zähler, mit 
dem normalen Takt kann man dann zwischen den Sekunden messen.

von K. S. (the_yrr)


Lesenswert?

Quarz (nicht Uhrenquarz) und RTC war noch nie so ne gute Idee.
eventuell kannst du einen guten Quarz nehmen und bei verschiedenen 
Temperaturen (kann der  Arduino über ADC messen) kompensieren und im 
EEPROM speichern

besser wäre ein fertiges temperature compensated RTC modul/IC
z.B.:

https://www.nxp.com/products/analog/signal-chain/real-time-clocks/rtcs-with-temperature-compensation:MC_71311#/
https://www.maximintegrated.com/en/app-notes/index.mvp/id/3566
oder selbst mal google benutzen

: Bearbeitet durch User
von m.n. (Gast)


Lesenswert?

Toto mit Harry schrieb:
> Nee.. man benutzt direkt das PPS Signal als "Volle Sekunde" Zähler, mit
> dem normalen Takt kann man dann zwischen den Sekunden messen.

Wenn man genaue 500 Hz erzeugen möchte, nützt einem die volle Sekunde 
überhaupt nichts.

Toto mit Harry schrieb:
> Vor allem bringt das alles garnix.. fragt sich ja auch noch ob ein
> Crystal die benötigte Abweichung bringt.
>
> Bei bestenfalls 20ppm bei 20-25° ohne große Schwankungen kommt man auf
> 10Sekunden abweichung die Stunde.

"Crystal" kannst Du Dir sparen, ein Quarz reicht locker für wenige ppm 
bei nahezu konstanter Raumtemperatur. Richtig abgeglichen kommt man auch 
auf < 10 s Abweichung/Tag. Man muß es nur einmal machen.


K. S. schrieb:
> Quarz (nicht Uhrenquarz) und RTC war noch nie so ne gute Idee.
> eventuell kannst du einen guten Quarz nehmen und bei verschiedenen
> Temperaturen (kann der  Arduino über ADC messen) kompensieren und im
> EEPROM speichern

Bevor es wieder bei Atomuhren endet, sollte man die Anforderungen 
festlegen und danach entscheiden, was notwendig und sinnvoll ist.

Keramikresonatoren mögen für hohe Stückzahlen günstiger sein. Bei 
kleinen Stückzahlen spart man nichts und handelt sich nur potentiellen 
Ärger ein. Siehe: dieser Beitrag!
Gut, Resonatoren schwingen schneller an, wenn man es braucht.
Großer "Nachteil": handelsüblich gibt es wohl keine 
"Baudratenresonatoren" ;-)

von Georg M. (g_m)


Angehängte Dateien:

Lesenswert?


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.