Ok, das Programm sieht jetzt so aus:
1 | void serial_init()
|
2 | {
|
3 | // Set baud rate
|
4 | #if BAUD_RATE < 57600
|
5 | uint16_t UBRR0_value = ((F_CPU / (8L * BAUD_RATE)) - 1)/2 ;
|
6 | UCSR0A &= ~(1 << U2X0); // baud doubler off - Only needed on Uno XXX
|
7 | #else
|
8 | uint16_t UBRR0_value=(F_CPU/8L/BAUD_RATE)-1; // ((F_CPU / (4L * BAUD_RATE)) - 1)/2;
|
9 | UCSR0A |= (1 << U2X0); // baud doubler on for high baud rates, i.e. 115200
|
10 | #endif
|
11 | UBRR0H = UBRR0_value >> 8;
|
12 | UBRR0L = UBRR0_value;
|
13 |
|
14 | // enable rx, tx, and interrupt on complete reception of a byte
|
15 | UCSR0B |= (1<<RXEN0 | 1<<TXEN0);
|
16 |
|
17 |
|
18 | // Set baud rate
|
19 | #if BAUD_RATE < 57600
|
20 | UCSR1A &= ~(1 << U2X1); // baud doubler off - Only needed on Uno XXX
|
21 | #else
|
22 | UCSR1A |= (1 << U2X1); // baud doubler on for high baud rates, i.e. 115200
|
23 | #endif
|
24 | UBRR1H = UBRR0_value >> 8;
|
25 | UBRR1L = UBRR0_value;
|
26 |
|
27 | // enable tx
|
28 | UCSR1B |= (1 << TXEN1);
|
29 | // defaults to 8-bit, no parity, 1 stop bit
|
30 | }
|
31 |
|
32 |
|
33 | void serial_write_tx1(const uint8_t value)
|
34 | {
|
35 | if ((UCSR1A & (1<<UDRE1))!=0)
|
36 | {
|
37 | UDR1 = value;
|
38 | }
|
39 | }
|
USART0 soll RX und TX können, USART1 nur TX. Dass serial_write_tx1() ein
Byte verliert, wenn das Senden gerade nicht geht, ist gewollt.
Was ich mich frage: muss ich den TX1 pin nicht noch irgendwie von GPIO
auf UART umschalten?