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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.