Port als Parameterübergabe

Gast #181832
Lesenswert?
• ▲
▼
Ich möchte gerne eine funktion schreiben, die mir an einem beliebigen
Port einen beliebigen Pin invertiert. Meine Idee hierzu ist:

void invert_pin (uint8_t * PINX, uint8_t * PORTX, uint8_t pin) {
 if (*PINX & (1 << pin))
  *PORTX &= ~(1 << pin);
 else
  *PORTX |= (1 << pin);
}

Doch leider entsteht beim Compilieren immer die Warnung

warning: passing arg 1 of `invert_pin' discards qualifiers from
pointer target type
warning: passing arg 2 of `invert_pin' discards qualifiers from
pointer target type

wenn ich die Funktion mit

invert_pin (&PIND, &PORTD, 0);

aufrufe. Von welchem Typ sind denn die Ports und neben bei gefragt:
Kann ich das Invertieren nicht auch mit dem ~ - Operator realisieren.
Das hat bei mir aber nur geklappt, wenn ich einen kompletten Port
invertieren wollte.

Wie hängen eigentlich PinD und PortD zusammen? Kann man es irgendwie
erreichen, dass nur ein Parameter dafür nötig ist. So ist es doch
irgendwie doppelt gemoppelt.
Gast #181834
Lesenswert?
• ▲
▼
Ich kenne den Unterschied zwischen PIN und PORT. Meine Frage war, ob es
in C eine möglichkeit gibt bei der Übergabe eines Ports, der sich aus
den Registern DDRX, PINX und PORTX zusammensetzt, aus einem Parameter
auf die beiden anderen (ich benötige aber nur PORTX und PINX) zu
schließen OHNE sie einzelt, explizit zu nennen. Verstehst du meine
Frage? Aber das ist ja auch gar nicht mein eigentliches Problem (lese
Betreff).
Gast #181836
Lesenswert?
• ▲
▼
Jein.  Du kannst natürlich annehmen, dass Atmel sein Portlayout nie
ändert und daraufhin eine Beziehung zwischen DDRx, PINx und PORTx
aufbauen.  Auf der wirklich sicheren Seite bist du allerdings damit
nicht.
Gast #181837
Lesenswert?
• ▲
▼
warum nicht mit Macros?

#define setBit(x,y)    ((x) |=  (y))
#define clearBit(x,y)   ((x) &= ~(y))
#define toggleBit(x,y)   ((x) ^=  (y))

wenn du dann noch:

#define BIT0 0x01
#define BIT1 usw..

hast, dann schreibe einfach:

setBit(P2OUT,BIT1);
clearBit(P1DIR,BIT3);

oder

toggleBit(P3IN,BIT4);  //invertieren
Gast #181839
Lesenswert?
• ▲
▼
Vielen Dank für eure rasche Hilfe. Der Tip mit dem volatile-Objekt hat
den Fehler beseitigt. Die Möglichkeit mit Macros zu arbeiten kannte ich
bis gerade gar nicht. Werde da gleich mal ein wenig mit herumspielen.
Kennst du vielleicht eine kleine Doku über Macros, dir mir noch ein
bißchen mehr zeigen kann???

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.