Forum: Mikrocontroller und Digitale Elektronik Programmierfehler???


von Heinrich (Gast)


Lesenswert?

while((bit_is_clear(EINSe,AnschW))||(cstop==0));


Das Programm sollte bei diesem Befehl stehen bleiben und wenn eine der
beiden Bedingungen oder Beide nicht zutreffen weiterlaufen.

"cstop" ist int Variable

"EINSe,AnschW" ist andere Bezeichnung für PORTD (PIND,PIND1)


WINAVR + Atmega128 Programm wurde getestet und simuliert.

Wenn der oben genannte Befehl nicht möglich ist, was geht dann??

von Karl H. (kbuchegg)


Lesenswert?

> while((bit_is_clear(EINSe,AnschW))||(cstop==0));
>
> Das Programm sollte bei diesem Befehl stehen bleiben und wenn
> eine der beiden Bedingungen oder Beide nicht zutreffen
> weiterlaufen.

Mit anderen Worten:

Das Programm soll 'schleifen', solange wie Bedingung A UND
Bedingung B zutreffen.

UND nicht ODER

So wie Du es jetzt hast, reicht eine der beiden Bedingungen,
damit die Schleife aufrecht erhalten bleibt. Erst wenn beide
Bedingungen nicht zutreffen, wird die Schleife verlassen.

Bei logischem UND bzw. ODER muss man aufpassen. Im umgangs-
sprachlichen Sprachgebrauch verwenden wir die beiden Worte
sehr oft logisch falsch.

von Heinrich (Gast)


Lesenswert?

Ich bin so dumm! Danke!

von xXx (Gast)


Lesenswert?

JUPP!!!

von Marian (Gast)


Lesenswert?

Ich dachte immer das & ein Und ist und das | ein Oder.
Bin ich da jetzt falsch informiert?

von Karl H. (kbuchegg)


Lesenswert?

Nicht wirklich.
Das ist eine bekannte Falle in der jeder irgendwann mal
sitzt. Oft auch mehrmals hintereinander :-)

De-Morgan nicht vergessen:

   !( A && B ) <==> !A || !B
   !( A || B ) <==> !A && !B

von Karl H. (kbuchegg)


Lesenswert?

> Bin ich da jetzt falsch informiert?

Es gibt in C 2 verschiedene Verknuepfungen:

Die mit nur einem Zeichen, also & und | sind die Bit-Verknuepfungen.
Die mit 2 Zeichen, also && und || sind die logischen Verknuepfungen.

Bit-Verknuepfung:  zwei int werden Bit fuer Bit miteinander
                   verknuepft.
                   0b1011 & 0b1101 -> 0b1001
                   ( in dezimaler Schreibweise: 11 & 13 -> 9 )

Logische Verknuepfung: beide Partner werden als logische
                   Werte true oder false aufgefasst:
                   0 wird zu false, alles andere ist true
                   Dann werden diese Wahrheitswerte miteinander
                   logisch verknuepft:

                   11 && 13

                     11 ist nicht 0, also logisch true
                     13 ist nicht 0, also logisch true

                     true UND true ergibt true

                   oder binaer

                   0b1011 && 0b1101  -> 0b0001

Sollte aber auch in jedem besseren C-Lehrbuch zu finden sein.
Ehrlich: Besorgt Euch Literatur! Das ist wesentlich besser
als diese 'Try and Error'-Methoden, Halbwahrheiten und Halbwissen,
das da jeden Tag auftaucht.

von Karl H. (kbuchegg)


Lesenswert?

> Nicht wirklich.

Das war auf 'Heinrich' gemuenzt.

von Heinrich (Gast)


Lesenswert?

Das Programm stimmt jetzt, aber: Es bleibt stehen und läuft nur weiter
wenn ich den PIN(ANSCHw) high setze, wenn es schon bei der Schleife
steht(Passt) oder "vor" der Schleife die Variable cstop ändere es
sollte aber auch weiterlaufen wenn ich die Variable ändere während das
Programm bei der Schleife stehen bleibt.


"cstop globale int  Variable
Schleife im int main (void)
ändern der Variable mit Interrupt"

Fehler beim Simulieren, Testen konnte ich noch nicht.

Und wenn ich

"while((cstop==0)&&(bit_is_clear(EINSe,AnschW)));"schreibe hängt sich
das Programm auf und nach einer Weile kommt der Dissambler

von Heinrich (Gast)


Lesenswert?

Wenn ich es teste funktioniert es auch nicht??

von Andreas B. (andreasb)


Lesenswert?

Eventuell "cstop" ein zweites mal im int main() deklariert?
poste mal noch den Rest. Eventuell ist irgendwo anderst was falsch
(Speicherüberschreitung oder so was...)

mfg Andreas

von Unbekannter (Gast)


Lesenswert?

"cstop" wird bestimmt über einen Interrupt geändert und Du hast
"cstop" nicht "volatile" deklariert...

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.