Der Timer0 läuft 2Hz zu langsam

#5751676
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
Gast #5751690
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?
#5751715
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.
#5751716
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.
#5751719
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
#5751734
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.
Angehängte Dateien:
Gast #5751757
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.
#5751765
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
#5751778
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?
Moderator #5751781
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?
Gast #5751804
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).
#5751827
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?
Gast #5751830
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.
Gast #5751919
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.
Moderator #5752001
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.
Gast #5752133
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
#5752253
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
#5752736
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.
Gast #5752747
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?
Gast #5753056
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.
#5753092
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
Gast #5753203
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" ;-)

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