Forum: Mikrocontroller und Digitale Elektronik Fehler bei AVR-Studio


von Jannik (Gast)


Lesenswert?

Mein AVR-Studio gibt mir bei meinem Programm folgende Fehler aus:
------------------------------------------------------------------------
c:16: lvalue required as increment operand
c:18: lvalue required as decrement operand
------------------------------------------------------------------------
das Programm lautet:

#include <avr/io.h>
#include <util/delay.h>

#ifndef F_CPU
#define F_CPU 16000000UL
#endif

#define TON
#define TASTER1 0b00001000
#define TASTER2 0b00000100
#define SUMMER 0b10000000

void ZEIT (void) {

while(1) {
  TON = TON++;                        //c:16
  _delay_ms(1000);
  TON = TON--;                        //c:18
  _dalay_ms(1000);
  }
}



int main(void) {

DDRD = 0b11100000;

BEGIN:;

if ((PORTD & TASTER1) == TASTER1) {
  while(1) {
  PORTD = SUMMER;
  _delay_ms(TON);
  PORTD = 0;
  _delay_ms(TON);

  if ((PORTD & TASTER2) == TASTER2) {
    goto BEGIN;
    }

  }

}

return 0;
}

----------------------------------------------

wo ist da jetzt der Fehler?
Kann mir jemand helfen?

von Horst (Gast)


Lesenswert?

Jannik schrieb:
> #define TON

Schau mal bitte im C-Grundkurs nach, was Du da versuchst. Dann wird Dir 
der Fehler auch klar.

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Hallo Jannik,

das geht entweder so:

while(1) {
  TON = TON + 1;                        //c:16
  _delay_ms(1000);
  TON = TON - 1;                        //c:18
  _dalay_ms(1000);
  }
}

oder so:

while(1) {
  TON++;                        //c:16
  _delay_ms(1000);
  TON--;                        //c:18
  _dalay_ms(1000);
  }
}

oder so:

while(1) {
  TON += 1;                        //c:16
  _delay_ms(1000);
  TON -= 1;                        //c:18
  _dalay_ms(1000);
  }
}


Grüße,

Peter

von ... (Gast)


Lesenswert?

Jannik schrieb:
> TON = TON++;                        //c:16

Was ist denn das für ein Konstrukt?

Täte es nicht ein
1
TON++

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Horst schrieb:
> Jannik schrieb:
>> #define TON
>
> Schau mal bitte im C-Grundkurs nach, was Du da versuchst. Dann wird Dir
> der Fehler auch klar.

Ja, genau, stimmt auch, hab ich ganz überlesen, TON muss natürlich eine 
Variable sein, Konstanten kann man nicht im Wert ändern.

von Jannik (Gast)


Lesenswert?

oh stimmt, da war ich wohl zu doof für, dass ich das nicht gesehen habe 
:D

von Jannik (Gast)


Lesenswert?

@ Peter Diener

was denn für eine Variable?

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Erstmal ganz egal, Hauptsache es ist keine Konstante, die kann man 
nämlich nicht ändern. Und eins draufaddieren oder subtrahieren ändert 
doch den Wert - oder?

Dann muss man sich noch überlegen, wie groß die Zahlen werden, die dort 
auftreten und ob sie negativ werden. Danach wählt man den Datentyp 
(short, int, long, signed, unsigned...) der Variable.

Überhaupt verstehe ich nicht, was das werden soll.

In ZEIT wird irgendwas komisches gemacht, im Wesentlichen ja 2 Sekunden 
gewartet und sonst nichts, aber die ganze Funktion wird nie verwendet.

Und dann in main die Konstruktion mit dem goto...
Goto sollte man komplett vermeiden, es gibt nur ein paar ganz wenige 
Ausnahmefälle in denen das sinnvoll ist. Das Abbrechen von einer 
while(1)-Schleife geht mit break.

Dann: Was passiert da genau mit PORTD? Die Taster sind offenbar dort 
angeschlossen, aber SUMMER schreibt auf den ganzen Port. Da stimmt doch 
was nicht...

von Wichtel (Gast)


Lesenswert?

Jannik schrieb:
> #define TON

Peter Diener schrieb:
> TON muss natürlich eine
> Variable sein, Konstanten kann man nicht im Wert ändern.

Das Problem ist hier vor allem, dass TON definiert wird zu "Nichts". 
Also weder Konstante noch Variable.
#define kann nur den zuerst angegebenen Text durch den dahinter 
angegebenen ersetzen, wenn da nichts steht wird jede Erwähnung von "TON" 
komplett eliminiert.

Aus der Zeile:
1
TON = TON++;
macht der Compiler also ein "solides"
1
 = ++;
und fragt sich zurecht, worauf er diese Operatoren denn nun anwenden 
soll.

Dass das mit dem x=x++; ein doppelt gemoppeltes, wenig sinnvolles 
Konstrukt ist, sind die Vorschreiber ja schon genügend eingegangen.

von Grml (Gast)


Lesenswert?

Der Mensch braucht ein C Buch. Und zwar dringend.
Und Leute, TON ist keine Konstante. Das ist einfach auch falsch.

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.