1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
|
/*
* ----------------------------------------------------------------------------
* "THE BEER-WARE LICENSE" (Revision 42):
* <joerg@FreeBSD.ORG> wrote this file. As long as you retain this notice you
* can do whatever you want with this stuff. If we meet some day, and you think
* this stuff is worth it, you can buy me a beer in return. Joerg Wunsch
* ----------------------------------------------------------------------------
*
* IO feature compatibility definitions for various AVRs.
*
* $Id: iocompat.h 1638 2008-03-17 21:52:00Z joerg_wunsch $
*/
#if !defined(IOCOMPAT_H)
#define IOCOMPAT_H 1
/*
* Device-specific adjustments:
*
* Supply definitions for the location of the OCR1[A] port/pin, the
* name of the OCR register controlling the PWM, and adjust interrupt
* vector names that differ from the one used in demo.c
* [TIMER1_OVF_vect].
*/
#if defined(__AVR_AT90S2313__)
# define OC1 PB3
# define OCR OCR1
# define DDROC DDRB
# define TIMER1_OVF_vect TIMER1_OVF1_vect
#elif defined(__AVR_AT90S2333__) || defined(__AVR_AT90S4433__)
# define OC1 PB1
# define DDROC DDRB
# define OCR OCR1
#elif defined(__AVR_AT90S4414__) || defined(__AVR_AT90S8515__) || \
defined(__AVR_AT90S4434__) || defined(__AVR_AT90S8535__) || \
defined(__AVR_ATmega163__) || defined(__AVR_ATmega8515__) || \
defined(__AVR_ATmega8535__) || \
defined(__AVR_ATmega164P__) || defined(__AVR_ATmega324P__) || \
defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || \
defined(__AVR_ATmega1284P__)
# define OC1 PD5
# define DDROC DDRD
# define OCR OCR1A
# if !defined(TIMSK) /* new ATmegas */
# define TIMSK TIMSK1
# endif
#elif defined(__AVR_ATmega8__) || defined(__AVR_ATmega48__) || \
defined(__AVR_ATmega88__) || defined(__AVR_ATmega168__)
# define OC1 PB1
# define DDROC DDRB
# define OCR OCR1A
# if !defined(TIMSK) /* ATmega48/88/168 */
# define TIMSK TIMSK1
# endif /* !defined(TIMSK) */
#elif defined(__AVR_ATtiny2313__)
# define OC1 PB3
# define OCR OCR1A
# define DDROC DDRB
#elif defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || \
defined(__AVR_ATtiny84__)
# define OC1 PA6
# define DDROC DDRA
# if !defined(OCR1A)
# /* work around misspelled name in avr-libc 1.4.[0..1] */
# define OCR OCRA1
# else
# define OCR OCR1A
# endif
# define TIMSK TIMSK1
# define TIMER1_OVF_vect TIM1_OVF_vect /* XML and datasheet mismatch */
#elif defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || \
defined(__AVR_ATtiny85__)
/* Timer 1 is only an 8-bit timer on these devices. */
# define OC1 PB1
# define DDROC DDRB
# define OCR OCR1A
# define TCCR1A TCCR1
# define TCCR1B TCCR1
# define TIMER1_OVF_vect TIM1_OVF_vect
# define TIMER1_TOP 255 /* only 8-bit PWM possible */
# define TIMER1_PWM_INIT _BV(PWM1A) | _BV(COM1A1)
# define TIMER1_CLOCKSOURCE _BV(CS12) /* use 1/8 prescaler */
#elif defined(__AVR_ATtiny26__)
/* Rather close to ATtinyX5 but different enough for its own section. */
# define OC1 PB1
# define DDROC DDRB
# define OCR OCR1A
# define TIMER1_OVF_vect TIMER1_OVF1_vect
# define TIMER1_TOP 255 /* only 8-bit PWM possible */
# define TIMER1_PWM_INIT _BV(PWM1A) | _BV(COM1A1)
# define TIMER1_CLOCKSOURCE _BV(CS12) /* use 1/8 prescaler */
/*
* Without setting OCR1C to TOP, the ATtiny26 does not trigger an
* overflow interrupt in PWM mode.
*/
# define TIMER1_SETUP_HOOK() OCR1C = 255
#elif defined(__AVR_ATtiny261__) || defined(__AVR_ATtiny461__) || \
defined(__AVR_ATtiny861__)
# define OC1 PB1
# define DDROC DDRB
# define OCR OCR1A
# define TIMER1_PWM_INIT _BV(WGM10) | _BV(PWM1A) | _BV(COM1A1)
/*
* While timer 1 could be operated in 10-bit mode on these devices,
* the handling of the 10-bit IO registers is more complicated than
* that of the 16-bit registers of other AVR devices (no combined
* 16-bit IO operations possible), so we restrict this demo to 8-bit
* mode which is pretty standard.
*/
# define TIMER1_TOP 255
# define TIMER1_CLOCKSOURCE _BV(CS12) /* use 1/8 prescaler */
#elif defined(__AVR_ATmega32__) || defined(__AVR_ATmega16__)
# define OC1 PD5
# define DDROC DDRD
# define OCR OCR1A
#elif defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__) || \
defined(__AVR_ATmega165__) || defined(__AVR_ATmega169__) || \
defined(__AVR_ATmega325__) || defined(__AVR_ATmega3250__) || \
defined(__AVR_ATmega645__) || defined(__AVR_ATmega6450__) || \
defined(__AVR_ATmega329__) || defined(__AVR_ATmega3290__) || \
defined(__AVR_ATmega649__) || defined(__AVR_ATmega6490__) || \
defined(__AVR_ATmega640__) || \
defined(__AVR_ATmega1280__) || defined(__AVR_ATmega1281__) || \
defined(__AVR_ATmega2560__) || defined(__AVR_ATmega2561__)
# define OC1 PB5
# define DDROC DDRB
# define OCR OCR1A
# if !defined(PB5) /* work around missing bit definition */
# define PB5 5
# endif
# if !defined(TIMSK) /* new ATmegas */
# define TIMSK TIMSK1
# endif
#else
# error "Don't know what kind of MCU you are compiling for"
#endif
/*
* Map register names for older AVRs here.
*/
#if !defined(COM1A1)
# define COM1A1 COM11
#endif
#if !defined(WGM10)
# define WGM10 PWM10
# define WGM11 PWM11
#endif
/*
* Provide defaults for device-specific macros unless overridden
* above.
*/
#if !defined(TIMER1_TOP)
# define TIMER1_TOP 1023 /* 10-bit PWM */
#endif
#if !defined(TIMER1_PWM_INIT)
# define TIMER1_PWM_INIT _BV(WGM10) | _BV(WGM11) | _BV(COM1A1)
#endif
#if !defined(TIMER1_CLOCKSOURCE)
# define TIMER1_CLOCKSOURCE _BV(CS10) /* full clock */
#endif
#endif /* !defined(IOCOMPAT_H) */
|