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:
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?
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
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)
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.
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.
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.
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
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
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.
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.
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
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?
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?
Markus G. schrieb:> Bei verschidenen Boards auch noch unterschiedlich.
Um welche Boards handelt es sich denn?
benenne es und zeige zusätzlich ein Foto.
>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?
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).
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?
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.
>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.
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?
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.
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.
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
> 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
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
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.
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?
> 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.
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.
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.
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" ;-)