Forum: Compiler & IDEs Eingänge negiert verknüpfen


von Benjamin (Gast)


Lesenswert?

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

von johnny.m (Gast)


Lesenswert?

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.

von Benjamin (Gast)


Lesenswert?

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.

von johnny.m (Gast)


Lesenswert?

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}

von Benjamin (Gast)


Lesenswert?

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

von johnny.m (Gast)


Lesenswert?

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!

von Benjamin (Gast)


Lesenswert?

achso definition der ENDRx:

#define ENDR1 (1<<PA1)
#define ENDR2 (1<<PA2)
#define ENDR3 (1<<PA3)

Gruß un Danke noch einmal!!

von johnny.m (Gast)


Lesenswert?

Aha!

von Benjamin (Gast)


Lesenswert?

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

von peter dannegger (Gast)


Lesenswert?

> 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

von johnny.m (Gast)


Lesenswert?

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

von johnny.m (Gast)


Lesenswert?

...Sorry, meinte natürlich die erste. Ist jedenfalls vom Code her die
optimalere...

von Benjamin (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.