Programmierfehler???

Gast #314541
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??
#314542
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.
#314547
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.
Gast #314549
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren