mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zugriff auf Register über Pointer


Autor: Julius Krebs (julius-krebs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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
void SerialEnRc(unsigned char Value)
{
    if (Value == ON) {
        SerialGetCurrUCSRB() |= (1<<RXEN);
    } else {
        SerialGetCurrUCSRB() &= ~(1<<RXEN);
    }
}

Ist dies möglich?

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Registerdefinitionen (PORTA...) sind Zeiger. Guck mal in die 
Header...

Autor: Julius Krebs (julius-krebs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
es werden "_SFR_" Makros verwendet.
Nun bleibt es bei der Frage wie ich dieses Zeiger variabel einsetzen 
kann.

Autor: dummy (Gast)
Datum:

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

Autor: Julius Krebs (julius-krebs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Rückgabewert von SerialGetCurrUCSRB wäre ein Pointer. Der Inhalt 
dieser Funktion könnte wie folgt aussehen;
unsigned char *SerialGetCurrUCSRB()
{
    switch (Serial->CurrPort){
        case 1:
            return UCSR1B;
        default:
            return UCSR0B;
    }
}

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
unsigned char *SerialGetCurrUCSRB()
->
volatile unsigned char *SerialGetCurrUCSRB()

return UCSR1B;
->
return &UCSR1B;

SerialGetCurrUCSRB() |= (1<<RXEN);
->
*(SerialGetCurrUCSRB()) |= (1<<RXEN);

Autor: Julius Krebs (julius-krebs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dankeschön. Funktioniert auf Anhieb!

Autor: Julius Krebs (julius-krebs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.
volatile unsigned char *SerialGetCurrUCSRA()
{
    switch (Serial->CurrChannel){
        case 1:
            return &UCSR1A;
        default:
            return &UCSR0A;
    }
}
volatile unsigned char *SerialGetCurrUCSRB()
{
    switch (Serial->CurrChannel){
        case 1:
            return &UCSR1B;
        default:
            return &UCSR0B;
    }
}
volatile unsigned char *SerialGetCurrUCSRC()
{
    switch (Serial->CurrChannel){
        case 1:
            return &UCSR1C;
        default:
            return &UCSR0C;
    }
}
...

Autor: Stefan Ernst (sternst)
Datum:

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