www.mikrocontroller.net

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


Autor: Benjamin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Benjamin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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}

Autor: Benjamin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!!!

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Benjamin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
achso definition der ENDRx:

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

Gruß un Danke noch einmal!!

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha!

Autor: Benjamin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!!

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...Sorry, meinte natürlich die erste. Ist jedenfalls vom Code her die
optimalere...

Autor: Benjamin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.