AVR Pointer UART Library

OP #5351515
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
Gast #5351574
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?
Gast #5352035
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren