Initial import
[avr_bc100.git] / BaseTinyFirmware / IAR / Release / List / NIMHcharge.s90
1 ///////////////////////////////////////////////////////////////////////////////\r
2 //                                                                            /\r
3 // IAR Atmel AVR C/C++ Compiler V4.30F/W32              13/Mar/2008  04:52:02 /\r
4 // Copyright 1996-2007 IAR Systems. All rights reserved.                      /\r
5 //                                                                            /\r
6 //    Source file           =  C:\home\kevin\pub\src\bc100\IAR\NIMHcharge.c   /\r
7 //    Command line          =  C:\home\kevin\pub\src\bc100\IAR\NIMHcharge.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
30 //                             116-117                                        /\r
31 //    List file             =  C:\home\kevin\pub\src\bc100\IAR\Release\List\N /\r
32 //                             IMHcharge.s90                                  /\r
33 //                                                                            /\r
34 //                                                                            /\r
35 ///////////////////////////////////////////////////////////////////////////////\r
36 \r
37         NAME NIMHcharge\r
38 \r
39         RSEG CSTACK:DATA:NOROOT(0)\r
40         RSEG RSTACK:DATA:NOROOT(0)\r
41 \r
42         EXTERN ?SS_DIVMOD_L02\r
43         EXTERN ?US_DIVMOD_L02\r
44         EXTERN __eeget8_16\r
45 \r
46         PUBLIC Charge\r
47         PUBWEAK __?EEARH\r
48         PUBWEAK __?EEARL\r
49         PUBWEAK __?EECR\r
50         PUBWEAK __?EEDR\r
51 \r
52         EXTERN PWM_Start\r
53         EXTERN Time_Set\r
54         EXTERN ConstantCurrent\r
55         EXTERN PWM_Stop\r
56         EXTERN BattActive\r
57         EXTERN BattControl\r
58         EXTERN BattData\r
59         EXTERN ChargeParameters\r
60         EXTERN CurrentState\r
61         EXTERN HaltParameters\r
62 \r
63 // C:\home\kevin\pub\src\bc100\IAR\NIMHcharge.c\r
64 //    1 /* This file has been prepared for Doxygen automatic documentation generation.*/\r
65 //    2 /*! \file *********************************************************************\r
66 //    3  *\r
67 //    4  * \brief\r
68 //    5  *      Charge state function for NiMH batteries\r
69 //    6  *\r
70 //    7  *      Contains the charge state function, in which the NiMH charging\r
71 //    8  *      algorithm is, plus the associated functions.\r
72 //    9  *\r
73 //   10  * \par Application note:\r
74 //   11  *      AVR463: Charging NiMH Batteries with BC100 \n\r
75 //   12  *\r
76 //   13  * \par Documentation\r
77 //   14  *      For comprehensive code documentation, supported compilers, compiler \r
78 //   15  *      settings and supported devices see readme.html\r
79 //   16  *\r
80 //   17  * \author\r
81 //   18  *      Atmel Corporation: http://www.atmel.com \n\r
82 //   19  *      Support email: avr@atmel.com\r
83 //   20  *\r
84 //   21  * \r
85 //   22  * $Name$\r
86 //   23  * $Revision: 2255 $\r
87 //   24  * $RCSfile$\r
88 //   25  * $URL: http://svn.norway.atmel.com/AppsAVR8/avr463_Charging_NiMH_Batteries_with_BC100/trunk/code/IAR/NIMHcharge.c $\r
89 //   26  * $Date: 2007-08-09 14:47:58 +0200 (to, 09 aug 2007) $\n\r
90 //   27  ******************************************************************************/\r
91 //   28 \r
92 //   29 #include <ioavr.h>\r
93 //   30 \r
94 //   31 #include "enums.h"\r
95 //   32 #include "structs.h"\r
96 //   33 \r
97 //   34 #include "battery.h"\r
98 //   35 #include "charge.h"\r
99 //   36 #include "chargefunc.h"\r
100 //   37 #include "main.h"\r
101 //   38 #include "menu.h"\r
102 //   39 #include "NIMHspecs.h"\r
103 //   40 #include "PWM.h"\r
104 //   41 #include "time.h"\r
105 //   42 \r
106 //   43 #ifndef NIMH\r
107 //   44 #error NIMH not defined in main.h!\r
108 //   45 #endif // NIMH\r
109 //   46 \r
110 //   47 \r
111 //   48 //******************************************************************************\r
112 //   49 // Functions\r
113 //   50 //******************************************************************************\r
114 //   51 /*! \brief Controls the charging.\r
115 //   52  *\r
116 //   53  * This function contains the charging algorithm itself, divided into stages.\n\r
117 //   54  * For each stage the PWM may be started/stopped, and the timer, \r
118 //   55  * halt-requirements and charge parameters may be set.\n\r
119 //   56  * The charging functions return whatever state is next, and as long as no\r
120 //   57  * errors occur this is the next charging stage.\r
121 //   58  *\r
122 //   59  * \note If more stages are needed simply define more states in menu.h, include\r
123 //   60  * them in \ref menu_state[] in menu.c, then add the cases to this function.\r
124 //   61  *\r
125 //   62  * \note This algorithm is for NiMH batteries.\r
126 //   63  */\r
127 \r
128         RSEG CODE:CODE:NOROOT(1)\r
129 //   64 unsigned char Charge(unsigned char inp)\r
130 Charge:\r
131 //   65 {\r
132 //   66         unsigned char NextState;\r
133 //   67 \r
134 //   68         switch (CurrentState) {\r
135         LDS     R16, CurrentState\r
136         SUBI    R16, 30\r
137         BREQ    ??Charge_0\r
138         SUBI    R16, 20\r
139         BREQ    ??Charge_1\r
140         SUBI    R16, 10\r
141         BRNE    $+2+2\r
142         RJMP    ??Charge_2\r
143         SUBI    R16, 10\r
144         BRNE    $+2+2\r
145         RJMP    ??Charge_3\r
146         RJMP    ??Charge_4\r
147 //   69         // First stage is a prequalification. Attempt to charge battery to 1 V,\r
148 //   70         // using a 0.1 C current, within 2 minutes.\r
149 //   71         // If this fails, the battery is likely damaged.\r
150 //   72         // If it succeeds, start a fast charge.\r
151 //   73         case ST_PREQUAL:\r
152 //   74                 \r
153 //   75                 // Set up charge current and next state.\r
154 //   76                 ChargeParameters.Current = BattData.Capacity / 10;\r
155 ??Charge_0:\r
156         LDI     R30, LOW(BattData)\r
157         LDI     R31, (BattData) >> 8\r
158         LDD     R16, Z+4\r
159         LDD     R17, Z+5\r
160         LDI     R20, 10\r
161         LDI     R21, 0\r
162         RCALL   ?US_DIVMOD_L02\r
163         LDI     R30, LOW(ChargeParameters)\r
164         LDI     R31, (ChargeParameters) >> 8\r
165         STD     Z+2, R16\r
166         STD     Z+3, R17\r
167 //   77                 ChargeParameters.NextState = ST_FASTCHARGE;\r
168         LDI     R16, 50\r
169         STD     Z+4, R16\r
170 //   78                 \r
171 //   79                 // Halt charge on voltage limit or timeout.\r
172 //   80                 // Timeout means battery exhaustion.\r
173 //   81                 HaltParameters.HaltFlags = (HALT_VOLTAGE_MAX | HALT_TIME |\r
174 //   82                                             HALT_FLAG_EXHAUSTION);\r
175         LDI     R30, LOW(HaltParameters)\r
176         LDI     R31, (HaltParameters) >> 8\r
177         ST      Z, R16\r
178 //   83                 \r
179 //   84                 // Set up voltage limit and temperature limits.\r
180 //   85                 HaltParameters.VoltageMax = BAT_VOLTAGE_PREQUAL;\r
181         LDI     R16, 184\r
182         LDI     R17, 11\r
183         STD     Z+3, R16\r
184         STD     Z+4, R17\r
185 //   86                 HaltParameters.TemperatureMin = BAT_TEMPERATURE_MIN;\r
186         LDI     R16, 5\r
187         LDI     R17, 0\r
188         STD     Z+9, R16\r
189         STD     Z+10, R17\r
190 //   87                 HaltParameters.TemperatureMax = 35;\r
191         LDI     R16, 35\r
192         STD     Z+7, R16\r
193         STD     Z+8, R17\r
194 //   88                 \r
195 //   89                 // Reset temperature measurement for HaltNow().\r
196 //   90                 HaltParameters.LastNTC = 0;\r
197         STD     Z+15, R17\r
198         STD     Z+16, R17\r
199 //   91                 \r
200 //   92                 // Start PWM and charge timer before calling the charge function.\r
201 //   93                 PWM_Start();\r
202         RCALL   PWM_Start\r
203 //   94                 Time_Set(TIMER_CHG, BAT_TIME_PREQUAL, 0, 0);\r
204         LDI     R20, 0\r
205         LDI     R17, 0\r
206         LDI     R18, 2\r
207         RJMP    ??Charge_5\r
208 //   95                 \r
209 //   96                 // Call charge function, get next state.\r
210 //   97                 NextState = ConstantCurrent();\r
211 //   98         break;\r
212 //   99 \r
213 //  100 \r
214 //  101         // Second stage is a fast charge. Charge at 1.0 C for at most 1.5 hours,\r
215 //  102         // until either rate of temperature increase or voltage reaches limit, or\r
216 //  103         // the voltage drops sufficiently.\r
217 //  104         // Timeout doesn't mean battery exhaustion now.\r
218 //  105         case ST_FASTCHARGE:\r
219 //  106 \r
220 //  107                 // Set up charge current and next state.\r
221 //  108                 ChargeParameters.Current = BattData.Capacity;\r
222 ??Charge_1:\r
223         LDI     R18, LOW(BattData)\r
224         LDI     R19, (BattData) >> 8\r
225         MOVW    R31:R30, R19:R18\r
226         LDD     R16, Z+4\r
227         LDD     R17, Z+5\r
228         LDI     R30, LOW(ChargeParameters)\r
229         LDI     R31, (ChargeParameters) >> 8\r
230         STD     Z+2, R16\r
231         STD     Z+3, R17\r
232 //  109                 ChargeParameters.NextState = ST_LOWRATECHARGE;\r
233         LDI     R16, 60\r
234         STD     Z+4, R16\r
235 //  110                 \r
236 //  111                 // Halt charge on voltage limit, timeout, voltage drop or rate of \r
237 //  112                 // temperature increase.\r
238 //  113                 HaltParameters.HaltFlags = (HALT_VOLTAGE_MAX | HALT_TIME |\r
239 //  114                                             HALT_VOLTAGE_DROP | HALT_TEMPERATURE_RISE);\r
240         LDI     R30, LOW(HaltParameters)\r
241         LDI     R31, (HaltParameters) >> 8\r
242         LDI     R16, 27\r
243         ST      Z, R16\r
244 //  115                 \r
245 //  116                 // Set up limits for voltage, voltage drop, temperature and rate of \r
246 //  117                 // temperature increase (1 degree C per minute).\r
247 //  118                 HaltParameters.VoltageMax = BAT_VOLTAGE_MAX;\r
248         LDI     R16, 192\r
249         LDI     R17, 18\r
250         STD     Z+3, R16\r
251         STD     Z+4, R17\r
252 //  119                 HaltParameters.VoltageDrop = BAT_VOLTAGE_DROP;\r
253         LDI     R16, 45\r
254         LDI     R17, 0\r
255         STD     Z+1, R16\r
256         STD     Z+2, R17\r
257 //  120                 HaltParameters.TemperatureMax = BAT_TEMPERATURE_MAX;\r
258         LDI     R16, 50\r
259         STD     Z+7, R16\r
260         STD     Z+8, R17\r
261 //  121                 HaltParameters.TemperatureRise = 1;\r
262         LDI     R16, 1\r
263         STD     Z+11, R16\r
264         STD     Z+12, R17\r
265 //  122                 \r
266 //  123                 // Reset maximum voltage measurement for HaltNow().\r
267 //  124                 HaltParameters.VBATMax = 0;\r
268         STD     Z+13, R17\r
269         STD     Z+14, R17\r
270 //  125 \r
271 //  126                 // Start timer, PWM should still be running.\r
272 //  127                 Time_Set(TIMER_CHG, BattData.MaxTime, 0, 0);\r
273         LDI     R20, 0\r
274         MOVW    R31:R30, R19:R18\r
275         LDD     R18, Z+8\r
276         LDD     R19, Z+9\r
277         RJMP    ??Charge_6\r
278 //  128 \r
279 //  129                 // Call charge function, get next state.\r
280 //  130                 NextState = ConstantCurrent();\r
281 //  131         break;\r
282 //  132 \r
283 //  133 \r
284 //  134         // Last stage is a trickle charge. Charge at 0.1 C for at most 30 minutes,\r
285 //  135         // until either rate of temperature increase or voltage reaches limit.\r
286 //  136         case ST_LOWRATECHARGE:\r
287 //  137                 \r
288 //  138                 // Set up charge current and next state.\r
289 //  139                 ChargeParameters.Current = BattData.Capacity / 10;\r
290 ??Charge_2:\r
291         LDI     R30, LOW(BattData)\r
292         LDI     R31, (BattData) >> 8\r
293         LDD     R16, Z+4\r
294         LDD     R17, Z+5\r
295         LDI     R20, 10\r
296         LDI     R21, 0\r
297         RCALL   ?US_DIVMOD_L02\r
298         LDI     R30, LOW(ChargeParameters)\r
299         LDI     R31, (ChargeParameters) >> 8\r
300         STD     Z+2, R16\r
301         STD     Z+3, R17\r
302 //  140                 ChargeParameters.NextState = ST_ENDCHARGE;\r
303         LDI     R16, 70\r
304         STD     Z+4, R16\r
305 //  141                 \r
306 //  142                 // Halt charge on voltage limit, timeout or temperature rise.\r
307 //  143                 // Use the same requirements as during the last stage (ST_FASTCHARGE).\r
308 //  144                 HaltParameters.HaltFlags = (HALT_VOLTAGE_MAX | HALT_TIME |\r
309 //  145                                             HALT_TEMPERATURE_RISE);\r
310         LDI     R16, 26\r
311         STS     HaltParameters, R16\r
312 //  146 \r
313 //  147                 // Start timer, 30 minutes.\r
314 //  148                 Time_Set(TIMER_CHG, 30, 0, 0);\r
315         LDI     R20, 0\r
316         LDI     R17, 0\r
317         LDI     R18, 30\r
318 ??Charge_5:\r
319         LDI     R19, 0\r
320         LDI     R16, 1\r
321 ??Charge_6:\r
322         RCALL   Time_Set\r
323 //  149                 \r
324 //  150                 // Call charge function, get next state.\r
325 //  151                 NextState = ConstantCurrent();\r
326         RJMP    ConstantCurrent\r
327 //  152         break;\r
328 //  153 \r
329 //  154 \r
330 //  155         // Charging is done!\r
331 //  156         case ST_ENDCHARGE:\r
332 //  157 \r
333 //  158                 // Stop the PWM output and flag battery as charged.\r
334 //  159                 PWM_Stop();\r
335 ??Charge_3:\r
336         RCALL   PWM_Stop\r
337 //  160                 BattData.Charged = TRUE;\r
338         LDI     R30, LOW(BattData)\r
339         LDI     R31, (BattData) >> 8\r
340         LD      R16, Z\r
341         ORI     R16, 0x02\r
342         ST      Z, R16\r
343 //  161                 \r
344 //  162                 // If the other battery is enabled go to ST_BATCON, otherwise\r
345 //  163                 // go to ST_SLEEP.\r
346 //  164                 if (BattControl[(BattActive+1)%2].Enabled) {\r
347         LDS     R16, BattActive\r
348         LDI     R17, 0\r
349         SUBI    R16, 255\r
350         SBCI    R17, 255\r
351         LDI     R20, 2\r
352         LDI     R21, 0\r
353         RCALL   ?SS_DIVMOD_L02\r
354         LDI     R18, LOW(BattControl)\r
355         LDI     R19, (BattControl) >> 8\r
356         ADD     R18, R20\r
357         ADC     R19, R21\r
358         MOVW    R21:R20, R19:R18\r
359         RCALL   __eeget8_16\r
360         ANDI    R16, 0x01\r
361         BREQ    ??Charge_7\r
362 //  165                         NextState = ST_BATCON;\r
363         LDI     R16, 20\r
364         RET\r
365 //  166                 } else {\r
366 //  167                         NextState = ST_SLEEP;\r
367 ??Charge_7:\r
368         LDI     R16, 40\r
369         RET\r
370 //  168                 }               \r
371 //  169         break;\r
372 //  170 \r
373 //  171 \r
374 //  172         default:  // Shouldn't end up here. Reinitialize for safety.\r
375 //  173                 NextState = ST_INIT;\r
376 ??Charge_4:\r
377         LDI     R16, 10\r
378 //  174                 break;\r
379 //  175         }\r
380 //  176 \r
381 //  177         // Return the next state to main().\r
382 //  178         return(NextState);\r
383         RET\r
384 //  179 }\r
385 \r
386         ASEGN ABSOLUTE:DATA:NOROOT,01cH\r
387 __?EECR:\r
388 \r
389         ASEGN ABSOLUTE:DATA:NOROOT,01dH\r
390 __?EEDR:\r
391 \r
392         ASEGN ABSOLUTE:DATA:NOROOT,01eH\r
393 __?EEARL:\r
394 \r
395         ASEGN ABSOLUTE:DATA:NOROOT,01fH\r
396 __?EEARH:\r
397 \r
398         END\r
399 // \r
400 // 268 bytes in segment CODE\r
401 // \r
402 // 268 bytes of CODE memory\r
403 //\r
404 //Errors: none\r
405 //Warnings: none\r