UART Interrupt Fehler

OP #5606693
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
Angehängte Dateien:
#5606698
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.
Gast #5606701
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.
OP #5606702
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;
Gast #5606712
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.

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