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
voiddelay_ms(uint16_tms)
4
{
5
for(uint16_tt3=0;t3<=ms;t3++)
6
{
7
_delay_ms(1);
8
}
9
}
10
11
voiddelay_us(uint16_tus)
12
{
13
for(uint16_tt4=0;t4<=us;t4++)
14
{
15
_delay_us(1);
16
}
17
}
18
19
20
voidLCD_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
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>)?
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.
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.
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.
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.
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.
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.
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.
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.
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.