Fehler bei AVR-Studio

Gast #2542117
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?
Persönliche Seite #2542158
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...
Gast #2542278
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren