Guten Tag, ich benötigte ein wenig Hilfe bei dem USART des Atmega8.
Ich habe es hier schon einmal versucht, aber da konnte mir leider
niemand helfen.
FuseBits habe ich auf: LOW = 0xEF
HIGH = 0xD9
(Sollte eigentlich stimmen)
Frequenz ist 16MHz.
Das ganze läuft auf dem Pollin-Entwicklungsboard.
Nun zum Code
1 | #define F_CPU 16000000
|
2 | #define BAUD 9600
|
3 | #define UBRR_BAUD ((F_CPU)/(BAUD*16UL))-1
|
4 |
|
5 |
|
6 | #include <avr/io.h>
|
7 | #include <util/delay.h>
|
8 | #include <stdlib.h>
|
9 | #include <avr/interrupt.h>
|
10 |
|
11 |
|
12 | void init_uart(void)
|
13 | {
|
14 | UBRRH = (uint8_t) (UBRR_BAUD>>8);
|
15 | UBRRL = (uint8_t) (UBRR_BAUD);
|
16 | UCSRB = (1<<RXEN)|(1<<TXEN);
|
17 | UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
|
18 | }
|
19 |
|
20 |
|
21 |
|
22 |
|
23 | int uart_putc(unsigned char c)
|
24 | {
|
25 | while (!(UCSRA & (1<<UDRE))) /* warten bis Senden moeglich */
|
26 | {
|
27 | }
|
28 |
|
29 | UDR = c; /* sende Zeichen */
|
30 |
|
31 | return 0;
|
32 | }
|
33 |
|
34 |
|
35 |
|
36 |
|
37 |
|
38 | uint8_t uart_getc(void)
|
39 | {
|
40 | while (!(UCSRA & (1<<RXC)))
|
41 | {
|
42 | }
|
43 | return UDR;
|
44 | }
|
45 |
|
46 |
|
47 |
|
48 |
|
49 | void main( void )
|
50 | {
|
51 |
|
52 |
|
53 | init_uart();
|
54 | uart_putc('t');
|
55 | uint8_t c = uart_getc();
|
56 | uart_putc(c);
|
57 |
|
58 | }
|
Das Empfangen ist kein Problem.
Das 't' empfange ich direkt.
Jedoch empfängt der Mikrocontroller nichts, denn egal was ich eingebe
ich bekomme kein Zeichen Zurück.
wenn ich jedoch folgende Funktion:
1 | uint8_t uart_getc(void)
|
2 | {
|
3 | while (!(UCSRA & (1<<RXC)))
|
4 | {
|
5 | }
|
6 | return UDR;
|
7 | }
|
so abändere:
1 | uint8_t uart_getc(void)
|
2 | {
|
3 | while (!(UCSRA & (1<<RXC)))
|
4 | {
|
5 | UDR=0;
|
6 | }
|
7 | return UDR;
|
8 | }
|
wird zumindest in ca. 45% der Fälle etwas korrektes zurückgegeben.
Vielen Dank im Vorraus!