mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik define Register


Autor: Patrick Hahn (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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"

Autor: Patrick Hahn (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... natürlich muss die 8-Bit Zeile lauten  ("reg") ...

#define  _P(reg)   (*(( uint8  volatile *)(reg)))

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.