Hallo,
ich bin gerade dabei meine erste Funkuhr zu bauen, dabei habe ich nun
ein ein Problem mit dem DCF Code von Pit hier aus dem Forum. Ich hoffe
ihr könnt mir weiterhelfen.
Hier erstmal der Code, also der DCF teil der rest dürfte uninteressant
sein.
DCF77TAL: .BYTE 1 ;LOW(NEWTIME) DCF77 Pointer auf NEWTIME Low
124
DCF77TAH: .BYTE 1 ;HIGH(NEWTIME) DCF77 Pointer auf NEWTIME High
125
HSEK: .BYTE 1 ;RTC verwaltet BCD 1/100 Sekunde
126
SEK: .BYTE 1 ;RTC verwaltet BCD Sekunde
127
MIN: .BYTE 1 ;RTC verwaltet BCD Minute
128
STU: .BYTE 1 ;RTC verwaltet BCD Stunde
129
TAG: .BYTE 1 ;RTC verwaltet BCD Tag
130
WTAG: .BYTE 1 ;RTC verwaltet BCD Wochentag
131
MON: .BYTE 1 ;RTC verwaltet BCD Monat
132
JHR: .BYTE 1 ;RTC verwaltet BCD Jahr
So dieser Code wird per Interrupt alle 10 mSek aufgerufe. Empfangen habe
ich auch schon was indem ich mal NEWTIME auf das LCD ausgegeben habe ,
also sollte Harwaremäßig alles OK sein. Nun müsste doch sobald die Zeit
richtig erkannt wurde diese auf die Adresssen Min bis JHR gespeichert
werden. Wenn ich diese auslese bekomme ich jedoch nur müll.
Was ist falsch oder wie bekomme ich die Zeitdaten in den Speicher??
Auslesen tue ich eine Speicherstelle so:
LDI ZL, LOW(STU)
LDI ZH, HIGH(STU)
ld temp1, Z
Und die Init wird auch am Anfange aufgerufen.
MfG
Hallo
hast du daran gedacht, das die Werte BCD-kodiert sind ?
Du must den Wert als HEX ausgeben, um die richtige Anzeige zu bekommen.
>Auslesen tue ich eine Speicherstelle so:> LDI ZL, LOW(STU)> LDI ZH, HIGH(STU)> ld temp1, Z
was für ein Aufwand!
lds templ,STU
es sei denn du willst nacheinander mehrere Werte lesen
LDI ZL, LOW(SEK)
LDI ZH, HIGH(SEK)
ld temp1, Z+ ;Sekunde
...
ld temp1, Z+ ;Minute
...
ld temp1, Z+ ;Stunde
...
dann würde man wieder Zeit und Speicher sparen
Sascha
Hallo,
ich habe nun den Fehler gefunden kann ihn mir aber leider noch nicht
erklären.
Wenn ich die Zeile für die Fehlererkennug auskommentiere bekomme ich die
richtigen Zeitdaten:
1
dcf77_11: cpi r22,$3a ;58 DCF77-Bits erfasst?
2
brne dcf77_init ;unvollständig -> dcf77_init
3
andi r21,$81
4
>>> ;brne dcf77_init ;Fehlerstatus -> dcf77_init
5
6
ldi r20,6 ;Erfolgreicher Empfang:
7
ld r21,Z ;BCD-Zeitinformation
8
dcf77_12:
9
std Z+11,r21 ;nach MIN...JHR sichern
10
ld r21,-Z
11
dec r20
12
brne dcf77_12
13
std Z+11,r20 ;Sek. = 0 setzen
14
std Z+10,r20 ;1/100 Sek. = 0 setzen
Kan mir das ganze bloß noch nicht erklären wo ein Fehler erkannt wird wo
keiner ist da die Zeit richtig angezeigt wird.
Wäre toll wenn mal jemnd drüber schauen könnte weil ich bin langsam am
verzweifeln!!!
Ach ja ich habe den ATmega8 mit 8MHz getaktet das sollte doch aber
ncihts ausmachen solange der Interrupt stimmt?? Oder?