|
- #ifndef Pins_Arduino_Compile_Time_h
- #define Pins_Arduino_Compile_time_h
-
-
- /* This is an alternative to pins_arduino.h
- In pins_arduino.h and .cpp the look up arrays are defined as:
- const uint16_t PROGMEM port_to_output_PGM[]
- This places the array in program memory. pgm_read_byte() functions are used to retreive the array from program memory at runtime.
-
- Because the arrays are received at runtime, it takes some instructions to look up the outputs.
- This is not a problem in most cases, but it is if you are trying to write super fast code.
-
- To make use of efficient sbi (Set Bit Immidiate) and cbi (Clear Bit Immidiate), the pin to write to must be defined as const.
- The compiler does not understand that digitalPinToPort(2) is constant and does not optimize it away.
-
- In this file I redefine the arrays as:
- volatile uint8_t * const port_to_output_PGM_ct[]
-
- So it is a constant pointer to a volatile uint8_t:
- a pointer to an output register that stays in the same place (* const), but can change in value (volatile uint8_t)
-
- These definitions are understood by the compiler and result in superfast code,
- but still allow you to use the arduino pin numbers instead of registers like PORTB
-
- (C) 2011-2012 Elco Jacobs. www.elcojacobs.com
-
- */
-
- #include <pins_arduino.h>
-
- #define NOT_A_PIN 0
- #define NOT_A_PORT 0
-
-
- // On the Arduino board, digital pins are also used
- // for the analog output (software PWM). Analog input
- // pins are a separate set.
-
- // ATMEL ATMEGA8 & 168 / ARDUINO
- //
- // +-\/-+
- // PC6 1| |28 PC5 (AI 5)
- // (D 0) PD0 2| |27 PC4 (AI 4)
- // (D 1) PD1 3| |26 PC3 (AI 3)
- // (D 2) PD2 4| |25 PC2 (AI 2)
- // PWM+ (D 3) PD3 5| |24 PC1 (AI 1)
- // (D 4) PD4 6| |23 PC0 (AI 0)
- // VCC 7| |22 GND
- // GND 8| |21 AREF
- // PB6 9| |20 AVCC
- // PB7 10| |19 PB5 (D 13)
- // PWM+ (D 5) PD5 11| |18 PB4 (D 12)
- // PWM+ (D 6) PD6 12| |17 PB3 (D 11) PWM
- // (D 7) PD7 13| |16 PB2 (D 10) PWM
- // (D 8) PB0 14| |15 PB1 (D 9) PWM
- // +----+
- //
- // (PWM+ indicates the additional PWM pins on the ATmega168.)
-
- // ATMEL ATMEGA1280 / ARDUINO
- //
- // 0-7 PE0-PE7 works
- // 8-13 PB0-PB5 works
- // 14-21 PA0-PA7 works
- // 22-29 PH0-PH7 works
- // 30-35 PG5-PG0 works
- // 36-43 PC7-PC0 works
- // 44-51 PJ7-PJ0 works
- // 52-59 PL7-PL0 works
- // 60-67 PD7-PD0 works
- // A0-A7 PF0-PF7
- // A8-A15 PK0-PK7
-
- #define PA 1
- #define PB 2
- #define PC 3
- #define PD 4
- #define PE 5
- #define PF 6
- #define PG 7
- #define PH 8
- #define PJ 10
- #define PK 11
- #define PL 12
-
-
- #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
-
- volatile uint8_t * const port_to_output_PGM_ct[] = {
- NOT_A_PORT,
- &PORTA,
- &PORTB,
- &PORTC,
- &PORTD,
- &PORTE,
- &PORTF,
- &PORTG,
- &PORTH,
- NOT_A_PORT,
- &PORTJ,
- &PORTK,
- &PORTL,
- };
-
- const uint8_t digital_pin_to_port_PGM_ct[] = {
- // PORTLIST
- // -------------------------------------------
- PE , // PE 0 ** 0 ** USART0_RX
- PE , // PE 1 ** 1 ** USART0_TX
- PE , // PE 4 ** 2 ** PWM2
- PE , // PE 5 ** 3 ** PWM3
- PG , // PG 5 ** 4 ** PWM4
- PE , // PE 3 ** 5 ** PWM5
- PH , // PH 3 ** 6 ** PWM6
- PH , // PH 4 ** 7 ** PWM7
- PH , // PH 5 ** 8 ** PWM8
- PH , // PH 6 ** 9 ** PWM9
- PB , // PB 4 ** 10 ** PWM10
- PB , // PB 5 ** 11 ** PWM11
- PB , // PB 6 ** 12 ** PWM12
- PB , // PB 7 ** 13 ** PWM13
- PJ , // PJ 1 ** 14 ** USART3_TX
- PJ , // PJ 0 ** 15 ** USART3_RX
- PH , // PH 1 ** 16 ** USART2_TX
- PH , // PH 0 ** 17 ** USART2_RX
- PD , // PD 3 ** 18 ** USART1_TX
- PD , // PD 2 ** 19 ** USART1_RX
- PD , // PD 1 ** 20 ** I2C_SDA
- PD , // PD 0 ** 21 ** I2C_SCL
- PA , // PA 0 ** 22 ** D22
- PA , // PA 1 ** 23 ** D23
- PA , // PA 2 ** 24 ** D24
- PA , // PA 3 ** 25 ** D25
- PA , // PA 4 ** 26 ** D26
- PA , // PA 5 ** 27 ** D27
- PA , // PA 6 ** 28 ** D28
- PA , // PA 7 ** 29 ** D29
- PC , // PC 7 ** 30 ** D30
- PC , // PC 6 ** 31 ** D31
- PC , // PC 5 ** 32 ** D32
- PC , // PC 4 ** 33 ** D33
- PC , // PC 3 ** 34 ** D34
- PC , // PC 2 ** 35 ** D35
- PC , // PC 1 ** 36 ** D36
- PC , // PC 0 ** 37 ** D37
- PD , // PD 7 ** 38 ** D38
- PG , // PG 2 ** 39 ** D39
- PG , // PG 1 ** 40 ** D40
- PG , // PG 0 ** 41 ** D41
- PL , // PL 7 ** 42 ** D42
- PL , // PL 6 ** 43 ** D43
- PL , // PL 5 ** 44 ** D44
- PL , // PL 4 ** 45 ** D45
- PL , // PL 3 ** 46 ** D46
- PL , // PL 2 ** 47 ** D47
- PL , // PL 1 ** 48 ** D48
- PL , // PL 0 ** 49 ** D49
- PB , // PB 3 ** 50 ** SPI_MISO
- PB , // PB 2 ** 51 ** SPI_MOSI
- PB , // PB 1 ** 52 ** SPI_SCK
- PB , // PB 0 ** 53 ** SPI_SS
- PF , // PF 0 ** 54 ** A0
- PF , // PF 1 ** 55 ** A1
- PF , // PF 2 ** 56 ** A2
- PF , // PF 3 ** 57 ** A3
- PF , // PF 4 ** 58 ** A4
- PF , // PF 5 ** 59 ** A5
- PF , // PF 6 ** 60 ** A6
- PF , // PF 7 ** 61 ** A7
- PK , // PK 0 ** 62 ** A8
- PK , // PK 1 ** 63 ** A9
- PK , // PK 2 ** 64 ** A10
- PK , // PK 3 ** 65 ** A11
- PK , // PK 4 ** 66 ** A12
- PK , // PK 5 ** 67 ** A13
- PK , // PK 6 ** 68 ** A14
- PK , // PK 7 ** 69 ** A15
- };
-
- const uint8_t digital_pin_to_bit_PGM_ct[] = {
- // PIN IN PORT
- // -------------------------------------------
- 0 , // PE 0 ** 0 ** USART0_RX
- 1 , // PE 1 ** 1 ** USART0_TX
- 4 , // PE 4 ** 2 ** PWM2
- 5 , // PE 5 ** 3 ** PWM3
- 5 , // PG 5 ** 4 ** PWM4
- 3 , // PE 3 ** 5 ** PWM5
- 3 , // PH 3 ** 6 ** PWM6
- 4 , // PH 4 ** 7 ** PWM7
- 5 , // PH 5 ** 8 ** PWM8
- 6 , // PH 6 ** 9 ** PWM9
- 4 , // PB 4 ** 10 ** PWM10
- 5 , // PB 5 ** 11 ** PWM11
- 6 , // PB 6 ** 12 ** PWM12
- 7 , // PB 7 ** 13 ** PWM13
- 1 , // PJ 1 ** 14 ** USART3_TX
- 0 , // PJ 0 ** 15 ** USART3_RX
- 1 , // PH 1 ** 16 ** USART2_TX
- 0 , // PH 0 ** 17 ** USART2_RX
- 3 , // PD 3 ** 18 ** USART1_TX
- 2 , // PD 2 ** 19 ** USART1_RX
- 1 , // PD 1 ** 20 ** I2C_SDA
- 0 , // PD 0 ** 21 ** I2C_SCL
- 0 , // PA 0 ** 22 ** D22
- 1 , // PA 1 ** 23 ** D23
- 2 , // PA 2 ** 24 ** D24
- 3 , // PA 3 ** 25 ** D25
- 4 , // PA 4 ** 26 ** D26
- 5 , // PA 5 ** 27 ** D27
- 6 , // PA 6 ** 28 ** D28
- 7 , // PA 7 ** 29 ** D29
- 7 , // PC 7 ** 30 ** D30
- 6 , // PC 6 ** 31 ** D31
- 5 , // PC 5 ** 32 ** D32
- 4 , // PC 4 ** 33 ** D33
- 3 , // PC 3 ** 34 ** D34
- 2 , // PC 2 ** 35 ** D35
- 1 , // PC 1 ** 36 ** D36
- 0 , // PC 0 ** 37 ** D37
- 7 , // PD 7 ** 38 ** D38
- 2 , // PG 2 ** 39 ** D39
- 1 , // PG 1 ** 40 ** D40
- 0 , // PG 0 ** 41 ** D41
- 7 , // PL 7 ** 42 ** D42
- 6 , // PL 6 ** 43 ** D43
- 5 , // PL 5 ** 44 ** D44
- 4 , // PL 4 ** 45 ** D45
- 3 , // PL 3 ** 46 ** D46
- 2 , // PL 2 ** 47 ** D47
- 1 , // PL 1 ** 48 ** D48
- 0 , // PL 0 ** 49 ** D49
- 3 , // PB 3 ** 50 ** SPI_MISO
- 2 , // PB 2 ** 51 ** SPI_MOSI
- 1 , // PB 1 ** 52 ** SPI_SCK
- 0 , // PB 0 ** 53 ** SPI_SS
- 0 , // PF 0 ** 54 ** A0
- 1 , // PF 1 ** 55 ** A1
- 2 , // PF 2 ** 56 ** A2
- 3 , // PF 3 ** 57 ** A3
- 4 , // PF 4 ** 58 ** A4
- 5 , // PF 5 ** 59 ** A5
- 6 , // PF 6 ** 60 ** A6
- 7 , // PF 7 ** 61 ** A7
- 0 , // PK 0 ** 62 ** A8
- 1 , // PK 1 ** 63 ** A9
- 2 , // PK 2 ** 64 ** A10
- 3 , // PK 3 ** 65 ** A11
- 4 , // PK 4 ** 66 ** A12
- 5 , // PK 5 ** 67 ** A13
- 6 , // PK 6 ** 68 ** A14
- 7 , // PK 7 ** 69 ** A15
- };
-
- #elif defined(__AVR_ATmega32U4__)
-
- #if defined(CORE_TEENSY)
-
- volatile uint8_t * const port_to_output_PGM_ct[] = {
- NOT_A_PORT, NOT_A_PORT, &PORTB, &PORTC, &PORTD, &PORTE, &PORTF
- };
- const uint8_t digital_pin_to_port_PGM_ct[] = {
- PB, PB, PB, PB, PB, PD, PD, PD, PD, PC, PC,
- PD, PD, PB, PB, PB, PF, PF, PF, PF, PF, PF,
- PD, PD, PE
- };
- const uint8_t digital_pin_to_bit_PGM_ct[] = {
- 0, 1, 2, 3, 7, 0, 1, 2, 3, 6, 7,
- 6, 7, 4, 5, 6, 7, 6, 5, 4, 1, 0,
- 4, 5, 6
- };
- #else
- //Assumes Arduino Leonardo
- volatile uint8_t * const port_to_output_PGM_ct[] = {
- NOT_A_PORT, NOT_A_PORT, &PORTB, &PORTC, &PORTD, &PORTE, &PORTF
- };
- const uint8_t digital_pin_to_port_PGM_ct[] = {
- PD, PD, PD, PD, PD, PC, PD, PE, PB, PB, PB,
- PB, PD, PC, PB, PB, PB, PB, PF, PF, PF, PF,
- PF, PF, PD, PD, PB, PB, PB, PD
- };
- const uint8_t digital_pin_to_bit_PGM_ct[] = {
- 2, 3, 1, 0, 4, 6, 7, 6, 4, 5, 6,
- 7, 6, 7, 3, 1, 2, 0, 7, 6, 5, 4,
- 1, 0, 4, 7, 4, 5, 6, 6
- };
- #endif
- #elif defined(__AVR_AT90USB1286__)
-
- volatile uint8_t * const port_to_output_PGM_ct[] = {
- NOT_A_PORT, &PORTA, &PORTB, &PORTC, &PORTD, &PORTE, &PORTF
- };
- const uint8_t digital_pin_to_port_PGM_ct[] = {
- PD, PD, PD, PD, PD, PD, PD, PD, PE, PE,
- PC, PC, PC, PC, PC, PC, PC, PC, PE, PE,
- PB, PB, PB, PB, PB, PB, PB, PB, PA, PA,
- PA, PA, PA, PA, PA, PA, PE, PE, PF, PF,
- PF, PF, PF, PF, PF, PF
- };
- const uint8_t digital_pin_to_bit_PGM_ct[] = {
- 0, 1, 2, 3, 4, 5, 6, 7, 0, 1,
- 0, 1, 2, 3, 4, 5, 6, 7, 6, 7,
- 0, 1, 2, 3, 4, 5, 6, 7, 0, 1,
- 2, 3, 4, 5, 6, 7, 4, 5, 0, 1,
- 2, 3, 4, 5, 6, 7
- };
-
- #elif defined(__arm__) && defined(CORE_TEENSY)
- // for Teensy 3.x and Teensy LC
- #ifndef SHIFTPWM_NOSPI
- #error "On Teensy 3.x & LC, you must define SHIFTPWM_NOSPI, ShiftPWM_dataPin, ShiftPWM_clockPin"
- #endif
- #define SHIFTPWM_USE_DIGITALWRITEFAST
- volatile uint8_t * const port_to_output_PGM_ct[] = {
- NULL
- };
- const uint8_t digital_pin_to_port_PGM_ct[] = {
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0
- };
- const uint8_t digital_pin_to_bit_PGM_ct[] = {
- 0, 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
- };
-
-
- #else
-
- // these arrays map port names (e.g. port B) to the
- // appropriate addresses for various functions (e.g. reading
- // and writing)
-
- volatile uint8_t * const port_to_output_PGM_ct[] = {
- NOT_A_PORT,
- NOT_A_PORT,
- &PORTB,
- &PORTC,
- &PORTD,
- };
-
-
- const uint8_t digital_pin_to_port_PGM_ct[] = {
- PD, // 0
- PD,
- PD,
- PD,
- PD,
- PD,
- PD,
- PD,
- PB, // 8
- PB,
- PB,
- PB,
- PB,
- PB,
- PC, // 14
- PC,
- PC,
- PC,
- PC,
- PC,
- };
-
- const uint8_t digital_pin_to_bit_PGM_ct[] = {
- 0, // 0, port D
- 1,
- 2,
- 3,
- 4,
- 5,
- 6,
- 7,
- 0, // 8, port B
- 1,
- 2,
- 3,
- 4,
- 5,
- 0, // 14, port C /
- 1,
- 2,
- 3,
- 4,
- 5,
- };
-
- #endif
-
-
- #endif
|