Feld definieren mit Portnamen beim AVR

Gast #218155
Lesenswert?

Mit WinAVR möchte ich in einem Feld verschiedene Portpins definieren, um
diese auslesen zu können. So stelle ich mir das vor:

char port_tab[4][MAX_USED_PORTS] = {
  { DS1820_PORT_DDR, DS1820_PORT_OUT, DS1820_PORT_IN, PA4 },
  { DS1820_PORT_DDR, DS1820_PORT_OUT, DS1820_PORT_IN, PA5 },
  { DS1820_PORT_DDR, DS1820_PORT_OUT, DS1820_PORT_IN, PA6 },
  { DS1820_PORT_DDR, DS1820_PORT_OUT, DS1820_PORT_IN, PA7 },
};

Natürlich geht das nicht so einfach, da die Portbezeichnungen irgendwie
Adressen sind. Wie könnte ich das dennoch sinnvollerweise einsetzen und
im weiteren Programmverlauf weiterverwenden?

DANKE!
#218156
Lesenswert?

Salve,

soweit ich weiß adressiert der GCC die I/O-Ports über Memory Mapping
(theoretisch jedenfalls - praktisch werden aus Optimierungsgründen
meist direkte Portzugriffe draus gemacht). So gesehen werden die
Portkonstanten wie "PORTA" doch nur dereferenzierte Pointer sein. In
der Doku zur avr-libc wird dieses Thema auch behandelt. Schau am besten
dort nochmal rein.
Also meine Idee wäre sowas:

char* ports[] = { &PORTA, &PORTB, &PORTC };
char porta = *ports[0];

Viel Erfolg,
Mark
Gast #218157
Lesenswert?

Ich habe noch mal in den Headerfiles geschaut. Außerhalb der
eigentlichen Funktion kann ich wohl nicht auf die PORTs zugreifen, da
dort beim Aufruf immer ein Makro ausgeführt wird. Allerdings ist das
schade, dass eben die Adressen nicht direkt definiert sind, sondern
gleich mit Makro. Deshalb ist das weniger portabel und könnte so
aussehen::

// DDRA, PORTA, PINA
uint8_t ds1820_tab[4][DS1820_MAX_PORTS] = {
  { 0x1A, 0x1B, 0x19, PA4 },
  { 0x1A, 0x1B, 0x19, PA5 },
  { 0x1A, 0x1B, 0x19, PA6 },
  { 0x1A, 0x1B, 0x19, PA7 }
};

Damit kann ich dann das entsprechende Bit setzen,l was in dem Tab
vereinbart ist.

_SFR_IO8(ds1820_tab[0][1]) |= ds1820_tab[0][3];

Wenn es eine besser Lösung gibt, immer her damit:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren