Details | Last modification | View Log | SVN | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 361 | andfri | 1 | 1 .file "timebase.c" |
| 2 | 2 .arch atmega8 |
||
| 3 | 3 __SREG__ = 0x3f |
||
| 4 | 4 __SP_H__ = 0x3e |
||
| 5 | 5 __SP_L__ = 0x3d |
||
| 6 | 6 __tmp_reg__ = 0 |
||
| 7 | 7 __zero_reg__ = 1 |
||
| 8 | 8 .global __do_copy_data |
||
| 9 | 9 .global __do_clear_bss |
||
| 10 | 11 .text |
||
| 11 | 12 .Ltext0: |
||
| 12 | 64 .global __vector_4 |
||
| 13 | 66 __vector_4: |
||
| 14 | 1:../avr-lib/drivers/timer/timebase.c **** /** |
||
| 15 | 2:../avr-lib/drivers/timer/timebase.c **** * Timebase software module. Utilizes timer0 to provide a 32bit timebase with |
||
| 16 | 3:../avr-lib/drivers/timer/timebase.c **** * millisecond-granularity to the application. |
||
| 17 | 4:../avr-lib/drivers/timer/timebase.c **** * |
||
| 18 | 5:../avr-lib/drivers/timer/timebase.c **** * @author Martin Thomas |
||
| 19 | 6:../avr-lib/drivers/timer/timebase.c **** * @author Jimmy Myhrman |
||
| 20 | 7:../avr-lib/drivers/timer/timebase.c **** * |
||
| 21 | 8:../avr-lib/drivers/timer/timebase.c **** * @date 2006-11-19 |
||
| 22 | 9:../avr-lib/drivers/timer/timebase.c **** */ |
||
| 23 | 10:../avr-lib/drivers/timer/timebase.c **** |
||
| 24 | 11:../avr-lib/drivers/timer/timebase.c **** /*----------------------------------------------------------------------------- |
||
| 25 | 12:../avr-lib/drivers/timer/timebase.c **** * Includes |
||
| 26 | 13:../avr-lib/drivers/timer/timebase.c **** *---------------------------------------------------------------------------*/ |
||
| 27 | 14:../avr-lib/drivers/timer/timebase.c **** #include <inttypes.h> |
||
| 28 | 15:../avr-lib/drivers/timer/timebase.c **** #include <avr/io.h> |
||
| 29 | 16:../avr-lib/drivers/timer/timebase.c **** #include <avr/interrupt.h> |
||
| 30 | 17:../avr-lib/drivers/timer/timebase.c **** |
||
| 31 | 18:../avr-lib/drivers/timer/timebase.c **** #include <config.h> |
||
| 32 | 19:../avr-lib/drivers/timer/timebase.c **** #include <drivers/timer/timebase.h> |
||
| 33 | 20:../avr-lib/drivers/timer/timebase.c **** |
||
| 34 | 21:../avr-lib/drivers/timer/timebase.c **** |
||
| 35 | 22:../avr-lib/drivers/timer/timebase.c **** /*----------------------------------------------------------------------------- |
||
| 36 | 23:../avr-lib/drivers/timer/timebase.c **** * Globals |
||
| 37 | 24:../avr-lib/drivers/timer/timebase.c **** *---------------------------------------------------------------------------*/ |
||
| 38 | 25:../avr-lib/drivers/timer/timebase.c **** volatile uint32_t gMilliSecTick; |
||
| 39 | 26:../avr-lib/drivers/timer/timebase.c **** |
||
| 40 | 27:../avr-lib/drivers/timer/timebase.c **** |
||
| 41 | 28:../avr-lib/drivers/timer/timebase.c **** /*----------------------------------------------------------------------------- |
||
| 42 | 29:../avr-lib/drivers/timer/timebase.c **** * Interrupt Service Routines |
||
| 43 | 30:../avr-lib/drivers/timer/timebase.c **** *---------------------------------------------------------------------------*/ |
||
| 44 | 31:../avr-lib/drivers/timer/timebase.c **** #if defined(TIMER2) |
||
| 45 | 32:../avr-lib/drivers/timer/timebase.c **** ISR(SIG_OVERFLOW2) { |
||
| 46 | 68 .LM0: |
||
| 47 | 69 /* prologue: frame size=0 */ |
||
| 48 | 70 0000 1F92 push __zero_reg__ |
||
| 49 | 71 0002 0F92 push __tmp_reg__ |
||
| 50 | 72 0004 0FB6 in __tmp_reg__,__SREG__ |
||
| 51 | 73 0006 0F92 push __tmp_reg__ |
||
| 52 | 74 0008 1124 clr __zero_reg__ |
||
| 53 | 75 000a 8F93 push r24 |
||
| 54 | 76 000c 9F93 push r25 |
||
| 55 | 77 000e AF93 push r26 |
||
| 56 | 78 0010 BF93 push r27 |
||
| 57 | 79 /* prologue end (size=9) */ |
||
| 58 | 33:../avr-lib/drivers/timer/timebase.c **** TCNT2 = TIMEBASE_RELOAD; |
||
| 59 | 81 .LM1: |
||
| 60 | 82 0012 83E8 ldi r24,lo8(-125) |
||
| 61 | 83 0014 84BD out 68-0x20,r24 |
||
| 62 | 34:../avr-lib/drivers/timer/timebase.c **** gMilliSecTick++; |
||
| 63 | 85 .LM2: |
||
| 64 | 86 0016 8091 0000 lds r24,gMilliSecTick |
||
| 65 | 87 001a 9091 0000 lds r25,(gMilliSecTick)+1 |
||
| 66 | 88 001e A091 0000 lds r26,(gMilliSecTick)+2 |
||
| 67 | 89 0022 B091 0000 lds r27,(gMilliSecTick)+3 |
||
| 68 | 90 0026 0196 adiw r24,1 |
||
| 69 | 91 0028 A11D adc r26,__zero_reg__ |
||
| 70 | 92 002a B11D adc r27,__zero_reg__ |
||
| 71 | 93 002c 8093 0000 sts gMilliSecTick,r24 |
||
| 72 | 94 0030 9093 0000 sts (gMilliSecTick)+1,r25 |
||
| 73 | 95 0034 A093 0000 sts (gMilliSecTick)+2,r26 |
||
| 74 | 96 0038 B093 0000 sts (gMilliSecTick)+3,r27 |
||
| 75 | 97 /* epilogue: frame size=0 */ |
||
| 76 | 98 003c BF91 pop r27 |
||
| 77 | 99 003e AF91 pop r26 |
||
| 78 | 100 0040 9F91 pop r25 |
||
| 79 | 101 0042 8F91 pop r24 |
||
| 80 | 102 0044 0F90 pop __tmp_reg__ |
||
| 81 | 103 0046 0FBE out __SREG__,__tmp_reg__ |
||
| 82 | 104 0048 0F90 pop __tmp_reg__ |
||
| 83 | 105 004a 1F90 pop __zero_reg__ |
||
| 84 | 106 004c 1895 reti |
||
| 85 | 107 /* epilogue end (size=9) */ |
||
| 86 | 108 /* function __vector_4 size 39 (21) */ |
||
| 87 | 110 .Lscope0: |
||
| 88 | 112 .global Timebase_Init |
||
| 89 | 114 Timebase_Init: |
||
| 90 | 35:../avr-lib/drivers/timer/timebase.c **** } |
||
| 91 | 36:../avr-lib/drivers/timer/timebase.c **** #else |
||
| 92 | 37:../avr-lib/drivers/timer/timebase.c **** ISR(SIG_OVERFLOW0) { |
||
| 93 | 38:../avr-lib/drivers/timer/timebase.c **** TCNT0 = TIMEBASE_RELOAD; |
||
| 94 | 39:../avr-lib/drivers/timer/timebase.c **** gMilliSecTick++; |
||
| 95 | 40:../avr-lib/drivers/timer/timebase.c **** } |
||
| 96 | 41:../avr-lib/drivers/timer/timebase.c **** #endif |
||
| 97 | 42:../avr-lib/drivers/timer/timebase.c **** |
||
| 98 | 43:../avr-lib/drivers/timer/timebase.c **** |
||
| 99 | 44:../avr-lib/drivers/timer/timebase.c **** /*----------------------------------------------------------------------------- |
||
| 100 | 45:../avr-lib/drivers/timer/timebase.c **** * Public Functions |
||
| 101 | 46:../avr-lib/drivers/timer/timebase.c **** *---------------------------------------------------------------------------*/ |
||
| 102 | 47:../avr-lib/drivers/timer/timebase.c **** |
||
| 103 | 48:../avr-lib/drivers/timer/timebase.c **** /** |
||
| 104 | 49:../avr-lib/drivers/timer/timebase.c **** * Initializes the timebase. The hardware timer interrupt source will be |
||
| 105 | 50:../avr-lib/drivers/timer/timebase.c **** * enabled, but global interrupts need to be enabled by the application. |
||
| 106 | 51:../avr-lib/drivers/timer/timebase.c **** */ |
||
| 107 | 52:../avr-lib/drivers/timer/timebase.c **** void Timebase_Init() { |
||
| 108 | 116 .LM3: |
||
| 109 | 117 /* prologue: frame size=0 */ |
||
| 110 | 118 /* prologue end (size=0) */ |
||
| 111 | 53:../avr-lib/drivers/timer/timebase.c **** #if defined(TIMER2) |
||
| 112 | 54:../avr-lib/drivers/timer/timebase.c **** #if defined(__AVR_ATmega8__) |
||
| 113 | 55:../avr-lib/drivers/timer/timebase.c **** #if TIMEBASE_PRESCALE == 64 |
||
| 114 | 56:../avr-lib/drivers/timer/timebase.c **** TCCR2 = (1<<CS22); // prescaler: 64 |
||
| 115 | 120 .LM4: |
||
| 116 | 121 004e 84E0 ldi r24,lo8(4) |
||
| 117 | 122 0050 85BD out 69-0x20,r24 |
||
| 118 | 57:../avr-lib/drivers/timer/timebase.c **** #elif TIMEBASE_PRESCALE == 256 |
||
| 119 | 58:../avr-lib/drivers/timer/timebase.c **** TCCR2 = (1<<CS22) | (1<<CS21); // prescaler: 256 |
||
| 120 | 59:../avr-lib/drivers/timer/timebase.c **** #endif |
||
| 121 | 60:../avr-lib/drivers/timer/timebase.c **** TCNT2 = TIMEBASE_RELOAD; // set initial reload-value |
||
| 122 | 124 .LM5: |
||
| 123 | 125 0052 83E8 ldi r24,lo8(-125) |
||
| 124 | 126 0054 84BD out 68-0x20,r24 |
||
| 125 | 61:../avr-lib/drivers/timer/timebase.c **** TIFR |= (1<<TOV2); // clear overflow int. |
||
| 126 | 128 .LM6: |
||
| 127 | 129 0056 88B7 in r24,88-0x20 |
||
| 128 | 130 0058 8064 ori r24,lo8(64) |
||
| 129 | 131 005a 88BF out 88-0x20,r24 |
||
| 130 | 62:../avr-lib/drivers/timer/timebase.c **** TIMSK |= (1<<TOIE2); // enable overflow-interrupt |
||
| 131 | 133 .LM7: |
||
| 132 | 134 005c 89B7 in r24,89-0x20 |
||
| 133 | 135 005e 8064 ori r24,lo8(64) |
||
| 134 | 136 0060 89BF out 89-0x20,r24 |
||
| 135 | 137 /* epilogue: frame size=0 */ |
||
| 136 | 138 0062 0895 ret |
||
| 137 | 139 /* epilogue end (size=1) */ |
||
| 138 | 140 /* function Timebase_Init size 11 (10) */ |
||
| 139 | 142 .Lscope1: |
||
| 140 | 144 .global Timebase_CurrentTime |
||
| 141 | 146 Timebase_CurrentTime: |
||
| 142 | 63:../avr-lib/drivers/timer/timebase.c **** #endif |
||
| 143 | 64:../avr-lib/drivers/timer/timebase.c **** |
||
| 144 | 65:../avr-lib/drivers/timer/timebase.c **** #if defined(__AVR_ATmega88__) |
||
| 145 | 66:../avr-lib/drivers/timer/timebase.c **** #if TIMEBASE_PRESCALE == 64 |
||
| 146 | 67:../avr-lib/drivers/timer/timebase.c **** TCCR2B = (1<<CS22); // prescaler: 64 |
||
| 147 | 68:../avr-lib/drivers/timer/timebase.c **** #elif TIMEBASE_PRESCALE == 256 |
||
| 148 | 69:../avr-lib/drivers/timer/timebase.c **** TCCR2B = (1<<CS22)|(1<<CS21); // prescaler: 256 |
||
| 149 | 70:../avr-lib/drivers/timer/timebase.c **** #endif |
||
| 150 | 71:../avr-lib/drivers/timer/timebase.c **** TCNT2 = TIMEBASE_RELOAD; // set initial reload-value |
||
| 151 | 72:../avr-lib/drivers/timer/timebase.c **** TIFR2 |= (1<<TOV2); // clear overflow int. |
||
| 152 | 73:../avr-lib/drivers/timer/timebase.c **** TIMSK2 |= (1<<TOIE2); // enable overflow-interrupt |
||
| 153 | 74:../avr-lib/drivers/timer/timebase.c **** #endif |
||
| 154 | 75:../avr-lib/drivers/timer/timebase.c **** #else /* Use timer0 */ |
||
| 155 | 76:../avr-lib/drivers/timer/timebase.c **** #if defined(__AVR_ATmega8__) |
||
| 156 | 77:../avr-lib/drivers/timer/timebase.c **** #if TIMEBASE_PRESCALE == 64 |
||
| 157 | 78:../avr-lib/drivers/timer/timebase.c **** TCCR0 = (1<<CS01) | (1<<CS00); // prescaler: 64 |
||
| 158 | 79:../avr-lib/drivers/timer/timebase.c **** #elif TIMEBASE_PRESCALE == 256 |
||
| 159 | 80:../avr-lib/drivers/timer/timebase.c **** TCCR0 = (1<<CS02); // prescaler: 256 |
||
| 160 | 81:../avr-lib/drivers/timer/timebase.c **** #endif |
||
| 161 | 82:../avr-lib/drivers/timer/timebase.c **** TCNT0 = TIMEBASE_RELOAD; // set initial reload-value |
||
| 162 | 83:../avr-lib/drivers/timer/timebase.c **** TIFR |= (1<<TOV0); // clear overflow int. |
||
| 163 | 84:../avr-lib/drivers/timer/timebase.c **** TIMSK |= (1<<TOIE0); // enable overflow-interrupt |
||
| 164 | 85:../avr-lib/drivers/timer/timebase.c **** #endif |
||
| 165 | 86:../avr-lib/drivers/timer/timebase.c **** |
||
| 166 | 87:../avr-lib/drivers/timer/timebase.c **** #if defined(__AVR_ATmega88__) |
||
| 167 | 88:../avr-lib/drivers/timer/timebase.c **** #if TIMEBASE_PRESCALE == 64 |
||
| 168 | 89:../avr-lib/drivers/timer/timebase.c **** TCCR0B = (1<<CS01) | (1<<CS00); // prescaler: 64 |
||
| 169 | 90:../avr-lib/drivers/timer/timebase.c **** #elif TIMEBASE_PRESCALE == 256 |
||
| 170 | 91:../avr-lib/drivers/timer/timebase.c **** TCCR0B = (1<<CS02); // prescaler: 256 |
||
| 171 | 92:../avr-lib/drivers/timer/timebase.c **** #endif |
||
| 172 | 93:../avr-lib/drivers/timer/timebase.c **** TCNT0 = TIMEBASE_RELOAD; // set initial reload-value |
||
| 173 | 94:../avr-lib/drivers/timer/timebase.c **** TIFR0 |= (1<<TOV0); // clear overflow int. |
||
| 174 | 95:../avr-lib/drivers/timer/timebase.c **** TIMSK0 |= (1<<TOIE0); // enable overflow-interrupt |
||
| 175 | 96:../avr-lib/drivers/timer/timebase.c **** #endif |
||
| 176 | 97:../avr-lib/drivers/timer/timebase.c **** #endif |
||
| 177 | 98:../avr-lib/drivers/timer/timebase.c **** } |
||
| 178 | 99:../avr-lib/drivers/timer/timebase.c **** |
||
| 179 | 100:../avr-lib/drivers/timer/timebase.c **** |
||
| 180 | 101:../avr-lib/drivers/timer/timebase.c **** /** |
||
| 181 | 102:../avr-lib/drivers/timer/timebase.c **** * Reads the current time. |
||
| 182 | 103:../avr-lib/drivers/timer/timebase.c **** * |
||
| 183 | 104:../avr-lib/drivers/timer/timebase.c **** * @return |
||
| 184 | 105:../avr-lib/drivers/timer/timebase.c **** * The current time in milliseconds (32bit value). |
||
| 185 | 106:../avr-lib/drivers/timer/timebase.c **** */ |
||
| 186 | 107:../avr-lib/drivers/timer/timebase.c **** uint32_t Timebase_CurrentTime(void) { |
||
| 187 | 148 .LM8: |
||
| 188 | 149 /* prologue: frame size=0 */ |
||
| 189 | 150 /* prologue end (size=0) */ |
||
| 190 | 108:../avr-lib/drivers/timer/timebase.c **** uint8_t sreg; |
||
| 191 | 109:../avr-lib/drivers/timer/timebase.c **** uint16_t res; |
||
| 192 | 110:../avr-lib/drivers/timer/timebase.c **** sreg=SREG; |
||
| 193 | 152 .LM9: |
||
| 194 | 153 0064 2FB7 in r18,95-0x20 |
||
| 195 | 111:../avr-lib/drivers/timer/timebase.c **** cli(); |
||
| 196 | 155 .LM10: |
||
| 197 | 156 /* #APP */ |
||
| 198 | 157 0066 F894 cli |
||
| 199 | 112:../avr-lib/drivers/timer/timebase.c **** res = gMilliSecTick; |
||
| 200 | 159 .LM11: |
||
| 201 | 160 /* #NOAPP */ |
||
| 202 | 161 0068 6091 0000 lds r22,gMilliSecTick |
||
| 203 | 162 006c 7091 0000 lds r23,(gMilliSecTick)+1 |
||
| 204 | 163 0070 8091 0000 lds r24,(gMilliSecTick)+2 |
||
| 205 | 164 0074 9091 0000 lds r25,(gMilliSecTick)+3 |
||
| 206 | 113:../avr-lib/drivers/timer/timebase.c **** SREG=sreg; |
||
| 207 | 166 .LM12: |
||
| 208 | 167 0078 2FBF out 95-0x20,r18 |
||
| 209 | 168 007a 8827 clr r24 |
||
| 210 | 169 007c 9927 clr r25 |
||
| 211 | 170 /* epilogue: frame size=0 */ |
||
| 212 | 171 007e 0895 ret |
||
| 213 | 172 /* epilogue end (size=1) */ |
||
| 214 | 173 /* function Timebase_CurrentTime size 15 (14) */ |
||
| 215 | 178 .Lscope2: |
||
| 216 | 181 .global Timebase_PassedTimeMillis |
||
| 217 | 183 Timebase_PassedTimeMillis: |
||
| 218 | 114:../avr-lib/drivers/timer/timebase.c **** return res; |
||
| 219 | 115:../avr-lib/drivers/timer/timebase.c **** } |
||
| 220 | 116:../avr-lib/drivers/timer/timebase.c **** |
||
| 221 | 117:../avr-lib/drivers/timer/timebase.c **** |
||
| 222 | 118:../avr-lib/drivers/timer/timebase.c **** /** |
||
| 223 | 119:../avr-lib/drivers/timer/timebase.c **** * Checks how much time has passed since a given timestamp. |
||
| 224 | 120:../avr-lib/drivers/timer/timebase.c **** * |
||
| 225 | 121:../avr-lib/drivers/timer/timebase.c **** * @param t0 |
||
| 226 | 122:../avr-lib/drivers/timer/timebase.c **** * The timestamp. |
||
| 227 | 123:../avr-lib/drivers/timer/timebase.c **** * @return |
||
| 228 | 124:../avr-lib/drivers/timer/timebase.c **** * Number of milliseconds that have passed since t0. |
||
| 229 | 125:../avr-lib/drivers/timer/timebase.c **** */ |
||
| 230 | 126:../avr-lib/drivers/timer/timebase.c **** uint32_t Timebase_PassedTimeMillis(uint32_t t0) { |
||
| 231 | 185 .LM13: |
||
| 232 | 186 /* prologue: frame size=0 */ |
||
| 233 | 187 /* prologue end (size=0) */ |
||
| 234 | 127:../avr-lib/drivers/timer/timebase.c **** uint8_t sreg; |
||
| 235 | 128:../avr-lib/drivers/timer/timebase.c **** uint16_t res; |
||
| 236 | 129:../avr-lib/drivers/timer/timebase.c **** sreg=SREG; |
||
| 237 | 189 .LM14: |
||
| 238 | 190 0080 EFB7 in r30,95-0x20 |
||
| 239 | 130:../avr-lib/drivers/timer/timebase.c **** cli(); |
||
| 240 | 192 .LM15: |
||
| 241 | 193 /* #APP */ |
||
| 242 | 194 0082 F894 cli |
||
| 243 | 131:../avr-lib/drivers/timer/timebase.c **** res = (uint16_t)(gMilliSecTick-t0); |
||
| 244 | 196 .LM16: |
||
| 245 | 197 /* #NOAPP */ |
||
| 246 | 198 0084 2091 0000 lds r18,gMilliSecTick |
||
| 247 | 199 0088 3091 0000 lds r19,(gMilliSecTick)+1 |
||
| 248 | 200 008c 4091 0000 lds r20,(gMilliSecTick)+2 |
||
| 249 | 201 0090 5091 0000 lds r21,(gMilliSecTick)+3 |
||
| 250 | 132:../avr-lib/drivers/timer/timebase.c **** SREG=sreg; |
||
| 251 | 203 .LM17: |
||
| 252 | 204 0094 EFBF out 95-0x20,r30 |
||
| 253 | 205 0096 261B sub r18,r22 |
||
| 254 | 206 0098 370B sbc r19,r23 |
||
| 255 | 207 009a B901 movw r22,r18 |
||
| 256 | 208 009c 8827 clr r24 |
||
| 257 | 209 009e 9927 clr r25 |
||
| 258 | 210 /* epilogue: frame size=0 */ |
||
| 259 | 211 00a0 0895 ret |
||
| 260 | 212 /* epilogue end (size=1) */ |
||
| 261 | 213 /* function Timebase_PassedTimeMillis size 18 (17) */ |
||
| 262 | 218 .Lscope3: |
||
| 263 | 219 .comm gMilliSecTick,4,1 |
||
| 264 | 222 .Letext0: |
||
| 265 | 223 /* File "../avr-lib/drivers/timer/timebase.c": code 83 = 0x0053 ( 62), prologues 9, epilogues |
||
| 266 | DEFINED SYMBOLS |
||
| 267 | *ABS*:00000000 timebase.c |
||
| 268 | /tmp/ccrzEiEW.s:3 *ABS*:0000003f __SREG__ |
||
| 269 | /tmp/ccrzEiEW.s:4 *ABS*:0000003e __SP_H__ |
||
| 270 | /tmp/ccrzEiEW.s:5 *ABS*:0000003d __SP_L__ |
||
| 271 | /tmp/ccrzEiEW.s:6 *ABS*:00000000 __tmp_reg__ |
||
| 272 | /tmp/ccrzEiEW.s:7 *ABS*:00000001 __zero_reg__ |
||
| 273 | /tmp/ccrzEiEW.s:66 .text:00000000 __vector_4 |
||
| 274 | *COM*:00000004 gMilliSecTick |
||
| 275 | /tmp/ccrzEiEW.s:114 .text:0000004e Timebase_Init |
||
| 276 | /tmp/ccrzEiEW.s:146 .text:00000064 Timebase_CurrentTime |
||
| 277 | /tmp/ccrzEiEW.s:183 .text:00000080 Timebase_PassedTimeMillis |
||
| 278 | |||
| 279 | UNDEFINED SYMBOLS |
||
| 280 | __do_copy_data |
||
| 281 | __do_clear_bss |