Hallo, ich möchte die tatsächlich benutzten Peripheriemodule in einer Headerdatei mit #defines angeben/festlegen. Beim Xmega sind in der ioxxx.h Strukturen auf die Peripherieregister definiert - Bspw.: typedef struct USART_struct { register8_t DATA; /* Data Register */ register8_t STATUS; /* Status Register */ register8_t CTRLA; /* Control Register A */ .... } USART_t; Normalerweise benutzt man dann im c-Quelltext: USARTC0.CTRLA= xxx; Wenn ich schreibe: #define PC_IF_USART USARTC0 PC_IF_USART.CTRLA= 0; Compiliert er fehlerfrei, jedoch gibt A.Studio beim eintippen keine Unterstützung der Member (...CTRLA). Schreibe ich dagegen: #define PC_IF_USART ((USART_t *)(&USARTF0)) PC_IF_USART.CTRLA= 0; Zeigt er mir beim Eintippen die Member an, jedoch meldet der Compiler: "error: request for member 'CTRLA' in something not a structure or union" Wo ist mein Fehler? Wie macht man das richtig?
Anno schrieb: > #define PC_IF_USART ((USART_t *)(&USARTF0)) > PC_IF_USART.CTRLA= 0; Oben verwendest Du im #define die Adresse von USARTF0. Dann musst Du auch
1 | PC_IF_USART->CTRLA = 0; |
schreiben.
Ahh, ja eigentlich klar. Danke. Schade nur dass man bei der einfacheren Schreibweise mit #define PC_IF_USART USARTC0 keine Member-Unterstützung bekommt...
Anno schrieb: > Schade nur dass man bei der einfacheren Schreibweise mit #define > PC_IF_USART USARTC0 > keine Member-Unterstützung bekommt... Du könntest zunächst USARTC0 verwenden und im Abschluss dann per global-replace USARTC0 in PC_IF_USART umbenennen.
@Frank: Ja, das wäre tatsächlich eine Möglichkeit, die gar nicht so umständlich ist!
Moin, was benutzt du denn zum programmieren? Ich habe das gerade mit dem Atmel Studio 7 probiert und da geht das mit dem define eigentlich ganz gut. Ich bekomme schön die Vorschläge angezeigt.
Anno schrieb: > Ahh, ja eigentlich klar. Danke. > Schade nur dass man bei der einfacheren Schreibweise mit > #define PC_IF_USART USARTC0 > keine Member-Unterstützung bekommt... Das sind zwei verschiedene Dinge. Deine beiden #defines sind auch abseits des Casts verschieden. Das eine definiert einen neuen Namen für die struct, das andere einen neuen Namen für den Zeiger auf die struct. Wie wäre es denn, wenn du statt
1 | #define PC_IF_USART ((USART_t *)(&USARTF0))
|
besser
1 | #define PC_IF_USART ((USART_t)(USARTF0))
|
schreibst? Dann kannst du später bei
1 | PC_IF_USART.CTRLA= 0; |
bleiben und mußt nicht den -> Operator benutzen.
Keiner N. schrieb: > Ich habe das gerade mit dem Atmel Studio 7 probiert und da geht das mit > dem define eigentlich ganz gut. Ich bekomme schön die Vorschläge > angezeigt. bei mir funktioniert das auch tadellos. mfg Achim
> bei mir funktioniert das auch tadellos.
Ja stimmt, jetzt zeigt er bei mir auch die Members an.
(weil - nachdem im Rest des Programms keine Fehler mehr drin sind?)
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.