Forum: Mikrocontroller und Digitale Elektronik UART Interrupt Fehler


von Leopold N. (leo_n)


Angehängte Dateien:

Lesenswert?

Hallo,

ich möchte per UART Zeichen an meinen PC senden.
Da es auch mehr Zeichen werden können, möchte ich das über einen 
Interrupt und einen Buffer realisieren.

Dazu habe ich mir dementsprechend Funktionen geschrieben.
Allerdings kommt es immer wieder zu Fehlern in der Übertragung, die ich 
trotz inzwischen wochenlanger Fehlersuche nicht gefunden habe.

Anbei der Code,
ich hoffe, es kann jemand helfen.

Grüße

von Falk B. (falk)


Lesenswert?

@ Leopold N. (leo_n)

>Da es auch mehr Zeichen werden können, möchte ich das über einen
>Interrupt und einen Buffer realisieren.

Sinnvoll.

>Dazu habe ich mir dementsprechend Funktionen geschrieben.
>Allerdings kommt es immer wieder zu Fehlern in der Übertragung, die ich
>trotz inzwischen wochenlanger Fehlersuche nicht gefunden habe.

>Anbei der Code,
>ich hoffe, es kann jemand helfen.

Das Fragment allein reicht nicht. Aber man sieht, daß du da eher Unsinn 
machst. Erstens sendet man mit dem UDRE-Interrupt und 2. ist dein 
selbstgebastelter FIFO reichlich Quark. Man schaufelt nicht nach jedem 
Byte den gesammten FIFO-Inhalt um! Man verschiebt die Pointer! Das ist 
ja der "Trick" an Pointern! Siehe FIFO.

von Falk B. (falk)


Lesenswert?

Such mal nach Peter Fleury's UART-Lib, da steckt ein echter FIFO drin.

von Karl M. (Gast)


Lesenswert?

Leopold N. schrieb:
> Hallo,
>
> ich möchte per UART Zeichen an meinen PC senden.
> Da es auch mehr Zeichen werden können, möchte ich das über einen
> Interrupt und einen Buffer realisieren.
> Facebook
> Dazu habe ich mir dementsprechend Funktionen geschrieben.
> Allerdings kommt es immer wieder zu Fehlern in der Übertragung, die ich
> trotz inzwischen wochenlanger Fehlersuche nicht gefunden habe.
>
> Anbei der Code,
> ich hoffe, es kann jemand helfen.
>
> Grüße

Halllo,

da fehlt ja noch über 50% um es erfolgreich übersetzen im im Assembler 
Output analysieren zu können.

Was man aber als Fehler schon sieht, es gibt keinen TX Ringpuffer!
Dieser ist aber zwingend notwendig.

von Leopold N. (leo_n)


Lesenswert?

Karl M. schrieb:
> Was man aber als Fehler schon sieht, es gibt keinen TX Ringpuffer!
> Dieser ist aber zwingend notwendig.

Nun gut,

das habe ich jetzt nicht extra alles rauskopiert gehabt,
das habe ich jetzt im Geiste vorausgesetzt.
Aber hier noch mal für dich:



#define USART_BAUDRATE 57600
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
#define UART_TX_BUFFER_LENGTH 100

volatile uint8_t uart_tx_buff[UART_TX_BUFFER_LENGTH];
volatile uint8_t uart_tx_pointer = 0;

von Karl M. (Gast)


Lesenswert?

Leopold N. schrieb:
> Aber hier noch mal für dich:
>
> #define USART_BAUDRATE 57600
> #define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
> #define UART_TX_BUFFER_LENGTH 100
>
> volatile uint8_t uart_tx_buff[UART_TX_BUFFER_LENGTH];
> volatile uint8_t uart_tx_pointer = 0;

Danke,

der erste mal!

Was steht denn in der UART.h?

Peter Dannegger (peda) hat auch einen sehr effizienten Code mit RX-/ 
TX-Fifo geschrieben.
Denn könnte man sich mal ansehen.

Ich verwende ihn schon ca. 10 Jahre.

von Leopold N. (leo_n)


Lesenswert?

Karl M. schrieb:
> Was steht denn in der UART.h?

Wo siehst du eine UART.h Datei?

von S. Landolt (Gast)


Lesenswert?

> Fehlern in der Übertragung
Welcher Art?

Was passiert, wenn zwischen
1
uart_tx_buff[uart_tx_pointer] = data;
2
uart_tx_pointer++;
der TXC-Interrupt auftritt?

von Leopold N. (leo_n)


Lesenswert?

S. Landolt schrieb:
> Was passiert, wenn zwischenuart_tx_buff[uart_tx_pointer] = data;
> uart_tx_pointer++;
> der TXC-Interrupt auftritt?

Stimmt,
das könnte ein Fehler sein.

Fehler der Art,
dass einzelne Zeichen verschluckt werden.

Grüße

von S. Landolt (Gast)


Lesenswert?

Okay, das passt dann zusammen; wenn auch, vermutlich, eher selten.

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.