Forum: Mikrocontroller und Digitale Elektronik Hauptuhr mit ATMega8


von Patrick (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

ich plane eine Nebenuhr über einen ATMega8 anzusteuern. Die Uhr erwartet 
jeweils einen Impuls je Minute mit wechselnder Polarität.

Ich plane einen ATMega und einen L293 einzusetzten um die Polwendung zu 
erreichen. Dazu einen 32khz bzw. einen DS32khz Quarz Oscillator um die 
Genauigkeit zu erreichen.

Ich hab aktuell einen Probeaufbau mit einem 1Mhz Quarz und lass in 
Bascom einen Timer jede Sekunde zählen sodass ich bei 60 dann die Pole 
ändern kann.

Mein Problem ist noch das ich ja nicht dauerhaft Strom auf die Spule 
geben kann. Wenn ich allerdings den ATMega ein paar Sekunden anhalte ist 
meine Zeitzählung pfutsch.

von Achim M. (minifloat)


Lesenswert?

Du willst z.B. bei Stromausfall oder bei Feierabend die Uhren ausmachen, 
in der Früh bei "Arbeitsantritt" wieder korrekte Zeit haben?

Häng doch eine externe Echtzeituhr wie z.B. eine DS1307 dran. In dem 
1307-Uhrenchip ist zusätzlich ein Batteriegepuffertes Non-Volatile RAM.

Der Atmega speichert nach jedem Stellbefehl/Impuls die angezeigte 
Uhrzeit im NV-RAM. Wenn nun der Strom ausfällt, geht im DS1307 die Uhr 
trotzdem weiter und der Speicher bleibt erhalten. Der Atmega liest bei 
wiedereinschalten die zuletzt gestellte Zeit aus dem NV-RAM aus und gibt 
solange Stellimpulse, bis die Uhrzeit der Nebenuhren wieder korrekt ist.

Lösung mit internem EEPROM des Atmega würde zwar funktionieren, aber den 
EEPROM zu stark "ausleiern".

mfg mf

von Patrick (Gast)


Lesenswert?

Okay Nein also das mit der RTC hab ich mir dann auch schon überlegt aber 
erst als 2ten Schritt. Hab auch schon fleißig Datenblatt gelesen DS1307 
und DS32khz.

Mein aktuelles Problem/Frage ist das der Schaltkreis erst nach jeder 
Minute den Impuls sendet was aber kein Impuls ist sondern ein 
Dauer-"An".

Portx.0 = 0 'Spule'
Portx.1 = 1 'Spule'
Portx.2 = 1 'An'
Bei der nächsten Minute:

Portx.0 = 0
Portx.1 = 1
Portx.2 = 1

Das funktioniert auch wunderbar allerdings brennt mir irgendwann die 
Spule in der Uhr durch wenn ich 60 Sekunden lang Strom drauf gebe. Ich 
wollte halt was einbauen wie waitms 1000 und dann Portx.2 = 0 Strom aus 
-> Impuls.

Wenn ich nun den µC 1000ms warten lass dann ist die Timer geschichte 
hinfällig.

MfG

von Peter D. (peda)


Lesenswert?

Patrick schrieb:
> Wenn ich allerdings den ATMega ein paar Sekunden anhalte ist
> meine Zeitzählung pfutsch.

Warum willst Du ihn denn anhalten?

Die RTC macht man mit nem Timerinterrupt.
Ob nun 32kHz oder 10MHz Quarz, ist egal.
32kHz lohnt sich nur bei Batteriebetrieb (weniger Stromverbrauch).


Peter

von Achim M. (minifloat)


Lesenswert?

Schalte in Reihe zur Uhr einen Bipolaren Elko. Falls die Uhr Haltekraft 
benötigt, kommt noch ein Widerstand parallel zum Elko.
mfg && Gute N8 mf

von Peter D. (peda)


Lesenswert?

Patrick schrieb:
> Wenn ich nun den µC 1000ms warten lass dann ist die Timer geschichte
> hinfällig.

Hä?

Der Timer läuft weiter, deshalb nimmt man ja Timer.


Peter

von Achim M. (minifloat)


Lesenswert?

PS:
Mit Elko natürlich nur halbe Betriebsspannung für den Leistungsteil, da 
der Elko ja jedesmal seine Spannung dazu addiert.

von Thomas E. (thomase)


Lesenswert?

Patrick schrieb:
> Wenn ich nun den µC 1000ms warten lass dann ist die Timer geschichte
>
> hinfällig.

Wieso das denn?

Lasse den Atmega mit internem Takt laufen und schliesse an den 
Oszillator-eingang einen Uhrenquarz an. Dann stellst für Timer2 den 
asynchronen Takt ein und fertig ist deine Uhr. Der Timer2 läuft sogar im 
Sleepmode.

mfg.

von Helmut (Gast)


Lesenswert?

Der Sekundenticker läuft doch eh rund.
Warum merkst du dir nicht die Zeit, wenn der Impuls zur Spule raus geht
und setzt die Spule eine Sekunde später wieder zurück?

Spule_an = Zeit_X
Spule_aus = Zeit_X + 1

von Patrick (Gast)


Lesenswert?

Der Timer läuft wirklich weiter? Das muss ich morgen probieren wenn ich 
wieder richtig wach bin :)

Danke erstmal für eure Gedankenanregungen.

von Helmut (Gast)


Lesenswert?

Du hast noch einen kleinen Fehler im Programm.
Es gibt nur 59 Einheiten in der Zeit. Also nur 59 Sekunden.
Musst also deine Bedingung ändern in if sekunden > 59 then sekunden = 0.
Sonst zählst du pro Minute jeweils eine Sekunde zuviel.

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.