Fehler bei AVR-Studio

Gast #2542117
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
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
Persönliche Seite
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
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

Eine eigene Frage? Dieser Thread ist über 14 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.