Forum: Mikrocontroller und Digitale Elektronik AVR Pointer UART Library


von Samuel K. (secures)


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)


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)


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)


Lesenswert?

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

von Samuel K. (secures)


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)


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 ;)

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
Noch kein Account? Hier anmelden.