diff options
-rw-r--r-- | Binaeruhr.asm | 334 |
1 files changed, 167 insertions, 167 deletions
diff --git a/Binaeruhr.asm b/Binaeruhr.asm index 9a18a11..8d7eb53 100644 --- a/Binaeruhr.asm +++ b/Binaeruhr.asm @@ -1,167 +1,167 @@ -/*
- * Fernbedienung.asm
- *
- * Created: 08.10.2015 14:35:11
- * 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
-
- rjmp RESET
- reti
- 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)
- ldi r16,0x09
- out TCCR1B,r16 ; no prescaler
- ldi r16,0x40
- 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 Spalte,1
- ldi r16,0x12
- mov Stunde,r16
- ldi r16,0x34
- mov Minute,r16
- ldi r16,0x56
- mov Sekunde,r16
-
- ldi nTicsL,100
-
- sei
-
-main_loop:
- cp nTicsL,TicsL
- brcc main_loop
- mov r16,nTicsL
- subi r16,0x80
- mov r17,TicsL
- subi r17,0x80
- cp r16,r17
- brcc main_loop
-
-neue_Sekunde:
-
- ldi r16,100
- add nTicsL,r16
-
- sbis PIND,2
- rjmp neue_Stunde
- sbis PIND,3
- rjmp neue_Minute
-
- inc Sekunde
- mov r16,Sekunde
- cpi r16,60
- brcs main_loop
-
-neue_Minute:
-
- clr Sekunde
- inc Minute
- mov r16,Minute
- cpi r16,60
- brcs main_loop
-
-neue_Stunde:
-
- clr Sekunde
- clr Minute
- inc Stunde
- mov r16,Stunde
- cpi r16,24
- brcs main_loop
-
- clr Stunde
-
- rjmp main_loop
-
-TIMER1COMPA:
- push r16
- in r16,SREG
- push r16
- push r17
- ldi r17,0x7c
- out PORTD,r17
-
- inc Spalte
- cpi Spalte,2
- brne nicht_Stunde_Anzeigen
- ldi r17,0x60
- mov r16,Stunde
- rjmp anzeigen
-nicht_Stunde_Anzeigen:
- cpi Spalte,3
- brne nicht_Minute_Anzeigen
- ldi r17,0x50
- mov r16,Minute
- rjmp anzeigen
-nicht_Minute_Anzeigen:
- ldi r17,0x30
- mov r16,Sekunde
- subi Spalte,3
- inc TicsL
- brne anzeigen
- inc TicsH
-anzeigen:
- com r16
- sbr r16,0x80
- sbic PIND,1
- cbr r16,0x80
- ori r17,0x0c
- out PORTB,r16
- out PORTD,r17
- pop r17
- pop r16
- out SREG,r16
- pop r16
- reti
+/* + * Fernbedienung.asm + * + * Created: 08.10.2015 14:35:11 + * 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 + + rjmp RESET + reti + 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) + ldi r16,0x09 + out TCCR1B,r16 ; no prescaler + ldi r16,0x40 + 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 Spalte,1 + ldi r16,0x12 + mov Stunde,r16 + ldi r16,0x34 + mov Minute,r16 + ldi r16,0x56 + mov Sekunde,r16 + + ldi nTicsL,100 + + sei + +main_loop: + cp nTicsL,TicsL + brcc main_loop + mov r16,nTicsL + subi r16,0x80 + mov r17,TicsL + subi r17,0x80 + cp r16,r17 + brcc main_loop + +neue_Sekunde: + + ldi r16,100 + add nTicsL,r16 + + sbis PIND,2 + rjmp neue_Stunde + sbis PIND,3 + rjmp neue_Minute + + inc Sekunde + mov r16,Sekunde + cpi r16,60 + brcs main_loop + +neue_Minute: + + clr Sekunde + inc Minute + mov r16,Minute + cpi r16,60 + brcs main_loop + +neue_Stunde: + + clr Sekunde + clr Minute + inc Stunde + mov r16,Stunde + cpi r16,24 + brcs main_loop + + clr Stunde + + rjmp main_loop + +TIMER1COMPA: + push r16 + in r16,SREG + push r16 + push r17 + ldi r17,0x7c + out PORTD,r17 + + inc Spalte + cpi Spalte,2 + brne nicht_Stunde_Anzeigen + ldi r17,0x60 + mov r16,Stunde + rjmp anzeigen +nicht_Stunde_Anzeigen: + cpi Spalte,3 + brne nicht_Minute_Anzeigen + ldi r17,0x50 + mov r16,Minute + rjmp anzeigen +nicht_Minute_Anzeigen: + ldi r17,0x30 + mov r16,Sekunde + subi Spalte,3 + inc TicsL + brne anzeigen + inc TicsH +anzeigen: + com r16 + sbr r16,0x80 + sbic PIND,1 + cbr r16,0x80 + ori r17,0x0c + out PORTB,r16 + out PORTD,r17 + pop r17 + pop r16 + out SREG,r16 + pop r16 + reti |