1 ###############################################################################
\r
3 # IAR Atmel AVR C/C++ Compiler V4.30F/W32 12/Mar/2008 23:01:40 #
\r
4 # Copyright 1996-2007 IAR Systems. All rights reserved. #
\r
6 # Source file = C:\home\kevin\pub\src\bc100_cal\IAR\time.c #
\r
7 # Command line = C:\home\kevin\pub\src\bc100_cal\IAR\time.c #
\r
8 # --cpu=tiny861 -ms -o C:\home\kevin\pub\src\bc100_cal\IAR #
\r
9 # \Debug\Obj\ -lC C:\home\kevin\pub\src\bc100_cal\IAR\Debu #
\r
10 # g\List\ -lB C:\home\kevin\pub\src\bc100_cal\IAR\Debug\Li #
\r
11 # st\ --initializers_in_flash -z2 --no_cse --no_inline #
\r
12 # --no_code_motion --no_cross_call --no_clustering #
\r
13 # --no_tbaa --debug -DENABLE_BIT_DEFINITIONS -e #
\r
14 # --require_prototypes -I "C:\Program Files\IAR #
\r
15 # Systems\Embedded Workbench 4.0\avr\INC\" -I "C:\Program #
\r
16 # Files\IAR Systems\Embedded Workbench 4.0\avr\INC\CLIB\" #
\r
17 # --eeprom_size 512 #
\r
18 # List file = C:\home\kevin\pub\src\bc100_cal\IAR\Debug\List\time.lst #
\r
19 # Object file = C:\home\kevin\pub\src\bc100_cal\IAR\Debug\Obj\time.r90 #
\r
22 ###############################################################################
\r
24 C:\home\kevin\pub\src\bc100_cal\IAR\time.c
\r
25 1 /* This file has been prepared for Doxygen automatic documentation generation.*/
\r
26 2 /*! \file *********************************************************************
\r
29 5 * Functions for timing
\r
31 7 * Contains functions to initialize, set, poll and stop timers.
\r
33 9 * \par Application note:
\r
34 10 * AVR458: Charging Li-Ion Batteries with BC100 \n
\r
35 11 * AVR463: Charging NiMH Batteries with BC100
\r
37 13 * \par Documentation
\r
38 14 * For comprehensive code documentation, supported compilers, compiler
\r
39 15 * settings and supported devices see readme.html
\r
42 18 * Atmel Corporation: http://www.atmel.com \n
\r
43 19 * Support email: avr@atmel.com
\r
47 23 * $Revision: 2299 $
\r
49 25 * $URL: http://svn.norway.atmel.com/AppsAVR8/avr458_Charging_Li-Ion_Batteries_with_BC100/tag/20070904_release_1.0/code/IAR/time.c $
\r
50 26 * $Date: 2007-08-23 12:55:51 +0200 (to, 23 aug 2007) $\n
\r
51 27 ******************************************************************************/
\r
53 29 #include <ioavr.h>
\r
55 \ In segment ABSOLUTE, at 0x59
\r
56 \ <unnamed> volatile __io _A_TIMSK
\r
60 \ In segment ABSOLUTE, at 0x53
\r
61 \ <unnamed> volatile __io _A_TCCR0B
\r
65 \ In segment ABSOLUTE, at 0x35
\r
66 \ <unnamed> volatile __io _A_TCCR0A
\r
70 \ In segment ABSOLUTE, at 0x33
\r
71 \ <unnamed> volatile __io _A_OCR0A
\r
75 \ In segment ABSOLUTE, at 0x32
\r
76 \ <unnamed> volatile __io _A_OCR0B
\r
79 30 #include <inavr.h>
\r
81 32 #include "enums.h"
\r
83 34 #include "main.h"
\r
84 35 #include "time.h"
\r
87 38 //******************************************************************************
\r
89 40 //******************************************************************************
\r
91 \ In segment NEAR_Z, align 1, keep-with-next
\r
92 \ 00000000 REQUIRE `?<Segment init: NEAR_Z>`
\r
93 41 unsigned long timeval[TIMERS]; //!< Contains the values for each timer.
\r
97 43 // timer runs at 1 MHz and overflow will occur every 255 / 1 Mz ~= 0.25 ms
\r
98 44 //#pragma vector = TIM0_OVF_vect
\r
101 47 //******************************************************************************
\r
103 49 //******************************************************************************
\r
104 50 /*! \brief Interrupt service routine for timer 0 overflow
\r
106 52 * Timer 0 runs at 125 kHz and compare match will occur every millisecond
\r
107 53 * (125 / 125 kHz = 1.0 ms), which will result in a call to this function.
\r
108 54 * When called, this function will decrement the time left for each timer,
\r
109 55 * unless they are already at zero.
\r
111 57 #pragma vector = TIM0_COMPA_vect
\r
113 \ In segment CODE, align 2, keep-with-next
\r
114 58 __interrupt void TICK_ISR(void)
\r
117 \ 00000000 93FA ST -Y, R31
\r
118 \ 00000002 93EA ST -Y, R30
\r
119 \ 00000004 920A ST -Y, R0
\r
120 \ 00000006 937A ST -Y, R23
\r
121 \ 00000008 936A ST -Y, R22
\r
122 \ 0000000A 935A ST -Y, R21
\r
123 \ 0000000C 934A ST -Y, R20
\r
124 \ 0000000E 933A ST -Y, R19
\r
125 \ 00000010 932A ST -Y, R18
\r
126 \ 00000012 931A ST -Y, R17
\r
127 \ 00000014 930A ST -Y, R16
\r
128 \ 00000016 B60F IN R0, 0x3F
\r
129 60 unsigned char i;
\r
131 62 // 1 ms has passed, decrement all non-zero timers.
\r
132 63 for (i = 0; i < TIMERS; i++) {
\r
133 \ 00000018 E000 LDI R16, 0
\r
135 \ 0000001A 3004 CPI R16, 4
\r
136 \ 0000001C F540 BRCC ??TICK_ISR_1
\r
137 64 if(timeval[i] > 0) {
\r
138 \ 0000001E 2F20 MOV R18, R16
\r
139 \ 00000020 E030 LDI R19, 0
\r
140 \ 00000022 0F22 LSL R18
\r
141 \ 00000024 1F33 ROL R19
\r
142 \ 00000026 0F22 LSL R18
\r
143 \ 00000028 1F33 ROL R19
\r
144 \ 0000002A 01F9 MOVW R31:R30, R19:R18
\r
145 \ 0000002C .... SUBI R30, LOW((-(timeval) & 0xFFFF))
\r
146 \ 0000002E .... SBCI R31, (-(timeval) & 0xFFFF) >> 8
\r
147 \ 00000030 8140 LD R20, Z
\r
148 \ 00000032 8151 LDD R21, Z+1
\r
149 \ 00000034 8162 LDD R22, Z+2
\r
150 \ 00000036 8173 LDD R23, Z+3
\r
151 \ 00000038 2B45 OR R20, R21
\r
152 \ 0000003A 2B46 OR R20, R22
\r
153 \ 0000003C 2B47 OR R20, R23
\r
154 \ 0000003E F0A9 BREQ ??TICK_ISR_2
\r
156 \ 00000040 2F20 MOV R18, R16
\r
157 \ 00000042 E030 LDI R19, 0
\r
158 \ 00000044 0F22 LSL R18
\r
159 \ 00000046 1F33 ROL R19
\r
160 \ 00000048 0F22 LSL R18
\r
161 \ 0000004A 1F33 ROL R19
\r
162 \ 0000004C 01F9 MOVW R31:R30, R19:R18
\r
163 \ 0000004E .... SUBI R30, LOW((-(timeval) & 0xFFFF))
\r
164 \ 00000050 .... SBCI R31, (-(timeval) & 0xFFFF) >> 8
\r
165 \ 00000052 8140 LD R20, Z
\r
166 \ 00000054 8151 LDD R21, Z+1
\r
167 \ 00000056 8162 LDD R22, Z+2
\r
168 \ 00000058 8173 LDD R23, Z+3
\r
169 \ 0000005A 5041 SUBI R20, 1
\r
170 \ 0000005C 4050 SBCI R21, 0
\r
171 \ 0000005E 4060 SBCI R22, 0
\r
172 \ 00000060 4070 SBCI R23, 0
\r
173 \ 00000062 8340 ST Z, R20
\r
174 \ 00000064 8351 STD Z+1, R21
\r
175 \ 00000066 8362 STD Z+2, R22
\r
176 \ 00000068 8373 STD Z+3, R23
\r
180 \ 0000006A 9503 INC R16
\r
181 \ 0000006C CFD6 RJMP ??TICK_ISR_0
\r
184 \ 0000006E BE0F OUT 0x3F, R0
\r
185 \ 00000070 9109 LD R16, Y+
\r
186 \ 00000072 9119 LD R17, Y+
\r
187 \ 00000074 9129 LD R18, Y+
\r
188 \ 00000076 9139 LD R19, Y+
\r
189 \ 00000078 9149 LD R20, Y+
\r
190 \ 0000007A 9159 LD R21, Y+
\r
191 \ 0000007C 9169 LD R22, Y+
\r
192 \ 0000007E 9179 LD R23, Y+
\r
193 \ 00000080 9009 LD R0, Y+
\r
194 \ 00000082 91E9 LD R30, Y+
\r
195 \ 00000084 91F9 LD R31, Y+
\r
196 \ 00000086 9518 RETI
\r
199 71 /*! \brief Checks if a specified timer has expired
\r
201 73 * \param timer Specifies timer
\r
203 75 * \retval TRUE Timer still going.
\r
204 76 * \retval FALSE Timer has expired.
\r
207 \ In segment CODE, align 2, keep-with-next
\r
208 78 unsigned char Time_Left(unsigned char timer)
\r
211 \ 00000000 2F20 MOV R18, R16
\r
212 80 if(timeval[timer] > 0) {
\r
213 \ 00000002 2F02 MOV R16, R18
\r
214 \ 00000004 E010 LDI R17, 0
\r
215 \ 00000006 0F00 LSL R16
\r
216 \ 00000008 1F11 ROL R17
\r
217 \ 0000000A 0F00 LSL R16
\r
218 \ 0000000C 1F11 ROL R17
\r
219 \ 0000000E 01F8 MOVW R31:R30, R17:R16
\r
220 \ 00000010 .... SUBI R30, LOW((-(timeval) & 0xFFFF))
\r
221 \ 00000012 .... SBCI R31, (-(timeval) & 0xFFFF) >> 8
\r
222 \ 00000014 8140 LD R20, Z
\r
223 \ 00000016 8151 LDD R21, Z+1
\r
224 \ 00000018 8162 LDD R22, Z+2
\r
225 \ 0000001A 8173 LDD R23, Z+3
\r
226 \ 0000001C 2B45 OR R20, R21
\r
227 \ 0000001E 2B46 OR R20, R22
\r
228 \ 00000020 2B47 OR R20, R23
\r
229 \ 00000022 F011 BREQ ??Time_Left_0
\r
231 \ 00000024 E001 LDI R16, 1
\r
232 \ 00000026 9508 RET
\r
236 \ 00000028 E000 LDI R16, 0
\r
237 \ 0000002A 9508 RET
\r
242 88 /*! \brief Sets the specified timer
\r
244 90 * \param timer Specifies timer
\r
245 91 * \param min Minutes for timer to count down
\r
246 92 * \param sec Seconds for timer to count down
\r
247 93 * \param ms Milliseconds for timer to count down
\r
250 \ In segment CODE, align 2, keep-with-next
\r
251 95 void Time_Set(unsigned char timer, unsigned int min, unsigned char sec,
\r
253 96 unsigned char ms)
\r
255 \ 00000000 .... RCALL ?PROLOGUE7_L09
\r
256 \ 00000002 REQUIRE ?Register_R4_is_cg_reg
\r
257 \ 00000002 REQUIRE ?Register_R5_is_cg_reg
\r
258 \ 00000002 REQUIRE ?Register_R6_is_cg_reg
\r
259 \ 00000002 2FA0 MOV R26, R16
\r
260 \ 00000004 01C9 MOVW R25:R24, R19:R18
\r
261 \ 00000006 2E61 MOV R6, R17
\r
262 \ 00000008 2E44 MOV R4, R20
\r
263 98 // timeval[i] = 4 * (1000*(sec + 60*min) + ms); // about 4000 ticks per second
\r
264 99 // timeval[i] = 240000 * (unsigned long)min;
\r
265 100 // timeval[i] += 4000 * (unsigned long)sec;
\r
266 101 // timeval[i] += 4 * (unsigned long)ms;
\r
268 103 timeval[timer] = 60000 * (unsigned long)min;
\r
269 \ 0000000A 01AC MOVW R21:R20, R25:R24
\r
270 \ 0000000C E060 LDI R22, 0
\r
271 \ 0000000E E070 LDI R23, 0
\r
272 \ 00000010 E600 LDI R16, 96
\r
273 \ 00000012 EE1A LDI R17, 234
\r
274 \ 00000014 E020 LDI R18, 0
\r
275 \ 00000016 E030 LDI R19, 0
\r
276 \ 00000018 .... RCALL ?L_MUL_L03
\r
277 \ 0000001A 2F4A MOV R20, R26
\r
278 \ 0000001C E050 LDI R21, 0
\r
279 \ 0000001E 0F44 LSL R20
\r
280 \ 00000020 1F55 ROL R21
\r
281 \ 00000022 0F44 LSL R20
\r
282 \ 00000024 1F55 ROL R21
\r
283 \ 00000026 01FA MOVW R31:R30, R21:R20
\r
284 \ 00000028 .... SUBI R30, LOW((-(timeval) & 0xFFFF))
\r
285 \ 0000002A .... SBCI R31, (-(timeval) & 0xFFFF) >> 8
\r
286 \ 0000002C 8300 ST Z, R16
\r
287 \ 0000002E 8311 STD Z+1, R17
\r
288 \ 00000030 8322 STD Z+2, R18
\r
289 \ 00000032 8333 STD Z+3, R19
\r
290 104 timeval[timer] += 1000 * (unsigned long)sec;
\r
291 \ 00000034 2D46 MOV R20, R6
\r
292 \ 00000036 E050 LDI R21, 0
\r
293 \ 00000038 E060 LDI R22, 0
\r
294 \ 0000003A E070 LDI R23, 0
\r
295 \ 0000003C EE08 LDI R16, 232
\r
296 \ 0000003E E013 LDI R17, 3
\r
297 \ 00000040 E020 LDI R18, 0
\r
298 \ 00000042 E030 LDI R19, 0
\r
299 \ 00000044 .... RCALL ?L_MUL_L03
\r
300 \ 00000046 2F4A MOV R20, R26
\r
301 \ 00000048 E050 LDI R21, 0
\r
302 \ 0000004A 0F44 LSL R20
\r
303 \ 0000004C 1F55 ROL R21
\r
304 \ 0000004E 0F44 LSL R20
\r
305 \ 00000050 1F55 ROL R21
\r
306 \ 00000052 01FA MOVW R31:R30, R21:R20
\r
307 \ 00000054 .... SUBI R30, LOW((-(timeval) & 0xFFFF))
\r
308 \ 00000056 .... SBCI R31, (-(timeval) & 0xFFFF) >> 8
\r
309 \ 00000058 8140 LD R20, Z
\r
310 \ 0000005A 8151 LDD R21, Z+1
\r
311 \ 0000005C 8162 LDD R22, Z+2
\r
312 \ 0000005E 8173 LDD R23, Z+3
\r
313 \ 00000060 0F40 ADD R20, R16
\r
314 \ 00000062 1F51 ADC R21, R17
\r
315 \ 00000064 1F62 ADC R22, R18
\r
316 \ 00000066 1F73 ADC R23, R19
\r
317 \ 00000068 8340 ST Z, R20
\r
318 \ 0000006A 8351 STD Z+1, R21
\r
319 \ 0000006C 8362 STD Z+2, R22
\r
320 \ 0000006E 8373 STD Z+3, R23
\r
321 105 timeval[timer] += 1 * (unsigned long)ms;
\r
322 \ 00000070 2455 CLR R5
\r
323 \ 00000072 0182 MOVW R17:R16, R5:R4
\r
324 \ 00000074 E020 LDI R18, 0
\r
325 \ 00000076 E030 LDI R19, 0
\r
326 \ 00000078 2F4A MOV R20, R26
\r
327 \ 0000007A E050 LDI R21, 0
\r
328 \ 0000007C 0F44 LSL R20
\r
329 \ 0000007E 1F55 ROL R21
\r
330 \ 00000080 0F44 LSL R20
\r
331 \ 00000082 1F55 ROL R21
\r
332 \ 00000084 01FA MOVW R31:R30, R21:R20
\r
333 \ 00000086 .... SUBI R30, LOW((-(timeval) & 0xFFFF))
\r
334 \ 00000088 .... SBCI R31, (-(timeval) & 0xFFFF) >> 8
\r
335 \ 0000008A 8140 LD R20, Z
\r
336 \ 0000008C 8151 LDD R21, Z+1
\r
337 \ 0000008E 8162 LDD R22, Z+2
\r
338 \ 00000090 8173 LDD R23, Z+3
\r
339 \ 00000092 0F40 ADD R20, R16
\r
340 \ 00000094 1F51 ADC R21, R17
\r
341 \ 00000096 1F62 ADC R22, R18
\r
342 \ 00000098 1F73 ADC R23, R19
\r
343 \ 0000009A 8340 ST Z, R20
\r
344 \ 0000009C 8351 STD Z+1, R21
\r
345 \ 0000009E 8362 STD Z+2, R22
\r
346 \ 000000A0 8373 STD Z+3, R23
\r
348 \ 000000A2 E0E7 LDI R30, 7
\r
349 \ 000000A4 .... RJMP ?EPILOGUE_B7_L09
\r
352 109 /*! \brief Stops timers
\r
354 111 * Sets timer0's clock source to none.
\r
357 \ In segment CODE, align 2, keep-with-next
\r
358 113 void Time_Stop(void)
\r
362 \ 00000000 E000 LDI R16, 0
\r
363 \ 00000002 BF03 OUT 0x33, R16
\r
365 \ 00000004 9508 RET
\r
366 \ 00000006 REQUIRE _A_TCCR0B
\r
369 119 /*! \brief Starts timers
\r
371 121 * Sets timer0's clock source to system clock divided by 64.
\r
374 \ In segment CODE, align 2, keep-with-next
\r
375 123 void Time_Start(void)
\r
378 125 TCCR0B = (0<<CS02)|(1<<CS01)|(1<<CS00); // CLKT0 = CLK/64 = 125 kHz.
\r
379 \ 00000000 E003 LDI R16, 3
\r
380 \ 00000002 BF03 OUT 0x33, R16
\r
382 \ 00000004 9508 RET
\r
383 \ 00000006 REQUIRE _A_TCCR0B
\r
386 129 /*! \brief Initializes timers
\r
388 131 * Resets all the timer values to 0, then sets up timer 0 for a compare match
\r
389 132 * every millisecond.
\r
392 \ In segment CODE, align 2, keep-with-next
\r
393 134 void Time_Init(void)
\r
396 136 unsigned char i;
\r
398 138 for (i = 0; i<<TIMERS; i++) {
\r
399 \ 00000000 E040 LDI R20, 0
\r
401 \ 00000002 2344 TST R20
\r
402 \ 00000004 F099 BREQ ??Time_Init_1
\r
403 139 timeval[i] = 0;
\r
404 \ 00000006 E000 LDI R16, 0
\r
405 \ 00000008 E010 LDI R17, 0
\r
406 \ 0000000A E020 LDI R18, 0
\r
407 \ 0000000C E030 LDI R19, 0
\r
408 \ 0000000E 2F64 MOV R22, R20
\r
409 \ 00000010 E070 LDI R23, 0
\r
410 \ 00000012 0F66 LSL R22
\r
411 \ 00000014 1F77 ROL R23
\r
412 \ 00000016 0F66 LSL R22
\r
413 \ 00000018 1F77 ROL R23
\r
414 \ 0000001A 01FB MOVW R31:R30, R23:R22
\r
415 \ 0000001C .... SUBI R30, LOW((-(timeval) & 0xFFFF))
\r
416 \ 0000001E .... SBCI R31, (-(timeval) & 0xFFFF) >> 8
\r
417 \ 00000020 8300 ST Z, R16
\r
418 \ 00000022 8311 STD Z+1, R17
\r
419 \ 00000024 8322 STD Z+2, R18
\r
420 \ 00000026 8333 STD Z+3, R19
\r
422 \ 00000028 9543 INC R20
\r
423 \ 0000002A CFEB RJMP ??Time_Init_0
\r
425 142 // OCR0A = 0; // Doesn't matter, will run in normal mode.
\r
427 144 OCR0A = 125; // Will give a compare match every ms.
\r
429 \ 0000002C E70D LDI R16, 125
\r
430 \ 0000002E BB03 OUT 0x13, R16
\r
432 146 OCR0B = 0; // Doesn't matter, will run in normal mode.
\r
433 \ 00000030 E000 LDI R16, 0
\r
434 \ 00000032 BB02 OUT 0x12, R16
\r
436 148 // TCCR0A = 0; // Normal 8-bit mode, no input capture.
\r
438 150 TCCR0A = (1<<WGM00); // 8-bit CTC mode.
\r
439 \ 00000034 E001 LDI R16, 1
\r
440 \ 00000036 BB05 OUT 0x15, R16
\r
442 152 // TCCR0B = (0<<CS02)|(1<<CS01)|(0<<CS00); // CLKT0 = CLK/8 = 1 MHz.
\r
444 154 TCCR0B = (0<<CS02)|(1<<CS01)|(1<<CS00); // CLKT0 = CLK/64 = 125 kHz.
\r
445 \ 00000038 E003 LDI R16, 3
\r
446 \ 0000003A BF03 OUT 0x33, R16
\r
448 156 // TIMSK |= (1<<TOIE0); // Overflow interrupt enabled.
\r
450 158 TIMSK |= (1<<OCIE0A); // Timer 0, Compare match A interrupt enabled.
\r
451 \ 0000003C B709 IN R16, 0x39
\r
452 \ 0000003E 6100 ORI R16, 0x10
\r
453 \ 00000040 BF09 OUT 0x39, R16
\r
455 160 // Enable interrupts, just in case they weren't already.
\r
456 161 __enable_interrupt();
\r
457 \ 00000042 9478 SEI
\r
459 \ 00000044 9508 RET
\r
460 \ 00000046 REQUIRE _A_TIMSK
\r
461 \ 00000046 REQUIRE _A_TCCR0B
\r
462 \ 00000046 REQUIRE _A_TCCR0A
\r
463 \ 00000046 REQUIRE _A_OCR0A
\r
464 \ 00000046 REQUIRE _A_OCR0B
\r
466 \ In segment INTVEC, offset 0x1c, root
\r
467 \ `??TICK_ISR??INTVEC 28`:
\r
468 \ 0000001C .... RJMP TICK_ISR
\r
470 Maximum stack usage in bytes:
\r
472 Function CSTACK RSTACK
\r
473 -------- ------ ------
\r
482 Segment part sizes:
\r
484 Function/Label Bytes
\r
485 -------------- -----
\r
498 ??TICK_ISR??INTVEC 28 2
\r
502 5 bytes in segment ABSOLUTE
\r
503 428 bytes in segment CODE
\r
504 6 bytes in segment INITTAB
\r
505 2 bytes in segment INTVEC
\r
506 16 bytes in segment NEAR_Z
\r
508 428 bytes of CODE memory (+ 8 bytes shared)
\r
509 16 bytes of DATA memory (+ 5 bytes shared)
\r