Atmega16 Arduino
Atmega16 Arduino
Atmega 8
My comments in yellow ;)
#include <avr/io.h> #include "wiring.h"
int port_to_mode[NUM_PORTS + 1] = { NOT_A_PORT, _SFR_IO_ADDR(DDRA), _SFR_IO_ADDR(DDRB), _SFR_IO_ADDR(DDRC), _SFR_IO_ADDR(DDRD), }; int port_to_output[NUM_PORTS + 1] = { NOT_A_PORT, _SFR_IO_ADDR(PORTA), _SFR_IO_ADDR(PORTB), _SFR_IO_ADDR(PORTC), _SFR_IO_ADDR(PORTD), }; int port_to_input[NUM_PORTS + 1] = { NOT_A_PORT, _SFR_IO_ADDR(PINA), _SFR_IO_ADDR(PINB), _SFR_IO_ADDR(PINC), _SFR_IO_ADDR(PIND), }; pin_t digital_pin_to_port_array[] = { { NOT_A_PIN, NOT_A_PIN }, { { { { { { { { { { { { { PB, 0 }, PB, 1 }, PB, 2 }, PB, 3 }, PB, 4 }, PB, 5 }, PB, 6 }, PB, 7 }, NOT_A_PIN, NOT_A_PIN, NOT_A_PIN, NOT_A_PIN, NOT_A_PIN, Looking on the pins 1-40 NOT_A_PORT, I add the A port NOT_A_PORT, I add the A port NOT_A_PORT, I add the A port
}, }, }, }, },
{ { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { };
PD, 0 }, PD, 1 }, PD, 2 }, PD, 3 }, PD, 4 }, PD, 5 }, PD, 6 }, PD, 7 }, PC, 0 }, PC, 1 }, PC, 2 }, PC, 3 }, PC, 4 }, PC, 5 }, PC, 6 }, PC, 7 }, NOT_A_PIN, NOT_A_PIN }, NOT_A_PIN, NOT_A_PIN }, NOT_A_PIN, NOT_A_PIN }, { PA, 0 }, PA, 1 }, PA, 2 }, PA, 3 }, PA, 4 }, PA, 5 }, PA, 6 }, PA, 7 }, PC, 6 }, PD, 0 }, PD, 1 }, PD, 2 }, PD, 3 }, PD, 4 }, NOT_A_PIN, NOT_A_PIN }, NOT_A_PIN, NOT_A_PIN }, PB, 6 }, PB, 7 }, PD, 5 }, PD, 6 }, PD, 7 }, PB, 0 }, PB, 1 }, PB, 2 }, PB, 3 }, PB, 4 }, PB, 5 }, NOT_A_PIN, NOT_A_PIN }, NOT_A_PIN, NOT_A_PIN }, NOT_A_PIN, NOT_A_PIN }, PC, 0 }, PC, 1 }, PC, 2 }, PC, 3 }, PC, 4 }, PC, 5 },
PA PB PC PD
1 2 3 4
// these arrays map port names (e.g. port B) to the // appropriate addresses for various functions (e.g. reading // and writing) const uint8_t PROGMEM port_to_mode_PGM[] = { NOT_A_PORT, #if defined(__AVR_ATmega16__) &DDRA, #else NOT_A_PORT, #endif &DDRB, &DDRC, &DDRD, }; const uint8_t PROGMEM port_to_output_PGM[] = { NOT_A_PORT, #if defined(__AVR_ATmega16__) &PORTA, #else NOT_A_PORT, #endif &PORTB, &PORTC, &PORTD, }; const uint8_t PROGMEM port_to_input_PGM[] = { NOT_A_PORT, #if defined(__AVR_ATmega16__) &PINA, #else NOT_A_PORT, #endif &PINB, &PINC, &PIND,
}; const uint8_t PROGMEM digital_pin_to_port_PGM[] = { PD, /* 0 */ PD, PD, PD, PD, PD, PD, PD, PB, /* 8 */ PB, PB, PB, PB, PB, PC, /* 14 */ PC, PC, PC, PC, PC, #if defined(__AVR_ATmega16__) PC, PC, PA, /* 22*/ PA, PA, PA, PA, PA, PA, PA, #endif }; const uint8_t _BV(0), _BV(1), _BV(2), _BV(3), _BV(4), _BV(5), _BV(6), _BV(7), _BV(0), _BV(1), _BV(2), _BV(3), _BV(4), _BV(5), _BV(0), _BV(1), _BV(2), _BV(3), _BV(4), PROGMEM digital_pin_to_bit_mask_PGM[] = { /* 0, port D */
/* 8, port B */
/* 14, port C */
_BV(5), #if defined(__AVR_ATmega16__) _BV(6), _BV(7), _BV(0), /* 22, port A */ _BV(1), _BV(2), _BV(3), _BV(4), _BV(5), _BV(6), _BV(7), #endif
}; I took away all ifs for atmega8 and 168, was too confusing and wrong const uint8_t PROGMEM digital_pin_to_timer_PGM[] = { NOT_ON_TIMER, /* 0 - port D */ NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, TIMER1B, TIMER1A, NOT_ON_TIMER, TIMER2, NOT_ON_TIMER, /* 8 - port B */ NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER,/* 14 - port C */ NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, /*22 port A */ NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER,
};