guten abend,
ich habe ein Problem mit dem UART auf einem ATMega328 welcher auf einem
Arduino Board sizt.
Dieser möchte nicht funktionieren.
main.c:
1 | #include <stdint.h>
|
2 | #include <avr/io.h>
|
3 | #include <avr/interrupt.h>
|
4 | #include <util/delay.h>
|
5 | #include "defines.h"
|
6 | #include "uart/uart.h"
|
7 |
|
8 | int main(void)
|
9 | {
|
10 | DDRB |= (1 << PINB5);
|
11 | PORTB &= ~(1 << PINB5);
|
12 | uart_init(MYUBRR);
|
13 | sei();
|
14 | while(1)
|
15 | {
|
16 | uart_sendStringWait("Test");
|
17 | PORTB ^= (1 << PINB5);
|
18 | _delay_ms(1000);
|
19 | }
|
20 | }
|
uart.c:
1 | void uart_init(unsigned int ubrr)
|
2 | {
|
3 | /* Set baud rate */
|
4 | UBRR0H = ubrr >> 8;
|
5 | UBRR0L = ubrr & 0xFF;
|
6 |
|
7 | /* Enable receiver and transmitter */
|
8 | UCSR0B |= (1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0); // RXCIE0: RX Interrupt
|
9 |
|
10 | /* Set frame format: 8data, 1stop bit */
|
11 | UCSR0C = (1<<UCSZ00)|(1<<UCSZ01);
|
12 | }
|
13 |
|
14 | UART_ERROR uart_sendStringWait(char *s)
|
15 | {
|
16 | UART_ERROR ret;
|
17 | if(1 != (UCSR0B & (1<<RXEN0)))
|
18 | {
|
19 | ret = UART_TX_NOT_ENABLED;
|
20 | }
|
21 | else
|
22 | {
|
23 | while(*s != 0x00)
|
24 | {
|
25 | ret = uart_transmit(*s);
|
26 | if(UART_NO_ERROR == ret)
|
27 | {
|
28 | s++;
|
29 | }
|
30 | }
|
31 | ret = UART_NO_ERROR;
|
32 | }
|
33 | return ret;
|
34 | }
|
35 |
|
36 | static UART_ERROR uart_transmit( unsigned char data );
|
37 | static UART_ERROR uart_transmit( unsigned char data )
|
38 | {
|
39 | UART_ERROR ret = UART_UDR_NOT_FREE;
|
40 | if(UCSR0A & (1<<UDRE0))
|
41 | {
|
42 | UDR0 = data;
|
43 | ret = UART_NO_ERROR;
|
44 | }
|
45 |
|
46 | return ret;
|
47 | }
|
Angeschlossen habe ich dies über einem FTDI zum PC.
1 | Verbunden (Arduino <-> FTDI)
|
2 | TX <-> RX
|
3 | RX <-> TX
|
4 | GND <-> GND
|
Auch am FTDI an für sich sehe ich nicht das UART daten gesendet bzw.
empfangen worden sind.
Sende ich etwas vom PC, sehe ich eine LED am FTDI kurz aufblitzen
(sprich es ist etwas angekommen)
Die LED toggelt. Sprich der Code an für sich läuft.
Aber den Fehler im Code für den UART sehe ich nicht.