mikrocontroller.net

Forum: Compiler & IDEs Zustand der PIN´s einer Variable zuweisen


Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich möchte den Zustand von einzelnen PINs am MC auslesen und 
einer Variable zuweisen. Folgenden Code habe ich bereits dafür verfasst 
aber der funktioniert nicht richtig. Ich finde den Fehler nicht.

"

    uint8_t j = 0;

    j += PINC & (1<<PC7); //read Port C Input Pins Address --> C7
    j <<= 1;
    j += PINC & (1<<PC6); //read Port C Input Pins Address --> C6
    j <<= 1;
    j += PIND & (1<<PD5); //read Port D Input Pins Address --> D5
    j <<= 1;
    j += PIND & (1<<PD4); //read Port D Input Pins Address --> D4
    j <<= 1;
    j += PIND & (1<<PD3); //read Port D Input Pins Address --> D3
    j <<= 1;
    j += PIND & (1<<PD2); //read Port D Input Pins Address --> D2
    j <<= 1;
    j += PIND & (1<<PD1); //read Port D Input Pins Address --> D1
    j <<= 1;
    j += PIND & (1<<PD0); //read Port D Input Pins Address --> D0
"

kann mir jemand helfen? Danke im Vorraus.

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich würde so machen:
//liest nur die untern 6 Bits von PIND
j = PIND & 63; //=0b00111111

//dann die beiden PINs von C dazu oderen..
j |= (PINC & 3); //=0b00000011

ich hoffe das klappt...

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, es klappt:

  uint8_t Testchar = 0x00;

  j = PIND & 63;     //=0b00111111
  j |= (PINC & 192); //=0b11000000

  Testchar = j;

Autor: Mathias O. (m-obi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was sagt denn die 63 bzw 192 aus. Die Position der Bits im Byte?

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

steht doch als Kommentar im Posting darüber: die Maske der zu 
beachtenden Bits.

Zuerst mit AND 0b00111111 die oberen beiden Bits auf 0 und damit 
ignorierenm
dann mit AND 0b11000000 die oberen beiden Bits des anderen Ports 
beschaffen
und zuletzt mit OR den Kram zusammenfassen.

Gruß aus Berlin
Michael

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Entweder so

    uint8_t j = 0;

    j += PINC & (1<<PC7) ? 1 : 0; //read Port C Input Pins Address --> C7
    j <<= 1;
    j += PINC & (1<<PC6) ? 1 : 0; //read Port C Input Pins Address --> C6
    j <<= 1;
    j += PIND & (1<<PD5) ? 1 : 0; //read Port D Input Pins Address --> D5
    j <<= 1;
    j += PIND & (1<<PD4) ? 1 : 0; //read Port D Input Pins Address --> D4
    j <<= 1;
    j += PIND & (1<<PD3) ? 1 : 0; //read Port D Input Pins Address --> D3
    j <<= 1;
    j += PIND & (1<<PD2) ? 1 : 0; //read Port D Input Pins Address --> D2
    j <<= 1;
    j += PIND & (1<<PD1) ? 1 : 0; //read Port D Input Pins Address --> D1
    j <<= 1;
    j += PIND & (1<<PD0) ? 1 : 0; //read Port D Input Pins Address --> D0

    // Anm.: Klammern zur besseren Lesbarkeit schaden nicht 
    // bes. wenn man sich bzgl. Vorrang der Operatoren unsicher ist
    // Bsp: j += (PIND & (1<<PD0)) ? 1 : 0;

oder so
    uint8_t j = 0;

    j |= PINC & (1<<PC7); //read Port C Input Pins Address --> C7
    j |= PINC & (1<<PC6); //read Port C Input Pins Address --> C6
    j |= PIND & (1<<PD5); //read Port D Input Pins Address --> D5
    j |= PIND & (1<<PD4); //read Port D Input Pins Address --> D4
    j |= PIND & (1<<PD3); //read Port D Input Pins Address --> D3
    j |= PIND & (1<<PD2); //read Port D Input Pins Address --> D2
    j |= PIND & (1<<PD1); //read Port D Input Pins Address --> D1
    j |= PIND & (1<<PD0); //read Port D Input Pins Address --> D0

letzteres zusammengefasst dann so
    uint8_t j = 0;

    j |= PINC & ((1<<PC7)|(1<<PC6)); // 192
    j |= PIND & ((1<<PD5)|(1<<PD4)|(1<<PD3)|(1<<PD2)|(1<<PD1)|(1<<PD0)); // 63

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, ja... Warum einfach, wenns auch kompliziert geht :)

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kommt halt darauf an, was man machen will. Die Variante #1 könnte 
interessant sein, wenn die Bits nicht so säuberlich in Reih' und Glied 
vorliegen und man keine breite Masken wie in der Variante #3 benutzen 
kann. Das ReinODERn und VerSHIFTen (nicht Verschiffen!) ist quasi 
tägliches Brot, wenn man Bits per seriell verschickt oder empfängt.

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.