new prescaler + debug outs
[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         ; status register
120         ldi r31,0
121
122         ; decharge rc pin
123         cbi PORTD,PORTD2
124
125         ; enable overflow interrupt
126         ldi r17,(1<<TOIE1)      
127         out TIMSK,r17
128
129         ; global interrupt enable
130         sei
131
132         ; loop forever
133         MAIN_LOOP:
134
135         ; loop
136         rjmp MAIN_LOOP
137
138 ;
139 ; analog comparator interrupt routine
140 ;
141
142 ANA_COMP:
143
144         ; immediately take away the clock
145         out TCCR1B,r0
146
147         ; disable comparator + del possible interrupt flag
148         cbi ACSR,ACIE
149
150         ; pull low the rc element
151         cbi PORTD,PORTD2
152
153         ; read the captured value
154         in r19,TCNT1L
155         in r18,TCNT1H
156
157         LOOP_ONE:
158                 sbis UCSRA,UDRE
159                 rjmp LOOP_ONE
160                 out UDR,r18
161         LOOP_TWO:
162                 sbis UCSRA,UDRE
163                 rjmp LOOP_TWO
164                 out UDR,r19
165
166         ; reset timer counter
167         out TCNT1H,r0
168         out TCNT1L,r0
169
170         ; clear possible overflow flag
171         ldi r17,(1<<TOV1)
172         out TIFR,r17
173
174         ; enable the counter
175         ldi r17,(1<<CS10)|(1<<CS11)
176         out TCCR1B,r17
177
178         reti
179
180 ;
181 ; timer 1 overflow interrupt function
182 ;
183
184 T1_OVERFLOW:
185
186         ; check whether second run
187         cpi r31,4
188         brne MARK_2ND_RUN
189
190         ; reset to a first run
191         ldi r31,0
192
193         ; enable analog comparator interrupt + del possible interrupt flags
194         sbi ACSR,ACIE
195         sbi ACSR,ACI
196
197         ; pull rc element high
198         sbi PORTD,PORTD2
199
200         reti
201
202         MARK_2ND_RUN:
203                 inc r31
204                 reti
205