1 | /* |
2 | pins_arduino.h - Pin definition functions for Arduino |
3 | Part of Arduino - http://www.arduino.cc/ |
4 | |
5 | Copyright (c) 2007 David A. Mellis |
6 | |
7 | This library is free software; you can redistribute it and/or |
8 | modify it under the terms of the GNU Lesser General Public |
9 | License as published by the Free Software Foundation; either |
10 | version 2.1 of the License, or (at your option) any later version. |
11 | |
12 | This library is distributed in the hope that it will be useful, |
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
15 | Lesser General Public License for more details. |
16 | |
17 | You should have received a copy of the GNU Lesser General |
18 | Public License along with this library; if not, write to the |
19 | Free Software Foundation, Inc., 59 Temple Place, Suite 330, |
20 | Boston, MA 02111-1307 USA |
21 | */ |
22 |
|
23 | #ifndef Pins_Arduino_h |
24 | #define Pins_Arduino_h |
25 |
|
26 | #include <avr/pgmspace.h> |
27 |
|
28 | #define NUM_DIGITAL_PINS 20 |
29 | #define NUM_ANALOG_INPUTS 6 |
30 | #define analogInputToDigitalPin(p) ((p < 6) ? (p) + 14 : -1) |
31 |
|
32 | #if defined(__AVR_ATmega8__) |
33 | #define digitalPinHasPWM(p) ((p) == 9 || (p) == 10 || (p) == 11) |
34 | #else |
35 | #define digitalPinHasPWM(p) ((p) == 3 || (p) == 5 || (p) == 6 || (p) == 9 || (p) == 10 || (p) == 11) |
36 | #endif |
37 |
|
38 | #define PIN_SPI_SS (10) |
39 | #define PIN_SPI_MOSI (11) |
40 | #define PIN_SPI_MISO (12) |
41 | #define PIN_SPI_SCK (13) |
42 |
|
43 | static const uint8_t SS = PIN_SPI_SS; |
44 | static const uint8_t MOSI = PIN_SPI_MOSI; |
45 | static const uint8_t MISO = PIN_SPI_MISO; |
46 | static const uint8_t SCK = PIN_SPI_SCK; |
47 |
|
48 | #define PIN_WIRE_SDA (18) |
49 | #define PIN_WIRE_SCL (19) |
50 |
|
51 | static const uint8_t SDA = PIN_WIRE_SDA; |
52 | static const uint8_t SCL = PIN_WIRE_SCL; |
53 |
|
54 | #define LED_BUILTIN 13 |
55 |
|
56 | #define PIN_A0 (14) |
57 | #define PIN_A1 (15) |
58 | #define PIN_A2 (16) |
59 | #define PIN_A3 (17) |
60 | #define PIN_A4 (18) |
61 | #define PIN_A5 (19) |
62 | #define PIN_A6 (20) |
63 | #define PIN_A7 (21) |
64 |
|
65 | static const uint8_t A0 = PIN_A0; |
66 | static const uint8_t A1 = PIN_A1; |
67 | static const uint8_t A2 = PIN_A2; |
68 | static const uint8_t A3 = PIN_A3; |
69 | static const uint8_t A4 = PIN_A4; |
70 | static const uint8_t A5 = PIN_A5; |
71 | static const uint8_t A6 = PIN_A6; |
72 | static const uint8_t A7 = PIN_A7; |
73 |
|
74 | #define digitalPinToPCICR(p) (((p) >= 0 && (p) <= 21) ? (&PCICR) : ((uint8_t *)0)) |
75 | #define digitalPinToPCICRbit(p) (((p) <= 7) ? 2 : (((p) <= 13) ? 0 : 1)) |
76 | #define digitalPinToPCMSK(p) (((p) <= 7) ? (&PCMSK2) : (((p) <= 13) ? (&PCMSK0) : (((p) <= 21) ? (&PCMSK1) : ((uint8_t *)0)))) |
77 | #define digitalPinToPCMSKbit(p) (((p) <= 7) ? (p) : (((p) <= 13) ? ((p) - 8) : ((p) - 14))) |
78 |
|
79 | #define digitalPinToInterrupt(p) ((p) == 2 ? 0 : ((p) == 3 ? 1 : NOT_AN_INTERRUPT)) |
80 |
|
81 | #ifdef ARDUINO_MAIN |
82 |
|
83 | // On the Arduino board, digital pins are also used |
84 | // for the analog output (software PWM). Analog input |
85 | // pins are a separate set. |
86 |
|
87 | // ATMEL ATMEGA8 & 168 / ARDUINO |
88 | // |
89 | // +-\/-+ |
90 | // PC6 1| |28 PC5 (AI 5) |
91 | // (D 0) PD0 2| |27 PC4 (AI 4) |
92 | // (D 1) PD1 3| |26 PC3 (AI 3) |
93 | // (D 2) PD2 4| |25 PC2 (AI 2) |
94 | // PWM+ (D 3) PD3 5| |24 PC1 (AI 1) |
95 | // (D 4) PD4 6| |23 PC0 (AI 0) |
96 | // VCC 7| |22 GND |
97 | // GND 8| |21 AREF |
98 | // PB6 9| |20 AVCC |
99 | // PB7 10| |19 PB5 (D 13) |
100 | // PWM+ (D 5) PD5 11| |18 PB4 (D 12) |
101 | // PWM+ (D 6) PD6 12| |17 PB3 (D 11) PWM |
102 | // (D 7) PD7 13| |16 PB2 (D 10) PWM |
103 | // (D 8) PB0 14| |15 PB1 (D 9) PWM |
104 | // +----+ |
105 | // |
106 | // (PWM+ indicates the additional PWM pins on the ATmega168.) |
107 |
|
108 | // ATMEL ATMEGA1280 / ARDUINO |
109 | // |
110 | // 0-7 PE0-PE7 works |
111 | // 8-13 PB0-PB5 works |
112 | // 14-21 PA0-PA7 works |
113 | // 22-29 PH0-PH7 works |
114 | // 30-35 PG5-PG0 works |
115 | // 36-43 PC7-PC0 works |
116 | // 44-51 PJ7-PJ0 works |
117 | // 52-59 PL7-PL0 works |
118 | // 60-67 PD7-PD0 works |
119 | // A0-A7 PF0-PF7 |
120 | // A8-A15 PK0-PK7 |
121 |
|
122 |
|
123 | // these arrays map port names (e.g. port B) to the |
124 | // appropriate addresses for various functions (e.g. reading |
125 | // and writing) |
126 | const uint16_t PROGMEM port_to_mode_PGM[] = { |
127 | NOT_A_PORT, |
128 | NOT_A_PORT, |
129 | (uint16_t) &DDRB, |
130 | (uint16_t) &DDRC, |
131 | (uint16_t) &DDRD, |
132 | }; |
133 |
|
134 | const uint16_t PROGMEM port_to_output_PGM[] = { |
135 | NOT_A_PORT, |
136 | NOT_A_PORT, |
137 | (uint16_t) &PORTB, |
138 | (uint16_t) &PORTC, |
139 | (uint16_t) &PORTD, |
140 | }; |
141 |
|
142 | const uint16_t PROGMEM port_to_input_PGM[] = { |
143 | NOT_A_PORT, |
144 | NOT_A_PORT, |
145 | (uint16_t) &PINB, |
146 | (uint16_t) &PINC, |
147 | (uint16_t) &PIND, |
148 | }; |
149 |
|
150 | const uint8_t PROGMEM digital_pin_to_port_PGM[] = { |
151 | PD, /* 0 */ |
152 | PD, |
153 | PD, |
154 | PD, |
155 | PD, |
156 | PD, |
157 | PD, |
158 | PD, |
159 | PB, /* 8 */ |
160 | PB, |
161 | PB, |
162 | PB, |
163 | PB, |
164 | PB, |
165 | PC, /* 14 */ |
166 | PC, |
167 | PC, |
168 | PC, |
169 | PC, |
170 | PC, |
171 | }; |
172 |
|
173 | const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = { |
174 | _BV(0), /* 0, port D */ |
175 | _BV(1), |
176 | _BV(2), |
177 | _BV(3), |
178 | _BV(4), |
179 | _BV(5), |
180 | _BV(6), |
181 | _BV(7), |
182 | _BV(0), /* 8, port B */ |
183 | _BV(1), |
184 | _BV(2), |
185 | _BV(3), |
186 | _BV(4), |
187 | _BV(5), |
188 | _BV(0), /* 14, port C */ |
189 | _BV(1), |
190 | _BV(2), |
191 | _BV(3), |
192 | _BV(4), |
193 | _BV(5), |
194 | }; |
195 |
|
196 | const uint8_t PROGMEM digital_pin_to_timer_PGM[] = { |
197 | NOT_ON_TIMER, /* 0 - port D */ |
198 | NOT_ON_TIMER, |
199 | NOT_ON_TIMER, |
200 | // on the ATmega168, digital pin 3 has hardware pwm |
201 | #if defined(__AVR_ATmega8__) |
202 | NOT_ON_TIMER, |
203 | #else |
204 | TIMER2B, |
205 | #endif |
206 | NOT_ON_TIMER, |
207 | // on the ATmega168, digital pins 5 and 6 have hardware pwm |
208 | #if defined(__AVR_ATmega8__) |
209 | NOT_ON_TIMER, |
210 | NOT_ON_TIMER, |
211 | #else |
212 | TIMER0B, |
213 | TIMER0A, |
214 | #endif |
215 | NOT_ON_TIMER, |
216 | NOT_ON_TIMER, /* 8 - port B */ |
217 | TIMER1A, |
218 | TIMER1B, |
219 | #if defined(__AVR_ATmega8__) |
220 | TIMER2, |
221 | #else |
222 | TIMER2A, |
223 | #endif |
224 | NOT_ON_TIMER, |
225 | NOT_ON_TIMER, |
226 | NOT_ON_TIMER, |
227 | NOT_ON_TIMER, /* 14 - port C */ |
228 | NOT_ON_TIMER, |
229 | NOT_ON_TIMER, |
230 | NOT_ON_TIMER, |
231 | NOT_ON_TIMER, |
232 | }; |
233 |
|
234 | #endif |
235 |
|
236 | // These serial port names are intended to allow libraries and architecture-neutral |
237 | // sketches to automatically default to the correct port name for a particular type |
238 | // of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, |
239 | // the first hardware serial port whose RX/TX pins are not dedicated to another use. |
240 | // |
241 | // SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor |
242 | // |
243 | // SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial |
244 | // |
245 | // SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library |
246 | // |
247 | // SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. |
248 | // |
249 | // SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX |
250 | // pins are NOT connected to anything by default. |
251 | #define SERIAL_PORT_MONITOR Serial |
252 | #define SERIAL_PORT_HARDWARE Serial |
253 |
|
254 | #endif |
255 |
|