PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bascom und die aktuelle Uhrzeit



Dominik009
20.08.2013, 17:20
Hallo Zusammen,

nachdem ihr mir bei meinem letzen Problem hier so gut geholfen habt (dafür nochmal vielen, vielen Dank) hoffe ich das ihr mir nochmal weiterhelfen könnt.

Für ein Projekt ist es wichtig das mein AtMega32 immer die Aktuelle Uhrzeit und den Wochentag (das genaue Datum mit Jahr wäre schön, aber durch Schaltjahre und meine nicht so tollen Bascom Kentnisse ehr schwierig) kennt, da er zu bestimmten Zeiten an bestimmen Tagen Verscheidene Aktionen (Sub's) ausführen muss.

Nun ist es so das ich mir in die Hautschleife einfach reingeschrieben habe das der Atmega jede Sekunde zur Variable Sekunde 1 dazurechnet und beim erreichen von 60 sofort auf 0 geht. Minuten, Stunden und Wochentage sind so auch drinn und es scheint auch zu funktionieren.

Jetzt ist es aber so das der Controller ab und an in ein Sub schalten muss und dort Teilweise über 1ne Stunde drinn verweilt um aufgaben zum auf und abdimmen realisiert. Vieleicht sollte ich noch erwähnen, es wird ein Aquarium-Controller. Nun zählt aber natürlich da die Uhr nicht weiter und wenn ich zurück in die Haubtschleife komme, ist die Uhrzeit falsch.

Gibt es eine möglichkeit die Uhr immer im Hintergrund weiterzählen zu lassen(und auch beim erreichen von 60sek die Minuten um 1 erhöhen und die Sekunden auf 0 zurückstelle)?

Ich hoffe ihr könnt mir da helfen :)

Gruß Dominik

Kampi
20.08.2013, 18:41
Hey,

wenn du kein Uhrenquarz an deinem Controller hast, wird das mit der Uhrzeit schwer.
Ich würde eine DS1307 I2C RTC nehmen und dann den SQW auf 1Hz stellen und den Pin an einen Interrupt Pin vom Controller hängen.
Und dann wird bei jedem Interrupt die RTC ausgelesen und du hast ein Datum und eine Uhrzeit (und das super genau....glaube bei meiner RTC bin ich bei einer Ungenauigkeit von 1min pro Monat :)

Tido
20.08.2013, 19:55
Hi,

dann lass' deine Sekundenaddition statt in der Hauptschleife in einer Interruptroutine stattfinden, die 1x pro Sekunde aufgerufen wird. Dies passiert dann auch, während dein Programm in der Sub ist.
Wenn dir die Genauigkeit reicht und du ohne zus. HW auskommen willst, kannst du das so machen, ansonsten die Lösung von Kampi.

Thomas$
20.08.2013, 20:15
lohnt sich anzusehen http://home.arcor.de/friedrich.lischeck/funkuhr/funkuhr.html

Thomas E.
21.08.2013, 16:26
Jetzt ist es aber so das der Controller ab und an in ein Sub schalten muss und dort Teilweise über 1ne Stunde drinn verweilt um aufgaben zum auf und abdimmen realisiert.
Ich glaube da liegt das Problem. Meine Vermutung ist, dass du mit Befehlen wie Wait den Controller in der Sub anhältst, um zu warten. Eine Sub, die eine Stunde Rechenzeit benötigt kann ich mir nicht vorstellen. Der Trick ist, das Programm an keiner Stelle per Wait oder ähnliches warten zu lassen.

Vielleicht möchtest du uns deinen Code zeigen?

