diff options
-rw-r--r-- | Binaeruhr.asm | 178 |
1 files changed, 89 insertions, 89 deletions
diff --git a/Binaeruhr.asm b/Binaeruhr.asm index 264b69e..59e2a22 100644 --- a/Binaeruhr.asm +++ b/Binaeruhr.asm @@ -1,23 +1,23 @@ /* - * Fernbedienung.asm - * - * Created: 08.10.2015 14:35:11 - * Author: Erich - */ + * Binaeruhr.asm + * + * Created: 09.11.2020 + * Author: Erich + */ .INCLUDE "tn2313def.inc" -.EQU Spalte, 31 ; die anzuzeigende Spalte (als Bitmaske fuer PORTD) -.EQU TicsH, 30 ; 300Hz-Tics High -.EQU TicsL, 29 ; 300Hz-Tics Low -.EQU nTicsL, 28 ; wann ist die naechste Sekunde gemessen in 300Hz-Tics Low -.EQU Status, 27 ; Bit 0: Funksignal - ; Bit 1: kein Fehler im aktuellen Empfang - ; Bit 2: kein Fehler in der aktuellen oder letzten Minute -.EQU lHTicsL, 26 ; wann war die letzte Funk Low-High-Flanke in 300Hz-Tics Low -.EQU Stunde, 0 ; anzuzeigende Stunde -.EQU Minute, 1 ; anzuzeigende Minute -.EQU Sekunde, 2 ; anzuzeigende Sekunde +.EQU Spalte, 31 ; die anzuzeigende Spalte (als Bitmaske fuer PORTD) +.EQU TicsH, 30 ; 300Hz-Tics High +.EQU TicsL, 29 ; 300Hz-Tics Low +.EQU nTicsL, 28 ; wann ist die naechste Sekunde gemessen in 300Hz-Tics Low +.EQU Status, 27 ; Bit 0: Funksignal + ; Bit 1: kein Fehler im aktuellen Empfang + ; Bit 2: kein Fehler in der aktuellen oder letzten Minute +.EQU lHTicsL, 26 ; wann war die letzte Funk Low-High-Flanke in 300Hz-Tics Low +.EQU Stunde, 0 ; anzuzeigende Stunde +.EQU Minute, 1 ; anzuzeigende Minute +.EQU Sekunde, 2 ; anzuzeigende Sekunde .EQU Funk0, 3 .EQU Funk1, 4 .EQU Funk2, 5 @@ -27,53 +27,53 @@ .EQU Funk6, 9 .EQU Funk7, 10 - rjmp RESET - reti - reti - reti - rjmp TIMER1COMPA ; Timer1 Compare Match A - reti - reti - reti - reti + rjmp RESET reti - reti - reti - reti - reti - reti - reti - reti - - RESET: - ldi r16,lo8(RAMEND) ; Stackpointer initialisieren - out SPL,r16 - - ldi r16,0x80 - out CLKPR,r16 - ldi r16,0x00 - out CLKPR,r16 ; System-Vorteiler auf 1 - - ldi r16,0x00 - out WDTCSR,r16 ; Watchdog aus + reti + reti + rjmp TIMER1COMPA ; Timer1 Compare Match A + reti + reti + reti + reti + reti + reti + reti + reti + reti + reti + reti + reti + + RESET: + ldi r16,lo8(RAMEND) ; Stackpointer initialisieren + out SPL,r16 + + ldi r16,0x80 + out CLKPR,r16 + ldi r16,0x00 + out CLKPR,r16 ; System-Vorteiler auf 1 + + ldi r16,0x00 + out WDTCSR,r16 ; Watchdog aus ldi r17,0xd0 ldi r16,0x55 out OCR1AH,r17 - out OCR1AL,r16 ; TimerB bis 0xd055 laufen lassen (= 300 Hz) + out OCR1AL,r16 ; TimerB bis 0xd055 laufen lassen (= 300 Hz) ldi r16,0x09 - out TCCR1B,r16 ; no prescaler + out TCCR1B,r16 ; no prescaler ldi r16,0x40 - out TIMSK,r16 ; Counter1 Output Compare A Match Interrupt Enable + out TIMSK,r16 ; Counter1 Output Compare A Match Interrupt Enable - ldi r16,0x55 - out PORTB,r16 ; Muster auf PORTB (Zeilen) - ldi r16,0x7c - out PORTD,r16 ; 2x n.d., 2x Pull-up (Taster), Muster auf Spalten - ldi r16,0xff - out DDRB,r16 ; Ausgänge: PORTB (Zeilen) - ldi r16,0x70 - out DDRD,r16 ; Ausgänge: PORTD4..6 (Spalten) + ldi r16,0x55 + out PORTB,r16 ; Muster auf PORTB (Zeilen) + ldi r16,0x7c + out PORTD,r16 ; 2x n.d., 2x Pull-up (Taster), Muster auf Spalten + ldi r16,0xff + out DDRB,r16 ; Ausgänge: PORTB (Zeilen) + ldi r16,0x70 + out DDRD,r16 ; Ausgänge: PORTD4..6 (Spalten) ldi Spalte,0x10 ldi r16,0x12 @@ -95,9 +95,9 @@ main_loop: low_high_Funkflanke: mov r16,TicsL - sub r16,lHTicsL ; die gemessene "low" Zeit ist der Abstand der letzten lh-Flanke + 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 + brcc Funkfehler ; "low" > 2050ms -- hierzu ist *keine* Flanke vonnöten sbis PIND,1 rjmp nach_Funkflanke @@ -106,22 +106,22 @@ low_high_Funkflanke: mov lHTicsL,TicsL cpi r16,95 - brcs Funkfehler ; "low" < 950ms + brcs Funkfehler ; "low" < 950ms cpi r16,105 - brcs neue_Funksekunde ; 950ms < "low" < 1050ms (= normale Sekunde) + brcs neue_Funksekunde ; 950ms < "low" < 1050ms (= normale Sekunde) cpi r16,195 - brcs Funkfehler ; 1050ms < "low" < 1950ms + brcs Funkfehler ; 1050ms < "low" < 1950ms rjmp neue_Funkminute high_low_Funkflanke: mov r16,TicsL - sub r16,lHTicsL ; 10 vs. 20 ( = 100ms vs. 200ms) + sub r16,lHTicsL ; 10 vs. 20 ( = 100ms vs. 200ms) cpi r16,26 - brcc Funkfehler ; high > 250ms -- hierzu ist *keine* Flanke vonnöten + brcc Funkfehler ; high > 250ms -- hierzu ist *keine* Flanke vonnöten sbic PIND,1 rjmp nach_Funkflanke @@ -129,7 +129,7 @@ high_low_Funkflanke: cbr Status,0x01 cpi r16,5 - brcs Funkfehler ; high < 50ms + brcs Funkfehler ; high < 50ms com r16 cpi r16,240 @@ -142,7 +142,7 @@ high_low_Funkflanke: ror Funk1 ror Funk0 - sbrs Funk0,3 ; zu viele Bits + sbrs Funk0,3 ; zu viele Bits rjmp nach_Funkflanke Funkfehler: @@ -167,11 +167,11 @@ neue_Funksekunde: rjmp nach_Funkflanke mov r16,nTicsL - sub r16,TicsL ; wie viele TicsL bis zur nächsten Sekunde (nach Quarz) - mov nTicsL,TicsL ; wir setzen es auf "jetzt" - cpi r16,50 ; wurde die Sekunde durch den Quarz schon gezählt? - brcs nach_Funkflanke ; branch, wenn "noch nicht gezählt" - subi nTicsL,(256-100) ; wir setzen es jetz auf "in 100 TicsL" + sub r16,TicsL ; wie viele TicsL bis zur nächsten Sekunde (nach Quarz) + mov nTicsL,TicsL ; wir setzen es auf "jetzt" + cpi r16,50 ; wurde die Sekunde durch den Quarz schon gezählt? + brcs nach_Funkflanke ; branch, wenn "noch nicht gezählt" + subi nTicsL,(256-100) ; wir setzen es jetz auf "in 100 TicsL" nach_Funkflanke: @@ -203,21 +203,21 @@ neue_Sekunde: neue_Funkminute: bst Status,1 - sbr Status,0x02 ; der nächstminütige Empfang ist bisher ok + sbr Status,0x02 ; der nächstminütige Empfang ist bisher ok - brtc Funk_initialisieren ; die letzte Minute enthielt schon Fehler - sbrs Funk0,4 ; Bit -1: Start-bit da? + brtc Funk_initialisieren ; die letzte Minute enthielt schon Fehler + sbrs Funk0,4 ; Bit -1: Start-bit da? rjmp Funk_initialisieren - sbrc Funk0,5 ; Bit 0: 2.Start-bit da? + sbrc Funk0,5 ; Bit 0: 2.Start-bit da? rjmp Funk_initialisieren - mov r16,Funk2 ; Bits 11..18 + mov r16,Funk2 ; Bits 11..18 lsr r16 eor r16,Funk2 - sbrs r16,6 ; Bit 17 xor Bit 18 -> ME(S)Z ok? + sbrs r16,6 ; Bit 17 xor Bit 18 -> ME(S)Z ok? rjmp Funk_initialisieren - sbrs Funk3,1 ; Bit 20: Zeit-Start-bit + sbrs Funk3,1 ; Bit 20: Zeit-Start-bit rjmp Funk_initialisieren mov r16,Funk3 @@ -254,10 +254,10 @@ neue_Funkminute: clr Sekunde - sbr Status,0x04 ; die empfangene Minute ist ok + sbr Status,0x04 ; die empfangene Minute ist ok mov nTicsL,TicsL - subi nTicsL,(256-100) ; die nächste Sekunde startet in genau 100 TicsL + subi nTicsL,(256-100) ; die nächste Sekunde startet in genau 100 TicsL neue_Funkminute_Ende: rjmp Funk_initialisieren @@ -284,14 +284,14 @@ neue_Stunde: neuer_Tag: clr Stunde - + rjmp main_loop TIMER1COMPA: - push r16 - in r16,SREG - push r16 - push r17 + push r16 + in r16,SREG + push r16 + push r17 ldi r17,0x7c out PORTD,r17 @@ -323,13 +323,13 @@ nach_Funkeinfuegung: cbr r17,0x83 out PORTB,r16 out PORTD,r17 - pop r17 - pop r16 - out SREG,r16 - pop r16 + pop r17 + pop r16 + out SREG,r16 + pop r16 reti -bcd_to_bin: ; input/output: r18; tmp: r19 +bcd_to_bin: ; input/output: r18; tmp: r19 mov r19,r18 cbr r18,0xf0 swap r19 @@ -341,7 +341,7 @@ bcd_to_bin: ; input/output: r18; tmp: r19 add r18,r19 ret -checksum: ; input: r18; tmp: r19; output: T-Flag +checksum: ; input: r18; tmp: r19; output: T-Flag mov r19,r18 swap r19 eor r18,r19 |