added thermo app
[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 rjmp T1_CAPTURE
25
26 ; T1 COMP A
27 reti
28
29 ; T1 OVF1
30 reti
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 reti
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 ; 9600 bps @ 8mhz
89                 out UBRRL, r16
90                 out UBRRH, r0
91
92                 ldi r16,(1<<UCSZ0)|(1<<UCSZ1) ; 8 data bits, no parity, 1 stop bit
93                 out UCSRC,r16;
94
95                 sbi UCSRB,TXEN ; enable tx
96
97         ; timer init
98         TIME_INIT:
99
100                 ldi r16,(1<<CS10)|(1<<CS11) ; prescaler 1/64
101                 out TCCR1B,r16
102
103                 ldi r16,(1<<ICIE1) ; enable input capture interrupt
104                 out TIMSK,r16
105
106         ; analog comparator init
107         ANA_COMP_INIT:
108
109                 ; interrupt if voltage is higher, enable input capture function ot tc1
110                 ldi r16,(1<<ACIS0)|(1<<ACIS0)|(1<<ACIC) ; (no analog comp interrupt!)
111                 out ACSR,r16
112
113         ; output for rc element
114         ldi r17,(1<<DDB2)
115         out DDRB,r17
116         out PORTB,r0
117
118         sei ; global interrupt enable
119
120 MAIN:
121         rjmp MAIN
122
123 ;
124 ; timer 1 input capture interrupt routine
125 ;
126
127 T1_CAPTURE:
128
129         ; disable input capture interrupt
130         in r17,TIMSK
131         cbr r17,ICIE1
132         out TIMSK,r17
133
134         ; pull low the rc element
135         cbi PORTB,PORTB2
136
137         ; read the captured value
138         in r19,ICR1L
139         in r18,ICR1H
140
141         ; uart out
142         LOOP_ONE:
143                 sbis UCSRA,UDRE
144                 rjmp LOOP_ONE
145                 out UDR,r18
146         LOOP_TWO:
147                 sbis UCSRA,UDRE
148                 rjmp LOOP_TWO
149                 out UDR,r19
150
151         ; enable timer 1 overflow interrupt
152         in r17,TIMSK
153         sbr r17,TOIE1
154         out TIMSK,r17
155
156         reti
157
158 ;
159 ; timer 1 overflow interrupt function
160 ;
161
162 T1_OVERFLOW:
163
164         ; disable timer 1 overflow interrupt
165         in r17,TOIE1
166         cbr r17,TOIE1
167         out TIMSK,r17
168
169         ; uart space out
170         ldi r17,0x20
171         LOOP_THREE:
172                 sbis UCSRA,UDRE
173                 rjmp LOOP_TWO
174                 out UDR,r17
175
176         ; reset timer counter
177         out TCNT1H,r0
178         out TCNT1L,r0
179
180         ; pull rc element high
181         sbi PORTB,PORTB2
182
183         ; enable input capture interrupt
184         in r17,TIMSK
185         sbr r17,ICIE1
186         out TIMSK,r17
187
188         reti
189