diff options
-rw-r--r-- | Binaeruhr.asm | 109 |
1 files changed, 106 insertions, 3 deletions
diff --git a/Binaeruhr.asm b/Binaeruhr.asm index 97ff878..4b4fad9 100644 --- a/Binaeruhr.asm +++ b/Binaeruhr.asm @@ -18,6 +18,14 @@ .EQU Stunde, 0 ; anzuzeigende Stunde .EQU Minute, 1 ; anzuzeigende Minute .EQU Sekunde, 2 ; anzuzeigende Sekunde +.EQU Funk0, 3 +.EQU Funk1, 4 +.EQU Funk2, 5 +.EQU Funk3, 6 +.EQU Funk4, 7 +.EQU Funk5, 8 +.EQU Funk6, 9 +.EQU Funk7, 10 rjmp RESET reti @@ -80,6 +88,79 @@ sei main_loop: + + bst Status,0 + brts high_low_Funkflanke + +low_high_Funkflanke: + + mov r16,TicsL + sub r16,lHTicsL ; die gemessene "low" Zeit ist der Abstand der letzten lh-Flanke + cpi r16,205 + brcc Funkfehler ; "low" > 2050ms -- hierzu ist *keine* Flanke vonnöten + + sbis PIND,1 + rjmp nach_Funkflanke + + sbr Status,0x01 + mov lHTicsL,TicsL + + cpi r16,95 + brcs Funkfehler ; "low" < 950ms + + cpi r16,105 + brcs nach_Funkflanke ; 950ms < "low" < 1050ms (= normale Sekunde) + + cpi r16,195 + brcs Funkfehler ; 1050ms < "low" < 1950ms + + rjmp neue_Funkminute + +high_low_Funkflanke: + + mov r16,TicsL + sub r16,lHTicsL ; 10 vs. 20 ( = 100ms vs. 200ms) + cpi r16,26 + brcc Funkfehler ; high > 250ms -- hierzu ist *keine* Flanke vonnöten + + sbic PIND,1 + rjmp nach_Funkflanke + + cbr Status,0x01 + + cpi r16,5 + brcs Funkfehler ; high < 50ms + + com r16 + cpi r16,240 + rol Funk7 + rol Funk6 + rol Funk5 + rol Funk4 + rol Funk3 + rol Funk2 + rol Funk1 + rol Funk0 + + sbrs Funk0,4 ; zu viele Bits + rjmp nach_Funkflanke + +Funkfehler: + cbr Status,0x06 + +Funk_initialisieren: + clr Funk0 + clr Funk1 + clr Funk2 + clr Funk3 + clr Funk4 + clr Funk5 + clr Funk6 + ldi r16,0x01 + mov Funk7,r16 + +nach_Funkflanke: + cp nTicsL,TicsL brcc main_loop mov r16,nTicsL @@ -102,7 +183,25 @@ neue_Sekunde: inc Sekunde mov r16,Sekunde cpi r16,60 - brcs main_loop + brcc neue_Minute + rjmp main_loop + +neue_Funkminute: + + bst Status,1 + sbr Status,0x02 ; der nächstminütige Empfang ist bisher ok + + brtc Funk_initialisieren ; die letzte Minute enthielt schon Fehler + sbrs Funk0,3 ; Start-bit da? + rjmp Funk_initialisieren + sbrc Funk0,2 ; 2.Start-bit da? + rjmp Funk_initialisieren + +; TODO: hier mehr checken + + sbr Status,0x04 ; die empfangene Minute ist ok + + rjmp Funk_initialisieren neue_Minute: @@ -110,7 +209,8 @@ neue_Minute: inc Minute mov r16,Minute cpi r16,60 - brcs main_loop + brcc neue_Stunde + rjmp main_loop neue_Stunde: @@ -119,7 +219,10 @@ neue_Stunde: inc Stunde mov r16,Stunde cpi r16,24 - brcs main_loop + brcc neuer_Tag + rjmp main_loop + +neuer_Tag: clr Stunde |