Hallo,
jetzt weiß ich endlich wie ich den anonymen namespace richtig nutzen muss ... hatte zu groß gedacht ...
PortBitList.h
#pragma once
using Register = volatile uint8_t *;
namespace
{
// Die Arrays sind automatisch generierter Code, bitte nicht haendisch aendern
// Der Index ist jeweils die Arduino Pinnummer
// UNO, Nano, Pro Mini usw.
#if defined(__AVR_ATmega328P__) | defined(__AVR_ATmega328__) | defined(__AVR_ATmega168P__) | defined(__AVR_ATmega168__)
constexpr uint8_t portBit[] = {0,1,2,3,4,5,6,7,0,1,2,3,4,5,0,1,2,3,4,5};
constexpr uint8_t pinMaske[] = {0b1,0b10,0b100,0b1000,0b10000,0b100000,0b1000000,0b10000000,0b1,0b10,0b100,0b1000,0b10000,0b100000,0b1,0b10,0b100,0b1000,0b10000,0b100000};
constexpr Register portList[] = {&PORTD,&PORTD,&PORTD,&PORTD,&PORTD,&PORTD,&PORTD,&PORTD,&PORTB,&PORTB,&PORTB,&PORTB,&PORTB,&PORTB,&PORTC,&PORTC,&PORTC,&PORTC,&PORTC,&PORTC};
constexpr Register ddrList[] = {&DDRD,&DDRD,&DDRD,&DDRD,&DDRD,&DDRD,&DDRD,&DDRD,&DDRB,&DDRB,&DDRB,&DDRB,&DDRB,&DDRB,&DDRC,&DDRC,&DDRC,&DDRC,&DDRC,&DDRC};
constexpr Register pinList[] = {&PIND,&PIND,&PIND,&PIND,&PIND,&PIND,&PIND,&PIND,&PINB,&PINB,&PINB,&PINB,&PINB,&PINB,&PINC,&PINC,&PINC,&PINC,&PINC,&PINC};
// #endif
// Leonardo, Micro, usw.
#elif defined(__AVR_ATmega32U4__)
constexpr uint8_t portBit[] = {2,3,1,0,4,6,7,6,4,5,6,7,6,7,3,1,2,0,7,6,5,4,1,0};
constexpr uint8_t pinMaske[] = {0b100,0b1000,0b10,0b1,0b10000,0b1000000,0b10000000,0b1000000,0b10000,0b100000,0b1000000,0b10000000,0b1000000,0b10000000,0b1000,0b10,0b100,0b1,0b10000000,0b1000000,0b100000,0b10000,0b10,0b1};
constexpr Register portList[] = {&PORTD,&PORTD,&PORTD,&PORTD,&PORTD,&PORTC,&PORTD,&PORTE,&PORTB,&PORTB,&PORTB,&PORTB,&PORTD,&PORTC,&PORTB,&PORTB,&PORTB,&PORTB,&PORTF,&PORTF,&PORTF,&PORTF,&PORTF,&PORTF};
constexpr Register ddrList[] = {&DDRD,&DDRD,&DDRD,&DDRD,&DDRD,&DDRC,&DDRD,&DDRE,&DDRB,&DDRB,&DDRB,&DDRB,&DDRD,&DDRC,&DDRB,&DDRB,&DDRB,&DDRB,&DDRF,&DDRF,&DDRF,&DDRF,&DDRF,&DDRF};
constexpr Register pinList[] = {&PIND,&PIND,&PIND,&PIND,&PIND,&PINC,&PIND,&PINE,&PINB,&PINB,&PINB,&PINB,&PIND,&PINC,&PINB,&PINB,&PINB,&PINB,&PINF,&PINF,&PINF,&PINF,&PINF,&PINF};
// #endif
// Mega
#elif defined(__AVR_ATmega2560__) | defined(__AVR_ATmega1280__)
constexpr uint8_t portBit[] = {0,1,4,5,5,3,3,4,5,6,4,5,6,7,1,0,1,0,3,2,1,0,0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0,7,2,1,0,7,6,5,4,3,2,1,0,3,2,1,0,0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7};
constexpr uint8_t pinMaske[] = {0b1,0b10,0b10000,0b100000,0b100000,0b1000,0b1000,0b10000,0b100000,0b1000000,0b10000,0b100000,0b1000000,0b10000000,0b10,0b1,0b10,0b1,0b1000,0b100,0b10,0b1,0b1,0b10,0b100,0b1000,0b10000,0b100000,0b1000000,0b10000000,0b10000000,0b1000000,0b100000,0b10000,0b1000,0b100,0b10,0b1,0b10000000,0b100,0b10,0b1,0b10000000,0b1000000,0b100000,0b10000,0b1000,0b100,0b10,0b1,0b1000,0b100,0b10,0b1,0b1,0b10,0b100,0b1000,0b10000,0b100000,0b1000000,0b10000000,0b1,0b10,0b100,0b1000,0b10000,0b100000,0b1000000,0b10000000};
constexpr Register portList[] = {&PORTE,&PORTE,&PORTE,&PORTE,&PORTG,&PORTE,&PORTH,&PORTH,&PORTH,&PORTH,&PORTB,&PORTB,&PORTB,&PORTB,&PORTJ,&PORTJ,&PORTH,&PORTH,&PORTD,&PORTD,&PORTD,&PORTD,&PORTA,&PORTA,&PORTA,&PORTA,&PORTA,&PORTA,&PORTA,&PORTA,&PORTC,&PORTC,&PORTC,&PORTC,&PORTC,&PORTC,&PORTC,&PORTC,&PORTD,&PORTG,&PORTG,&PORTG,&PORTL,&PORTL,&PORTL,&PORTL,&PORTL,&PORTL,&PORTL,&PORTL,&PORTB,&PORTB,&PORTB,&PORTB,&PORTF,&PORTF,&PORTF,&PORTF,&PORTF,&PORTF,&PORTF,&PORTF,&PORTK,&PORTK,&PORTK,&PORTK,&PORTK,&PORTK,&PORTK,&PORTK};
constexpr Register ddrList[] = {&DDRE,&DDRE,&DDRE,&DDRE,&DDRG,&DDRE,&DDRH,&DDRH,&DDRH,&DDRH,&DDRB,&DDRB,&DDRB,&DDRB,&DDRJ,&DDRJ,&DDRH,&DDRH,&DDRD,&DDRD,&DDRD,&DDRD,&DDRA,&DDRA,&DDRA,&DDRA,&DDRA,&DDRA,&DDRA,&DDRA,&DDRC,&DDRC,&DDRC,&DDRC,&DDRC,&DDRC,&DDRC,&DDRC,&DDRD,&DDRG,&DDRG,&DDRG,&DDRL,&DDRL,&DDRL,&DDRL,&DDRL,&DDRL,&DDRL,&DDRL,&DDRB,&DDRB,&DDRB,&DDRB,&DDRF,&DDRF,&DDRF,&DDRF,&DDRF,&DDRF,&DDRF,&DDRF,&DDRK,&DDRK,&DDRK,&DDRK,&DDRK,&DDRK,&DDRK,&DDRK};
constexpr Register pinList[] = {&PINE,&PINE,&PINE,&PINE,&PING,&PINE,&PINH,&PINH,&PINH,&PINH,&PINB,&PINB,&PINB,&PINB,&PINJ,&PINJ,&PINH,&PINH,&PIND,&PIND,&PIND,&PIND,&PINA,&PINA,&PINA,&PINA,&PINA,&PINA,&PINA,&PINA,&PINC,&PINC,&PINC,&PINC,&PINC,&PINC,&PINC,&PINC,&PIND,&PING,&PING,&PING,&PINL,&PINL,&PINL,&PINL,&PINL,&PINL,&PINL,&PINL,&PINB,&PINB,&PINB,&PINB,&PINF,&PINF,&PINF,&PINF,&PINF,&PINF,&PINF,&PINF,&PINK,&PINK,&PINK,&PINK,&PINK,&PINK,&PINK,&PINK};
// #endif
// ATtiny841
#elif defined(__AVR_ATtiny841__) | defined(__AVR_ATtiny441__)
constexpr uint8_t portBit[] = {0, 1, 2, 7, 6, 5, 4, 3, 2, 1, 0};
constexpr uint8_t pinMaske[] = {0b1,0b10,0b100,0b10000000,0b1000000,0b100000,0b10000,0b1000,0b100,0b10,0b1};
constexpr Register portList[] = {&PORTB,&PORTB,&PORTB,&PORTA,&PORTA,&PORTA,&PORTA,&PORTA,&PORTA,&PORTA,&PORTA};
constexpr Register ddrList[] = {&DDRB,&DDRB,&DDRB,&DDRA,&DDRA,&DDRA,&DDRA,&DDRA,&DDRA,&DDRA,&DDRA};
constexpr Register pinList[] = {&PINB,&PINB,&PINB,&PINA,&PINA,&PINA,&PINA,&PINA,&PINA,&PINA,&PINA};
// #endif
#else
#error “This AVR type is currently not yet supported.”
#endif
}
constexpr uint8_t getPortBit(const uint8_t pin)
{
return portBit[pin];
};
constexpr uint8_t getMaske(const uint8_t pin)
{
return pinMaske[pin];
};
constexpr Register getOutPort(const uint8_t pin)
{
return portList[pin];
};
constexpr Register getDdrPort(const uint8_t pin)
{
return ddrList[pin];
};
constexpr Register getInPort(const uint8_t pin)
{
return pinList[pin];
};
inline __attribute__((always_inline)) void digitalSwitch(uint8_t pin, uint8_t state) {
if (state) *getOutPort(pin) |= getMaske(pin);
else *getOutPort(pin) &= ~getMaske(pin);
}