Forum: Mikrocontroller und Digitale Elektronik IO Pin invertiert einlesen


von Thomas (Gast)


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...

: Verschoben durch User
von ich (Gast)


Lesenswert?

status != PIND.4;

von Marcus B. (raketenfred)


Lesenswert?

ich schrieb:
> status != PIND.4;

status = ! PIND.4;

sollte erfolgsversprechender sein

von ich (Gast)


Lesenswert?

ups...

von Simon K. (simon) Benutzerseite


Lesenswert?

Das Ausrufezeichen ist aber ein logischer Operator. Richtiger wäre das 
binäre Komplement: ~

Thomas schrieb:
> vermutlich bin ich zu doof und die Lösung total simpel...

Das liegt natürlich Nahe, bei Jemandem, der Fragen in der Codesammlung 
postet.

von Karl H. (kbuchegg)


Lesenswert?

verschoben

von Thomas (Gast)


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?

von holger (Gast)


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
{
}

von holger (Gast)


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.

von Karl H. (kbuchegg)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.