mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Programmierfehler???


Autor: Heinrich (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Heinrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin so dumm! Danke!

Autor: xXx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
JUPP!!!

Autor: Marian (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Nicht wirklich.

Das war auf 'Heinrich' gemuenzt.

Autor: Heinrich (Gast)
Datum:

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

Autor: Heinrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich es teste funktioniert es auch nicht??

Autor: Andreas B. (andreasb)
Datum:

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

Autor: Unbekannter (Gast)
Datum:

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

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.