Speicherung von Pin-Zuständen funktioniert nicht!

Christian8

Neues Mitglied
08. Dez. 2008
51
0
0
Sprachen
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. :confused: :mad:

Was mach ich nur falsch?


Hier der Code:

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

            if (SpeicherBits == 1)
            {
                Ergebnis[AnzahlMessungen] |= (PINB & (1<<PINB1));
                Ergebnis[AnzahlMessungen] |= ( (PINB & (1<<PINB2))<<1);
                SpeicherBits = 2;
            }

            else if (SpeicherBits == 2)
            {
                Ergebnis[AnzahlMessungen] |= ( (PINB & (1<<PINB1))<<2);
                Ergebnis[AnzahlMessungen] |= ( (PINB & (1<<PINB2))<<3);
                SpeicherBits = 3;
            }

            else if (SpeicherBits == 3)
            {
                Ergebnis[AnzahlMessungen] |= ( (PINB & (1<<PINB1))<<4);
                Ergebnis[AnzahlMessungen] |= ( (PINB & (1<<PINB2))<<5);
                SpeicherBits = 4;
            }

            else if (SpeicherBits == 4)
            {
                Ergebnis[AnzahlMessungen] |= ( (PINB & (1<<PINB1))<<6);
                Ergebnis[AnzahlMessungen] |= ( (PINB & (1<<PINB2))<<7);
                AnzahlMessungen++;
                SpeicherBits = 1;
            }
Ich hoffe da weiß jemand etwas!

Gruß, Christian
 
Hi Christian,

dann wollen wir doch mal sehen ...

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 0b10101010 raus. :confused: :mad:

Was mach ich nur falsch?
Gruß, Christian



CodeBox C

DDRB &= ~((1<<PB1) | (1<<PB2)); // PB1 und PB2 als Eingang


if (SpeicherBits == 1)
{
// PB1 auf Position Bit0 schieben xxxxxxx0
Ergebnis[AnzahlMessungen] |= (PINB & (1<<PINB1));
// PB2 auf Position Bit1 schieben xxxxxx1x
Ergebnis[AnzahlMessungen] |= ( (PINB & (1<<PINB2))<<1);
SpeicherBits = 2;
}

else if (SpeicherBits == 2)
{
// PB1 auf Position Bit2 schieben xxxxx0xx
Ergebnis[AnzahlMessungen] |= ( (PINB & (1<<PINB1))<<2);
// PB2 auf Position Bit3 schieben xxxx1xxx
Ergebnis[AnzahlMessungen] |= ( (PINB & (1<<PINB2))<<3);
SpeicherBits = 3;
}

else if (SpeicherBits == 3)
{
// PB1 auf Position Bit4 schieben xxx0xxxx
Ergebnis[AnzahlMessungen] |= ( (PINB & (1<<PINB1))<<4);
// PB2 auf Position Bit5 schieben xx1xxxxx
Ergebnis[AnzahlMessungen] |= ( (PINB & (1<<PINB2))<<5);
SpeicherBits = 4;
}

else if (SpeicherBits == 4)
{
// PB1 auf Position Bit6 schieben x0xxxxxx
Ergebnis[AnzahlMessungen] |= ( (PINB & (1<<PINB1))<<6);
// PB2 auf Position Bit7 schieben 1xxxxxxx
Ergebnis[AnzahlMessungen] |= ( (PINB & (1<<PINB2))<<7);
AnzahlMessungen++;
SpeicherBits = 1;
}
// macht zusammen ... 10101010

was willst Du denn ... Stimmt doch ;) Genau das falsche was Du möchtest.
Der ATmega macht alles richtig :eek: :rolleyes:

Gruß
Dino
 
Hallo Dino,

vielen Dank für deine Antwort.

Aber PINB müsste doch eigentlich 1 sein, wenn ich es mit 5V verbinde, oder?
(Oder bringe ich da irgendwas ganz durcheinander?)

Vieln Dank und Grüße, Christian
 
Hi Christian,

Aber PINB müsste doch eigentlich 1 sein, wenn ich es mit 5V verbinde, oder?
(Oder bringe ich da irgendwas ganz durcheinander?)
das paßt schon.

+5V => 1
GND => 0

Aber du hast durch die Sortierung der Bits in das Byte (das rumgeschiebe)
genau die Folge erzeugt, die du auch gesehen (oder über USART bekommen)
hast. Ich hab das ja im Quellcode mit Kommentaren versucht deutlich zu
machen. Wenn Du also deine Sortierung umstellst sollte alles passen :D .

Gruß
Dino
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)