Servus.. Ich möchte mir einen Datenlogger bauen, der wenn ein entsprechendes Ereignis eintritt (PortA1=High), die dazugehörige Zeit mitspeichern. Und zwar reichen dort die bis dahin abgelaufenden Minuten. Diese müssen ebend unabhängig vom Rest des Programms in einem Extra Register r19 aufaddiert werden. Man kann dann später die Uhrzeit zurückrechnen, wenn man die Anfangszeit kennt. Mir fehlt halt ein Programmschnipsel, wie man einen Timer dazu bringt - wahrscheinl. per Interrupt - ein Register "Minuten" jede Minute um 1 zu erhöhen...
Das 'Uhrwerk' einer Uhr. (AT90s1200)
Zählt nach dem Einschalten ab 00:00:00 hoch.
Der Quarz mit 3.2768MHz wird hier über Vorteiler 1024
und Timer0 (0x80) auf 25 Interrupts pro Sekunde heruntergeteilt.
Diese werden über die Variable 'Puls' abgezählt.
Ist Puls=0, wird die Sekunde erhöht.
Die beiden mit (X) markierten Zeilen sind bei
anderem Quarz/Teileränderung anzupassen.
Die Zeit steht als gepackte BCD-Zahl in Stunde, Minute, Sekunde zur
Verfügung.
.def Temp = R16
.def Display = R17
.def Timer = R18
.def Puls = R19
.def Sekunde = R20
.def Minute = R21
.def Stunde = R22
RESET: ;Reset Label
clr Sekunde
clr Minute
clr Stunde
ldi Temp, 0x05 ;Timer0-Mode auf Vorteiler 1024
out TCCR0, Temp
ldi Timer, 0x80 ;Timer0 auf überlauf 25Hz.
out TCNT0, Timer
ldi Temp, 0x02 ;Timer0-Int. freigeben ( Für 90s8515 anpassen,
;TOIE0 muss aktiv sein)
out TIMSK, Temp
in Temp, SREG ;Interrupts generell freigeben
ori Temp, 0x80
out SREG, Temp
ldi Puls, 25 ;Timer0-Überlauf runterteilen (X)
TIMER0: ;Timer0-Einsprung.
out TCNT0, Timer ;Timer0 neu starten
dec Puls ;Überlauf-Teiler -1
cpi Puls,0 ;Null?
brne Not_Null ;Nein?, Dann raus.
ldi Puls, 25 ;Ja? Überlaufteiler setzen (X)
inc Sekunde ;Sekunde +1
mov Temp, Sekunde
andi Temp, 0x0f ;Oberes Nibble weg
cpi Temp, 0x0a ;Gösser 9?
brne Not_Null ;Nein? Dann raus
swap Sekunde ;Nibbles tauschen
andi Sekunde, 0x0f ;Unerwünschtes Nibble weg
inc Sekunde ;Sekundenzehner +1
swap Sekunde ;Nibbles tauschen
cpi Sekunde, 0x60 ;Grösser 59?
BRNE Not_Null ;Nein? Dann raus
clr Sekunde ;Ja? Sekunden auf null
inc Minute ;Ab hier, wie Sekunden
mov Temp, Minute
andi Temp, 0x0f
cpi Temp, 0x0a
brne Not_Null
swap Minute
andi Minute, 0x0f
inc Minute
swap Minute
cpi Minute, 0x60 ;Minute grösser 59
BRNE Not_Null ;Nein? Dann raus
ldi Minute, 0 ;Ja? Minuten auf null.
inc Stunde ;Ab hier wie Sekunde
mov Temp, Stunde
andi Temp, 0x0f
cpi Temp, 0x0a
brne Not_Null2
swap Stunde
andi Stunde, 0x0f
inc Stunde
swap Stunde
Not_Null2:
cpi Stunde, 0x24 ;Stunde grösser 23
BRLO Not_Null ;Nein? Dann raus
clr Sekunde ;Ja? Alles auf null
clr Minute
clr Stunde
Not_Null:
reti
Hoffe, das hilft.
Gruss
Jadeclaw.
Also im Prinzip machast du das so: Timer aktivieren, und am besten im Overflow Modus betreiben. sagen wir mal du benuzt den 16bit timer, dann ist die größte speicherbare Zahl: 2^16 = 65536 Wenn du jezt 1hmz nimmst und du hast meist folgende Prescaller zur verfügung: /0 /8 /64 /256 /1024 (Steht im Datenblatt im Abschnitt zu dem Counter) Jezt rechnest du immer 1.000.000 / 8 = wären z.b 125.000 das teilst du durch den Maximalwert deines Timers (65536 bei 16bit) wären dann 1,9073486328125 also etwa 2 Overflows / Sekunde. Da jede Minute 60 sekunden hat, hast du also das ganze noch mal 60 = 114,44091796875 Nun aktivierst du den Overflow Interupt und zählst dort bei jedem mal ein register um eins hoch, wenn du bei 114 angekommen bist löscht du das register und zählst deine Minute um einen hoch. Fertig! :) Das ganze ist nicht mit einer Atomzeit vergleichbar, da das ganze natürlich etwas vor geht, aber wenn man die Quarzfrequenz gut wählt und mit dem Vorteiler rumspielt kommt man ab udn an auch auf glatte Werte die durchaus brauchbar sind. Im Obigem Beispiel wird deine Zeit also immer die abweichung von 0,44 haben aber das kann man im Prinzip auch ausgelichen es gibt in der COdesammlung dazu ein Programm wie man eine genaue Sekunde definiert, da kannst du dir was abschauen, aber je nachdem wie genau du das brauchst wird es auch so gehen. Da du aber eh nur Minuten genau messen willst solte das schon funktiinieren, ich hab das auf diese Art mal für nen Countdown gemacht und mit ner ordinären Küchentimer verglichen war eigentlich sehr Syncron, und wenn du eine etwas krumme Quarzfrequenz wählst läßt sich das ganze auch meist ganzzahlig lösen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.