1 /* 2 pins_arduino.c - pin definitions for the Arduino board 3 Part of Arduino / Wiring Lite 4 5 Copyright (c) 2005 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 $Id$ 23 */ 24 25 #include <avr/io.h> 26 #include "wiring_private.h" 27 #include "pins_arduino.h" 28 29 // On the Arduino board, digital pins are also used 30 // for the analog output (software PWM). Analog input 31 // pins are a separate set. 32 33 // ATMEL ATMEGA8 & 168 / ARDUINO 34 // 35 // +-\/-+ 36 // PC6 1| |28 PC5 (AI 5) 37 // (D 0) PD0 2| |27 PC4 (AI 4) 38 // (D 1) PD1 3| |26 PC3 (AI 3) 39 // (D 2) PD2 4| |25 PC2 (AI 2) 40 // PWM+ (D 3) PD3 5| |24 PC1 (AI 1) 41 // (D 4) PD4 6| |23 PC0 (AI 0) 42 // VCC 7| |22 GND 43 // GND 8| |21 AREF 44 // PB6 9| |20 AVCC 45 // PB7 10| |19 PB5 (D 13) 46 // PWM+ (D 5) PD5 11| |18 PB4 (D 12) 47 // PWM+ (D 6) PD6 12| |17 PB3 (D 11) PWM 48 // (D 7) PD7 13| |16 PB2 (D 10) PWM 49 // (D 8) PB0 14| |15 PB1 (D 9) PWM 50 // +----+ 51 // 52 // (PWM+ indicates the additional PWM pins on the ATmega168.) 53 54 // ATMEL ATMEGA1280 / ARDUINO 55 // 56 // 0-7 PE0-PE7 works 57 // 8-13 PB0-PB5 works 58 // 14-21 PA0-PA7 works 59 // 22-29 PH0-PH7 works 60 // 30-35 PG5-PG0 works 61 // 36-43 PC7-PC0 works 62 // 44-51 PJ7-PJ0 works 63 // 52-59 PL7-PL0 works 64 // 60-67 PD7-PD0 works 65 // A0-A7 PF0-PF7 66 // A8-A15 PK0-PK7 67 68 #define PA 1 69 #define PB 2 70 #define PC 3 71 #define PD 4 72 #define PE 5 73 #define PF 6 74 #define PG 7 75 #define PH 8 76 #define PJ 10 77 #define PK 11 78 #define PL 12 79 80 81 #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) 82 const uint16_t PROGMEM port_to_mode_PGM[] = { 83 NOT_A_PORT, 84 &DDRA, 85 &DDRB, 86 &DDRC, 87 &DDRD, 88 &DDRE, 89 &DDRF, 90 &DDRG, 91 &DDRH, 92 NOT_A_PORT, 93 &DDRJ, 94 &DDRK, 95 &DDRL, 96 }; 97 98 const uint16_t PROGMEM port_to_output_PGM[] = { 99 NOT_A_PORT, 100 &PORTA, 101 &PORTB, 102 &PORTC, 103 &PORTD, 104 &PORTE, 105 &PORTF, 106 &PORTG, 107 &PORTH, 108 NOT_A_PORT, 109 &PORTJ, 110 &PORTK, 111 &PORTL, 112 }; 113 114 const uint16_t PROGMEM port_to_input_PGM[] = { 115 NOT_A_PIN, 116 &PINA, 117 &PINB, 118 &PINC, 119 &PIND, 120 &PINE, 121 &PINF, 122 &PING, 123 &PINH, 124 NOT_A_PIN, 125 &PINJ, 126 &PINK, 127 &PINL, 128 }; 129 130 const uint8_t PROGMEM digital_pin_to_port_PGM[] = { 131 // PORTLIST 132 // ------------------------------------------- 133 PE , // PE 0 ** 0 ** USART0_RX 134 PE , // PE 1 ** 1 ** USART0_TX 135 PE , // PE 4 ** 2 ** PWM2 136 PE , // PE 5 ** 3 ** PWM3 137 PG , // PG 5 ** 4 ** PWM4 138 PE , // PE 3 ** 5 ** PWM5 139 PH , // PH 3 ** 6 ** PWM6 140 PH , // PH 4 ** 7 ** PWM7 141 PH , // PH 5 ** 8 ** PWM8 142 PH , // PH 6 ** 9 ** PWM9 143 PB , // PB 4 ** 10 ** PWM10 144 PB , // PB 5 ** 11 ** PWM11 145 PB , // PB 6 ** 12 ** PWM12 146 PB , // PB 7 ** 13 ** PWM13 147 PJ , // PJ 1 ** 14 ** USART3_TX 148 PJ , // PJ 0 ** 15 ** USART3_RX 149 PH , // PH 1 ** 16 ** USART2_TX 150 PH , // PH 0 ** 17 ** USART2_RX 151 PD , // PD 3 ** 18 ** USART1_TX 152 PD , // PD 2 ** 19 ** USART1_RX 153 PD , // PD 1 ** 20 ** I2C_SDA 154 PD , // PD 0 ** 21 ** I2C_SCL 155 PA , // PA 0 ** 22 ** D22 156 PA , // PA 1 ** 23 ** D23 157 PA , // PA 2 ** 24 ** D24 158 PA , // PA 3 ** 25 ** D25 159 PA , // PA 4 ** 26 ** D26 160 PA , // PA 5 ** 27 ** D27 161 PA , // PA 6 ** 28 ** D28 162 PA , // PA 7 ** 29 ** D29 163 PC , // PC 7 ** 30 ** D30 164 PC , // PC 6 ** 31 ** D31 165 PC , // PC 5 ** 32 ** D32 166 PC , // PC 4 ** 33 ** D33 167 PC , // PC 3 ** 34 ** D34 168 PC , // PC 2 ** 35 ** D35 169 PC , // PC 1 ** 36 ** D36 170 PC , // PC 0 ** 37 ** D37 171 PD , // PD 7 ** 38 ** D38 172 PG , // PG 2 ** 39 ** D39 173 PG , // PG 1 ** 40 ** D40 174 PG , // PG 0 ** 41 ** D41 175 PL , // PL 7 ** 42 ** D42 176 PL , // PL 6 ** 43 ** D43 177 PL , // PL 5 ** 44 ** D44 178 PL , // PL 4 ** 45 ** D45 179 PL , // PL 3 ** 46 ** D46 180 PL , // PL 2 ** 47 ** D47 181 PL , // PL 1 ** 48 ** D48 182 PL , // PL 0 ** 49 ** D49 183 PB , // PB 3 ** 50 ** SPI_MISO 184 PB , // PB 2 ** 51 ** SPI_MOSI 185 PB , // PB 1 ** 52 ** SPI_SCK 186 PB , // PB 0 ** 53 ** SPI_SS 187 PF , // PF 0 ** 54 ** A0 188 PF , // PF 1 ** 55 ** A1 189 PF , // PF 2 ** 56 ** A2 190 PF , // PF 3 ** 57 ** A3 191 PF , // PF 4 ** 58 ** A4 192 PF , // PF 5 ** 59 ** A5 193 PF , // PF 6 ** 60 ** A6 194 PF , // PF 7 ** 61 ** A7 195 PK , // PK 0 ** 62 ** A8 196 PK , // PK 1 ** 63 ** A9 197 PK , // PK 2 ** 64 ** A10 198 PK , // PK 3 ** 65 ** A11 199 PK , // PK 4 ** 66 ** A12 200 PK , // PK 5 ** 67 ** A13 201 PK , // PK 6 ** 68 ** A14 202 PK , // PK 7 ** 69 ** A15 203 }; 204 205 const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = { 206 // PIN IN PORT 207 // ------------------------------------------- 208 _BV( 0 ) , // PE 0 ** 0 ** USART0_RX 209 _BV( 1 ) , // PE 1 ** 1 ** USART0_TX 210 _BV( 4 ) , // PE 4 ** 2 ** PWM2 211 _BV( 5 ) , // PE 5 ** 3 ** PWM3 212 _BV( 5 ) , // PG 5 ** 4 ** PWM4 213 _BV( 3 ) , // PE 3 ** 5 ** PWM5 214 _BV( 3 ) , // PH 3 ** 6 ** PWM6 215 _BV( 4 ) , // PH 4 ** 7 ** PWM7 216 _BV( 5 ) , // PH 5 ** 8 ** PWM8 217 _BV( 6 ) , // PH 6 ** 9 ** PWM9 218 _BV( 4 ) , // PB 4 ** 10 ** PWM10 219 _BV( 5 ) , // PB 5 ** 11 ** PWM11 220 _BV( 6 ) , // PB 6 ** 12 ** PWM12 221 _BV( 7 ) , // PB 7 ** 13 ** PWM13 222 _BV( 1 ) , // PJ 1 ** 14 ** USART3_TX 223 _BV( 0 ) , // PJ 0 ** 15 ** USART3_RX 224 _BV( 1 ) , // PH 1 ** 16 ** USART2_TX 225 _BV( 0 ) , // PH 0 ** 17 ** USART2_RX 226 _BV( 3 ) , // PD 3 ** 18 ** USART1_TX 227 _BV( 2 ) , // PD 2 ** 19 ** USART1_RX 228 _BV( 1 ) , // PD 1 ** 20 ** I2C_SDA 229 _BV( 0 ) , // PD 0 ** 21 ** I2C_SCL 230 _BV( 0 ) , // PA 0 ** 22 ** D22 231 _BV( 1 ) , // PA 1 ** 23 ** D23 232 _BV( 2 ) , // PA 2 ** 24 ** D24 233 _BV( 3 ) , // PA 3 ** 25 ** D25 234 _BV( 4 ) , // PA 4 ** 26 ** D26 235 _BV( 5 ) , // PA 5 ** 27 ** D27 236 _BV( 6 ) , // PA 6 ** 28 ** D28 237 _BV( 7 ) , // PA 7 ** 29 ** D29 238 _BV( 7 ) , // PC 7 ** 30 ** D30 239 _BV( 6 ) , // PC 6 ** 31 ** D31 240 _BV( 5 ) , // PC 5 ** 32 ** D32 241 _BV( 4 ) , // PC 4 ** 33 ** D33 242 _BV( 3 ) , // PC 3 ** 34 ** D34 243 _BV( 2 ) , // PC 2 ** 35 ** D35 244 _BV( 1 ) , // PC 1 ** 36 ** D36 245 _BV( 0 ) , // PC 0 ** 37 ** D37 246 _BV( 7 ) , // PD 7 ** 38 ** D38 247 _BV( 2 ) , // PG 2 ** 39 ** D39 248 _BV( 1 ) , // PG 1 ** 40 ** D40 249 _BV( 0 ) , // PG 0 ** 41 ** D41 250 _BV( 7 ) , // PL 7 ** 42 ** D42 251 _BV( 6 ) , // PL 6 ** 43 ** D43 252 _BV( 5 ) , // PL 5 ** 44 ** D44 253 _BV( 4 ) , // PL 4 ** 45 ** D45 254 _BV( 3 ) , // PL 3 ** 46 ** D46 255 _BV( 2 ) , // PL 2 ** 47 ** D47 256 _BV( 1 ) , // PL 1 ** 48 ** D48 257 _BV( 0 ) , // PL 0 ** 49 ** D49 258 _BV( 3 ) , // PB 3 ** 50 ** SPI_MISO 259 _BV( 2 ) , // PB 2 ** 51 ** SPI_MOSI 260 _BV( 1 ) , // PB 1 ** 52 ** SPI_SCK 261 _BV( 0 ) , // PB 0 ** 53 ** SPI_SS 262 _BV( 0 ) , // PF 0 ** 54 ** A0 263 _BV( 1 ) , // PF 1 ** 55 ** A1 264 _BV( 2 ) , // PF 2 ** 56 ** A2 265 _BV( 3 ) , // PF 3 ** 57 ** A3 266 _BV( 4 ) , // PF 4 ** 58 ** A4 267 _BV( 5 ) , // PF 5 ** 59 ** A5 268 _BV( 6 ) , // PF 6 ** 60 ** A6 269 _BV( 7 ) , // PF 7 ** 61 ** A7 270 _BV( 0 ) , // PK 0 ** 62 ** A8 271 _BV( 1 ) , // PK 1 ** 63 ** A9 272 _BV( 2 ) , // PK 2 ** 64 ** A10 273 _BV( 3 ) , // PK 3 ** 65 ** A11 274 _BV( 4 ) , // PK 4 ** 66 ** A12 275 _BV( 5 ) , // PK 5 ** 67 ** A13 276 _BV( 6 ) , // PK 6 ** 68 ** A14 277 _BV( 7 ) , // PK 7 ** 69 ** A15 278 }; 279 280 const uint8_t PROGMEM digital_pin_to_timer_PGM[] = { 281 // TIMERS 282 // ------------------------------------------- 283 NOT_ON_TIMER , // PE 0 ** 0 ** USART0_RX 284 NOT_ON_TIMER , // PE 1 ** 1 ** USART0_TX 285 TIMER3B , // PE 4 ** 2 ** PWM2 286 TIMER3C , // PE 5 ** 3 ** PWM3 287 TIMER0B , // PG 5 ** 4 ** PWM4 288 TIMER3A , // PE 3 ** 5 ** PWM5 289 TIMER4A , // PH 3 ** 6 ** PWM6 290 TIMER4B , // PH 4 ** 7 ** PWM7 291 TIMER4C , // PH 5 ** 8 ** PWM8 292 TIMER2B , // PH 6 ** 9 ** PWM9 293 TIMER2A , // PB 4 ** 10 ** PWM10 294 TIMER1A , // PB 5 ** 11 ** PWM11 295 TIMER1B , // PB 6 ** 12 ** PWM12 296 TIMER0A , // PB 7 ** 13 ** PWM13 297 NOT_ON_TIMER , // PJ 1 ** 14 ** USART3_TX 298 NOT_ON_TIMER , // PJ 0 ** 15 ** USART3_RX 299 NOT_ON_TIMER , // PH 1 ** 16 ** USART2_TX 300 NOT_ON_TIMER , // PH 0 ** 17 ** USART2_RX 301 NOT_ON_TIMER , // PD 3 ** 18 ** USART1_TX 302 NOT_ON_TIMER , // PD 2 ** 19 ** USART1_RX 303 NOT_ON_TIMER , // PD 1 ** 20 ** I2C_SDA 304 NOT_ON_TIMER , // PD 0 ** 21 ** I2C_SCL 305 NOT_ON_TIMER , // PA 0 ** 22 ** D22 306 NOT_ON_TIMER , // PA 1 ** 23 ** D23 307 NOT_ON_TIMER , // PA 2 ** 24 ** D24 308 NOT_ON_TIMER , // PA 3 ** 25 ** D25 309 NOT_ON_TIMER , // PA 4 ** 26 ** D26 310 NOT_ON_TIMER , // PA 5 ** 27 ** D27 311 NOT_ON_TIMER , // PA 6 ** 28 ** D28 312 NOT_ON_TIMER , // PA 7 ** 29 ** D29 313 NOT_ON_TIMER , // PC 7 ** 30 ** D30 314 NOT_ON_TIMER , // PC 6 ** 31 ** D31 315 NOT_ON_TIMER , // PC 5 ** 32 ** D32 316 NOT_ON_TIMER , // PC 4 ** 33 ** D33 317 NOT_ON_TIMER , // PC 3 ** 34 ** D34 318 NOT_ON_TIMER , // PC 2 ** 35 ** D35 319 NOT_ON_TIMER , // PC 1 ** 36 ** D36 320 NOT_ON_TIMER , // PC 0 ** 37 ** D37 321 NOT_ON_TIMER , // PD 7 ** 38 ** D38 322 NOT_ON_TIMER , // PG 2 ** 39 ** D39 323 NOT_ON_TIMER , // PG 1 ** 40 ** D40 324 NOT_ON_TIMER , // PG 0 ** 41 ** D41 325 NOT_ON_TIMER , // PL 7 ** 42 ** D42 326 NOT_ON_TIMER , // PL 6 ** 43 ** D43 327 TIMER5C , // PL 5 ** 44 ** D44 328 TIMER5B , // PL 4 ** 45 ** D45 329 TIMER5A , // PL 3 ** 46 ** D46 330 NOT_ON_TIMER , // PL 2 ** 47 ** D47 331 NOT_ON_TIMER , // PL 1 ** 48 ** D48 332 NOT_ON_TIMER , // PL 0 ** 49 ** D49 333 NOT_ON_TIMER , // PB 3 ** 50 ** SPI_MISO 334 NOT_ON_TIMER , // PB 2 ** 51 ** SPI_MOSI 335 NOT_ON_TIMER , // PB 1 ** 52 ** SPI_SCK 336 NOT_ON_TIMER , // PB 0 ** 53 ** SPI_SS 337 NOT_ON_TIMER , // PF 0 ** 54 ** A0 338 NOT_ON_TIMER , // PF 1 ** 55 ** A1 339 NOT_ON_TIMER , // PF 2 ** 56 ** A2 340 NOT_ON_TIMER , // PF 3 ** 57 ** A3 341 NOT_ON_TIMER , // PF 4 ** 58 ** A4 342 NOT_ON_TIMER , // PF 5 ** 59 ** A5 343 NOT_ON_TIMER , // PF 6 ** 60 ** A6 344 NOT_ON_TIMER , // PF 7 ** 61 ** A7 345 NOT_ON_TIMER , // PK 0 ** 62 ** A8 346 NOT_ON_TIMER , // PK 1 ** 63 ** A9 347 NOT_ON_TIMER , // PK 2 ** 64 ** A10 348 NOT_ON_TIMER , // PK 3 ** 65 ** A11 349 NOT_ON_TIMER , // PK 4 ** 66 ** A12 350 NOT_ON_TIMER , // PK 5 ** 67 ** A13 351 NOT_ON_TIMER , // PK 6 ** 68 ** A14 352 NOT_ON_TIMER , // PK 7 ** 69 ** A15 353 }; 354 #else 355 // these arrays map port names (e.g. port B) to the 356 // appropriate addresses for various functions (e.g. reading 357 // and writing) 358 const uint16_t PROGMEM port_to_mode_PGM[] = { 359 NOT_A_PORT, 360 NOT_A_PORT, 361 &DDRB, 362 &DDRC, 363 &DDRD, 364 }; 365 366 const uint16_t PROGMEM port_to_output_PGM[] = { 367 NOT_A_PORT, 368 NOT_A_PORT, 369 &PORTB, 370 &PORTC, 371 &PORTD, 372 }; 373 374 const uint16_t PROGMEM port_to_input_PGM[] = { 375 NOT_A_PORT, 376 NOT_A_PORT, 377 &PINB, 378 &PINC, 379 &PIND, 380 }; 381 382 const uint8_t PROGMEM digital_pin_to_port_PGM[] = { 383 PD, /* 0 */ 384 PD, 385 PD, 386 PD, 387 PD, 388 PD, 389 PD, 390 PD, 391 PB, /* 8 */ 392 PB, 393 PB, 394 PB, 395 PB, 396 PB, 397 PC, /* 14 */ 398 PC, 399 PC, 400 PC, 401 PC, 402 PC, 403 }; 404 405 const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = { 406 _BV(0), /* 0, port D */ 407 _BV(1), 408 _BV(2), 409 _BV(3), 410 _BV(4), 411 _BV(5), 412 _BV(6), 413 _BV(7), 414 _BV(0), /* 8, port B */ 415 _BV(1), 416 _BV(2), 417 _BV(3), 418 _BV(4), 419 _BV(5), 420 _BV(0), /* 14, port C */ 421 _BV(1), 422 _BV(2), 423 _BV(3), 424 _BV(4), 425 _BV(5), 426 }; 427 428 const uint8_t PROGMEM digital_pin_to_timer_PGM[] = { 429 NOT_ON_TIMER, /* 0 - port D */ 430 NOT_ON_TIMER, 431 NOT_ON_TIMER, 432 // on the ATmega168, digital pin 3 has hardware pwm 433 #if defined(__AVR_ATmega8__) 434 NOT_ON_TIMER, 435 #else 436 TIMER2B, 437 #endif 438 NOT_ON_TIMER, 439 // on the ATmega168, digital pins 5 and 6 have hardware pwm 440 #if defined(__AVR_ATmega8__) 441 NOT_ON_TIMER, 442 NOT_ON_TIMER, 443 #else 444 TIMER0B, 445 TIMER0A, 446 #endif 447 NOT_ON_TIMER, 448 NOT_ON_TIMER, /* 8 - port B */ 449 TIMER1A, 450 TIMER1B, 451 #if defined(__AVR_ATmega8__) 452 TIMER2, 453 #else 454 TIMER2A, 455 #endif 456 NOT_ON_TIMER, 457 NOT_ON_TIMER, 458 NOT_ON_TIMER, 459 NOT_ON_TIMER, /* 14 - port C */ 460 NOT_ON_TIMER, 461 NOT_ON_TIMER, 462 NOT_ON_TIMER, 463 NOT_ON_TIMER, 464 }; 465 #endif 466