Forum: Mikrocontroller und Digitale Elektronik Hilfe bei Binär-Uhr


von Niklas A. (nikau)


Lesenswert?

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
volatile uint8_t sekunde;
7
uint8_t minute;
8
uint8_t stunde;
9
10
ISR(TIMER1_COMPA_vect)
11
{
12
  sekunde = sekunde + 1;
13
}
14
15
int main( 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

von Benjamin U. (utzus)


Lesenswert?

Was heißt den ziemlich ungenau? Und wo ist die ISR?

von Niklas A. (nikau)


Lesenswert?

Ziemlich ungenau heißt, dass die Uhr innerhalb einer halben Stunde 
bereits 2 Minuten "hinterher" hinkt.

Die ISR befindet sich vor der Haupt-Methode

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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...

von Karl H. (kbuchegg)


Lesenswert?

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.

von Eumel (Gast)


Lesenswert?

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 ;)

von Karl H. (kbuchegg)


Lesenswert?

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 :-)

von Niklas A. (nikau)


Lesenswert?

Okay danke, dann weiß ich ja jetzt woran es liegt :)

von Michael H. (michael_h45)


Lesenswert?

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!

von Gernot (Gast)


Lesenswert?

gibt doch Uhrenquarze, sollten die nicht genau sein?
also ich meine diese 32,... kHz Quarze.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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?

von Niklas A. (nikau)


Lesenswert?

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.

von Niklas A. (nikau)


Lesenswert?

Vielen Dank für die Antworten,

ich besorge mir dann einen Uhrenquarz und warte nochmal die Ergebnisse 
ab.

von Eumel (Gast)


Lesenswert?

Es muss kein Uhrenquarz sein :)

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

@Niklas

Du kannst ja auch hier mal ändern
1
  OCR1A = F_CPU / 1024 - 1;

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.

von Ben Ster (Gast)


Lesenswert?

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.

von Eumel (Gast)


Lesenswert?

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.

von Kurt B. (kurt)


Lesenswert?


von frank (Gast)


Lesenswert?

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.

von Eumel (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Michael H. (michael_h45)


Lesenswert?

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.

von avr (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

Geh, bitte!

Ihr wisst doch alle was Ben Ster gemeint hat.
Muss man da jetzt wirklich wieder mal auf jedem einzelnen Wort 
rumreiten?

von Michael H. (michael_h45)


Lesenswert?

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.

von Michael H. (michael_h45)


Lesenswert?

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.

von Ralph S. (jjflash)


Lesenswert?

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)

von Dietrich L. (dietrichl)


Lesenswert?

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

von Michael H. (michael_h45)


Lesenswert?

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.

von Niklas A. (nikau)


Lesenswert?

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.

von Michael H. (michael_h45)


Lesenswert?

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?

von Niklas A. (nikau)


Lesenswert?

Hat sich erledigt,
die Anschlüsse an dem Quarz waren wohl kaputt.

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.