47 #include <avr/interrupt.h>
52 #include "rtimer-arch.h"
54 #if defined(__AVR_ATmega1284P__)
66 #endif // 1281 / 1284p
68 #if defined(__AVR_ATmega1281__) || defined(__AVR_AT90USB1287__) || defined(__AVR_ATmega128RFA1__)
74 #if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega644__)
82 extern uint8_t debugflowsize,debugflow[DEBUGFLOWSIZE];
83 #define DEBUGFLOW(c) if (debugflowsize<(DEBUGFLOWSIZE-1)) debugflow[debugflowsize++]=c
89 #if defined(__AVR_ATxmega256A3__) || defined(__AVR_ATxmega256A3U__)
94 #elif defined(__AVR_ATxmega256A3B__) || defined(__AVR_ATxmega256A3BU__)
99 #elif defined(TCNT3) && RTIMER_ARCH_PRESCALER
100 ISR (TIMER3_COMPA_vect) {
102 ENERGEST_ON(ENERGEST_TYPE_IRQ);
105 ETIMSK &= ~((1 << OCIE3A) | (1 << OCIE3B) | (1 << TOIE3) |
106 (1 << TICIE3) | (1 << OCIE3C));
108 #if RTIMER_CONF_NESTED_INTERRUPTS
117 ENERGEST_OFF(ENERGEST_TYPE_IRQ);
121 #elif RTIMER_ARCH_PRESCALER
122 #warning "No Timer3 in rtimer-arch.c - using Timer1 instead"
123 ISR (TIMER1_COMPA_vect) {
125 TIMSK &= ~((1<<TICIE1)|(1<<OCIE1A)|(1<<OCIE1B)|(1<<TOIE1));
136 #if RTIMER_ARCH_PRESCALER
142 #if defined(__AVR_ATxmega256A3__) || defined(__AVR_ATxmega256A3U__)
143 xmega_rtc_rcosc_enable();
145 xmega_rtc_wait_sync_busy();
147 xmega_rtc_set_per(31);
148 xmega_rtc_set_comp(31);
149 xmega_rtc_set_cnt(0);
152 xmega_rtc_set_prescaler(RTC_PRESCALER_DIV1_gc);
155 xmega_rtc_set_interrupt_levels(RTC_OVFINTLVL_LO_gc, RTC_COMPINTLVL_LO_gc);
157 xmega_rtc_wait_sync_busy();
158 #elif defined(__AVR_ATxmega256A3BU__) || defined(__AVR_ATxmega256A3B__)
159 #warning RTC NOT IMPLEMENTED
163 ETIMSK &= ~((1 << OCIE3A) | (1 << OCIE3B) | (1 << TOIE3) |
164 (1 << TICIE3) | (1 << OCIE3C));
166 ETIFR |= (1 << ICF3) | (1 << OCF3A) | (1 << OCF3B) | (1 << TOV3) |
177 #if RTIMER_ARCH_PRESCALER==1024
179 #elif RTIMER_ARCH_PRESCALER==256
181 #elif RTIMER_ARCH_PRESCALER==64
183 #elif RTIMER_ARCH_PRESCALER==8
185 #elif RTIMER_ARCH_PRESCALER==1
188 #error Timer3 PRESCALER factor not supported.
191 #elif RTIMER_ARCH_PRESCALER
195 TIMSK &= ~((1<<TICIE1)|(1<<OCIE1A)|(1<<OCIE1B)|(1<<TOIE1));
196 TIFR |= (1 << ICF1) | (1 << OCF1A) | (1 << OCF1B) | (1 << TOV1);
206 #if RTIMER_ARCH_PRESCALER==1024
208 #elif RTIMER_ARCH_PRESCALER==256
210 #elif RTIMER_ARCH_PRESCALER==64
212 #elif RTIMER_ARCH_PRESCALER==8
214 #elif RTIMER_ARCH_PRESCALER==1
217 #error Timer1 PRESCALER factor not supported.
230 #if RTIMER_ARCH_PRESCALER
236 #if defined(__AVR_ATxmega256A3__) || defined(__AVR_ATxmega256A3U__)
240 while (RTC.STATUS & RTC_SYNCBUSY_bm) {;}
243 RTC.PER = (uint16_t) t;
244 RTC.INTCTRL |= RTC_OVFINTLVL_MED_gc;
246 RTC.CTRL = RTC_PRESCALER_DIV1_gc;
248 #elif defined(__AVR_ATxmega256A3BU__) || defined(__AVR_ATxmega256A3B__)
251 while(RTC32.SYNCCTRL & RTC32_SYNCBUSY_bm);
253 RTC32.PER = (uint16_t) t;
254 RTC32.INTCTRL |= RTC32_OVFINTLVL_LO_gc;
256 RTC32.CTRL |= RTC32_ENABLE_bm;
261 ETIFR |= (1 << ICF3) | (1 << OCF3A) | (1 << OCF3B) | (1 << TOV3) |
264 ETIMSK |= (1 << OCIE3A);
266 #elif RTIMER_ARCH_PRESCALER
269 TIFR |= (1 << ICF1) | (1 << OCF1A) | (1 << OCF1B) | (1 << TOV1);
270 TIMSK |= (1 << OCIE1A);
279 #if RDC_CONF_MCU_SLEEP
282 rtimer_arch_sleep(rtimer_clock_t howlong)
291 #include <avr/sleep.h>
292 #include <dev/watchdog.h>
293 uint32_t longhowlong;
294 #if AVR_CONF_USE32KCRYSTAL
296 uint8_t savedTCNT2=TCNT2, savedTCCR2A=TCCR2A, savedTCCR2B = TCCR2B, savedOCR2A = OCR2A;
300 set_sleep_mode(SLEEP_MODE_PWR_SAVE);
306 #if 0 //Prescale by 1024 - 32 ticks/sec, 8 seconds max sleep
307 TCCR2B =((1<<CS22)|(1<<CS21)|(1<<CS20));
308 longhowlong=howlong*32UL;
309 #elif 0 // Prescale by 256 - 128 ticks/sec, 2 seconds max sleep
310 TCCR2B =((1<<CS22)|(1<<CS21)|(0<<CS20));
311 longhowlong=howlong*128UL;
312 #elif 0 // Prescale by 128 - 256 ticks/sec, 1 seconds max sleep
313 TCCR2B =((1<<CS22)|(0<<CS21)|(1<<CS20));
314 longhowlong=howlong*256UL;
315 #elif 0 // Prescale by 64 - 512 ticks/sec, 500 msec max sleep
316 TCCR2B =((1<<CS22)|(0<<CS21)|(0<<CS20));
317 longhowlong=howlong*512UL;
318 #elif 1 // Prescale by 32 - 1024 ticks/sec, 250 msec max sleep
319 TCCR2B =((0<<CS22)|(1<<CS21)|(1<<CS20));
320 longhowlong=howlong*1024UL;
321 #elif 0 // Prescale by 8 - 4096 ticks/sec, 62.5 msec max sleep
322 TCCR2B =((0<<CS22)|(1<<CS21)|(0<<CS20));
323 longhowlong=howlong*4096UL;
324 #else // No Prescale - 32768 ticks/sec, 7.8 msec max sleep
325 TCCR2B =((0<<CS22)|(0<<CS21)|(1<<CS20));
326 longhowlong=howlong*32768UL;
328 OCR2A = longhowlong/RTIMER_ARCH_SECOND;
332 while(ASSR & (1 << TCN2UB));
335 TIMSK2 |= (1 << OCIE2A);
338 ENERGEST_OFF(ENERGEST_TYPE_CPU);
339 if (OCR2A) sleep_mode();
346 #if RTIMER_ARCH_PRESCALER
353 ENERGEST_ON(ENERGEST_TYPE_CPU);
355 #if AVR_CONF_USE32KCRYSTAL
358 TCCR2A = savedTCCR2A;
359 TCCR2B = savedTCCR2B;
365 TIMSK2 &= ~(1 << OCIE2A);
370 longhowlong=CLOCK_CONF_SECOND;
371 longhowlong*=howlong;
375 #if !AVR_CONF_USE32KCRYSTAL
379 ISR(TIMER2_COMPA_vect)