summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Binaeruhr.asm109
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