1 #ifndef CONTIKI_CLOCK_AVR_H
2 #define CONTIKI_CLOCK_AVR_H
4 #if defined (__AVR_ATmega128__)
5 #define AVR_OUTPUT_COMPARE_INT TIMER0_COMP_vect
6 #define AVR_CLOCK_COUNTER TCNT0
7 #define AVR_CLOCK_MAX (F_CPU/1024UL/CLOCK_CONF_SECOND)
14 AVR_CLOCK_COUNTER = 0; \
22 OCR0 = AVR_CLOCK_MAX; \
29 TCCR0 = _BV(CS00) | _BV(CS01) | _BV(CS02) | _BV(WGM01); \
40 #elif defined (__AVR_ATmega128RFA1__) && 0
43 #define AVR_OUTPUT_COMPARE_INT TIMER0_COMPA_vect
44 #define AVR_CLOCK_COUNTER TCNT0
45 #define AVR_CLOCK_MAX (F_CPU/1024/CLOCK_CONF_SECOND - 1)
52 AVR_CLOCK_COUNTER = 0; \
60 OCR0A = AVR_CLOCK_MAX; \
67 TCCR0A = _BV(WGM01); \
68 TCCR0B = _BV(CS00) | _BV(CS02); \
77 TIMSK0 = _BV (OCIE0A);
80 #elif defined (__AVR_ATmega1284P__) || (__AVR_AT90USB1287__) || (__AVR_ATmega1281__) || defined (__AVR_ATmega128RFA1__)
88 #if AVR_CONF_USE32KCRYSTAL
89 #define AVR_OUTPUT_COMPARE_INT TIMER2_COMPA_vect
90 #define AVR_CLOCK_COUNTER TCNT2
91 #define AVR_CLOCK_MAX (32768/8/CLOCK_CONF_SECOND - 1)
98 AVR_CLOCK_COUNTER = 0; \
106 OCR2A = AVR_CLOCK_MAX; \
113 TCCR2A = _BV(WGM21); \
114 TCCR2B = _BV(CS21); \
123 TIMSK2 = _BV (OCIE2A);
128 #error "Please define CPU clock speed for your platform. #define F_CPU 8000000UL is typical."
130 #if CLOCK_CONF_SECOND == 0
131 #error "Please define timer ticks per second for your platform. #define CLOCK_CONF_SECOND 128 is typical."
134 #ifdef AVR_CONF_TMR0_PRESCALE
135 #elif F_CPU/CLOCK_CONF_SECOND < 256
136 #define AVR_CONF_TMR0_PRESCALE 1
137 #elif F_CPU/CLOCK_CONF_SECOND < 256 * 8
138 #define AVR_CONF_TMR0_PRESCALE 8
139 #elif F_CPU/CLOCK_CONF_SECOND < 256 * 64
140 #define AVR_CONF_TMR0_PRESCALE 64
141 #elif F_CPU/CLOCK_CONF_SECOND < 256 * 256
142 #define AVR_CONF_TMR0_PRESCALE 256
144 #define AVR_CONF_TMR0_PRESCALE 1024
147 #if F_CPU/CLOCK_CONF_SECOND/AVR_CONF_TMR0_PRESCALE > 255
148 #error "Can not prescale CPU clock to get specified ticks per second. F_CPU/CLOCK_CONF_SECOND/1024 must be less than 256."
151 #if AVR_CONF_TMR0_PRESCALE == 1
152 #define AVR_TCCR0B_CONF _BV(CS00)
153 #elif AVR_CONF_TMR0_PRESCALE == 8
154 #define AVR_TCCR0B_CONF _BV(CS01)
155 #elif AVR_CONF_TMR0_PRESCALE == 64
156 #define AVR_TCCR0B_CONF _BV(CS01) | _BV(CS00)
157 #elif AVR_CONF_TMR0_PRESCALE == 256
158 #define AVR_TCCR0B_CONF _BV(CS02)
159 #elif AVR_CONF_TMR0_PRESCALE == 1024
160 #define AVR_TCCR0B_CONF _BV(CS02) | _BV(CS00)
162 #error "Prescale factor not supported. Allowed values are 1,8,64,256,1024."
165 #define AVR_OUTPUT_COMPARE_INT TIMER0_COMPA_vect
166 #define AVR_CLOCK_COUNTER TCNT0
167 #define AVR_CLOCK_MAX (F_CPU/AVR_CONF_TMR0_PRESCALE/CLOCK_CONF_SECOND - 1)
174 AVR_CLOCK_COUNTER = 0; \
182 OCR0A = AVR_CLOCK_MAX; \
189 TCCR0A = _BV(WGM01); \
190 TCCR0B = AVR_TCCR0B_CONF; \
199 TIMSK0 = _BV (OCIE0A);
202 #elif defined (__AVR_ATmega644__) || defined (__AVR_ATmega328P__)
204 #define AVR_CLOCK_COUNTER TCNT0
205 #define AVR_CLOCK_MAX (F_CPU/256UL/CLOCK_CONF_SECOND - 1)
209 AVR_CLOCK_COUNTER = 0; \
216 OCR0A = AVR_CLOCK_MAX; \
223 TCCR0A = _BV(WGM01); \
224 TCCR0B = _BV(CS02); \
233 TIMSK0 = _BV (OCIE0A);
235 #define AVR_OUTPUT_COMPARE_INT TIMER0_COMPA_vect
237 #elif defined (__AVR_ATmega8515__) || defined (__AVR_ATmega16__) || defined (__AVR_ATmega32__)
239 #define AVR_OUTPUT_COMPARE_INT TIMER0_COMP_vect
240 #define AVR_CLOCK_COUNTER TCNT0
241 #define AVR_CLOCK_MAX (F_CPU/256UL/CLOCK_CONF_SECOND)
245 AVR_CLOCK_COUNTER = 0; \
253 OCR0 = AVR_CLOCK_MAX; \
260 TCCR0 = _BV(CS02) | _BV(WGM01); \
271 #elif defined (__AVR_ATmega8__)
273 #define AVR_CLOCK_COUNTER TCNT2
274 #define AVR_CLOCK_MAX (F_CPU/256UL/CLOCK_CONF_SECOND)
275 #define AVR_OUTPUT_COMPARE_INT TIMER2_COMP_vect
279 AVR_CLOCK_COUNTER = 0; \
287 OCR2 = AVR_CLOCK_MAX; \
294 TCCR2 = _BV(CS22) | _BV(CS21) | _BV(WGM21); \
304 #elif defined(__AVR_XMEGA__)
306 #include "contiki-conf.h"
307 #include "xmega_timer.h"
310 #if (!defined(XMEGA_TIMER_RTC) || XMEGA_TIMER_RTC == 1)
311 #define AVR_OUTPUT_COMPARE_INT TCC0_OVF_vect
314 #define AVR_OUTPUT_COMPARE_INT RTC_COMP_vect
318 TCC0.PER = TIMER_TOP; \
319 TCC0.INTCTRLA = TC0_OVFINTLVL_gm; \
320 TCC0.CTRLA = TIMER_PRESCALE;
322 #error "Setup CPU in clock-avr.h"
325 #endif //CONTIKI_CLOCK_AVR_H