Initial import
[avr_bc100.git] / BaseTinyFirmware / IAR / Debug / List / time.s90
1 ///////////////////////////////////////////////////////////////////////////////\r
2 //                                                                            /\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
5 //                                                                            /\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
20 //                                                                            /\r
21 //                                                                            /\r
22 ///////////////////////////////////////////////////////////////////////////////\r
23 \r
24         NAME time\r
25 \r
26         RSEG CSTACK:DATA:NOROOT(0)\r
27         RSEG RSTACK:DATA:NOROOT(0)\r
28 \r
29         EXTERN ?EPILOGUE_B7_L09\r
30         EXTERN ?L_MUL_L03\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
36 \r
37         PUBWEAK `?<Segment init: NEAR_Z>`\r
38         PUBWEAK `??TICK_ISR??INTVEC 28`\r
39         PUBLIC TICK_ISR\r
40         PUBLIC Time_Init\r
41         PUBLIC Time_Left\r
42         PUBLIC Time_Set\r
43         PUBLIC Time_Start\r
44         PUBLIC Time_Stop\r
45         PUBWEAK _A_OCR0A\r
46         PUBWEAK _A_OCR0B\r
47         PUBWEAK _A_TCCR0A\r
48         PUBWEAK _A_TCCR0B\r
49         PUBWEAK _A_TIMSK\r
50         PUBWEAK __?EEARH\r
51         PUBWEAK __?EEARL\r
52         PUBWEAK __?EECR\r
53         PUBWEAK __?EEDR\r
54         PUBLIC timeval\r
55 \r
56 TICK_ISR            SYMBOL "TICK_ISR"\r
57 `??TICK_ISR??INTVEC 28` SYMBOL "??INTVEC 28", TICK_ISR\r
58 \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
62 //    3  *\r
63 //    4  * \brief\r
64 //    5  *      Functions for timing\r
65 //    6  *\r
66 //    7  *      Contains functions to initialize, set, poll and stop timers.\r
67 //    8  *\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
71 //   12  *\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
75 //   16  *\r
76 //   17  * \author\r
77 //   18  *      Atmel Corporation: http://www.atmel.com \n\r
78 //   19  *      Support email: avr@atmel.com\r
79 //   20  *\r
80 //   21  * \r
81 //   22  * $Name$\r
82 //   23  * $Revision: 2299 $\r
83 //   24  * $RCSfile$\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
87 //   28 \r
88 //   29 #include <ioavr.h>\r
89 \r
90         ASEGN ABSOLUTE:DATA:NOROOT,059H\r
91 // <unnamed> volatile __io _A_TIMSK\r
92 _A_TIMSK:\r
93         DS 1\r
94 \r
95         ASEGN ABSOLUTE:DATA:NOROOT,053H\r
96 // <unnamed> volatile __io _A_TCCR0B\r
97 _A_TCCR0B:\r
98         DS 1\r
99 \r
100         ASEGN ABSOLUTE:DATA:NOROOT,035H\r
101 // <unnamed> volatile __io _A_TCCR0A\r
102 _A_TCCR0A:\r
103         DS 1\r
104 \r
105         ASEGN ABSOLUTE:DATA:NOROOT,033H\r
106 // <unnamed> volatile __io _A_OCR0A\r
107 _A_OCR0A:\r
108         DS 1\r
109 \r
110         ASEGN ABSOLUTE:DATA:NOROOT,032H\r
111 // <unnamed> volatile __io _A_OCR0B\r
112 _A_OCR0B:\r
113         DS 1\r
114 //   30 #include <inavr.h>\r
115 //   31 \r
116 //   32 #include "enums.h"\r
117 //   33 \r
118 //   34 #include "main.h"\r
119 //   35 #include "time.h"\r
120 //   36 \r
121 //   37 \r
122 //   38 //******************************************************************************\r
123 //   39 // Variables\r
124 //   40 //******************************************************************************\r
125 \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
129 timeval:\r
130         DS 16\r
131 //   42 \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
134 //   45 \r
135 //   46 \r
136 //   47 //******************************************************************************\r
137 //   48 // Functions\r
138 //   49 //******************************************************************************\r
139 //   50 /*! \brief Interrupt service routine for timer 0 overflow\r
140 //   51  *\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
145 //   56  */\r
146 //   57 #pragma vector = TIM0_COMPA_vect\r
147 \r
148         RSEG CODE:CODE:NOROOT(1)\r
149 //   58 __interrupt void TICK_ISR(void)\r
150 TICK_ISR:\r
151 //   59 {\r
152         ST      -Y, R31\r
153         ST      -Y, R30\r
154         ST      -Y, R0\r
155         ST      -Y, R23\r
156         ST      -Y, R22\r
157         ST      -Y, R21\r
158         ST      -Y, R20\r
159         ST      -Y, R19\r
160         ST      -Y, R18\r
161         ST      -Y, R17\r
162         ST      -Y, R16\r
163         IN      R0, 0x3F\r
164 //   60         unsigned char i;\r
165 //   61 \r
166 //   62         // 1 ms has passed, decrement all non-zero timers.\r
167 //   63         for (i = 0; i < TIMERS; i++) {\r
168         LDI     R16, 0\r
169 ??TICK_ISR_0:\r
170         CPI     R16, 4\r
171         BRCC    ??TICK_ISR_1\r
172 //   64                 if(timeval[i] > 0) {\r
173         MOV     R18, R16\r
174         LDI     R19, 0\r
175         LSL     R18\r
176         ROL     R19\r
177         LSL     R18\r
178         ROL     R19\r
179         MOVW    R31:R30, R19:R18\r
180         SUBI    R30, LOW((-(timeval) & 0xFFFF))\r
181         SBCI    R31, (-(timeval) & 0xFFFF) >> 8\r
182         LD      R20, Z\r
183         LDD     R21, Z+1\r
184         LDD     R22, Z+2\r
185         LDD     R23, Z+3\r
186         OR      R20, R21\r
187         OR      R20, R22\r
188         OR      R20, R23\r
189         BREQ    ??TICK_ISR_2\r
190 //   65                         timeval[i]--;\r
191         MOV     R18, R16\r
192         LDI     R19, 0\r
193         LSL     R18\r
194         ROL     R19\r
195         LSL     R18\r
196         ROL     R19\r
197         MOVW    R31:R30, R19:R18\r
198         SUBI    R30, LOW((-(timeval) & 0xFFFF))\r
199         SBCI    R31, (-(timeval) & 0xFFFF) >> 8\r
200         LD      R20, Z\r
201         LDD     R21, Z+1\r
202         LDD     R22, Z+2\r
203         LDD     R23, Z+3\r
204         SUBI    R20, 1\r
205         SBCI    R21, 0\r
206         SBCI    R22, 0\r
207         SBCI    R23, 0\r
208         ST      Z, R20\r
209         STD     Z+1, R21\r
210         STD     Z+2, R22\r
211         STD     Z+3, R23\r
212 //   66                 }\r
213 //   67         }\r
214 ??TICK_ISR_2:\r
215         INC     R16\r
216         RJMP    ??TICK_ISR_0\r
217 //   68 }\r
218 ??TICK_ISR_1:\r
219         OUT     0x3F, R0\r
220         LD      R16, Y+\r
221         LD      R17, Y+\r
222         LD      R18, Y+\r
223         LD      R19, Y+\r
224         LD      R20, Y+\r
225         LD      R21, Y+\r
226         LD      R22, Y+\r
227         LD      R23, Y+\r
228         LD      R0, Y+\r
229         LD      R30, Y+\r
230         LD      R31, Y+\r
231         RETI\r
232 //   69 \r
233 //   70 \r
234 //   71 /*! \brief Checks if a specified timer has expired\r
235 //   72  *\r
236 //   73  * \param timer Specifies timer\r
237 //   74  *\r
238 //   75  * \retval TRUE Timer still going.\r
239 //   76  * \retval FALSE Timer has expired.\r
240 //   77  */ \r
241 \r
242         RSEG CODE:CODE:NOROOT(1)\r
243 //   78 unsigned char Time_Left(unsigned char timer)\r
244 Time_Left:\r
245 //   79 {\r
246         MOV     R18, R16\r
247 //   80         if(timeval[timer] > 0) {\r
248         MOV     R16, R18\r
249         LDI     R17, 0\r
250         LSL     R16\r
251         ROL     R17\r
252         LSL     R16\r
253         ROL     R17\r
254         MOVW    R31:R30, R17:R16\r
255         SUBI    R30, LOW((-(timeval) & 0xFFFF))\r
256         SBCI    R31, (-(timeval) & 0xFFFF) >> 8\r
257         LD      R20, Z\r
258         LDD     R21, Z+1\r
259         LDD     R22, Z+2\r
260         LDD     R23, Z+3\r
261         OR      R20, R21\r
262         OR      R20, R22\r
263         OR      R20, R23\r
264         BREQ    ??Time_Left_0\r
265 //   81                 return(TRUE);\r
266         LDI     R16, 1\r
267         RET\r
268 //   82         } else {\r
269 //   83                 return(FALSE);\r
270 ??Time_Left_0:\r
271         LDI     R16, 0\r
272         RET\r
273 //   84         }\r
274 //   85 }\r
275 //   86 \r
276 //   87 \r
277 //   88 /*! \brief Sets the specified timer\r
278 //   89  *\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
283 //   94  */\r
284 \r
285         RSEG CODE:CODE:NOROOT(1)\r
286 //   95 void Time_Set(unsigned char timer, unsigned int min, unsigned char sec,\r
287 Time_Set:\r
288 //   96                                   unsigned char ms)\r
289 //   97 {\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
294         MOV     R26, R16\r
295         MOVW    R25:R24, R19:R18\r
296         MOV     R6, R17\r
297         MOV     R4, R20\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
302 //  102 \r
303 //  103         timeval[timer] = 60000 * (unsigned long)min;\r
304         MOVW    R21:R20, R25:R24\r
305         LDI     R22, 0\r
306         LDI     R23, 0\r
307         LDI     R16, 96\r
308         LDI     R17, 234\r
309         LDI     R18, 0\r
310         LDI     R19, 0\r
311         RCALL   ?L_MUL_L03\r
312         MOV     R20, R26\r
313         LDI     R21, 0\r
314         LSL     R20\r
315         ROL     R21\r
316         LSL     R20\r
317         ROL     R21\r
318         MOVW    R31:R30, R21:R20\r
319         SUBI    R30, LOW((-(timeval) & 0xFFFF))\r
320         SBCI    R31, (-(timeval) & 0xFFFF) >> 8\r
321         ST      Z, R16\r
322         STD     Z+1, R17\r
323         STD     Z+2, R18\r
324         STD     Z+3, R19\r
325 //  104         timeval[timer] += 1000 * (unsigned long)sec;\r
326         MOV     R20, R6\r
327         LDI     R21, 0\r
328         LDI     R22, 0\r
329         LDI     R23, 0\r
330         LDI     R16, 232\r
331         LDI     R17, 3\r
332         LDI     R18, 0\r
333         LDI     R19, 0\r
334         RCALL   ?L_MUL_L03\r
335         MOV     R20, R26\r
336         LDI     R21, 0\r
337         LSL     R20\r
338         ROL     R21\r
339         LSL     R20\r
340         ROL     R21\r
341         MOVW    R31:R30, R21:R20\r
342         SUBI    R30, LOW((-(timeval) & 0xFFFF))\r
343         SBCI    R31, (-(timeval) & 0xFFFF) >> 8\r
344         LD      R20, Z\r
345         LDD     R21, Z+1\r
346         LDD     R22, Z+2\r
347         LDD     R23, Z+3\r
348         ADD     R20, R16\r
349         ADC     R21, R17\r
350         ADC     R22, R18\r
351         ADC     R23, R19\r
352         ST      Z, R20\r
353         STD     Z+1, R21\r
354         STD     Z+2, R22\r
355         STD     Z+3, R23\r
356 //  105         timeval[timer] += 1 * (unsigned long)ms;\r
357         CLR     R5\r
358         MOVW    R17:R16, R5:R4\r
359         LDI     R18, 0\r
360         LDI     R19, 0\r
361         MOV     R20, R26\r
362         LDI     R21, 0\r
363         LSL     R20\r
364         ROL     R21\r
365         LSL     R20\r
366         ROL     R21\r
367         MOVW    R31:R30, R21:R20\r
368         SUBI    R30, LOW((-(timeval) & 0xFFFF))\r
369         SBCI    R31, (-(timeval) & 0xFFFF) >> 8\r
370         LD      R20, Z\r
371         LDD     R21, Z+1\r
372         LDD     R22, Z+2\r
373         LDD     R23, Z+3\r
374         ADD     R20, R16\r
375         ADC     R21, R17\r
376         ADC     R22, R18\r
377         ADC     R23, R19\r
378         ST      Z, R20\r
379         STD     Z+1, R21\r
380         STD     Z+2, R22\r
381         STD     Z+3, R23\r
382 //  106 }\r
383         LDI     R30, 7\r
384         RJMP    ?EPILOGUE_B7_L09\r
385 //  107 \r
386 //  108 \r
387 //  109 /*! \brief Stops timers\r
388 //  110  *\r
389 //  111  * Sets timer0's clock source to none.\r
390 //  112  */\r
391 \r
392         RSEG CODE:CODE:NOROOT(1)\r
393 //  113 void Time_Stop(void)\r
394 Time_Stop:\r
395 //  114 {\r
396 //  115         TCCR0B = 0;\r
397         LDI     R16, 0\r
398         OUT     0x33, R16\r
399 //  116 }\r
400         RET\r
401         REQUIRE _A_TCCR0B\r
402 //  117 \r
403 //  118 \r
404 //  119 /*! \brief Starts timers\r
405 //  120  *\r
406 //  121  * Sets timer0's clock source to system clock divided by 64.\r
407 //  122  */\r
408 \r
409         RSEG CODE:CODE:NOROOT(1)\r
410 //  123 void Time_Start(void)\r
411 Time_Start:\r
412 //  124 {\r
413 //  125         TCCR0B = (0<<CS02)|(1<<CS01)|(1<<CS00);         // CLKT0 = CLK/64 = 125 kHz.\r
414         LDI     R16, 3\r
415         OUT     0x33, R16\r
416 //  126 }\r
417         RET\r
418         REQUIRE _A_TCCR0B\r
419 //  127 \r
420 //  128 \r
421 //  129 /*! \brief Initializes timers\r
422 //  130  *\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
425 //  133  */\r
426 \r
427         RSEG CODE:CODE:NOROOT(1)\r
428 //  134 void Time_Init(void)\r
429 Time_Init:\r
430 //  135 {\r
431 //  136         unsigned char i;\r
432 //  137         \r
433 //  138         for (i = 0; i<<TIMERS; i++)     {\r
434         LDI     R20, 0\r
435 ??Time_Init_0:\r
436         TST     R20\r
437         BREQ    ??Time_Init_1\r
438 //  139                 timeval[i] = 0;\r
439         LDI     R16, 0\r
440         LDI     R17, 0\r
441         LDI     R18, 0\r
442         LDI     R19, 0\r
443         MOV     R22, R20\r
444         LDI     R23, 0\r
445         LSL     R22\r
446         ROL     R23\r
447         LSL     R22\r
448         ROL     R23\r
449         MOVW    R31:R30, R23:R22\r
450         SUBI    R30, LOW((-(timeval) & 0xFFFF))\r
451         SBCI    R31, (-(timeval) & 0xFFFF) >> 8\r
452         ST      Z, R16\r
453         STD     Z+1, R17\r
454         STD     Z+2, R18\r
455         STD     Z+3, R19\r
456 //  140         }\r
457         INC     R20\r
458         RJMP    ??Time_Init_0\r
459 //  141 \r
460 //  142         //    OCR0A = 0;  // Doesn't matter, will run in normal mode.\r
461 //  143         \r
462 //  144         OCR0A = 125;  // Will give a compare match every ms.\r
463 ??Time_Init_1:\r
464         LDI     R16, 125\r
465         OUT     0x13, R16\r
466 //  145         \r
467 //  146         OCR0B = 0;  // Doesn't matter, will run in normal mode.\r
468         LDI     R16, 0\r
469         OUT     0x12, R16\r
470 //  147 \r
471 //  148                 //    TCCR0A = 0;  // Normal 8-bit mode, no input capture.\r
472 //  149 \r
473 //  150         TCCR0A = (1<<WGM00);  // 8-bit CTC mode.\r
474         LDI     R16, 1\r
475         OUT     0x15, R16\r
476 //  151         \r
477 //  152         //    TCCR0B = (0<<CS02)|(1<<CS01)|(0<<CS00);  // CLKT0 = CLK/8 = 1 MHz.\r
478 //  153         \r
479 //  154         TCCR0B = (0<<CS02)|(1<<CS01)|(1<<CS00);         // CLKT0 = CLK/64 = 125 kHz.\r
480         LDI     R16, 3\r
481         OUT     0x33, R16\r
482 //  155 \r
483 //  156         //    TIMSK |= (1<<TOIE0);      // Overflow interrupt enabled.\r
484 //  157 \r
485 //  158         TIMSK |= (1<<OCIE0A);  // Timer 0, Compare match A interrupt enabled.\r
486         IN      R16, 0x39\r
487         ORI     R16, 0x10\r
488         OUT     0x39, R16\r
489 //  159 \r
490 //  160         // Enable interrupts, just in case they weren't already.\r
491 //  161         __enable_interrupt();       \r
492         SEI\r
493 //  162 }\r
494         RET\r
495         REQUIRE _A_TIMSK\r
496         REQUIRE _A_TCCR0B\r
497         REQUIRE _A_TCCR0A\r
498         REQUIRE _A_OCR0A\r
499         REQUIRE _A_OCR0B\r
500 \r
501         ASEGN ABSOLUTE:DATA:NOROOT,01cH\r
502 __?EECR:\r
503 \r
504         ASEGN ABSOLUTE:DATA:NOROOT,01dH\r
505 __?EEDR:\r
506 \r
507         ASEGN ABSOLUTE:DATA:NOROOT,01eH\r
508 __?EEARL:\r
509 \r
510         ASEGN ABSOLUTE:DATA:NOROOT,01fH\r
511 __?EEARH:\r
512 \r
513         COMMON INTVEC:CODE:ROOT(1)\r
514         ORG 28\r
515 `??TICK_ISR??INTVEC 28`:\r
516         RJMP    TICK_ISR\r
517 \r
518         RSEG INITTAB:CODE:NOROOT(0)\r
519 `?<Segment init: NEAR_Z>`:\r
520         DW      SFE(NEAR_Z) - SFB(NEAR_Z)\r
521         DW      SFB(NEAR_Z)\r
522         DW      0\r
523         REQUIRE ?need_segment_init\r
524 \r
525         END\r
526 // \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
532 // \r
533 // 428 bytes of CODE memory (+ 8 bytes shared)\r
534 //  16 bytes of DATA memory (+ 5 bytes shared)\r
535 //\r
536 //Errors: none\r
537 //Warnings: none\r