TX UART Problem Peter Fleury

Gast #1535194
Lesenswert?

Hallo,

ich habe ein Problem mit der UART Lib von Peter Fleury:
1
void uart_putc(unsigned char data)
2
{
3
    unsigned char tmphead;
4

5
    
6
    tmphead  = (UART_TxHead + 1) & UART_TX_BUFFER_MASK;
7
    
8
    while ( tmphead == UART_TxTail ){
9
        ;/* wait for free space in buffer */
10
    }
11
    
12
    UART_TxBuf[tmphead] = data;
13
    UART_TxHead = tmphead;
14

15
    /* enable UDRE interrupt */
16
    UART0_CONTROL    |= _BV(UART0_UDRIE);
17

18
}/* uart_putc */

Wenn ich mittels uart_puts("dsadkljK") etwas verschicken will bleibt der 
Controller auf der Zeile
1
while ( tmphead == UART_TxTail ){
stehen. In beiden Variablen steht dann eine 0x12...

Wieso ist das so? Wieso while() ohne darin was zu tun?

Vielleicht kann mir jemand weiterhelfen, in jedem Fall vielen Dank!
Thomas
Gast #1535221
Lesenswert?

Das Programm wartet - wie dokumentiert - an dieser Stelle, weil im 
Sendepuffer momentan kein weiterer Platz ist. Weiterer Platz wird erst 
geschaffen, wenn Zeichen von der UDRE Interruptroutine gesendet werden.

In deinem unbekannten Programm werden anscheinend von der UDRE 
Interruptroutine keine Zeichen gesendet. Das kann an einem Fehler im 
selbst geschriebenen Programmteil liegen, den wir nicht sehen. 
Möglicherweise die Fleury Library ist von dir nicht richtig 
initialisiert und/oder Interrupts sind noch nicht global aktiviert.
Gast #1535307
Lesenswert?

mach doch so ...
1
uINT8 flags;
2
#define SHOULD_SEND    0
3
#define SHOULD_DO_XYZ  1
4
...
5

6

7
ISR(..._vect) {
8
    flags |= 1UL << SHOULD_SEND;
9
}
10

11
int main(void) {
12
    while(1) {
13
        if(flags & (1UL << SHOULD_SEND)) {
14
            flags &= ~(1UL << SHOULD_SEND);
15
            call_send_routine();
16
        }
17
        // ...
18
    }
19
}

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