Port als Parameterübergabe

Gast #181832
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
Vieleicht solltest du das einmal lesen:
www.mikrocontroller.net/articles/AVR-GCC-Tutorial#I.2FO-Register
Ich denke das erklärt den Unterschied zwischen PinD und PortD
Gast
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
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
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
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???
Gast
Das schöne an den Macros ist das die der Compiler schon erledigt, der MC
hat dadurch keine zusätzliche Arbeit. Wenn du dafür eine Funktion
schreibst hast du zusätzlichen Code.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.