Hallo zusammen,
ich versuche gerade, den UART eines AT90CAN ans Laufen zu bringen. Ich
versuche mich dabei an der Library von Peter Fleury. Ich habe sie nicht
vollkommen übernommen, sondern nur die entsprechenden Funktionen. Die
ganze Initialisierung für die verschiedensten Controller habe ich
rausgenommen und initialisiere ben nur den AT90CAN.
Leider habe ich noch Probleme sie ans Laufen zu bekommen. Es liegt wohl
weniger an der Lib, als an meiner Initialisierung des UART.
In meiner main.c, will ich testweise folgendes versenden:
1 | cli();
|
2 | initUSART();
|
3 | sei();
|
4 |
|
5 | uart_puts("String aus SRAM\n");
|
6 | uart_putc('a');
|
Hier nun das Problem und unten dann der Code.
Wenn ich in der Funktion "uart_putc" das "UDR0= 'x';" einkommentiere,
wird das 'x' gesendet und vom PC empfangen, wenn ich, wie oben
angegeben, uart_putc('a'); z.B. angebe. Die Sache ist nun, dass der
String oder das 'a' von oben nicht gesendet werden.
Dadurch, dass das 'x' testweise gesendet werden kann, sieht man ja, dass
es grundsätzlich funktioniert.
Anscheinend kommen die Interrupts nicht, weswegen der oben angegebene
String oder auch nur das 'a' nicht gesendet werden, wie es scheint. Die
ISR(USART0_TX_vect) wird anscheinend nicht aufgerufen.
Somit denke ich, dass es vielleicht an der Initialisierung der
Interrupts des UART liegt. Leider fällt mir da weiter nichts auf.
Ich würde mich freuen, wenn jemand drüber schauen und vielleicht sogar
den Fehler finden würde.
Vielen dank schon einmal.
Uwe
In der Datei uart.c habe ich folgenden Code (Auszug):
1 | void initUSART(void)
|
2 | {
|
3 | UART_Tx_Head = 0;
|
4 | UART_Tx_Tail = 0;
|
5 | UART_Rx_Head = 0;
|
6 | UART_Rx_Tail = 0;
|
7 |
|
8 |
|
9 | UART0_MODE |= (1<<UCSZ01)|(1<<UCSZ00);
|
10 |
|
11 | // 1 Stoppbit
|
12 | UBRR0 = UBRR_VAL; // UBRR_VAL -> ((F_CPU+UART_BAUD*8)/(UART_BAUD*16)-1)
|
13 | UART0_CONTROL |= (1<<RXCIE0)|(1<<TXEN0)|(1<<RXEN0);
|
14 | // UART TX,RX Pin einschalten
|
15 | // UCSRnB – USART Control and Status Register n B
|
16 | // RXCIEn: RX Complete Interrupt Enable
|
17 | // TXCIEn: TX Complete Interrupt Enable
|
18 | // RXENn: Receiver Enable n
|
19 | // TXENn: Transmitter Enable n
|
20 |
|
21 |
|
22 | }
|
23 |
|
24 | /***********************************/
|
25 |
|
26 | void uart_putc(unsigned char c)
|
27 | {
|
28 | unsigned char tmphead;
|
29 |
|
30 | tmphead = (UART_Tx_Head + 1) & UART_TX_BUFFER_MASK;
|
31 |
|
32 | while (tmphead == UART_Tx_Tail)
|
33 | {
|
34 | ;/* wait for free space in buffer */
|
35 | }/* while (tmphead == UART_Tx_Tail) */
|
36 |
|
37 | UART_Tx_Buf[tmphead] = c;
|
38 | UART_Tx_Head = tmphead;
|
39 | //UDR0= 'x'; // Zum Test eingefügt. Dieses 'x' wird gesendet und vom PC empfangen, wenn man es wieder
|
40 | // einkommentiert.
|
41 | UART0_CONTROL |= 1<<UDRIE0; // Bit 5 – UDRIEn: USARTn Data Register Empty Interrupt Enable
|
42 | }
|
43 |
|
44 | /***********************************/
|
45 |
|
46 | void uart_puts(unsigned char *s)
|
47 | {
|
48 | while(*s)
|
49 | {
|
50 | uart_putc(*s++);
|
51 | }/* while(*s) */
|
52 | }
|
53 |
|
54 |
|
55 | /***********************************/
|
56 |
|
57 | ISR(USART0_TX_vect)
|
58 | {
|
59 | unsigned char tmptail;
|
60 |
|
61 | if (UART_Tx_Head != UART_Tx_Tail)
|
62 | {
|
63 | /* calculate and store new buffer index */
|
64 | tmptail= (UART_Tx_Tail + 1) & UART_TX_BUFFER_MASK;
|
65 | UART_Tx_Tail = tmptail;
|
66 | /* get one byte from buffer and write it to UART */
|
67 | UART0_DATA = UART_Tx_Buf[tmptail]; /* start transmission */
|
68 | }
|
69 | else
|
70 | {
|
71 | /* tx buffer empty, disable UDRE interrupt */
|
72 | UART0_CONTROL &= ~(1<<UART0_UDRIE);
|
73 | }
|
74 | }/* ISR(USART0_TX_vect) */
|