; Codeschnipsel ; Hauptprogramm, DCF77 auswerten, Uhrzeit setzen ;--------------------------------------------------- main: bst flags, 3 ; Beginn einer neuen Minute? brtc ma1060 ; nein -> weiter mit ma1060 cli ; Interrupts sperren ldi temp, 0b11110111 ; sonst Minuten-Flag loeschen and flags, temp ; in Flags speichern sei ; Interrupts wieder aktivieren rcall mdcprc ; DCF77-Auswertung tst r19 ; DCF77 ok? brne ma1060 ; nein -> weiter rcall mtsync ; sonst Uhr synchronisieren rjmp ma1060 ; ma1060: clr r19 ; Fehlerzaehler resetten clr r20 rjmp ma1070 ; ma1070: set bld flags, 2 ; Synchronisationsversuch-Flag setzen clt bld flags, 4 ; Datum ungueltig clr r19 ; Fehlerzaehler resetten clr r20 sbrc flags1, 1 ; Gangreserve-Bit in ISR gesetzt ? rcall nosync ; -> Gangreserve aufrufen, rjmp main ; sonst Schleife ; ;------------------------------------------------- ; DCF77-Auswertung, Kontrolle der Pruefbits 1-3, ; Ablegen der Zeitinformation in Puffer dcbuf1 ; Register: r18,r19,r20,r21,r22,r23,y,z ; Ausgang: r19=0 - alles ok, r19>0 - Fehler ;------------------------------------------------- ; ;- Kontrolle des Impulszaehlers und der Paritybits ; fuer Minuten, Stunden und Datum ; mdcprc: clr r19 ; Fehlerzaehler loeschen mov r21, dcfsec ; DCF77-Markenzaehler kopieren clr dcfsec ; DCF77-Markenzaehler loeschen cpi r21, 59 ; wurden 59 Impulse empfangen? breq mdc010 ; ja -> weiter inc r19 ; sonst Fehlerzaehler erhoehen rjmp mdc200 ; Auswertung vorzeitig beenden ; mdc010: clr r21 ; wird fuer Paritaetsber. benoetigt clr r22 ; Reset Zaehler fuer Paritaetsber. lds r23, dcftab+1 ; Byte 1 aus DCF77-Puffer0 holen ldi r20, 6 ; 6 Minuten-Bits auswerten ; mdc020: rol r23 ; relevantes Bit in Carry schieben adc r22, r21 ; Eins-Bit addieren dec r20 ; alle Bits ausgewertet? brne mdc020 ; nein -> Schleife lds r23, dcftab+2 ; Byte 2 aus DCF77-Puffer0 holen ror r23 ; relevantes Bit in Carry schieben adc r22, r21 ; Eins-Bit addieren ror r23 ; relevantes Bit in Carry schieben adc r22, r21 ; Eins-Bit addieren bst r22, 0 ; war das Ergebnis geradzahlig? brtc mdc030 ; ja -> weiter inc r19 ; sonst Fehlerzaehler erhoehen ; ;.....