www.mikrocontroller.net

Forum: Compiler & IDEs Port als Parameterübergabe


Autor: Timelimelim (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hubert.G (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Timelimelim (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Parameter müssen auf ein volatile-Objekt zeigen (dieser
"Qualifier" wird bei dir unterschlagen).

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lanius (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lanius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
toggleBit(P3IN,BIT4);  //invertieren

... P3IN ist natärlich ein bloedes Beispiel :)

Autor: Timelimelim (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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???

Autor: Timelimelim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mit den Macros hat sich schon erledigt. Mir ist das Licht
aufgegangen. g

Autor: Lanius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.