Forum: Mikrocontroller und Digitale Elektronik AVR Pointer UART Library


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Samuel K. (secures)


Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

ich versuche gerade meine eigene AVR USART Library zu schreiben.

Aber irgendwie bin ich an einem Punkt angekommen an dem ich nicht 
verstehe, was den Fehler auslöst.

Folgende Ausgangslage:
1
#define UART_UNIT  { &UDR0, &UCSR0A, &UCSR0B, &UCSR0C, &UBRR0H, &UBRR0L }
2
3
typedef struct {
4
  uint8_t* UDR;       //USART I/O data register
5
  uint8_t* UCSRA;     //USART control and status register A
6
  uint8_t* UCSRB;     //USART control and status register B
7
  uint8_t* UCSRC;      //USART control and status register C
8
  uint8_t* UBRRH;      //USART baud rate registers L
9
  uint8_t* UBRRL;      //USART baud rate registers H
10
} usart_TypeDef;
11
12
usart_TypeDef uart0 = UART_UNIT;

Das Zeug ist irgendwo eingebunden und funktioniert im Simulator und auf 
der Hardware für die Konfiguration der UART und um Zeichen zu senden. 
Allerdings funktioniert der Empfang von nicht.

Wenn ich folgender Schnipsel in der main() aufrufe funktioniert alles 
ohne Probleme.
1
while ( !( UCSR0A & ( 1 << RXC0 ) ) );

Wenn ich allerdings das Register über den struct versuche auszulesen 
funktioniert der Empfang nicht mehr.
1
while ( !( *( uart0.UCSRA ) & ( 1 << RXC0 ) ) );

Ich verstehe irgendwie nicht was genau falsch ist. Laut Simulator sind 
im struct die richtigen Adressen hinterlegt. Und das ganze funktioniert 
auch wenn ich beispielsweise die Sendefunktion verwende.
1
void usart_loadTxBuf ( usart_TypeDef* usart, uint8_t data )
2
{
3
   while( ! ( *usart->UCSRA & ( 1 << UDRE ) ) );
4
   *(usart->UDR) = data;
5
}

Gruss

von Tom (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Die Register-defines sehen in den Systemheadern effektiv so aus:
1
#define SOME_REGISTER (*(volatile uint8_t *)(0x1234))
Das volatile hast du in deinem struct unterschlagen, vielleicht wird 
deshalb etwas wegoptimiert?

von Samuel K. (secures)


Bewertung
0 lesenswert
nicht lesenswert
Tom schrieb:
> Das volatile hast du in deinem struct unterschlagen, vielleicht wird
> deshalb etwas wegoptimiert?

Das wars. O.o
Ich danke dir - das mit dem volatile werde ich wohl nie lernen :S

von Tom (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Kam bei
1
usart_TypeDef uart0 = UART_UNIT;
kein
1
warning: initialization discards ‘volatile’ qualifier from pointer target type
?

von Samuel K. (secures)


Bewertung
0 lesenswert
nicht lesenswert
Doch.. Hab wohl den Wald vor lauter Bäumen nicht mehr gesehen :S

Dadurch, dass die Verwendung der Atmel defines funktioniert hat, habe 
ich den Fehler im Pointer/Struct Zugriff gesucht.

: Bearbeitet durch User
von Tom (Gast)


Bewertung
1 lesenswert
nicht lesenswert
So wie man irgendwann im Alter merkt, dass die Eltern mit ihrem Genörgel 
oft recht hatten, so begreift man irgendwann auch, dass die Warnungen 
des Compilers hilfreich sind und alle abgearbeitet (d.h. verstanden 
und beseitigt (oder qualifiziert ignoriert)) werden sollten, statt sie 
zu ignorieren oder sie durch Ausprobieren wegzucasten ;)

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]
  • [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.