Speicherung von Pin-Zuständen funktioniert nicht

Gast #1252507
Hallo,

ich habe ein Programm geschrieben, das in durch den Timer vorgegebenen 
Zeitabständen die Pegel an den Pins PB1 und PB2 speichert. Um 
Speicherplatz zu sparen, wird in eine 8-Bit Variable vier mal der 
jeweilige Zustand gespeichert, danach kommt die nächste Variable.
Jetzt habe ich PB1 mit 5V und PB2 mit GND verbunden. Also müsste die 
VAriable doch eigentlich 0b01010101 sein? Es kommt bei mir über den UART 
aber immer 0b10101010 an. Das ganze ist also genau vertauscht.

Wenn ich PB1 mit GND und PB2 mit 5V verbinde kommt 0b10101000 raus.

Was mach ich nur falsch?


Hier der Code:
1
 
2
DDRB &= ~((1<<PB1) | (1<<PB2)); // PB1 und PB2 als Eingang 
3

4
if (SpeicherBits == 1) 
5
{ 
6
Ergebnis[AnzahlMessungen] |= (PINB & (1<<PINB1)); 
7
Ergebnis[AnzahlMessungen] |= ( (PINB & (1<<PINB2))<<1); 
8
SpeicherBits = 2; 
9
} 
10

11
else if (SpeicherBits == 2) 
12
{ 
13
Ergebnis[AnzahlMessungen] |= ( (PINB & (1<<PINB1))<<2); 
14
Ergebnis[AnzahlMessungen] |= ( (PINB & (1<<PINB2))<<3); 
15
SpeicherBits = 3; 
16
} 
17

18
else if (SpeicherBits == 3) 
19
{ 
20
Ergebnis[AnzahlMessungen] |= ( (PINB & (1<<PINB1))<<4); 
21
Ergebnis[AnzahlMessungen] |= ( (PINB & (1<<PINB2))<<5); 
22
SpeicherBits = 4; 
23
} 
24

25
else if (SpeicherBits == 4) 
26
{ 
27
Ergebnis[AnzahlMessungen] |= ( (PINB & (1<<PINB1))<<6); 
28
Ergebnis[AnzahlMessungen] |= ( (PINB & (1<<PINB2))<<7); 
29
AnzahlMessungen++; 
30
SpeicherBits = 1; 
31
}

Vielen Dank und Grüße, Alexander
Gast
>(PINB & (1<<PINB1)
und
>(PINB & (1<<PINB2)

tum wohl nicht das, was du erwartest, wenn der enztsprechende Pin 0 oder 
1 ist.

Also:
(PINB & (1<<PINB1)
ist ausgeschrieben
PINB & (1<<1)
also
PINB & 2

Ist der Pin PB1 auf GND, ergibt das
0 & 2 = 0
Ist der Pin auf VCC, ergibt das
2 & 2 = 2 = 0b00000010

Entsprechend für Pin PB2
0 & 4 = 0
bzw.
4 & 4 = 4 = 0b00000100

Die Einser sind also nicht da, wo du sie gerne hättest.

Oliver

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 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.