8795636ee213fef05e12abd34d1b8fd716b77290
[my-code/atmel.git] / monolyzer / main.asm
1 ; main file of the monolyzer project
2 ;
3 ; author: hackbard@hackdaworld.org
4 ;
5
6 ; device specific definition file
7 .include "../include/tn2313def.inc"
8
9 ; defines
10 .def    zero            = r1
11 .def    one             = r2
12 .def    tmp1            = r16
13 .def    tmp2            = r17
14 .def    uart_rxtx       = r18
15 .def    count           = r19
16 .def    state           = r20
17 .def    scount          = r21
18
19 ;
20 ; interrupts
21 ;
22
23 ; RESET
24 rjmp INIT
25
26 ; INT0
27 rjmp INT0_IR
28
29 ; INT1
30 reti
31
32 ; T1 CAPT1
33 reti
34
35 ; T1 COMP A
36 reti
37
38 ; T1 OVF1
39 rjmp T1_OVF_IR
40
41 ; T0 OVF0
42 reti
43
44 ; UART RX
45 reti
46
47 ; UART UDRE
48 reti
49
50 ; UART TX
51 reti
52
53 ; ANA COMP
54 reti
55
56 ; PCINT
57 reti
58
59 ; T1 COMP B
60 reti
61
62 ; T0 COMP A
63 reti
64
65 ; T0 COMP B
66 reti
67
68 ; USI START
69 reti
70
71 ; USI OVF
72 reti
73
74 ; EE READY
75 reti
76
77 ; WDT OVF
78 reti
79
80 ;
81 ; init and main code
82 ;
83
84 RESET:
85 INIT:
86
87         ; gio port init
88         rcall PORT_INIT
89
90         ; timer1 init
91         rcall TIMER1_INIT
92
93         ; uart init
94         rcall UART_INIT
95
96         ; zero and one initialization
97         ldi tmp1,0
98         mov zero,tmp1
99         ldi tmp1,1
100         mov one,tmp1
101
102         ; set stackpointer
103         ldi tmp1,low(RAMEND)
104         out SPL,tmp1
105
106         ; more init
107         ldi count,0
108         ldi state,0
109
110         ; storage pointer
111         ldi ZL,low(STORAGE)
112         ldi ZH,high(STORAGE)
113
114         ldi scount,0
115         ldi tmp1,0x23
116 INIT_STORAGE:
117         ; init storage
118         st Z+,tmp1
119         st Z+,tmp1
120         add scount,one
121         cpi scount,55
122         brne INIT_STORAGE
123
124         ; storage pointer again
125         ldi ZL,low(STORAGE)
126         ldi ZH,high(STORAGE)
127
128         ; signal ready output
129         ldi uart_rxtx,0x72
130         rcall UART_TX
131
132 DEBUG_PORT:
133         ;rcall UART_RX
134         ;ldi uart_rxtx,0x30
135         ;in tmp1,PIND
136         ;sbrc tmp1,2
137         ;ldi uart_rxtx,0x31
138         ;rcall UART_TX
139         ;rjmp DEBUG_PORT
140
141         ; external interrupt enable
142         rcall INT0_IR_CONF_INIT
143         rcall INT0_IR_ENABLE
144
145         ; global interrupt enable
146         sei 
147
148 MAIN:
149
150 SAMPLE:
151
152         ; sample as long as there is storage capacity and signal
153         cpi state,2
154         brne SAMPLE
155
156         ; disable interrupts
157         rcall INT0_IR_DISABLE
158         rcall TIMER1_INT_DISABLE
159
160         ; signal finish
161         ldi uart_rxtx,0x66
162         rcall UART_TX
163
164 IDLE:
165
166         ; wait for commands via uart
167         rcall UART_RX
168
169         ; decode instruction
170         cpi uart_rxtx,0x52
171         breq RESET
172         cpi uart_rxtx,0x54
173         breq TRANSFER
174
175         rjmp IDLE
176
177 TRANSFER:
178
179         ; reset storage pointer
180         ldi ZL,low(STORAGE)
181         ldi ZH,high(STORAGE)
182         ldi scount,1
183
184         ; transmit number of sampled words
185         mov uart_rxtx,count
186         rcall UART_TX
187
188 TRANSFER_LOOP:
189
190         ; send data and counter
191         ld uart_rxtx,Z+
192         rcall UART_TX
193         ld uart_rxtx,Z+
194         rcall UART_TX
195
196         ; count sent data
197         add scount,one
198
199         ; check amount of data
200         cpi scount,56
201         breq IDLE
202
203         rjmp TRANSFER_LOOP
204
205 ; include subroutines
206 .include "port.asm"
207 .include "timer.asm"
208 .include "uart.asm"
209
210 ;
211 ; interrupt routines
212 ;
213
214 INT0_IR:
215
216         ; debug output
217         ; cbi PORTD,3
218
219         ; get timer value
220         in tmp1,TCNT1L
221         in tmp2,TCNT1H
222
223         ; check for initial or running state
224         cpi state,0
225         brne INT0_RUN
226
227         ; configure interrupt for running state
228         rcall INT0_IR_CONF_RUN
229         ldi state,1
230
231         ; reset timer and start ovf interrupt
232         ldi tmp1,0
233         out TCNT1H,tmp1
234         out TCNT1L,tmp1
235         rcall TIMER1_INT_ENABLE
236
237         rjmp EXIT_IR
238
239 INT0_RUN:
240
241         ; write timer value into sram
242         st Z+,tmp2
243         st Z+,tmp1
244
245         ; inc counter
246         add count,one
247         
248         ; reset timer
249         ldi tmp1,0
250         out TCNT1H,tmp1
251         out TCNT1L,tmp1
252
253         ; check for left capacity
254         cpi count,55
255         brne EXIT_IR
256
257         ; indicate end of 'c'apacity
258         ldi uart_rxtx,0x63
259         rcall UART_TX
260
261         ; exit sampling
262         ldi state,2
263
264 EXIT_IR:
265
266         ; debug output
267         ; sbi PORTD,3
268
269         reti
270
271 T1_OVF_IR:
272
273         ; indicate 'o'verflow end
274         ldi uart_rxtx,0x6f
275         rcall UART_TX
276
277         ; exit sampling
278         ldi state,2
279
280         reti
281
282
283 ;
284 ; sram
285 ;
286
287 .dseg
288
289 STORAGE: .byte 110
290