www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C-Code ist Fehlerhaft


Autor: Kay --- (kingganja)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe folgenden Code geschrieben und der compiler von avr beschwert 
sich dabei immer.


if(PORTC|=0x40 && PORTD|=0x80)
        {
            PORTF|=(0<<PF3);
            PORTE|=(0<<PE1);
            PORTF|=0x04;
            PORTE|=0x01;
        }


Es sollen 2 Bedingungen eingelesen und mir einen Ausgang setzen.


Ist das so richtig? bzw, was mache ich falsch?

Gruß
Kay

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und was sagt der Compiler? Eigentlich sagt der doch immer ziemlich 
genau, was du falsch genacht hast.

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kay --- schrieb:

> Ist das so richtig? bzw, was mache ich falsch?

Du lieferst eine ungenuegende Fehlerbeschreibung, so wie tausende vor 
dir?

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

worüber beschwert er sich denn?
Ich würde mich auch beschweren.

Schreib es doch mal auseinander, vielleicht fällt Dir dann was auf?

if(PORTC = PORTC | 0x40 && PORTD = PORTD | 0x80)
        {

Wo fragst Du da was ab? Du setzt jeweils ein Bit in PORTC und PORTD...

Gruß aus Berlin
Michael

Autor: Niklas Gürtler (erlkoenig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kay --- schrieb:
> if(PORTC|=0x40 && PORTD|=0x80)
Dies ist immer wahr, da 0x40 bzw. 0x80 ungleich 0 sind, und ein OR mit 
einer anderen Zahl daran nichts ändert und die Bedingung immer erfüllt 
ist. Außerdem veränderst du die Inhalte von PORTC und PORTD.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke der Artikel Bitmanipulation bringt dich richtig voran!

Kay --- schrieb:

> if(PORTC|=0x40 && PORTD|=0x80)

Ist an PORTC Bit 5 gesetzt UND an PORTD Bit 7?

  if((PORTC & 0x40) && (PORTD & 0x80))

Wenn Eingänge abgefragt werden sollen:

  if((PINC & 0x40) && (PIND & 0x80))

>         {
>             PORTF|=(0<<PF3);
>             PORTE|=(0<<PE1);

Löschen von Bits geht anders:

              PORTF &= ~(1<<PF3);
              PORTE &= ~(1<<PE1);

>             PORTF |= 0x04;
>             PORTE |= 0x01;

Das macht die beiden Zeilen darüber nutzlos, da es anders geschrieben so 
zu lesen ist:

              PORTF |= (1<<PF3);
              PORTE |= (1<<PE1);

>         }

Autor: Markus F. (pippo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich hatte auch erst 1 Projekt und bin dabei noch net so fit, aber 
für mich sieht der Code gerade ziemlich falsch aus. Hier mal ne 
Verbesserung.

if((PORTC & 0x40) && (PORTD & 0x80))  //wenn Pin 3 von Port C und Pin 7 von Port D, dann ...
        {
            PORTF~=(1<<PF3);   //Pin 3 von Port F deaktivieren
            PORTE~=(1<<PE1);   //Pin 1 von Port E deaktivieren
            PORTF|=0x04;       //Pin 3 von Port F wieder aktivieren
            PORTE|=0x01;       //Pin 1 von Port E wieder aktivieren
        }

Ich kann mir vorstellen, dass du es vielleicht so gemeint hast.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch über die Zeilen, über die sich der Compiler nicht beschwert, 
solltest du dir nochmals Gedanken machen.
PORTF|=(0<<PF3);

ist zwar korrekter C-Code, aber ziemlich sinnlos, und tut nicht das, was 
du vermutlich erreichen möchtest.

Oliver

Autor: Kay --- (kingganja)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frank L. schrieb:
> weniger kiffen, dann klappts auch mit C

Sehr hilfreicher Komentar...... ich erspare mir da jeglichen Komentar zu




Also,

AVR schreibt dier als Fehler

../Komplett.c:46: error: lvalue required as left operand of assignment

Autor: Markus F. (pippo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und welche Zeile davon ist Zeile 46? Mir fällt im Moment nicht auf, auf 
welche von dir gepostete Zeile das zutreffen würde.

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kay --- schrieb:

> AVR schreibt dier als Fehler
>
> ../Komplett.c:46: error: lvalue required as left operand of assignment

Und jetzt sollten wir erraten, welches Zeile 46 ist?

Ueber dumme Kommentare solltest du dich nicht wundern, sondern 
nachdenken.

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

Bewertung
0 lesenswert
nicht lesenswert
Kay --- schrieb:

> ../Komplett.c:46: error: lvalue required as left operand of assignment

ein lvalue ist grob gesagt, etwas an das man etwas zuweisen kann. zb 
eine Variable.

Autor: Kay --- (kingganja)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dabke erstmal, Fehler gefunden

Autor: Markus F. (pippo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und was wars?

Autor: Kay --- (kingganja)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus F. schrieb:
> und was wars?

Dein Beitrag hatte meinem Kollegen wohl die Erleuchtung gebracht.

Inwiefern, weiss ich noch nicht genau. Aber es läuft nun g

Danke!!

Autor: skorpionx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>if(PORTC|=0x40 && PORTD|=0x80)

Zuweisungen in einem if...? Seit wann...
Die zusätzlich Klammern würden auch nicht schaden.

if ( (PORTC!=0x40 )&& (PORTD!=0x80) )

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
skorpionx schrieb:
> Die zusätzlich Klammern würden auch nicht schaden.
>
> if ( (PORTC!=0x40 )&& (PORTD!=0x80) )

Aber sowas von.

Autor: skorpionx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Aber sowas von.

Anfänger?...

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.