avr-libc  2.1.0
Standard C library for AVR-GCC

AVR Libc Home Page

AVRs

AVR Libc Development Pages

Main Page

User Manual

Library Reference

FAQ

Example Projects

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