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

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