Zdravím a už zase otravuji. Potřeboval bych poradit, zda lze definování I/O registrů nějak nacpat například do pole kvůli zjednodušení kódu. Například budu mít na výstupech plno relátek (nebo vstupů) rozházených různě po pinech mcu a ovládat (nebo číst stav) je budu třeba podle jednotlivých bitů v jedné proměnné např. typu int. Představoval jsem si to nějak takto, ale AvrStudio mi to nechce překousat.
uint8_t RELE_DEF[5][4] = {
&PORTA, &DDRA, &PINA, PINA0, // rele 1
&PORTB, &DDRB, &PINB, PINB1, // rele 2
&PORTA, &DDRA, &PINA, PINA2, // rele 3
&PORTD, &DDRD, &PIND, PIND0, // rele 4
&PORTA, &DDRA, &PINA, PINA4, // rele 5
};
nebo nějak přes sturktůru
typedef struct {#define PORT_REG; #define DDR_REG; #define PIN_REG; #define PIN;} device;
device RELE_DEF[5] = {
PORTA, DDRA, PINA, PINA0, // rele 1
PORTB, DDRB, PINB, PINB1, // rele 2
PORTA, DDRA, PINA, PINA2, // rele 3
PORTD, DDRD, PIND, PIND0, // rele 4
PORTA, DDRA, PINA, PINA4, // rele 5
};
Potom by stačilo pro inicializaci, čtení nebo nastavení bitu prohnat přes nějaký cyklus, např. for{}, který by používal prvky z pole.
for (uint8_t t = 0; t < 5; t++)
{
*RELE_DEF[t][1] |= (1<<RELE_DEF[t][3]) // nastavení jako výstup
// nebo RELE_DEF[t].DDR_REG |= (1<<RELE_DEF[t].PIN)
}
Dá se to nějak tak krásně sjednotit? Mě se to zatím nijak nepodařilo.