Ich beschäftige mich grad damit vom USART an ne Konsole aufm PC etwas zu senden. Funzt auch soweit, nur erhalte ich jedes Zeichen das ich schicke doppelt in der Ausgabezeile. Änder ich das zeichen, wird das zuvor gesendete Zeichen zuerst geschickt. Muss ich irgendwie den Datenpuffer nach dem senden löschen? Könnte jemand mal bitte über meinen Programmcode drüber schauen ? das wäre sehr nett. Gruß Sven
1 | //***************************************
|
2 | // Test der USART Schnittstelle, ATMEGA88
|
3 | //***************************************
|
4 | /*
|
5 | UART-Init:
|
6 | Berechnung des Wertes für das Baudratenregister
|
7 | aus Taktrate und gewünschter Baudrate
|
8 | */
|
9 | // defines
|
10 | //*************************
|
11 | #define FCPU 18432000
|
12 | #define FOSC 18432000// Clock Speed
|
13 | #define F_CPU 18432000UL // Systemtakt in Hz - Definition als unsigned long beachten
|
14 | // Ohne ergeben sich unten Fehler in der Berechnung
|
15 | #define BAUD 9600UL // Baudrate
|
16 | #define MYUBRR FOSC/16/BAUD-1
|
17 | // Berechnungen
|
18 | #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
|
19 | #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
|
20 | #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
|
21 | |
22 | #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
|
23 | #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
|
24 | #endif
|
25 | |
26 | // includes
|
27 | //*************************
|
28 | #include <inttypes.h> |
29 | #include <avr/io.h> |
30 | |
31 | // function prototypes
|
32 | //*************************
|
33 | void USART_Init(unsigned int ubrr); |
34 | void USART_Transmit(unsigned char data); |
35 | |
36 | // main
|
37 | //*************************
|
38 | |
39 | int main(void) |
40 | {
|
41 | USART_Init(MYUBRR); |
42 | |
43 | |
44 | USART_Transmit(0x23); |
45 | |
46 | }
|
47 | |
48 | // USART initialization
|
49 | //*************************
|
50 | void USART_Init(unsigned int ubrr) |
51 | {
|
52 | // Set baude rate
|
53 | UBRR0H = (unsigned char)(ubrr>>8); |
54 | UBRR0L = (unsigned char)ubrr; |
55 | |
56 | // enable transmittler TXD0
|
57 | UCSR0B |= (1<<TXEN0); |
58 | |
59 | // set frame format: 8data, 2stop bits
|
60 | UCSR0C |= (1<<USBS0)|(1<<UCSZ00)|(1<<UCSZ01); |
61 | }
|
62 | |
63 | |
64 | // USART Transmit
|
65 | //*************************
|
66 | void USART_Transmit(unsigned char data) |
67 | {
|
68 | |
69 | // Wait for empty transmit buffer
|
70 | while(!(UCSR0A & (1<<UDRE0))) |
71 | {
|
72 | |
73 | }
|
74 | |
75 | // Put data ito buffer, sends the data
|
76 | UDR0 = data; |
77 | }
|