Dominik009
21.08.2013, 20:01
Hmm, erstmal vielen dank für die Ideen. Also ich werde mir wohl einen DS1307 kaufen müssen. Das scheint einfacher als die DCF77 Metode zu sein. Alternativ hab ich überlegt einen kleinen Attiny für die Uhr zu nehmen, den hab ich auch da, ich würde es jedoch nicht hibekommen den per i2c zu koppeln, da ich hier 0 Erfahrung habe :(

Die Sache ist, das ich mit dem Mega32 die Steuerung von meinem Aquarium regeln möchte. Momentan ersmal nur das Licht, bzw. den LED Leuchtbalken.

Dieser soll morgens aufdimmen und abends abdimmen. Zu bestimmten eingestellten Zeiten und das ganze nicht linear damit es schöner aussieht. Das dimmen hab ich per PWM realisiert und da sind halt viele Wait befehle drinnen. Der PWM Wert wird etwas erhöht und dann wird. 36 Sekunden gewartet. Dannach wird der Wert wieder erhöht und wieder 36 sek. gewartet. Das ganze läuft in 2 Sub funktionen ab.

Den Code zeigen, muss ich mal sehn wie ich das anstelle, da ich auf nem alten Pentium II Rechner mit Win95 ohne USB programmiere. Ich werd es aber versuchen.

Gibt es sonst vieleicht noch ideen und möglichkeiten?

Gruß Dominik

Kampi
21.08.2013, 20:25
Wie gesagt....für Zeitmessung ist eine DS1307 eigentlich richtig gut.
Anbindung über 4 Leitungen, brauch kaum Zusatzhardware und den 1Hz Takt kannst du prima für Interrupts nutzen.
Und du hast da eigentlich auch einen kompletten Kalender drin.
Du kannst dann z.B. deinen µC schlafen legen und den durch den RTC Interrupt wach werden lassen und dann die Uhrzeit auslesen und dann wieder schlafen legen.
So hat er kaum was zu tun und du machst den ganzen Kram quasi Interruptgesteuert (was eine super Methode ist!).

Dominik009
21.08.2013, 20:37
Klingt gut, kann der DS1307 auch zu bestimmten Uhrzeiten einen zusätzlichen Interput ausgeben? Weil sonst kann ich den Mega ja nicht schlafen legen, da er sonst das auf und abdimmen verpassen würde.

Das einzigste was für mich eine kleine Hürde sein könnte ist die Kommunikation via I2C, da hab ich überhaubt keine Ahnung von und das scheint auch etwas komplexer zu sein.

for_ro
21.08.2013, 20:38
Gibt es sonst vieleicht noch ideen und möglichkeiten?

Hallo Dominik,
bevor ich zusätzliche Hardware anschließe, würde ich es erst mal mit den Bordmitteln probieren und sehen, welche Genauigkeit damit zu erreichen ist. Auch mit einem normalen Quarz kommst du bei 50ppm auf max 4 sec Abweichung pro Tag, macht 2 min / Monat oder 12min im halben Jahr. Dann steht die Sommerzeit Umstellung an, wo du eh die Zeit neu setzen musst ;)
Also würde ich mir einen Timer nehmen, der in bestimmten Interval überläuft. Daraus leitest du dir die Sekunden ab.
Z.B. so


$crystal 16000000
Config Timer0 = Timer , prescale=256, clear_timer=1
Compare0=249 'macht 250 Timer-Takte, also 16.000.000/256/250=250, also bei 250 ist eine Sekunde rum
On Compare0 sek_isr
...
Enable Compare0
Enable Interrupts
Do
If sek_flag=1 then
'hier zählst du die Sekunden, Minuten, Stunden, Tage usw. hoch
'und machst deine Zeitvergleiche, schaltest Ausgänge usw.
'und du zählst eine Variable hoch bis 36, dann änderst du den PWM Wert entsprechend ab
sek_flag=0
End If
...
Loop
End
sek_isr:
Incr 4ms
If 4ms = 250 Then
sek_flag=1
4ms=0
End If
return

Da wartet dann nichts mehr.
Wenn das nicht genau genug ist, kannst du den Timer2 auch asynchron über einen 32KHz Quarz an den TOSC Eingängen betreiben. Diese Quarze haben in der Regel ein max. Abweichung von 20ppm, sodass du unter eine Minute im Monat kommen kannst.

Kampi
21.08.2013, 20:43
Klingt gut, kann der DS1307 auch zu bestimmten Uhrzeiten einen zusätzlichen Interput ausgeben? Weil sonst kann ich den Mega ja nicht schlafen legen, da er sonst das auf und abdimmen verpassen würde.

Das einzigste was für mich eine kleine Hürde sein könnte ist die Kommunikation via I2C, da hab ich überhaubt keine Ahnung von und das scheint auch etwas komplexer zu sein.

Hey,

ne das kann sie nicht.
Aber da du den Controller ja jede Sekunde aufweckst, wirst du die Zeit wohl nicht verpassen oder sehe ich das falsch ;)?
Das tolle an der DS1307 ist, dass es dazu massig Beispiele im Netz gibt (in C, Bascom und allem anderen).
Ansonsten hilft dir hier jeder gerne weiter! (selbige gilt für mich ;)....das Prinzip was ich da beschreibe verwende ich bei meiner Röhrenuhr).

Thomas E.
22.08.2013, 13:45
Dieser soll morgens aufdimmen und abends abdimmen. Zu bestimmten eingestellten Zeiten und das ganze nicht linear damit es schöner aussieht. Das dimmen hab ich per PWM realisiert und da sind halt viele Wait befehle drinnen. Der PWM Wert wird etwas erhöht und dann wird. 36 Sekunden gewartet. Dannach wird der Wert wieder erhöht und wieder 36 sek. gewartet. Das ganze läuft in 2 Sub funktionen ab.

Und warum musst du unbedingt mit Wait 36 Sekunden warten? Meiner Ansicht nach liegt das einzige Problem dass du hast genau daran.
Du kannst auch jede Sekunde per Timer-Interrupt eine Variable hochzählen und bei 36 dann eine Aktion ausführen. Das wäre hundertmal eleganter, als die ganzen Wait-Befehle. Denn die sollten nämlich in keinem Programm vorhanden sein.