Forum: Compiler & IDEs UART Senden Mega32


von Mega32 (Gast)


Lesenswert?

Hallo,

ich möchte mit einem Mega32 etwas über den UART senden. Das Empfangen 
klappt schon. Ich habe in Auszügen die Lib von Peter Fleury verwendet. 
Sobald ich etwas senden will stürzt der Controller ab. Hier die 
relevanten Stellen:
1
ISR(USART_TXC_vect) {
2
  unsigned char tmptail;
3
4
    if ( UART_TxHead != UART_TxTail) {
5
        /* calculate and store new buffer index */
6
        tmptail = (UART_TxTail + 1) & UART_TX_BUFFER_MASK;
7
        UART_TxTail = tmptail;
8
        /* get one byte from buffer and write it to UART */
9
        UDR = UART_TxBuf[tmptail];  /* start transmission */
10
    }else{
11
        /* tx buffer empty, disable UDRE interrupt */
12
      //UCSRB &= ~_BV(UDRIE);
13
      UCSRB &= ~(1<<UDRIE);
14
    }
15
16
void uart_init(void) {
17
18
    UART_RxHead = 0;
19
    UART_RxTail = 0;
20
    UART_TxHead = 0;
21
    UART_TxTail = 0;
22
    UCSRB |= (1<<RXEN) | (1<<RXCIE) | (1<<TXEN);
23
24
    UCSRC |= (1<<URSEL)|(3<<UCSZ0);
25
26
    UBRRH = UBRR_VAL >> 8;
27
    UBRRL = UBRR_VAL & 0xFF;
28
29
}
30
31
32
void uart_putc(unsigned char data)
33
{
34
    unsigned char tmphead;
35
36
37
    tmphead  = (UART_TxHead + 1) & UART_TX_BUFFER_MASK;
38
39
    while ( tmphead == UART_TxTail ){
40
        ;/* wait for free space in buffer */
41
    }
42
43
    UART_TxBuf[tmphead] = data;
44
    UART_TxHead = tmphead;
45
46
    /* enable UDRE interrupt */
47
    UCSRB    |= (1<<UDRIE);
48
49
}
50
51
void uart_puts(const char *s )
52
{
53
    while (*s)
54
      uart_putc(*s++);
55
56
}
57
58
59
void uart_puts_p(const char *progmem_s )
60
{
61
    register char c;
62
63
    while ( (c = pgm_read_byte(progmem_s++)) )
64
      uart_putc(c);
65
66
}

Ich vermute es stimmt irgendeine Einstellung nicht. Die Lib ist ja nicht 
von mir und ist denke ich auch ausgiebig getestet wurden. 
Baudratenfehler etc. kann ich auch ausschließen, da ich ja via UART 
empfangen kann. Vlt. sieht einer von euch ja auf anhieb, ob ich eine 
Einstellung vermehrt habe.
Vielen Dank

von Mega32 (Gast)


Lesenswert?

Nachtrag:

ich habe gerade versucht herauszufinden, wo sich der Controller 
aufhängt:
1
    /* enable UDRE interrupt */
2
    UCSRB    |= (1<<UDRIE);

von Grrrr (Gast)


Lesenswert?

Und was heisst bitte "aufhängen" in dem Zshg.?

von Mega32 (Gast)


Lesenswert?

Naja, das nichts mehr geht. Ich habe ein Display dran, und nach diesem 
Befehl wird nichts mehr ausgegeben bzw. das Display flackert nur noch.

von Floh (Gast)


Lesenswert?

Mega32 schrieb:
> ich habe gerade versucht herauszufinden, wo sich der Controller
> aufhängt:
>     /* enable UDRE interrupt */
>     UCSRB    |= (1<<UDRIE);

hast du eine ISR dafür?
:-)

von Mega32 (Gast)


Lesenswert?

Ja, aber ich vermute, ich habe die falsch benannt:
1
ISR(USART_TXC_vect) {

von Mega32 (Gast)


Lesenswert?

Ok ich glaube es muss USART_UDRE_vect heißen...

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.