Forum: Mikrocontroller und Digitale Elektronik Feld definieren mit Portnamen beim AVR


von Ronny Schulz (Gast)


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!

von Mark H. (haemi)


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

von Ronny Schulz (Gast)


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:

von Ronny Schulz (Gast)


Lesenswert?

Damit verbunden würde mich schon interessieren, wie ich dann auch PORTS
usw. an Funktionen übergeben kann? Hat sowas schon einmal jemand
gemacht?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.