Guten Tag,
ich bin 16 Jahre alt und beschäftige mich nun seit ca 2 Wochen mit
Mikrokontrollern und wollte nachdem ich mich mit den Grundlagen, wie
Leds blinken lassen und Taster einbinden, ein wenig beschäftigt hatte,
wollte ich eine Binär-Uhr erstellen.
Jedoch ist sie ziemlich ungenau und ich finde den Fehler nicht wirklich,
möglicherweise liegt es daran, dass ich den internen Oszillator
verwende.
1
#include<avr/io.h>
2
#include<avr/interrupt.h>
3
4
#define F_CPU 1000000
5
6
volatileuint8_tsekunde;
7
uint8_tminute;
8
uint8_tstunde;
9
10
ISR(TIMER1_COMPA_vect)
11
{
12
sekunde=sekunde+1;
13
}
14
15
intmain(void)
16
{
17
sekunde=0;
18
minute=0;
19
stunde=0;
20
DDRD=0xFF;
21
DDRB=0xFF;
22
DDRC=0b00111111;
23
TCCR1B|=(1<<CS12);
24
TCCR1B|=(1<<CS10);
25
TCCR1B|=(1<<WGM12);
26
TIMSK|=(1<<OCIE1A);
27
OCR1A=976;
28
sei();
29
while(1)
30
{
31
if(sekunde==60)
32
{
33
sekunde=0;
34
minute=minute+1;
35
}
36
if(minute==60)
37
{
38
minute=0;
39
stunde=stunde+1;
40
}
41
if(stunde==24)
42
{
43
stunde=0;
44
}
45
PORTD=(sekunde/10)*16+sekunde%10;
46
PORTB=(minute/10)*16+minute%10;
47
PORTC=(stunde/10)*16+stunde%10;
48
}
49
}
Ich würde mich über ein wenig Hilfe sehr freuen.
Mit freundlichen Grüßen,
Niklas Aust
Was bedeutet "ziemlich" in Zahlen? Wieviele Sekunden pro Minute, Stunde
oder Tag?
Warum zählst du nicht einfach Einer und Zehner für s,m und h getrennt
hoch? Dann musste du nicht erst noch lange die einzelnen Stellen
ausrechnen...
Niklas Aust schrieb:> Jedoch ist sie ziemlich ungenau und ich finde den Fehler nicht wirklich,> möglicherweise liegt es daran, dass ich den internen Oszillator> verwende.
nicht nur möglicherweise, sondern sogar ganz sicher.
Wenn du eine halbwegs genau Uhr machen willst, kommst du an einem Quarz
nicht vorbei. Aber selbst der macht nicht genau die Frequenz, die
draufsteht, sondern du musst deine CTC Konstante entsprechend anpassen.
Bei einer Uhr kommt es auf lange Sicht auf jede einzelne Schwingung des
Taktgebers an.
> OCR1A = 976;
975
Aber das ist jetzt erst mal ein kleinerer Fehler, der von der
Ungenauigkeit des internen RC-Taktgebers völlig überdeckt wird. Denn der
macht alles mögliche, nur sicher nicht exakt 1 Mio Schwingungen in der
Sekunde.
Niklas Aust schrieb:> möglicherweise liegt es daran, dass ich den internen Oszillator> verwende.
So ist es. Der ist für Uhren absolut untauglich. 2 Minuten pro halbe
Stunden sind für den sogar ziemlich genau. Du brauchst einen externen
Qaurz dann wirst du glücklich ;)
Niklas Aust schrieb:> Ziemlich ungenau heißt, dass die Uhr innerhalb einer halben Stunde> bereits 2 Minuten "hinterher" hinkt.
Also rund 7% Fehler.
Für den RC-Schwingkreis im Mega ist das gar kein so schlechter Wert :-)
Niklas Aust schrieb:> ich bin 16 Jahre alt und beschäftige mich nun seit ca 2 Wochen mit> Mikrokontrollern und wollte nachdem ich mich mit den Grundlagen, wie
Sehr schön!
> Jedoch ist sie ziemlich ungenau und ich finde den Fehler nicht wirklich,> möglicherweise liegt es daran, dass ich den internen Oszillator> verwende.
Der interne Oszillator per facory default für eine Uhr zu ungenau mit
iirc +-10%. Trimmbar für einen schmalen Temperaturbereich ist er auf
+-1%. Genaueres dazu z.B. hier: AVR053: Calibration of the internal RC
oscillator: http://www.atmel.com/Images/doc2555.pdf
Für eine Uhr trotzdem ungeeignet. Zu empfehlen ist der Einsatz eines
Uhrenquarz, der über binäre Teiler im Zähler einen wesentlich genaueren
Takt für Sekunden liefert: mit typ. +-20ppm oder +-0,0002%
> OCR1A = 976;
Dieser Wert wirkt ein wenig vom Himmel gefallen. Der Precompiler des GCC
kann aber auch ziemlich gut rechnen, wenn man ihm die Aufgabe richtig
stellt.
Siehe dazu: AVR - Die genaue Sekunde / RTC.
> Ich würde mich über ein wenig Hilfe sehr freuen.
Dein Code sieht gut aus! Ältere Anfänger machen weit mehr falsch oder
kommen gleich gar nicht so weit - sehr schön!
Du hast also eine Abweichung von 1/15. Das sind 6%. Eigentlich noch
erträglich für den internen Oszillator...
Welchen uC hast du? Hast der einen kalibrierten Oszillator?
Lothar Miller schrieb:> Du hast also eine Abweichung von 1/15. Das sind 6%. Eigentlich noch> erträglich für den internen Oszillator...> Welchen uC hast du? Hast der einen kalibrierten Oszillator?
Microcontroller ist der Atmega 8 , der laut Datenblatt einen
kalibrierten Oszillator hat.
Gernot schrieb:> gibt doch Uhrenquarze, sollten die nicht genau sein?
Auch die müssen auf die genaue Frequenz gezogen werden.
> also ich meine diese 32,... kHz Quarze.
Im Prinzip ja.
Das 'Problem' ist, dass du den nur mit dem Timer 2 vernünftig einsetzen
kannst. Kann man natürlich machen. Du kannst aber auch genausogut einen
anderen Quarz benutzen (zb 16 Mhz). Der ist genausowenig auf exakt
16000000Hz, muss also genauso per Software abgeglichen werden. Nur
kriegst du als Nebeneffekt dann auch gleich automatisch einen schneller
arbeitenden Prozessor :-)
Und für die meisten Uhren, die in Wohnräumen benutzt werden, kann man
die geringe Temperaturdrift des Quarzes getrost vergessen bzw. über den
Tag gesehen rausmitteln.
und dann mal F_CPU variieren, bis deine Uhr so einigermassen richtig
läuft. Dann kennst du die genaue Frequenz (+-1024 Hz wegen dem Vorteiler
des Timers), auf der dein µC läuft.
6% von 1Mhz sind 60000Hz.
Probier halt einfach mal
#define F_CPU 940000
und taste dich von dort weiter vor.
Einen Quarz ersetzt das natürlich nicht. Aber für ein paar Stunden
Ganggenauigkeit könnte es schon reichen.
Uhrenquarze sind nicht genauer, nur weil man sie Uhrenquarze nennt. Man
nennt sie Uhrenquarze, weil ihre Resonazfrequenz gut zu den
Teilerquotienten für µC und den Bedürfnissen der Zeitmessung passen.
Wenn irgendwie möglich würde ich das Zeitnormal einer Uhr an die
Netzfrequenz koppeln, da die EVUs in ständigem Kontakt mit Braunschweig
stehen und Verluste damit langfristig ausgleichen.
Ben Ster schrieb:> Uhrenquarze sind nicht genauer, nur weil man sie Uhrenquarze nennt. Man> nennt sie Uhrenquarze, weil ihre Resonazfrequenz gut zu den> Teilerquotienten für µC und den Bedürfnissen der Zeitmessung passen.> Wenn irgendwie möglich würde ich das Zeitnormal einer Uhr an die> Netzfrequenz koppeln, da die EVUs in ständigem Kontakt mit Braunschweig> stehen und Verluste damit langfristig ausgleichen.
Und Elektronikanfänger lässt man immer schön am Netz rumspielen. Was für
einer dummer und gefährlicher Beitrag.
ich habe eine nixie uhr ohne externem quarz laufen. ich habe pro tag
etwa -5min abweichung. per funk aktualisiert sich das ganze einmal pro
tag. läuft seit 2jahren.
imo sind deine 2min auf 30min viel zu viel. wenn es immer +2min sind
pass einfach den zähler etwas an. problematisch wird es erst wenn du +-
abweichungen hast.
frank schrieb:> ich habe eine nixie uhr ohne externem quarz laufen. ich habe pro tag> etwa -5min abweichung. per funk aktualisiert sich das ganze einmal pro> tag. läuft seit 2jahren.>> imo sind deine 2min auf 30min viel zu viel. wenn es immer +2min sind> pass einfach den zähler etwas an. problematisch wird es erst wenn du +-> abweichungen hast.
Mensch, da haste ja locker 5 Cent für den Quarz gespart.
frank schrieb:> ich habe eine nixie uhr ohne externem quarz laufen. ich habe pro tag> etwa -5min abweichung. per funk aktualisiert sich das ganze einmal pro> tag. läuft seit 2jahren.>> imo sind deine 2min auf 30min viel zu viel.
Nö.
Er hat einfach nur genau das gemacht, was du auch gemacht hast. Er hat
sich nicht die Mühe gemacht, den internen Oszillator zu kalibrieren bzw.
dessen Abweichung einzurechnen. Seiner hat halt mehr Abweichung zu den
1Mhz als deiner.
Die 2 min sind absolut im Rahmen.
Beitrag #2877382 wurde von einem Moderator gelöscht.
gelöscht mit dem verweis auf fehlende begründung.
bitte, hier mit begründung in angemessenem ton:
Ben Ster schrieb:> Uhrenquarze sind nicht genauer, nur weil man sie Uhrenquarze nennt. Man> nennt sie Uhrenquarze, weil ihre Resonazfrequenz gut zu den> Teilerquotienten für µC und den Bedürfnissen der Zeitmessung passen.> Wenn irgendwie möglich würde ich das Zeitnormal einer Uhr an die> Netzfrequenz koppeln, da die EVUs in ständigem Kontakt mit Braunschweig> stehen und Verluste damit langfristig ausgleichen.
der beitrag ist von vorne bis hinten schwachsinn.
1. uhrenquarze sind nicht genauer. uhrenquarze sind nicht ungenauer.
vergleiche ohne bezug sind dümmer als vergleiche mit bezug.
NATÜRLICH ist ein uhrenquarz genauer als der interne und natürlich
unkalibrierte oszillator.
und kein mensch hat behauptet, ein uhrenquarz sei genauer als ein
anderer quarz. wohl aber ist er insgesamt besser geeignet.
sinnerfassend lesen und sinnwiedergebend schreiben sollte man schon
können, wenn man so einen aroganten rotz ablässt.
2. die "teilerquotienten" haben nichts mit µC zu tun, sondern mit dem
binärsystem, mit dem sich in jeder hardware halt nun mal nativ rechnen
lässt. die 16bit hat atmel nicht erfunden.
3. wenn irgendwie möglich, dcf-77 verwenden.
4. BLÖDSINN², denn die netzfrequenz hat rein gar nichts mit einer
zeitreferenz zu tun.
Michael H. schrieb:> BLÖDSINN², denn die netzfrequenz hat rein gar nichts mit einer> zeitreferenz zu tun.
BLÖDSINN³, die Netzfrequenz muss im Mittel 50Hz haben.
hab ich nie verneint.
aber ein "nachregeln" wie vom andern postuliert, findet nicht statt...
wers mir nicht glaubt, darf sich gerne über verbundregelung informieren.
vorkauen werd ichs euch maulhelden sicher nicht.
Karl Heinz Buchegger schrieb:> Ihr wisst doch alle was Ben Ster gemeint hat.
ja.
er postuliert, die netzfrequenz wird von der atomuhr nachgeführt. und
das ist einfach falsch. und ich kanns einfach nicht leiden, wenn einer
großkotzig mit wissen prahlt, das einfach falsch ist.
wer mal solche personen zum kollegen gehabt hat, hat davon ein leben
lang die nase voll.
Irgendwie muß ich schmunzeln, weil fast jeder Thread vom ursprünglichen
Thema abweicht.
Vor allem deshalb weil ja schon absolut klar erkannt wurde, dass die
verwendete "Zeitreferenz" (bekomm ich bestimmt auch einen Maulkorb) für
eine Uhr ungenügend ist.
Der interne Taktgeber der AVR-Controller ist - man möge mich berichtigen
wenn ich das falsch sage - meines Wissens ein RC-Oszillator, der hat in
aller Regel heftige Toleranzen und ist wie bereits mehrfach erwähnt auch
Temperaturabhängig (allerdings ist das ein Quarz - auch wenn nicht so
heftig - auch).
Wie gesagt muß ich schmunzeln, weil wir jetzt ja von einer Binäruhr zum
europäischen Verbundnetz (wir sind doch noch in Europa, oder? Wenn nicht
müßte man bei einer netzsynchronisierten Uhr berücksichtigen, dass die
in Amerika 60/50stel schneller läuft)geraten sind.
Die 50 Hz des europäischen Verbundnetzes sind deshalb so extrem "genau",
weil: Würde ein Kraftwerk, ein Windrad, ein Wechselrichter einer
Fotovoltaikanlage abweichen, würde das gesamte europäische Netz
"dagegenfahren". Smile aus einem stromgebenden Generator würde kürzester
Hand ein Motor werden! Meines Wissens sind die Kraftwerke nicht DCF-77
synchronisiert (das wäre für eine Generatorregelung deutlichst zu
langsam).
Prinzipiel (für einen Anfänger wirklich etwas kritischer) hab ich
netzsynchronisierte Uhren deutlich genauer hinbekommen als
Quarzsynchronisierte (vollkommen egal, ob es ein "Uhrenquarz" - 32768 Hz
- oder ein anderer war! Nur mal so: 32768 sind 2 hoch 15. 15 mal
nacheinander durch 2 geteilt ergibt hier genau eine Sekunde). Vielleicht
sollte sich unser Freund einen vollisolierten kleinen Trafo zulegen -
damit ihm nichts passiert - und den Ausgang über einen Optokoppler dem
ATMEGA 8 hinzufügen. Den ankommenden Takt durch 50 geteilt und das
dürfte es als Zeitbasis gewesen sein!
Sollte es zwingend Batteriebetrieben sein, kann er auch mit dem
"Uhrenquarz" und einem HEF4001 eine 32,768KHz Zeitbasis erstellen die er
einem Interruptpin zuführt. Das hat dann den Vorteil, dass er seinen
internen - und ungenauen - RC-Oszillator für den "normalen" Betrieb des
AVR's behalten kann, aber dennoch eine -relativ- exakte Zeitbasis für
die Uhr verwenden kann !
Einen lieben Gruß,
Ralph
(der sich immer wieder freut, hier mitlesen zu können, auch wenn er sich
fast nicht zu Wort meldet.
Muß ich immer noch schmunzeln, weil mir vor ca. 1 Jahr eben auch ein
absoluter Lapsus geschehen ist und ich schlicht - was ich nicht geglaubt
hätte - Mist geschrieben habe. In diesem Sinne hoffe ich, dass der Mist
den ich hier geschrieben habe.... erkennbar ist)
Michael H. schrieb:> 4. BLÖDSINN², denn die netzfrequenz hat rein gar nichts mit einer> zeitreferenz zu tun.Michael H. schrieb:> ja.> er postuliert, die netzfrequenz wird von der atomuhr nachgeführt. und> das ist einfach falsch. und ich kanns einfach nicht leiden, wenn einer> großkotzig mit wissen prahlt, das einfach falsch ist.
Dann schau Dir doch mal folgendes an:
http://www.swissgrid.ch/content/swissgrid/de/home/experts/topics/frequency.html
"Diese Netzzeitabweichung wird stetig ausgeglichen. Beträgt die
Zeitabweichung mehr als 20 Sekunden, so wird die Frequenz im Netz
korrigiert."
Gruß Dietrich
Michael H. schrieb:> aber ein "nachregeln" wie vom andern postuliert, findet nicht statt...> wers mir nicht glaubt, darf sich gerne über verbundregelung informieren.> vorkauen werd ichs euch maulhelden sicher nicht.
Hallo nochmal,
Leider läuft es bei mir nicht und bräuchte daher noch einmal Hilfe.
Fusebits habe ich so gesetzt: -hfuse auf 0xD9
-lfuse auf 0xEF
Kondensatoren vor dem Quarz sind auch vorhanden.
Vielen Dank schonmal.
Niklas Aust schrieb:> Leider läuft es bei mir nicht und bräuchte daher noch einmal Hilfe.
Was hast du denn jetzt verändert und was genau geht nicht mehr?
Hast du eine selbst-erstellte Hardware oder programmierst du auf einem
gekauften Board?
> Fusebits habe ich so gesetzt: -hfuse auf 0xD9> -lfuse auf 0xEF
Also externer Quarz mit "hoher" Frequenz. Stimmt also schon mal, solange
du nicht direkt einen Uhrenquarz angeschlossen hast. Der braucht weit
weniger Energie für die Anregung und geht bei zu hoher Anregung auch
gerne mal kaputt. Für den bräuchtest du die "Low Frequency"-Einstellung.
> Kondensatoren vor dem Quarz sind auch vorhanden.
Sind es auch die richtigen? =)
Irgendwas um 16pF (piko!) und kurz an Masse beim Controller angebunden?