Forum: Mikrocontroller und Digitale Elektronik AVR: Pointer IO-Register


von Anton Wert (Gast)


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....

von Karl H. (kbuchegg)


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.

von Anton Wert (Gast)


Lesenswert?

Danke!

Ich hätte noch erwähnen sollen dass ich den IAR verwende, geht dort aber 
auch!
Mit der Laufzeit ist auch aussreichend.

von coder (Gast)


Lesenswert?

Warum scheidet ein #define aus? Zum Manipulieren der Ports benutze ich 
z.b. Makros, die Bitmanipulationen durchführen.

von Anton Wert (Gast)


Lesenswert?

Wenn die Funktion universiell sein soll, muss der Port als parameter 
mitkommen,  mir fällt nun sopntan nicht ein wie das mit define gehen 
würde...

von Karl H. (kbuchegg)


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.

von Klaus W. (mfgkw)


Lesenswert?

Karl Heinz Buchegger schrieb:
> zb LCD-"Bibliotheken" keine richtigen
> Bibliotheken, ... mittels #define parametriert werden

Gilt nicht für meine in C++ :-)

von Martin S. (der_nachbauer)


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].

von Anton Wert (Gast)


Lesenswert?

wie gesagt, die Funktion soll mehrmals verwendet werden (in einem 
Projekt) mit mehreren Ports, damit ist define für mich raus!

von coder (Gast)


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 :-)

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.