Šebi Častý přispěvatel

Založen: 12.4.2007 Příspěvky: 37
|
Zaslal: 07 leden 2018, 15:42 Předmět: Definování I/O portů v poli |
|
|
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.
kód: |
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
kód: |
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.
kód: |
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.  |
|