Subversion Repositories HomeAutomation

Rev

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