Forum: Mikrocontroller und Digitale Elektronik C-Code ist Fehlerhaft


von Kay -. (kingganja)


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

von ich (Gast)


Lesenswert?

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

von P. S. (Gast)


Lesenswert?

Kay --- schrieb:

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

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

von Michael U. (amiga)


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

von Niklas G. (erlkoenig) Benutzerseite


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.

von Stefan B. (stefan) Benutzerseite


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);

>         }

von Markus F. (pippo)


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.

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

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

von Oliver (Gast)


Lesenswert?

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

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

Oliver

von Kay -. (kingganja)


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

von Markus F. (pippo)


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.

von P. S. (Gast)


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.

von Karl H. (kbuchegg)


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.

von Kay -. (kingganja)


Lesenswert?

Dabke erstmal, Fehler gefunden

von Markus F. (pippo)


Lesenswert?

und was wars?

von Kay -. (kingganja)


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!!

von skorpionx (Gast)


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) )

von Mark B. (markbrandis)


Lesenswert?

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

Aber sowas von.

von skorpionx (Gast)


Lesenswert?

>Aber sowas von.

Anfänger?...

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.