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
Und was sagt der Compiler? Eigentlich sagt der doch immer ziemlich genau, was du falsch genacht hast.
Kay --- schrieb:
> Ist das so richtig? bzw, was mache ich falsch?
Du lieferst eine ungenuegende Fehlerbeschreibung, so wie tausende vor
dir?
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
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.
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.
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
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
Und welche Zeile davon ist Zeile 46? Mir fällt im Moment nicht auf, auf welche von dir gepostete Zeile das zutreffen würde.
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.
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.
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!!
>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) )
skorpionx schrieb: > Die zusätzlich Klammern würden auch nicht schaden. > > if ( (PORTC!=0x40 )&& (PORTD!=0x80) ) Aber sowas von.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.