1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
|
/*
* 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,0x10
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
mov r17,Spalte
lsl Spalte
sbrc Spalte,5
mov r16,Stunde
sbrc Spalte,6
mov r16,Minute
sbrs Spalte,7
rjmp anzeigen
mov r16,Sekunde
ldi Spalte,0x10
inc TicsL
brne anzeigen
inc TicsH
anzeigen:
com r16
sbrs Spalte,5
rjmp nach_Funkeinfuegung
sbr r16,0xe0
sbrc Status,0
cbr r16,0x80
sbrc Status,1
cbr r16,0x40
sbrc Status,2
cbr r16,0x20
nach_Funkeinfuegung:
com r17
cbr r17,0x83
out PORTB,r16
out PORTD,r17
pop r17
pop r16
out SREG,r16
pop r16
reti
|