############################################################################### # # # IAR Atmel AVR C/C++ Compiler V4.30F/W32 13/Mar/2008 04:52:03 # # Copyright 1996-2007 IAR Systems. All rights reserved. # # # # Source file = C:\home\kevin\pub\src\bc100\IAR\time.c # # Command line = C:\home\kevin\pub\src\bc100\IAR\time.c # # --cpu=tiny861 -ms -o C:\home\kevin\pub\src\bc10 # # 0\IAR\Release\Obj\ -D NDEBUG -lCN # # C:\home\kevin\pub\src\bc100\IAR\Release\List\ # # -lB C:\home\kevin\pub\src\bc100\IAR\Release\Lis # # t\ --initializers_in_flash -s9 --no_cross_call # # --no_tbaa -DENABLE_BIT_DEFINITIONS -e -I # # "C:\Program Files\IAR Systems\Embedded # # Workbench 4.0\avr\INC\" -I "C:\Program # # Files\IAR Systems\Embedded Workbench # # 4.0\avr\INC\CLIB\" --eeprom_size 512 # # --misrac=5-9,11-12,14,16-17,19-21,24-26,29-32, # # 34-35,38-39,42-43,46,50,52-54,56-59,61-62, # # 64-65,68-80,83-84,87-91,94-95,98-100,103-110, # # 112-126 # # Enabled MISRA C rules = 5-9,11-12,14,16-17,19-21,24-26,29-32,34-35, # # 38-39,42-43,46,50,52-54,56-59,61-62,64-65, # # 68-80,83-84,87-91,94-95,98-100,103-110,112-126 # # Checked = 5,7-9,11-12,14,17,19-21,24,29-32,34-35,38-39, # # 42,46,50,52-54,56-59,61-62,64,68-69,71-80, # # 83-84,87-89,91,94-95,98,100,104-105,108-109, # # 112-115,118-126 # # Not checked = 6,16,25-26,43,65,70,90,99,103,106-107,110, # # 116-117 # # List file = C:\home\kevin\pub\src\bc100\IAR\Release\List\ti # # me.lst # # Object file = C:\home\kevin\pub\src\bc100\IAR\Release\Obj\tim # # e.r90 # # # # # ############################################################################### C:\home\kevin\pub\src\bc100\IAR\time.c 1 /* This file has been prepared for Doxygen automatic documentation generation.*/ 2 /*! \file ********************************************************************* 3 * 4 * \brief 5 * Functions for timing 6 * 7 * Contains functions to initialize, set, poll and stop timers. 8 * 9 * \par Application note: 10 * AVR458: Charging Li-Ion Batteries with BC100 \n 11 * AVR463: Charging NiMH Batteries with BC100 12 * 13 * \par Documentation 14 * For comprehensive code documentation, supported compilers, compiler 15 * settings and supported devices see readme.html 16 * 17 * \author 18 * Atmel Corporation: http://www.atmel.com \n 19 * Support email: avr@atmel.com 20 * 21 * 22 * $Name$ 23 * $Revision: 2299 $ 24 * $RCSfile$ 25 * $URL: http://svn.norway.atmel.com/AppsAVR8/avr458_Charging_Li-Ion_Batteries_with_BC100/tag/20070904_release_1.0/code/IAR/time.c $ 26 * $Date: 2007-08-23 12:55:51 +0200 (to, 23 aug 2007) $\n 27 ******************************************************************************/ 28 29 #include \ In segment ABSOLUTE, at 0x59 \ volatile __io _A_TIMSK \ _A_TIMSK: \ 00000000 DS 1 \ In segment ABSOLUTE, at 0x53 \ volatile __io _A_TCCR0B \ _A_TCCR0B: \ 00000000 DS 1 \ In segment ABSOLUTE, at 0x35 \ volatile __io _A_TCCR0A \ _A_TCCR0A: \ 00000000 DS 1 \ In segment ABSOLUTE, at 0x33 \ volatile __io _A_OCR0A \ _A_OCR0A: \ 00000000 DS 1 \ In segment ABSOLUTE, at 0x32 \ volatile __io _A_OCR0B \ _A_OCR0B: \ 00000000 DS 1 30 #include 31 32 #include "enums.h" 33 34 #include "main.h" 35 #include "time.h" 36 37 38 //****************************************************************************** 39 // Variables 40 //****************************************************************************** \ In segment NEAR_Z, align 1, keep-with-next \ 00000000 REQUIRE `?` 41 unsigned long timeval[TIMERS]; //!< Contains the values for each timer. \ timeval: \ 00000000 DS 16 42 43 // timer runs at 1 MHz and overflow will occur every 255 / 1 Mz ~= 0.25 ms 44 //#pragma vector = TIM0_OVF_vect 45 46 47 //****************************************************************************** 48 // Functions 49 //****************************************************************************** 50 /*! \brief Interrupt service routine for timer 0 overflow 51 * 52 * Timer 0 runs at 125 kHz and compare match will occur every millisecond 53 * (125 / 125 kHz = 1.0 ms), which will result in a call to this function. 54 * When called, this function will decrement the time left for each timer, 55 * unless they are already at zero. 56 */ 57 #pragma vector = TIM0_COMPA_vect \ In segment CODE, align 2, keep-with-next 58 __interrupt void TICK_ISR(void) \ TICK_ISR: 59 { \ 00000000 93FA ST -Y, R31 \ 00000002 93EA ST -Y, R30 \ 00000004 937A ST -Y, R23 \ 00000006 936A ST -Y, R22 \ 00000008 935A ST -Y, R21 \ 0000000A 934A ST -Y, R20 \ 0000000C 931A ST -Y, R17 \ 0000000E 930A ST -Y, R16 \ 00000010 B71F IN R17, 0x3F 60 unsigned char i; 61 62 // 1 ms has passed, decrement all non-zero timers. 63 for (i = 0; i < TIMERS; i++) { \ 00000012 .... LDI R30, LOW(timeval) \ 00000014 .... LDI R31, (timeval) >> 8 \ 00000016 E004 LDI R16, 4 64 if(timeval[i] > 0) { \ ??TICK_ISR_0: \ 00000018 8140 LD R20, Z \ 0000001A 8151 LDD R21, Z+1 \ 0000001C 8162 LDD R22, Z+2 \ 0000001E 8173 LDD R23, Z+3 \ 00000020 2B45 OR R20, R21 \ 00000022 2B46 OR R20, R22 \ 00000024 2B47 OR R20, R23 \ 00000026 F049 BREQ ??TICK_ISR_1 65 timeval[i]--; \ 00000028 8140 LD R20, Z \ 0000002A 5041 SUBI R20, 1 \ 0000002C 4050 SBCI R21, 0 \ 0000002E 4060 SBCI R22, 0 \ 00000030 4070 SBCI R23, 0 \ 00000032 8340 ST Z, R20 \ 00000034 8351 STD Z+1, R21 \ 00000036 8362 STD Z+2, R22 \ 00000038 8373 STD Z+3, R23 66 } 67 } \ ??TICK_ISR_1: \ 0000003A 9634 ADIW R31:R30, 4 \ 0000003C 950A DEC R16 \ 0000003E 2300 TST R16 \ 00000040 F759 BRNE ??TICK_ISR_0 68 } \ 00000042 BF1F OUT 0x3F, R17 \ 00000044 9109 LD R16, Y+ \ 00000046 9119 LD R17, Y+ \ 00000048 9149 LD R20, Y+ \ 0000004A 9159 LD R21, Y+ \ 0000004C 9169 LD R22, Y+ \ 0000004E 9179 LD R23, Y+ \ 00000050 91E9 LD R30, Y+ \ 00000052 91F9 LD R31, Y+ \ 00000054 9518 RETI 69 70 71 /*! \brief Checks if a specified timer has expired 72 * 73 * \param timer Specifies timer 74 * 75 * \retval TRUE Timer still going. 76 * \retval FALSE Timer has expired. 77 */ \ In segment CODE, align 2, keep-with-next 78 unsigned char Time_Left(unsigned char timer) \ Time_Left: 79 { 80 if(timeval[timer] > 0) { \ 00000000 E010 LDI R17, 0 \ 00000002 0F00 LSL R16 \ 00000004 1F11 ROL R17 \ 00000006 0F00 LSL R16 \ 00000008 1F11 ROL R17 \ 0000000A 01F8 MOVW R31:R30, R17:R16 \ 0000000C .... SUBI R30, LOW((-(timeval) & 0xFFFF)) \ 0000000E .... SBCI R31, (-(timeval) & 0xFFFF) >> 8 \ 00000010 8100 LD R16, Z \ 00000012 8111 LDD R17, Z+1 \ 00000014 8122 LDD R18, Z+2 \ 00000016 8133 LDD R19, Z+3 \ 00000018 2B01 OR R16, R17 \ 0000001A 2B02 OR R16, R18 \ 0000001C 2B03 OR R16, R19 \ 0000001E F011 BREQ ??Time_Left_0 81 return(TRUE); \ 00000020 E001 LDI R16, 1 \ 00000022 9508 RET 82 } else { 83 return(FALSE); \ ??Time_Left_0: \ 00000024 E000 LDI R16, 0 \ 00000026 9508 RET 84 } 85 } 86 87 88 /*! \brief Sets the specified timer 89 * 90 * \param timer Specifies timer 91 * \param min Minutes for timer to count down 92 * \param sec Seconds for timer to count down 93 * \param ms Milliseconds for timer to count down 94 */ \ In segment CODE, align 2, keep-with-next 95 void Time_Set(unsigned char timer, unsigned int min, unsigned char sec, \ Time_Set: 96 unsigned char ms) 97 { \ 00000000 928A ST -Y, R8 \ 00000002 926A ST -Y, R6 \ 00000004 925A ST -Y, R5 \ 00000006 924A ST -Y, R4 \ 00000008 93BA ST -Y, R27 \ 0000000A 93AA ST -Y, R26 \ 0000000C 939A ST -Y, R25 \ 0000000E 938A ST -Y, R24 \ 00000010 REQUIRE ?Register_R4_is_cg_reg \ 00000010 REQUIRE ?Register_R5_is_cg_reg \ 00000010 REQUIRE ?Register_R6_is_cg_reg \ 00000010 REQUIRE ?Register_R8_is_cg_reg \ 00000010 2E40 MOV R4, R16 \ 00000012 2E81 MOV R8, R17 \ 00000014 2E64 MOV R6, R20 98 // timeval[i] = 4 * (1000*(sec + 60*min) + ms); // about 4000 ticks per second 99 // timeval[i] = 240000 * (unsigned long)min; 100 // timeval[i] += 4000 * (unsigned long)sec; 101 // timeval[i] += 4 * (unsigned long)ms; 102 103 timeval[timer] = 60000 * (unsigned long)min; 104 timeval[timer] += 1000 * (unsigned long)sec; 105 timeval[timer] += 1 * (unsigned long)ms; \ 00000016 01A9 MOVW R21:R20, R19:R18 \ 00000018 E060 LDI R22, 0 \ 0000001A E070 LDI R23, 0 \ 0000001C E600 LDI R16, 96 \ 0000001E EE1A LDI R17, 234 \ 00000020 E020 LDI R18, 0 \ 00000022 E030 LDI R19, 0 \ 00000024 .... RCALL ?L_MUL_L03 \ 00000026 01C8 MOVW R25:R24, R17:R16 \ 00000028 01D9 MOVW R27:R26, R19:R18 \ 0000002A 2D48 MOV R20, R8 \ 0000002C E050 LDI R21, 0 \ 0000002E E060 LDI R22, 0 \ 00000030 E070 LDI R23, 0 \ 00000032 EE08 LDI R16, 232 \ 00000034 E013 LDI R17, 3 \ 00000036 E020 LDI R18, 0 \ 00000038 E030 LDI R19, 0 \ 0000003A .... RCALL ?L_MUL_L03 \ 0000003C 0F08 ADD R16, R24 \ 0000003E 1F19 ADC R17, R25 \ 00000040 1F2A ADC R18, R26 \ 00000042 1F3B ADC R19, R27 \ 00000044 2D46 MOV R20, R6 \ 00000046 E050 LDI R21, 0 \ 00000048 E060 LDI R22, 0 \ 0000004A E070 LDI R23, 0 \ 0000004C 0F40 ADD R20, R16 \ 0000004E 1F51 ADC R21, R17 \ 00000050 1F62 ADC R22, R18 \ 00000052 1F73 ADC R23, R19 \ 00000054 2455 CLR R5 \ 00000056 0C44 LSL R4 \ 00000058 1C55 ROL R5 \ 0000005A 0C44 LSL R4 \ 0000005C 1C55 ROL R5 \ 0000005E 01F2 MOVW R31:R30, R5:R4 \ 00000060 .... SUBI R30, LOW((-(timeval) & 0xFFFF)) \ 00000062 .... SBCI R31, (-(timeval) & 0xFFFF) >> 8 \ 00000064 8340 ST Z, R20 \ 00000066 8351 STD Z+1, R21 \ 00000068 8362 STD Z+2, R22 \ 0000006A 8373 STD Z+3, R23 106 } \ 0000006C 9189 LD R24, Y+ \ 0000006E 9199 LD R25, Y+ \ 00000070 91A9 LD R26, Y+ \ 00000072 91B9 LD R27, Y+ \ 00000074 9049 LD R4, Y+ \ 00000076 9059 LD R5, Y+ \ 00000078 9069 LD R6, Y+ \ 0000007A 9089 LD R8, Y+ \ 0000007C 9508 RET 107 108 109 /*! \brief Stops timers 110 * 111 * Sets timer0's clock source to none. 112 */ \ In segment CODE, align 2, keep-with-next 113 void Time_Stop(void) \ Time_Stop: 114 { 115 TCCR0B = 0; \ 00000000 E000 LDI R16, 0 \ 00000002 BF03 OUT 0x33, R16 116 } \ 00000004 9508 RET \ 00000006 REQUIRE _A_TCCR0B 117 118 119 /*! \brief Starts timers 120 * 121 * Sets timer0's clock source to system clock divided by 64. 122 */ \ In segment CODE, align 2, keep-with-next 123 void Time_Start(void) \ Time_Start: 124 { 125 TCCR0B = (0<