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