C-Code ist Fehlerhaft

OP #1285460
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
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
Persönliche Seite
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);

>         }
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.
Gast
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
Gast
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.
Gast
>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) )

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.