Hilfe bei Binär-Uhr

OP #2877292
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
#2877306
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.
#2877310
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!
#2877331
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.
#2877343
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.
Gast #2877346
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.
Gast #2877354
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.
Gast #2877711
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.
Gast #2877756
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.
#2877760
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.
#2877849
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.
#2877922
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)
#2878135
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
#2878793
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?

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