Hallo Zusammen, ich hoffe von Euch kann mir jemand helfen. Ich bastel schon seit Tagen an meinem Quellcode in C herum, aber ich bekomme einfach keinen negiertes Eingangssignal abgefragt... :o/. hier ein Beispiel wie ich es gemacht habe: //Initialisierung DDRA = 0x00; PORTA = 0xFF; ..... .... //Abfrage im Programm if ( !(PORTA & ENDR1 | ENDR2 | ENDR3)) { ...... } WinAVR bekommt die verknüpfung der Zustände nicht hin!! Muss ich jedes einzelne Signal in der "If - Schleife" verknüpfen?? Beispiel: if (!(PORTA & ENDR1) | !(PORTA & ENDR2) | !(PORTA & ENDR3)) { ..... } Oder kann mir jemand einen anderen Tipp geben?? Danke Schon mal!! Gruß Benjamin
Was genau willst Du denn abfragen? | ist übrigens der bitweise-Oder-Operator. Ich kann aus dem was Du schreibst nicht erkennen, wann Deine Bedingung eigentlich wahr sein soll.
ok stimmt, mmmmhhh.... also ENDRx sollten Bitabfragen des Registers PORTA sein. Also sollte auch eine Bitverknüpfung erfolgen, oder? Ich kenne das zumindestens so von 8051... Meine Bedingung soll wahr sein, wenn ENDR1, oder ENDR2, oder ENDR3, bzw. zwei der drei oder alle Signale ein low Signal führen.
Ach ja, solange Du nicht erzählst, wie ENDR1..3 überhaupt definiert sind, kann ich da eh nix machen. Außerdem musst Du anstelle von PORTA PINA abfragen, sonst kreigste nie ne Änderung! Ich vermute einfach mal, Du willst, dass der Inhalt der if-Anweisung ausgeführt wird, wenn entweder ein Pin oder ein anderer Pin oder noch ein anderer Pin auf Low ist. Oder eben auch mehrere Pins gleichzeitig. Wenn ENDRx die Pinnummer ist, dann muss das so aussehen: if(!(PINA & ((1 << ENDR1)|(1 << ENDR2)|(1 << ENDR3)))) {//Anweisungen}
ahhhhhh.... ohhhhh ..... böser fehler!!! jetzt habe ich es!! tja.... dann bedanke ich mich schon mal!! habe die passage überlesen, dass ich den pin- zustand nur über PINx einlesen kann!! Danke!!!
Mit welchem Compiler hast Du denn die 8051er programmiert? Mit Keil vielleicht? Der WINAVR-C-Compiler ist im Unterschied zum Keil ein reiner ANSI-C-Compiler, der die ganzen µC-spezifischen Erweiterungen wie Bitmanipulation nicht kennt. Da muss man mit Shift-Operatoren tricksen. Oder sich Makros schreiben. Dinger wie "BITNAME = 1;" oder ähnlich gehen da nicht ohne weiteres!
achso definition der ENDRx: #define ENDR1 (1<<PA1) #define ENDR2 (1<<PA2) #define ENDR3 (1<<PA3) Gruß un Danke noch einmal!!
ja... Keil!! habe ich auch schon festgestellt das ich mich dabei ziehmlich umstellen muss!! es gibt noch einige fragen die ich zu den AVR habe aber ich denke die werde ich nach und nach stellen!!
> if ( !(PORTA & ENDR1 | ENDR2 | ENDR3)) > { > ...... > } > > WinAVR bekommt die verknüpfung der Zustände nicht hin!! Muss ich > jedes einzelne Signal in der "If - Schleife" verknüpfen?? WINAVR macht genau das, was Du hinschreibst. Wenn ENDR2 oder ENDR3 ungleich 0 sind, ist die Odierung immer war und deren Negation immer unwahr. D.h. WINAVR darf alles zwischen {...} nie ausführen. WINAVR kann nichts dafür, wenn Du etwas anders hinschreibst, als Du es haben willst. Peter
Hey, Peter hat natürlich recht. Wenn Du wirklich die Verknüpfung haben willst, wie oben beschrieben (Anweisung wird ausgeführt, wenn einer oder mehrere der Pins 0 sind) muss es natürlich heißen if((PINA & (ENDR1 | ENDR2 | ENDR3)) != (ENDR1 | ENDR2 | ENDR3)) {//Anweisung} oder if(!(PINA & ENDR1) || !(PINA & ENDR2) || !(PINA & ENDR3)) {} Was Dir lieber ist, musst Du dann selbst entscheiden. Mir persönlich läge die zweite Version eher...
...Sorry, meinte natürlich die erste. Ist jedenfalls vom Code her die optimalere...
man man man... mmmmhhhhh.... ich glaube ich mache dort viele gedakliche fehler... aber noch einmal danke für die nützlichen tipps!!! wenn ich mir die beiden abfragen anschaue: if((PINA & (ENDR1 | ENDR2 | ENDR3)) != (ENDR1 | ENDR2 | ENDR3)) {//Anweisung} oder if(!(PINA & ENDR1) || !(PINA & ENDR2) || !(PINA & ENDR3)) {} dann muss ich sagen, von der elektrotechnisch logischen seite her ist die zweite variante einfacher zu verstehen!! Danke noch mal!!
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.