Forum: Mikrocontroller und Digitale Elektronik define Register


von Patrick Hahn (Gast)


Angehängte Dateien:

Lesenswert?

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"

von Patrick Hahn (Gast)


Angehängte Dateien:

Lesenswert?

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

von johnny.m (Gast)


Lesenswert?

#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.

von johnny.m (Gast)


Lesenswert?

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...

von Klaus (Gast)


Lesenswert?

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.

von Klaus (Gast)


Lesenswert?

... 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
Noch kein Account? Hier anmelden.