revised init, main + definitions
[my-code/atmel.git] / beginners / season_junior.asm
1 ; season - junior
2 ;
3 ; author: hackbard@hackdaworld.dyndns.org
4 ;
5
6
7 ; at90s2313
8 ; setup:
9 ; vcc card --- atmel vcc
10 ; vcc cam  --- 
11 ; rst cam  --- atmel int0 (pd2)
12 ; rst card --- atmel (pd4)
13 ; clk card -\ 
14 ;            -  atmel t1 (pd5)
15 ; clk cam  -/
16 ; gnd card --- gnd cam --- atmel gnd
17 ; i/o card --- atmel icp (pd6)
18 ; i/o cam  --- atmel int1 (pd3)
19
20 .include "../include/2313def.inc"
21
22 ; functions by now:
23 ;
24 ; stupid mode only by now. just see what cam/card do and redirect
25 ; this to card/cam.
26 ;
27 ; next implementation:
28
29 ; try to read one byte of card/cam communication and output via uart.
30 ; output time information in some way.
31 ;
32 ; future:
33 ;
34 ; buffer/parse whole strings and decide whether to send to card or not.
35
36 ; some defines
37 ; ------------
38
39 ; baudrate = clock freq / etu
40 ; std smartcard etu: 372
41 ; other smartcards: 625
42 .define clock 8000000
43 .define clk_h 4000000
44 .define etu 625
45 .define etu_h 312
46 .define baudrate 5 ; UBRR value for 76800 bits/s (8mhz clock)
47
48 ; names for registers
49 .define tmp r16
50 .define bitcount r17
51 .define tmp1 r18
52 .define tmp2 r19
53 .define byte r20
54 .define overflow_counter r21
55 .define one r1
56 .define zero r0
57
58
59 ;
60 ; programm code
61 ; -------------
62
63 ;
64 ; interrupt vectors:
65 ;
66
67 ; reset
68 rjmp INIT
69
70 ; int0
71 rjmp RST_CAM
72
73 ; int1
74 rjmp REC_CAM
75
76 ; timer/counter capt 1
77 rjmp REC_CARD
78
79 ; timer/counter compare
80 reti
81
82 ; timer/counter overflow 1
83 rjmp CLK_OVERFLOW
84
85 ; timer/counter overflow 0
86 reti
87
88 ; uart rx complete
89 reti
90
91 ; uart data register empty
92 rjmp UART_OUT
93
94 ; uart tx complete
95 reti
96
97 ; analog comparator
98 reti
99
100 ;
101 ; init routine
102 ;
103
104 INIT:
105
106 ; set stackpointer
107 ldi tmp,low(RAMEND)
108 out SPL,tmp
109
110 ; enable interrupts int0,int1
111 ldi tmp,((1<<INT0)|(1<<INT1))
112 out GIMSK,tmp
113 ; int0/1 setup
114 ldi tmp,((1<<ISC01)|(0<<ISC00)|(1<<ISC11)|(0<<ISC10))
115 out MCUCR,tmp
116
117 ; enable t/c overflow interrupt and icp
118 ldi tmp,((1<<TOIE1)|(1<<TICIE1))
119 out TIMSK,tmp
120 ; setup t/c and icp
121 ldi tmp,((1<<CS12)|(1<<CS11)|(1<<CS10)|(1<<ICNC1)|(1<<ICES1))
122 out TCCR1B,tmp
123
124 ; configure uart - interrupt enabled when i/o
125 ldi tmp,baudrate
126 out UBRR,tmp
127 sbi UCR,TXEN
128
129 ; init registers
130 ldi bitcounter,0 
131 ldi byte,0
132 ldi overflow_counter,0
133 ldi tmp1,0
134 ldi tmp2,0 
135 ldi tmp,1
136 mov one,tmp
137 ldi tmp,0
138 mov zero,tmp
139
140 ; enable interrupts (global)
141 sei
142
143 ; jump to mainloop
144 rjmp MAIN
145
146 ;
147 ; main routine
148 ;
149
150 MAIN:
151
152 rjmp MAIN
153
154 ;
155 ; rec_card routines
156 ;
157
158 REC_CARD:
159
160 ; decide what to do
161 sbic PORTD,PD6
162 rjmp REC_CARD_HIGH
163 rjmp REC_CARD_LOW
164
165 REC_CARD_HIGH:
166
167 ; save counter
168 in r24,ICR1L
169 in r25,ICR1H
170
171 ; output high on port to cam
172 sbi PORTD,PD3
173
174 ; toggle icp sense
175 cbi TCCR1B,ICES1
176 ;in r16,TCCR1B
177 ;cbr r16,ICES1
178 ;out TCCR1B,r16
179
180 ; status tu submit
181 ldi r26,1
182
183 ; enable uart dre interrupt
184 sbi UCR,UDRIE
185
186 reti
187
188 REC_CARD_LOW:
189
190 ; save counter
191 in r27,ICR1L
192 in r28,ICR1H
193
194 ; output low on port to cam
195 cbi PORTD,PD3
196
197 ; toggle icp sense
198 sbi TCCR1B,ICES1
199
200 ; status to submit
201 ldi r26,0
202
203 ; enable uart dre interrupt
204 sbi UCR,UDRIE
205
206 reti
207
208 ;
209 ; rec_cam routines
210 ;
211
212 REC_CAM:
213
214 ; decide what to do
215 sbic PORTD,PD3
216 rjmp REC_CAM_HIGH
217 rjmp REC_CAM_LOW
218
219 REC_CAM_HIGH:
220
221 ; output high on port to card
222 sbi PORTD,PD6
223
224 ; toggle int1 sense
225 in r16,MCUCR
226 cbr r16,ISC10
227 out MCUCR,r16
228
229 reti
230
231 REC_CAM_LOW:
232
233 ; output low on port to card
234 cbi PORTD,PD6
235
236 ; toggle int 1 sense
237 in r16,MCUCR
238 sbr r16,ISC10
239 out MCUCR,r16
240
241 reti
242
243 ;
244 ; t1_overflow routine
245 ;
246
247 T1_OVERFLOW:
248
249 add r22,r1 ; inc counter overflow register
250
251 reti
252
253 ;
254 ; rst_cam routine
255 ;
256
257 RST_CAM:
258
259 ; decide what to do
260 sbic PORTD,PD2
261 rjmp RST_CAM_HIGH
262 rjmp RST_CAM_LOW
263
264 RST_CAM_HIGH:
265
266 ; output high on rst port to card
267 sbi PORTD,PD4
268
269 ; toggle int0 sense
270 in r16,MCUCR
271 cbr r16,ISC00
272 out MCUCR,r16
273
274 reti
275
276 RST_CAM_LOW:
277
278 ; output low on rst port to cam
279 cbi PORTD,PD4
280
281 ; toggle int0 sense
282 in r16,MCUCR
283 sbr r16,ISC00
284 out MCUCR,r16
285
286 reti
287
288 ;
289 ; uart_out routines
290 ;
291
292 UART_OUT:
293
294 ;
295 ; hier weiter ...
296 ;