IO Pin invertiert einlesen

Gast #2283583
Lesenswert?

Hi,

vermutlich bin ich zu doof und die Lösung total simpel...
Ich möchte einen IO pin in eine unsigned char variable lesen. Das ganze 
allerdings invertiert.

Der Compiler ist CodeVision AVR und es handelt sich um einen ATMega32 
Prozessor.

normal lese ich ein Pin so ein:
status = PIND.4;

an PIND.4 hängt allerdings ein Pull-Up und ich hätte gern, das status = 
1 wird wenn PIND.4 = 0 ist, also auf Masse gezogen wurde und halt 
entsprechend umgekehrt status = 0 wenn PIND.4 = 1 ist.

by the way: macht es Sinn bzw. hat es vorteile anstatt unsigned char die 
Variable Status als bit zu deklarieren? Geht mit Bit irgendwas nicht 
bzw. umgekehrt was mit unsigned char geht?

Danke schonmal für die Hilfe...
Gast #2283829
Lesenswert?

Hallo,

ups, erstmal sorry, hatte mich wohl im Subforum verklickt, sollte 
eigentlich zu GCC, nicht in die Codesammlung.

also ich habe sowohl status = !PIND.4 als auch status = ~PIND.4 
getestet. Beides ohne Erfolg.

Was macht denn der Compiler aus status = ~PIND.4 ??
da status ja ein unsigned char ist, könnte er doch aus einer 1 ein 0xFE 
machen, was dann natürlich nicht mehr auf 0 oder 1 abgefragt werden kann 
oder ist der Datentyp von PIND.4 ausschlaggebend für die invertierung?
Gast #2283848
Lesenswert?

>also ich habe sowohl status = !PIND.4

Das sollte eigentlich gehen da PIND.4 nur ein Bit ist.
Kann also nur 0 oder 1 werden. Die Frage ist wirklich was
der Compiler daraus macht.

Zur Not eben nicht auf 1 abfragen sondern auf ungleich 0:

status = PIND.4;
status = ~status;

if(status) // ungleich Null
{
}
else
{
}
Gast #2283904
Lesenswert?

>Zur Not eben nicht auf 1 abfragen sondern auf ungleich 0:
>
>status = PIND.4;
>status = ~status;
>
>if(status) // ungleich Null
>{
>}
>else
>{
>}

Upps das war jetzt Quatsch. Da kommt ja 0xFE und 0xFF raus;)

Vieleicht besser:
if(!PIND.4) // pin low aktiv
{
}

Also Zwischenvariable weglassen.

Wenn dein Compiler status = !PIND.4;
nicht mag, also seine eigenen Bitvariablen, dann am besten wegwerfen.
#2283933
Lesenswert?

Thomas schrieb:
> Hallo,
>
> ups, erstmal sorry, hatte mich wohl im Subforum verklickt, sollte
> eigentlich zu GCC, nicht in die Codesammlung.
>
> also ich habe sowohl status = !PIND.4 als auch status = ~PIND.4
> getestet. Beides ohne Erfolg.

Du hast aber im weiteren Code, dort wo Status verwendet wird, 
hoffentlich nicht den Fehler gemacht auf 0 und 1 abzufragen. Manchmal 
ist weniger einfach mehr. Du willst wissen, ob das 0 oder nicht 0 ist (1 
ist nicht 0, genauso wie jede andere Zahl die bei der Invertierung 
entstehen kann).

Bei !PIND.4 müsste eigentlich 0 bzw. 1 rauskommen. Aber bei ~PIND.4 muss 
das keineswegs so sein.

Zur Not kannst du immer noch das machen

   Status = PIND.4 ? 0 : 1;

um die Invertierung gezielt auf 0 bzw. 1 zu machen.

Und wenn alle Stricke reißen, dann ist es immer eine gute Idee, sich 
einen Wert mal irgendwo ausgeben zu lassen. Zb auf einem LCD, zb über 
die UART. Dann weißt du nämlich, wie dein Compiler das behandelt und 
musst nicht raten. Der erkenntnistheoretische Wert einer gezielten 
simplen Ausgabe ist nicht zu unterschätzen! Anfänger ignorieren das 
gerne und stochern lieber 5 Stunden im Nebel herum, anstelle mal eben in 
2 Minuten eine Ausgabe einzubauen, die dann wieder rausfliegt, wenn der 
unklare Punkt erledigt ist.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren