Forum: Mikrocontroller und Digitale Elektronik Probleme beim Compilieren


von Dani (Gast)


Lesenswert?

Hallo zusammen,

nun, an sich ist meine Frage einfach, für die meisten wohl, nur ich 
steige da grad im Moment nicht mehr so ganz durch, ich glaube fast, ich 
seh den Wald vor lauter Bäumen nicht mehr.
Und mein bester Freund Google, kann mir da grad irgendwie auch nicht 
mehr so ganz weiterhelfen, vllt könnt ihr es ja.

Also, beim Versuch das Programm(siehe Code weiter unten) zu compilieren 
kommt an mehreren stellen: 1value required as left operand.

Genutzte Software ist AVR Studio 4...

1
#include "lcddef.h"
2
3
void delay_ms(uint16_t ms)
4
{
5
for (uint16_t t3=0; t3<=ms; t3++)
6
{
7
_delay_ms(1);
8
}
9
}
10
11
void delay_us(uint16_t us)
12
{
13
for (uint16_t t4=0;t4<=us; t4++)
14
{
15
_delay_us(1);
16
}
17
}
18
19
20
void LCD_E(void)
21
{
22
LCD_En = 1;
23
delay_us(LCD_Wsend);
24
LCD_En = 0;
25
}

das ist das C programm... Die Definitionen stehen in der Datei LCDdef.h 
die am Anfang eingebunden ist, und diese sehen wie folgt aus.
1
//Definition der Daten und Steuerleitungen
2
3
#define LCD_Port   PORTD
4
#define LCD_En    PD3
5
#define LCD_RS    PD2
6
7
8
//Definition der Register und Maske
9
10
#define DDR_LCD    DDRD
11
#define mask    0b11111100
12
#define used_out  0b11111100

Vielleicht könnt ihr mir ja weiterhelfen, würde mich freuen.

Vielen Dank schonmal

von Hw-Noob (Gast)


Lesenswert?

Ich würde behaupten, dass der Compiler die Register Bezeichnungen nicht 
auflösen kann (PORTD, PD3...). Ist den irgendwo (idealer weise im 
C-File) das Header File mit den Regsiter-Adressierung eingebunden (z.B. 
#include <Atmega644.h>)?

von Dani (Gast)


Lesenswert?

Hallo,

mh, ich glaube fast nein, das es nirgendwo eingebunden ist. Ist nen 
Atmega 16 im Moment.

Sollte ich dann wohl mal noch machen. Allerdings hab ich die avr/io.h 
drin, habe ich jetzt hier nur nicht mitkopiert.

Nun gut, dann begebe ich mich mal auf die Suche nach der Datei die, die 
genauen Register für den Atmega16 enthält.

Danke schonmal.

von Klaus W. (mfgkw)


Lesenswert?

Dani schrieb:
> habe ich jetzt hier nur nicht mitkopiert.

Und wie soll hier jemand helfen, wenn du irgendwas hier reinkopierst?

von Hc Z. (mizch)


Lesenswert?

Dani schrieb:
> #define LCD_En    PD3
> ...
> LCD_En = 1;

Da PD3 als 8 definiert ist, steht da 8 = 1.  8 ist kein lvalue.

PORTD |= 1<<LCD_En;

wäre der richtige Weg.

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Dani schrieb:
> kommt an mehreren stellen: 1value required as left operand.

Das kenne ich. Meine Mitarbeiter rufen auch öfters an, dass ihr Programm 
XXX "irgend eine Fehlermeldung" zeigt. Jedoch können sie nicht mehr 
sagen, was drin stand, weil sie diese sofort weggeklickt hatten. Noch 
schlimmer ist die Behauptung, dass "der Computer nicht geht" und 
irgendeine Fehlermeldung kommt.

Gib bitte genau an, wo der Fehler auftritt, mit welcher Software Du das 
Programm übersetzt hast und wenn möglich (Urheberrecht, Geheimhaltung, 
etc) den kompletten und compilierbaren Quellcode (keinen Ausschnitt in 
dem Deiner Meinung nach der Fehler liegt). Und vor allem, die 
Zeilennummer, wo welcher Fehler auftrat und bitte auch den genauen Text 
der Fehlermeldung.

Hc Zimmerer schrieb:
> Da PD3 als 8 definiert ist, steht da 8 = 1.  8 ist kein lvalue.

Stimmt auch wieder.

von Huch (Gast)


Lesenswert?

Ich kann mir eigentlich auch nicht vorstellen, dass man bei der Suche 
nach "1value required as left operand" bei google nun wirklich überhaupt 
keine Erklärung findet.
Da hättest Du Dir beim suchen wirklich mehr Mühe geben können.

von Dani (Gast)


Lesenswert?

Hc Zimmerer schrieb:
> Da PD3 als 8 definiert ist, steht da 8 = 1.  8 ist kein lvalue.
>
>
>
> PORTD |= 1<<LCD_En;
>
>
>
> wäre der richtige Weg.

Geht das nicht auch irgendwie so, dass ich dem einzelnen Portpin / Bit 
einen Wert zuweise?

Ich meine da etwas im Hinterkopf zu haben, wo ich aber nicht draufkomme 
gerade.

Christian H. schrieb:
> Gib bitte genau an, wo der Fehler auftritt, mit welcher Software Du das
>
> Programm übersetzt hast und wenn möglich (Urheberrecht, Geheimhaltung,
>
> etc) den kompletten und compilierbaren Quellcode (keinen Ausschnitt in
>
> dem Deiner Meinung nach der Fehler liegt). Und vor allem, die
>
> Zeilennummer, wo welcher Fehler auftrat und bitte auch den genauen Text
>
> der Fehlermeldung.

AVR-Studio4 mit AVR-GCC der Teil der aus dem WinAVR kommt.

Ich habe die include weggelassen, ja das war mein Fehler(da ich dachte 
ich hab in der Definition irgendwo nen Fehler drin) und ich hätte 
erwähnen sollen, das er bei LCD_En die Probleme hat.

Dennoch Danke für deine Hilfe und mit mehreren Stellen, war einfach 
gemeint das er bei dem LCD_En noch an ner anderen Stelle im Programm das 
Problem hat.

Dennoch vielen Dank für deine Hilfe, ich werde mich in Zukunft bemühen, 
meine Wünsche/Probleme noch genauer zu spezifizieren.

von Karl H. (kbuchegg)


Lesenswert?

Dani schrieb:

> Geht das nicht auch irgendwie so, dass ich dem einzelnen Portpin / Bit
> einen Wert zuweise?

Ja das geht.
Aber solange deine C-Kenntnisse auf deinem Niveau sind, ist es besser 
wenn du erst mal die übliche C-Konvention benutzt, die da lautet: 
Einzelbits werden mit binären Operationen Und(&), Oder(|) und Nicht(~) 
miteinander verknüpft.

> Dennoch vielen Dank für deine Hilfe, ich werde mich in Zukunft
> bemühen, meine Wünsche/Probleme noch genauer zu spezifizieren.

Und damit dir das in Zukunft besser gelingt:

lvalue ist die Abkürzung für 'Left Value'.

Wie in einer Zuweisung:

   a = b;

da gibt es den Teil links vom = und den Teil rechts vom =
Also den 'Left Value' und den 'Right Value'. Oder eben in C-speak: den 
lvalue und den rvalue.

Und klarerweise muss ein lvalue etwas sein, an das man etwas zuweisen 
kann. Wenn du also eine Fehlermeldung hast 'lvalue required' dann 
konzentrierst du dich in Zukunft auf die linke Seite einer Zuweisung und 
verfolgst nach, was das im Detail ist. Alle #define auflösen. Und 
irgendwann kommst du drauf: Hopple, da steht ja gar keine Variable oder 
ein Register, da steht ja etwas was konstant ist und dem kann man 
natürlich nichts zuweisen.

von Dani (Gast)


Lesenswert?

Hallo,

und wie würde das gehen, jetzt rein aus Interesse. Ich will imch ja 
schließlich weiterentwickeln. Und gerade dann würde ich mich freuen, 
wenn ich auch solche Dinge erklärt bekommen würde.

Danke für die Hilfe.

von Karl H. (kbuchegg)


Lesenswert?

Dani schrieb:
> Hallo,
>
> und wie würde das gehen, jetzt rein aus Interesse.

Über Strukturen (struct) und einem darin eingebetteten Bitfeld.

> Ich will imch ja
> schließlich weiterentwickeln.

Am besten entwickelst du dich systematisch weiter, wenn du ein C-Buch 
liest und durcharbeitest. Da hast du mehr davon als vom anlassbedingten 
Zusammenfragen von Halbwissen in einem Forum.

von Floh (Gast)


Lesenswert?

Gibt grad was ziemlich ähnliches im anderen Thread:
Beitrag "Wie kann ich folgenden C-Code mit einer Schleife kürzer machen?"
Die Lösung von Fralla weiter unten demonstriert mal so eine Struktur.
Aber erst verstehen, dann kopieren :-)

von Hc Z. (mizch)


Lesenswert?

Ich halte es für nicht besonders sinnvoll, über andere Wege einer 
Bit-Zuweisung nachzudenken, bevor der grundsätzliche Weg (nämlich über 
|= und &=) verstanden ist.  Vielleicht versuchst Du Dich einfach 
zunächst damit.

Über die anderen Wege wirst Du früher oder später ohnehin nachdenken 
müssen (denn structs und Bitfelder sind oft in anderem Zusammenhang 
notwendig), aber eher nicht, damit bloß rechts vom Gleichheitszeichen 
eine 1 steht.

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.