mikrocontroller.net

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


Autor: Ronny Schulz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Mark Hämmerling (haemi)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ronny Schulz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:

Autor: Ronny Schulz (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.