somehow t1_overflow is not executed properly ...
[my-code/atmel.git] / thermo / thermo.asm
1 ;
2 ; thermo - getting temperature using analog comparator
3 ;
4 ; author: hackbard@hackdaworld.org
5 ;
6
7 ; specify device
8 .include "../include/tn2313def.inc"
9
10 ;
11 ; interrupts
12 ;
13
14 ; RESET
15 rjmp INIT
16
17 ; INT0
18 reti
19
20 ; INT1
21 reti
22
23 ; T1 CAPT1
24 reti
25
26 ; T1 COMP A
27 reti
28
29 ; T1 OVF1
30 rjmp T1_OVERFLOW
31
32 ; T0 OVF0
33 reti
34
35 ; UART RX
36 reti
37
38 ; UART UDRE
39 reti
40
41 ; UART TX
42 reti
43
44 ; ANA COMP
45 rjmp ANA_COMP
46
47 ; PCINT
48 reti
49
50 ; T1 COMP B
51 reti
52
53 ; T0 COMP A
54 reti
55
56 ; T0 COMP B
57 reti
58
59 ; USI START
60 reti
61
62 ; USI OVF
63 reti
64
65 ; EE READY
66 reti
67
68 ; WDT OVF
69 reti
70
71 ;
72 ; init function
73 ;
74
75 INIT:
76
77         ; stackpointer
78         ldi r16,low(RAMEND)
79         out SPL,r16
80
81         ; zero to register 0
82         ldi r17,0
83         mov r0,r17
84
85         ; uart init
86         UART_INIT:
87
88                 ldi r16,51 ; 9k6 bps @ 8mhz
89                 out UBRRL, r16
90                 out UBRRH, r0
91
92                 ldi r16,(1<<UCSZ0)|(1<<UCSZ1) ; 8n1
93                 out UCSRC,r16;
94
95                 sbi UCSRB,TXEN ; enable tx
96
97         ; timer init
98         TIMER_INIT:
99
100                 ; prescaler 64
101                 ldi r16,(1<<CS10)|(1<<CS11)
102                 out TCCR1B,r16
103
104         ; analog comparator init
105         ANA_COMP_INIT:
106
107                 ; interrupt if voltage is higher
108                 ; enable input capture function ot tc1
109                 ldi r16,(1<<ACIS0)|(1<<ACIS1)
110                 out ACSR,r16
111
112         ; output for rc element
113         RC_PIN_INIT:
114                 sbi DDRD,DDD2 ; pin 2 port d is output
115
116
117 MAIN:
118
119         ; print 'S'tart symbol via uart
120         ldi r17,0x53
121         sbis UCSRA,UDRE
122         rjmp MAIN
123         out UDR,r17
124
125         ; decharge rc pin
126         cbi PORTD,PORTD2
127
128         ; reset timer counter 1 and enable overflow interrupt
129         out TCNT1H,r0
130         out TCNT1L,r0
131         ldi r17,(1<<TOIE1)      
132         out TIMSK,r17
133
134         ; global interrupt enable
135         sei
136
137         ; loop forever
138         MAIN_LOOP:
139
140                 ldi r21,0
141                 WLOOP1:
142                         ldi r22,0
143                         WLOOP2:
144                                 inc r22
145                                 cpi r22,0xff
146                                 brne WLOOP2
147                         inc r21
148                         cpi r21,0xff
149                         brne WLOOP1
150
151                 ; tell the world 
152
153                 ; separate with a space
154                 ldi r17,0x20
155                 SPACE1:
156                         sbis UCSRA,UDRE
157                         rjmp SPACE1
158                         out UDR,r17
159
160                 ; aco status
161                 ldi r17,0x30
162                 sbic ACSR,ACO
163                 ldi r17,0x31
164                 ACO_STAT:
165                         sbis UCSRA,UDRE
166                         rjmp ACO_STAT
167                         out UDR,r17
168
169                 ; aci status
170                 ldi r17,0x30
171                 sbic ACSR,ACIE
172                 ldi r17,0x31
173                 ACI_STAT:
174                         sbis UCSRA,UDRE
175                         rjmp ACI_STAT
176                         out UDR,r17
177
178                 ; pin status
179                 ldi r17,0x30
180                 sbic PORTD,PORTD2
181                 ldi r17,0x31
182                 PIN_STAT:
183                         sbis UCSRA,UDRE
184                         rjmp PIN_STAT
185                         out UDR,r17
186
187                 ; ti status
188                 ldi r17,0x30
189                 in r23,TIMSK
190                 sbrc r23,TOIE1
191                 ldi r17,0x31
192                 TI_STAT:
193                         sbis UCSRA,UDRE
194                         rjmp TI_STAT
195                         out UDR,r17
196
197                 ; a space again for separation
198                 ldi r17,0x20
199                 SPACE2:
200                         sbis UCSRA,UDRE
201                         rjmp SPACE2
202                         out UDR,r17
203                 
204                 ; loop
205                 rjmp MAIN_LOOP
206
207 ;
208 ; analog comparator interrupt routine
209 ;
210
211 ANA_COMP:
212
213         ; immediately disable the analog comparator interrupt
214         cbi ACSR,ACIE
215
216         ; read the captured value
217         in r19,TCNT1L
218         in r18,TCNT1H
219
220         ; pull low the rc element
221         cbi PORTD,PORTD2
222
223         ; uart out
224         ANA_COMP_SEND:
225                 ldi r17,0x61
226                 sbis UCSRA,UDRE
227                 rjmp ANA_COMP_SEND
228                 out UDR,r17
229         LOOP_ONE:
230                 sbis UCSRA,UDRE
231                 rjmp LOOP_ONE
232                 out UDR,r18
233         LOOP_TWO:
234                 sbis UCSRA,UDRE
235                 rjmp LOOP_TWO
236                 out UDR,r19
237
238         ; reset timer counter
239         out TCNT1H,r0
240         out TCNT1L,r0
241
242         ; enable timer 1 overflow interrupt
243         in r17,TIMSK
244         sbr r17,TOIE1
245         out TIMSK,r17
246
247         reti
248
249 ;
250 ; timer 1 overflow interrupt function
251 ;
252
253 T1_OVERFLOW:
254
255         ; immediately disable timer 1 overflow interrupt
256         in r17,TIMSK
257         cbr r17,(1<<TOIE1)
258         out TIMSK,r17
259
260         ; uart debug out
261         ldi r17,0x4f
262         OVF_SEND:
263                 sbis UCSRA,UDRE
264                 rjmp OVF_SEND
265                 out UDR,r17
266
267         ; reset timer counter
268         out TCNT1H,r0
269         out TCNT1L,r0
270
271         ; enable analog comparator interrupt
272         sbi ACSR,ACIE
273
274         ; pull rc element high
275         sbi PORTD,PORTD2
276
277         reti
278