Hallo Experten, ich benutze ein MSP430F2131. Ich hab Register einträge definiert, damit ich Sie in meinen Programm verwenden kann. Doch anscheinend ist die Syntax für die Einträge falsch. Würde mich sehr freuen wenn mir jemand helfen könnte. Als Fehlermeldung kriege ich: "expression must be a modifiable lvalue"
Zum besseren VErständnis: ich möchte in meinen Beispiel USICTL0 die Register Adresse 0x78 zuweisen, was ich auch oben mache: #define USICTL0 0x78 unten möchte ich dann USICTL0 (also 0x78) den Wert 0xEE zuweisen doch ich krieg immer die selbe Fehlermeldung, die als Anhang dabei ist. Was mach ich Falsch ? Danke im Vorraus. MfG Patrick
#define definiert ein Makro für einen konstanten Wert, der an der Stelle, an der das Makro im Programm aufgerufen wird, anstelle des Makros eingesetzt wird (reine Textersetzung). Man kann einem Makro keinen Wert zuweisen! Kenne mich zwar mit MSP430 nicht aus, aber i.d.R. geht das über Special-Function-Register-Definitionen.
Beim WINAVR-C-Compiler geht das z.B. mit #define PORTD _SFR_IO8(0x12) Da ich nicht weiß, mit was für einem Compiler Du arbeitest, kann ich nicht mehr dazu sagen. Dein Compiler besitzt sicher auch irgendwelche Ausdrücke zum definieren von SFRs. So wie Du es oben geschrieben hast, wird jedes Mal beim Aufruf von "USICTL0" der Wert 0x78 (also eine reine Zahl) eingesetzt. Da meckert der Compiler natürlich, wenn Du ihm erzählst, dass 0x78 = 0xEE sein soll. Würde ich an seiner Stelle auch tun...;-) BTW: Die SFRs sind i.d.R. in der jeweiligen Device-spezifischen Header-Datei vordefiniert. Da muss man selber eigentlich nix mehr machen. Die Register heißen zumindest bei den AVRs dann so wie im Datenblatt...
typedef unsigned char uint8; typedef unsigned short uint16; #define _P(off) (*(( uint8 volatile *)(reg))) #define _LP(reg) (*(( uint16 volatile *)(reg))) #define USICTL0 _P(0x78) // entweder 8-Bit Zugriffe #define USICTL0 _LP(0x78) // oder 16-Bit Zugriffe USICTL0 = 0xEE ; ==> ACHTUNG: Bitte in uP Datenblatt nachsehen, ob es 8-Bit oder 16-Bit Zugriffe sind. Nur EINES der beiden angebotenen define ist dann zutreffend.
... natürlich muss die 8-Bit Zeile lauten ("reg") ... #define _P(reg) (*(( uint8 volatile *)(reg)))
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.