AVR: Pointer IO-Register

Gast #2249009
Lesenswert?
• ▲
▼
Hallo,

ich schreibe an einer Bibliotheksfunktion welche ich in diesem Projekt 
an verschiedenen Stellen einsetzen will.
Diese funktion greift auf einen IO-Pin zu, welcher aber immer 
unterschiedlich ist.
Welches C-Konstrukt erlaubt mir den zugriff mittels eines Pointes - o.ä. 
damit ich nicht für jede Port-variante eine eigene Funktion 
implementieren muss. Ein define scheidet ja leider aus....
#2249011
Lesenswert?
• ▲
▼
Der Datentyp den du brauchst ist ein

volatile unsigned char *


also zb

void TurnOnPort( volatile unsigned char * port )
{
  *port = 0xFF;
}


int main()
{
  TurnOnPort( &PORTB );
  TurnOnPort( &PORTC );
}


> Ein define scheidet ja leider aus....

Das solltest du dir nochmal gut überlegen. Die obige Konstruktion ist 
nämlich relativ teuer was Laufzeit angeht. Sie hindert den Compiler 
daran, die Optimierungen für Bitzugriffe an Ports anzuwenden. Wenn das 
ganze Laufzeitmässig kein Problem ist, dann ist es ok.
#2249082
Lesenswert?
• ▲
▼
Anton Wert schrieb:
> Wenn die Funktion universiell sein soll,

Hier trifft auf einem µC oft die reine Lehre auf die Praxis.

Die Frage ist dann nämlich: Wie universell muss es denn eigentlich 
wirklich sein?

Aus genau dem Grunde, sind zb LCD-"Bibliotheken" keine richtigen 
Bibliotheken, wie man sie von größeren Systemen kennt, sondern werden in 
Source Code Form eingesetzt, die im jeweiligen Projekt mittels #define 
parametriert werden und für das Projekt massgeschneidert compiliert 
werden.
#2249096
Lesenswert?
• ▲
▼
coder schrieb:
> Warum scheidet ein #define aus? Zum Manipulieren der Ports benutze ich
> z.b. Makros, die Bitmanipulationen durchführen.

Das war auch mein erster Gedanke beim Lesen der Frage.

Es hängt aber wohl hauptsächlich davon ab, ob die betreffenden Pins sich 
während der Laufzeit ändern [dann wäre Karl-Heinz' Lösung angesagt], 
oder nur einmalig beim build der Firmware je nach Konfiguration der 
Schaltung [dann eher über #define].
Gast #2249127
Lesenswert?
• ▲
▼
@Martin Schröer + Anton Wert
Dann empfehle ich Euch, die Arbeitsweise von C-Preprozessor Anweisungen, 
wie z.B. defines und Makro, nochmals in einem Buch oder Tutorial 
durchzulesen.

Bin für Copy&Paste gerade zu faul :-)

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.