nes-proj/cpu/avr/dev/clock-avr.h

80 lines
1.9 KiB
C

#ifndef CONTIKI_CLOCK_AVR_H
#define CONTIKI_CLOCK_AVR_H
#if defined (__AVR_ATmega128__)
#define AVR_OUTPUT_COMPARE_INT TIMER0_COMP_vect
#define OCRSetup() \
/* Select internal clock */ \
ASSR = 0x00; \
\
/* Set counter to zero */ \
TCNT0 = 0; \
\
/* \
* Set comparison register: \
* Crystal freq. is 16000000,\
* pre-scale factor is 1024, i.e. we have 125 "ticks" / sec: \
* 16000000 = 1024 * 125 * 125 \
*/ \
OCR0 = 125; \
\
/* \
* Set timer control register: \
* - prescale: 1024 (CS00 - CS02) \
* - counter reset via comparison register (WGM01) \
*/ \
TCCR0 = _BV(CS00) | _BV(CS01) | _BV(CS02) | _BV(WGM01); \
\
/* Clear interrupt flag register */ \
TIFR = 0x00; \
\
/* \
* Raise interrupt when value in OCR0 is reached. Note that the \
* counter value in TCNT0 is cleared automatically. \
*/ \
TIMSK = _BV (OCIE0);
#elif defined (__AVR_ATmega1284P__) || (__AVR_AT90USB1287__)
#define OCRSetup() \
/* Select internal clock */ \
ASSR = 0x00; \
\
/* Set counter to zero */ \
TCNT0 = 0; \
\
/* \
* Set comparison register: \
* Crystal freq. is 8000000,\
* pre-scale factor is 1024, i.e. we have 125 "ticks" / sec: \
* 8000000 = 1024 * 125 * 62.5 \
*/ \
OCR0A = 62; \
\
/* \
* Set timer control register: \
* - prescale: 1024 (CS00 - CS02) \
* - counter reset via comparison register (WGM01) \
*/ \
TCCR0A = _BV(WGM01); \
TCCR0B = _BV(CS00) | _BV(CS02); \
\
/* Clear interrupt flag register */ \
TIFR0 = TIFR0; \
\
/* \
* Raise interrupt when value in OCR0 is reached. Note that the \
* counter value in TCNT0 is cleared automatically. \
*/ \
TIMSK0 = _BV (OCIE0A);
#define AVR_OUTPUT_COMPARE_INT TIMER0_COMPA_vect
#else
#error "Setup CPU in clock-avr.h"
#endif
#endif //CONTIKI_CLOCK_AVR_H