1 ///////////////////////////////////////////////////////////////////////////////
\r
3 // IAR Atmel AVR C/C++ Compiler V4.30F/W32 13/Mar/2008 04:52:03 /
\r
4 // Copyright 1996-2007 IAR Systems. All rights reserved. /
\r
6 // Source file = C:\home\kevin\pub\src\bc100\IAR\time.c /
\r
7 // Command line = C:\home\kevin\pub\src\bc100\IAR\time.c /
\r
8 // --cpu=tiny861 -ms -o C:\home\kevin\pub\src\bc1 /
\r
9 // 00\IAR\Release\Obj\ -D NDEBUG -lCN /
\r
10 // C:\home\kevin\pub\src\bc100\IAR\Release\List\ /
\r
11 // -lB C:\home\kevin\pub\src\bc100\IAR\Release\Li /
\r
12 // st\ --initializers_in_flash -s9 /
\r
13 // --no_cross_call --no_tbaa /
\r
14 // -DENABLE_BIT_DEFINITIONS -e -I "C:\Program /
\r
15 // Files\IAR Systems\Embedded Workbench /
\r
16 // 4.0\avr\INC\" -I "C:\Program Files\IAR /
\r
17 // Systems\Embedded Workbench 4.0\avr\INC\CLIB\" /
\r
18 // --eeprom_size 512 --misrac=5-9,11-12,14,16-17, /
\r
19 // 19-21,24-26,29-32,34-35,38-39,42-43,46,50, /
\r
20 // 52-54,56-59,61-62,64-65,68-80,83-84,87-91, /
\r
21 // 94-95,98-100,103-110,112-126 /
\r
22 // Enabled MISRA C rules = 5-9,11-12,14,16-17,19-21,24-26,29-32,34-35, /
\r
23 // 38-39,42-43,46,50,52-54,56-59,61-62,64-65, /
\r
24 // 68-80,83-84,87-91,94-95,98-100,103-110,112-126 /
\r
25 // Checked = 5,7-9,11-12,14,17,19-21,24,29-32,34-35,38-39, /
\r
26 // 42,46,50,52-54,56-59,61-62,64,68-69,71-80, /
\r
27 // 83-84,87-89,91,94-95,98,100,104-105,108-109, /
\r
28 // 112-115,118-126 /
\r
29 // Not checked = 6,16,25-26,43,65,70,90,99,103,106-107,110, /
\r
31 // List file = C:\home\kevin\pub\src\bc100\IAR\Release\List\t /
\r
35 ///////////////////////////////////////////////////////////////////////////////
\r
39 RSEG CSTACK:DATA:NOROOT(0)
\r
40 RSEG RSTACK:DATA:NOROOT(0)
\r
43 EXTERN ?Register_R4_is_cg_reg
\r
44 EXTERN ?Register_R5_is_cg_reg
\r
45 EXTERN ?Register_R6_is_cg_reg
\r
46 EXTERN ?Register_R8_is_cg_reg
\r
47 EXTERN ?need_segment_init
\r
49 PUBWEAK `?<Segment init: NEAR_Z>`
\r
50 PUBWEAK `??TICK_ISR??INTVEC 28`
\r
68 TICK_ISR SYMBOL "TICK_ISR"
\r
69 `??TICK_ISR??INTVEC 28` SYMBOL "??INTVEC 28", TICK_ISR
\r
71 // C:\home\kevin\pub\src\bc100\IAR\time.c
\r
72 // 1 /* This file has been prepared for Doxygen automatic documentation generation.*/
\r
73 // 2 /*! \file *********************************************************************
\r
76 // 5 * Functions for timing
\r
78 // 7 * Contains functions to initialize, set, poll and stop timers.
\r
80 // 9 * \par Application note:
\r
81 // 10 * AVR458: Charging Li-Ion Batteries with BC100 \n
\r
82 // 11 * AVR463: Charging NiMH Batteries with BC100
\r
84 // 13 * \par Documentation
\r
85 // 14 * For comprehensive code documentation, supported compilers, compiler
\r
86 // 15 * settings and supported devices see readme.html
\r
89 // 18 * Atmel Corporation: http://www.atmel.com \n
\r
90 // 19 * Support email: avr@atmel.com
\r
94 // 23 * $Revision: 2299 $
\r
96 // 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
97 // 26 * $Date: 2007-08-23 12:55:51 +0200 (to, 23 aug 2007) $\n
\r
98 // 27 ******************************************************************************/
\r
100 // 29 #include <ioavr.h>
\r
102 ASEGN ABSOLUTE:DATA:NOROOT,059H
\r
103 // <unnamed> volatile __io _A_TIMSK
\r
107 ASEGN ABSOLUTE:DATA:NOROOT,053H
\r
108 // <unnamed> volatile __io _A_TCCR0B
\r
112 ASEGN ABSOLUTE:DATA:NOROOT,035H
\r
113 // <unnamed> volatile __io _A_TCCR0A
\r
117 ASEGN ABSOLUTE:DATA:NOROOT,033H
\r
118 // <unnamed> volatile __io _A_OCR0A
\r
122 ASEGN ABSOLUTE:DATA:NOROOT,032H
\r
123 // <unnamed> volatile __io _A_OCR0B
\r
126 // 30 #include <inavr.h>
\r
128 // 32 #include "enums.h"
\r
130 // 34 #include "main.h"
\r
131 // 35 #include "time.h"
\r
134 // 38 //******************************************************************************
\r
136 // 40 //******************************************************************************
\r
138 RSEG NEAR_Z:DATA:NOROOT(0)
\r
139 REQUIRE `?<Segment init: NEAR_Z>`
\r
140 // 41 unsigned long timeval[TIMERS]; //!< Contains the values for each timer.
\r
144 // 43 // timer runs at 1 MHz and overflow will occur every 255 / 1 Mz ~= 0.25 ms
\r
145 // 44 //#pragma vector = TIM0_OVF_vect
\r
148 // 47 //******************************************************************************
\r
150 // 49 //******************************************************************************
\r
151 // 50 /*! \brief Interrupt service routine for timer 0 overflow
\r
153 // 52 * Timer 0 runs at 125 kHz and compare match will occur every millisecond
\r
154 // 53 * (125 / 125 kHz = 1.0 ms), which will result in a call to this function.
\r
155 // 54 * When called, this function will decrement the time left for each timer,
\r
156 // 55 * unless they are already at zero.
\r
158 // 57 #pragma vector = TIM0_COMPA_vect
\r
160 RSEG CODE:CODE:NOROOT(1)
\r
161 // 58 __interrupt void TICK_ISR(void)
\r
173 // 60 unsigned char i;
\r
175 // 62 // 1 ms has passed, decrement all non-zero timers.
\r
176 // 63 for (i = 0; i < TIMERS; i++) {
\r
177 LDI R30, LOW(timeval)
\r
178 LDI R31, (timeval) >> 8
\r
180 // 64 if(timeval[i] > 0) {
\r
190 // 65 timeval[i]--;
\r
220 // 71 /*! \brief Checks if a specified timer has expired
\r
222 // 73 * \param timer Specifies timer
\r
224 // 75 * \retval TRUE Timer still going.
\r
225 // 76 * \retval FALSE Timer has expired.
\r
228 RSEG CODE:CODE:NOROOT(1)
\r
229 // 78 unsigned char Time_Left(unsigned char timer)
\r
232 // 80 if(timeval[timer] > 0) {
\r
238 MOVW R31:R30, R17:R16
\r
239 SUBI R30, LOW((-(timeval) & 0xFFFF))
\r
240 SBCI R31, (-(timeval) & 0xFFFF) >> 8
\r
249 // 81 return(TRUE);
\r
253 // 83 return(FALSE);
\r
261 // 88 /*! \brief Sets the specified timer
\r
263 // 90 * \param timer Specifies timer
\r
264 // 91 * \param min Minutes for timer to count down
\r
265 // 92 * \param sec Seconds for timer to count down
\r
266 // 93 * \param ms Milliseconds for timer to count down
\r
269 RSEG CODE:CODE:NOROOT(1)
\r
270 // 95 void Time_Set(unsigned char timer, unsigned int min, unsigned char sec,
\r
272 // 96 unsigned char ms)
\r
282 REQUIRE ?Register_R4_is_cg_reg
\r
283 REQUIRE ?Register_R5_is_cg_reg
\r
284 REQUIRE ?Register_R6_is_cg_reg
\r
285 REQUIRE ?Register_R8_is_cg_reg
\r
289 // 98 // timeval[i] = 4 * (1000*(sec + 60*min) + ms); // about 4000 ticks per second
\r
290 // 99 // timeval[i] = 240000 * (unsigned long)min;
\r
291 // 100 // timeval[i] += 4000 * (unsigned long)sec;
\r
292 // 101 // timeval[i] += 4 * (unsigned long)ms;
\r
294 // 103 timeval[timer] = 60000 * (unsigned long)min;
\r
295 // 104 timeval[timer] += 1000 * (unsigned long)sec;
\r
296 // 105 timeval[timer] += 1 * (unsigned long)ms;
\r
297 MOVW R21:R20, R19:R18
\r
305 MOVW R25:R24, R17:R16
\r
306 MOVW R27:R26, R19:R18
\r
333 MOVW R31:R30, R5:R4
\r
334 SUBI R30, LOW((-(timeval) & 0xFFFF))
\r
335 SBCI R31, (-(timeval) & 0xFFFF) >> 8
\r
352 // 109 /*! \brief Stops timers
\r
354 // 111 * Sets timer0's clock source to none.
\r
357 RSEG CODE:CODE:NOROOT(1)
\r
358 // 113 void Time_Stop(void)
\r
369 // 119 /*! \brief Starts timers
\r
371 // 121 * Sets timer0's clock source to system clock divided by 64.
\r
374 RSEG CODE:CODE:NOROOT(1)
\r
375 // 123 void Time_Start(void)
\r
378 // 125 TCCR0B = (0<<CS02)|(1<<CS01)|(1<<CS00); // CLKT0 = CLK/64 = 125 kHz.
\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 RSEG CODE:CODE:NOROOT(1)
\r
393 // 134 void Time_Init(void)
\r
396 // 136 unsigned char i;
\r
398 // 138 for (i = 0; i<<TIMERS; i++) {
\r
399 // 139 timeval[i] = 0;
\r
402 // 142 // OCR0A = 0; // Doesn't matter, will run in normal mode.
\r
404 // 144 OCR0A = 125; // Will give a compare match every ms.
\r
408 // 146 OCR0B = 0; // Doesn't matter, will run in normal mode.
\r
412 // 148 // TCCR0A = 0; // Normal 8-bit mode, no input capture.
\r
414 // 150 TCCR0A = (1<<WGM00); // 8-bit CTC mode.
\r
418 // 152 // TCCR0B = (0<<CS02)|(1<<CS01)|(0<<CS00); // CLKT0 = CLK/8 = 1 MHz.
\r
420 // 154 TCCR0B = (0<<CS02)|(1<<CS01)|(1<<CS00); // CLKT0 = CLK/64 = 125 kHz.
\r
424 // 156 // TIMSK |= (1<<TOIE0); // Overflow interrupt enabled.
\r
426 // 158 TIMSK |= (1<<OCIE0A); // Timer 0, Compare match A interrupt enabled.
\r
431 // 160 // Enable interrupts, just in case they weren't already.
\r
432 // 161 __enable_interrupt();
\r
442 ASEGN ABSOLUTE:DATA:NOROOT,01cH
\r
445 ASEGN ABSOLUTE:DATA:NOROOT,01dH
\r
448 ASEGN ABSOLUTE:DATA:NOROOT,01eH
\r
451 ASEGN ABSOLUTE:DATA:NOROOT,01fH
\r
454 COMMON INTVEC:CODE:ROOT(1)
\r
456 `??TICK_ISR??INTVEC 28`:
\r
459 RSEG INITTAB:CODE:NOROOT(0)
\r
460 `?<Segment init: NEAR_Z>`:
\r
461 DW SFE(NEAR_Z) - SFB(NEAR_Z)
\r
464 REQUIRE ?need_segment_init
\r
468 // 5 bytes in segment ABSOLUTE
\r
469 // 290 bytes in segment CODE
\r
470 // 6 bytes in segment INITTAB
\r
471 // 2 bytes in segment INTVEC
\r
472 // 16 bytes in segment NEAR_Z
\r
474 // 290 bytes of CODE memory (+ 8 bytes shared)
\r
475 // 16 bytes of DATA memory (+ 5 bytes shared)
\r