Ich möchte auf beide UART Schnittstellen eines Atmega64 zugreifen. Dabei wäre es sehr praktisch, wenn der Registerzugriff über einen Pointer geschieht. z.B. wie folgt
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
Ist dies möglich?
|
Anzeige
|
Zugriff auf Register über PointerIch möchte auf beide UART Schnittstellen eines Atmega64 zugreifen. Dabei wäre es sehr praktisch, wenn der Registerzugriff über einen Pointer geschieht. z.B. wie folgt
Ist dies möglich?
Gast
#1141280
Die Registerdefinitionen (PORTA...) sind Zeiger. Guck mal in die Header... es werden "_SFR_" Makros verwendet. Nun bleibt es bei der Frage wie ich dieses Zeiger variabel einsetzen kann.
Gast
#1141306
>wäre es sehr praktisch, wenn der Registerzugriff über einen Pointer >geschieht. >z.B. wie folgt >void SerialEnRc(unsigned char Value) >{ > if (Value == ON) { > SerialGetCurrUCSRB() |= (1<<RXEN); > } else { > SerialGetCurrUCSRB() &= ~(1<<RXEN); > } >} Ich sehe hier keinen Pointer. Der Rückgabewert von SerialGetCurrUCSRB wäre ein Pointer. Der Inhalt dieser Funktion könnte wie folgt aussehen;
unsigned char *SerialGetCurrUCSRB() -> volatile unsigned char *SerialGetCurrUCSRB() return UCSR1B; -> return &UCSR1B; SerialGetCurrUCSRB() |= (1<<RXEN); -> *(SerialGetCurrUCSRB()) |= (1<<RXEN); Dankeschön. Funktioniert auf Anhieb! Doch noch eine weitere Frage, wenn auch nahe an "Off-Topic": Funktionen wie folgende werde ich nun eine ganze Reihe haben (je nach dem viele Register in ansprechen möchte). Mir fällt leider nicht ein, wie ich das Ganze noch ein wenig EINDAMPFEN/VEREINFACHEN könnte. Werkzeuge wie "##" kann ich in Echtzeit nun mal nicht nutzen.
Du könntest z.B. mit 3 globalen Pointern arbeiten. Also statt Serial->CurrChannel dann: Serial->CurrUCSRA Serial->CurrUCSRB Serial->CurrUCSRC und dann: *Serial->CurrUCSRB |= (1<<RXEN); Das erspart beim Zugriff den "Umweg" über die Funktion. Dafür ist der Channelwechsel dann aber aufwändiger. Ist halt eine Abwägungssache. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|