Home | History | Annotate | Download | only in arduino
      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