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\IA /
\r
9 // R\Debug\Obj\ -lC C:\home\kevin\pub\src\bc100_cal\IAR\De /
\r
10 // bug\List\ -lB C:\home\kevin\pub\src\bc100_cal\IAR\Debug /
\r
11 // \List\ --initializers_in_flash -z2 --no_cse /
\r
12 // --no_inline --no_code_motion --no_cross_call /
\r
13 // --no_clustering --no_tbaa --debug /
\r
14 // -DENABLE_BIT_DEFINITIONS -e --require_prototypes -I /
\r
15 // "C:\Program 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 /
\r
19 // List file = C:\home\kevin\pub\src\bc100_cal\IAR\Debug\List\time.s90 /
\r
22 ///////////////////////////////////////////////////////////////////////////////
\r
26 RSEG CSTACK:DATA:NOROOT(0)
\r
27 RSEG RSTACK:DATA:NOROOT(0)
\r
29 EXTERN ?EPILOGUE_B7_L09
\r
31 EXTERN ?PROLOGUE7_L09
\r
32 EXTERN ?Register_R4_is_cg_reg
\r
33 EXTERN ?Register_R5_is_cg_reg
\r
34 EXTERN ?Register_R6_is_cg_reg
\r
35 EXTERN ?need_segment_init
\r
37 PUBWEAK `?<Segment init: NEAR_Z>`
\r
38 PUBWEAK `??TICK_ISR??INTVEC 28`
\r
56 TICK_ISR SYMBOL "TICK_ISR"
\r
57 `??TICK_ISR??INTVEC 28` SYMBOL "??INTVEC 28", TICK_ISR
\r
59 // C:\home\kevin\pub\src\bc100_cal\IAR\time.c
\r
60 // 1 /* This file has been prepared for Doxygen automatic documentation generation.*/
\r
61 // 2 /*! \file *********************************************************************
\r
64 // 5 * Functions for timing
\r
66 // 7 * Contains functions to initialize, set, poll and stop timers.
\r
68 // 9 * \par Application note:
\r
69 // 10 * AVR458: Charging Li-Ion Batteries with BC100 \n
\r
70 // 11 * AVR463: Charging NiMH Batteries with BC100
\r
72 // 13 * \par Documentation
\r
73 // 14 * For comprehensive code documentation, supported compilers, compiler
\r
74 // 15 * settings and supported devices see readme.html
\r
77 // 18 * Atmel Corporation: http://www.atmel.com \n
\r
78 // 19 * Support email: avr@atmel.com
\r
82 // 23 * $Revision: 2299 $
\r
84 // 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
85 // 26 * $Date: 2007-08-23 12:55:51 +0200 (to, 23 aug 2007) $\n
\r
86 // 27 ******************************************************************************/
\r
88 // 29 #include <ioavr.h>
\r
90 ASEGN ABSOLUTE:DATA:NOROOT,059H
\r
91 // <unnamed> volatile __io _A_TIMSK
\r
95 ASEGN ABSOLUTE:DATA:NOROOT,053H
\r
96 // <unnamed> volatile __io _A_TCCR0B
\r
100 ASEGN ABSOLUTE:DATA:NOROOT,035H
\r
101 // <unnamed> volatile __io _A_TCCR0A
\r
105 ASEGN ABSOLUTE:DATA:NOROOT,033H
\r
106 // <unnamed> volatile __io _A_OCR0A
\r
110 ASEGN ABSOLUTE:DATA:NOROOT,032H
\r
111 // <unnamed> volatile __io _A_OCR0B
\r
114 // 30 #include <inavr.h>
\r
116 // 32 #include "enums.h"
\r
118 // 34 #include "main.h"
\r
119 // 35 #include "time.h"
\r
122 // 38 //******************************************************************************
\r
124 // 40 //******************************************************************************
\r
126 RSEG NEAR_Z:DATA:NOROOT(0)
\r
127 REQUIRE `?<Segment init: NEAR_Z>`
\r
128 // 41 unsigned long timeval[TIMERS]; //!< Contains the values for each timer.
\r
132 // 43 // timer runs at 1 MHz and overflow will occur every 255 / 1 Mz ~= 0.25 ms
\r
133 // 44 //#pragma vector = TIM0_OVF_vect
\r
136 // 47 //******************************************************************************
\r
138 // 49 //******************************************************************************
\r
139 // 50 /*! \brief Interrupt service routine for timer 0 overflow
\r
141 // 52 * Timer 0 runs at 125 kHz and compare match will occur every millisecond
\r
142 // 53 * (125 / 125 kHz = 1.0 ms), which will result in a call to this function.
\r
143 // 54 * When called, this function will decrement the time left for each timer,
\r
144 // 55 * unless they are already at zero.
\r
146 // 57 #pragma vector = TIM0_COMPA_vect
\r
148 RSEG CODE:CODE:NOROOT(1)
\r
149 // 58 __interrupt void TICK_ISR(void)
\r
164 // 60 unsigned char i;
\r
166 // 62 // 1 ms has passed, decrement all non-zero timers.
\r
167 // 63 for (i = 0; i < TIMERS; i++) {
\r
172 // 64 if(timeval[i] > 0) {
\r
179 MOVW R31:R30, R19:R18
\r
180 SUBI R30, LOW((-(timeval) & 0xFFFF))
\r
181 SBCI R31, (-(timeval) & 0xFFFF) >> 8
\r
190 // 65 timeval[i]--;
\r
197 MOVW R31:R30, R19:R18
\r
198 SUBI R30, LOW((-(timeval) & 0xFFFF))
\r
199 SBCI R31, (-(timeval) & 0xFFFF) >> 8
\r
234 // 71 /*! \brief Checks if a specified timer has expired
\r
236 // 73 * \param timer Specifies timer
\r
238 // 75 * \retval TRUE Timer still going.
\r
239 // 76 * \retval FALSE Timer has expired.
\r
242 RSEG CODE:CODE:NOROOT(1)
\r
243 // 78 unsigned char Time_Left(unsigned char timer)
\r
247 // 80 if(timeval[timer] > 0) {
\r
254 MOVW R31:R30, R17:R16
\r
255 SUBI R30, LOW((-(timeval) & 0xFFFF))
\r
256 SBCI R31, (-(timeval) & 0xFFFF) >> 8
\r
265 // 81 return(TRUE);
\r
269 // 83 return(FALSE);
\r
277 // 88 /*! \brief Sets the specified timer
\r
279 // 90 * \param timer Specifies timer
\r
280 // 91 * \param min Minutes for timer to count down
\r
281 // 92 * \param sec Seconds for timer to count down
\r
282 // 93 * \param ms Milliseconds for timer to count down
\r
285 RSEG CODE:CODE:NOROOT(1)
\r
286 // 95 void Time_Set(unsigned char timer, unsigned int min, unsigned char sec,
\r
288 // 96 unsigned char ms)
\r
290 RCALL ?PROLOGUE7_L09
\r
291 REQUIRE ?Register_R4_is_cg_reg
\r
292 REQUIRE ?Register_R5_is_cg_reg
\r
293 REQUIRE ?Register_R6_is_cg_reg
\r
295 MOVW R25:R24, R19:R18
\r
298 // 98 // timeval[i] = 4 * (1000*(sec + 60*min) + ms); // about 4000 ticks per second
\r
299 // 99 // timeval[i] = 240000 * (unsigned long)min;
\r
300 // 100 // timeval[i] += 4000 * (unsigned long)sec;
\r
301 // 101 // timeval[i] += 4 * (unsigned long)ms;
\r
303 // 103 timeval[timer] = 60000 * (unsigned long)min;
\r
304 MOVW R21:R20, R25:R24
\r
318 MOVW R31:R30, R21:R20
\r
319 SUBI R30, LOW((-(timeval) & 0xFFFF))
\r
320 SBCI R31, (-(timeval) & 0xFFFF) >> 8
\r
325 // 104 timeval[timer] += 1000 * (unsigned long)sec;
\r
341 MOVW R31:R30, R21:R20
\r
342 SUBI R30, LOW((-(timeval) & 0xFFFF))
\r
343 SBCI R31, (-(timeval) & 0xFFFF) >> 8
\r
356 // 105 timeval[timer] += 1 * (unsigned long)ms;
\r
358 MOVW R17:R16, R5:R4
\r
367 MOVW R31:R30, R21:R20
\r
368 SUBI R30, LOW((-(timeval) & 0xFFFF))
\r
369 SBCI R31, (-(timeval) & 0xFFFF) >> 8
\r
384 RJMP ?EPILOGUE_B7_L09
\r
387 // 109 /*! \brief Stops timers
\r
389 // 111 * Sets timer0's clock source to none.
\r
392 RSEG CODE:CODE:NOROOT(1)
\r
393 // 113 void Time_Stop(void)
\r
404 // 119 /*! \brief Starts timers
\r
406 // 121 * Sets timer0's clock source to system clock divided by 64.
\r
409 RSEG CODE:CODE:NOROOT(1)
\r
410 // 123 void Time_Start(void)
\r
413 // 125 TCCR0B = (0<<CS02)|(1<<CS01)|(1<<CS00); // CLKT0 = CLK/64 = 125 kHz.
\r
421 // 129 /*! \brief Initializes timers
\r
423 // 131 * Resets all the timer values to 0, then sets up timer 0 for a compare match
\r
424 // 132 * every millisecond.
\r
427 RSEG CODE:CODE:NOROOT(1)
\r
428 // 134 void Time_Init(void)
\r
431 // 136 unsigned char i;
\r
433 // 138 for (i = 0; i<<TIMERS; i++) {
\r
438 // 139 timeval[i] = 0;
\r
449 MOVW R31:R30, R23:R22
\r
450 SUBI R30, LOW((-(timeval) & 0xFFFF))
\r
451 SBCI R31, (-(timeval) & 0xFFFF) >> 8
\r
460 // 142 // OCR0A = 0; // Doesn't matter, will run in normal mode.
\r
462 // 144 OCR0A = 125; // Will give a compare match every ms.
\r
467 // 146 OCR0B = 0; // Doesn't matter, will run in normal mode.
\r
471 // 148 // TCCR0A = 0; // Normal 8-bit mode, no input capture.
\r
473 // 150 TCCR0A = (1<<WGM00); // 8-bit CTC mode.
\r
477 // 152 // TCCR0B = (0<<CS02)|(1<<CS01)|(0<<CS00); // CLKT0 = CLK/8 = 1 MHz.
\r
479 // 154 TCCR0B = (0<<CS02)|(1<<CS01)|(1<<CS00); // CLKT0 = CLK/64 = 125 kHz.
\r
483 // 156 // TIMSK |= (1<<TOIE0); // Overflow interrupt enabled.
\r
485 // 158 TIMSK |= (1<<OCIE0A); // Timer 0, Compare match A interrupt enabled.
\r
490 // 160 // Enable interrupts, just in case they weren't already.
\r
491 // 161 __enable_interrupt();
\r
501 ASEGN ABSOLUTE:DATA:NOROOT,01cH
\r
504 ASEGN ABSOLUTE:DATA:NOROOT,01dH
\r
507 ASEGN ABSOLUTE:DATA:NOROOT,01eH
\r
510 ASEGN ABSOLUTE:DATA:NOROOT,01fH
\r
513 COMMON INTVEC:CODE:ROOT(1)
\r
515 `??TICK_ISR??INTVEC 28`:
\r
518 RSEG INITTAB:CODE:NOROOT(0)
\r
519 `?<Segment init: NEAR_Z>`:
\r
520 DW SFE(NEAR_Z) - SFB(NEAR_Z)
\r
523 REQUIRE ?need_segment_init
\r
527 // 5 bytes in segment ABSOLUTE
\r
528 // 428 bytes in segment CODE
\r
529 // 6 bytes in segment INITTAB
\r
530 // 2 bytes in segment INTVEC
\r
531 // 16 bytes in segment NEAR_Z
\r
533 // 428 bytes of CODE memory (+ 8 bytes shared)
\r
534 // 16 bytes of DATA memory (+ 5 bytes shared)
\r