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
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.
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?
>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
{
}
>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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.