Hallo zusammen,
ich verwende einen ATMega Controller in kombination mit dem CP2102 als
USB/UART Brücke um mit dem PC zu kommunizieren. Nun habe ich leider das
Problem das die Daten sich auf dem Weg zum Controller, bzw. auch anderst
herum, also vom Controller zum PC verändern und nicht mehr ausgewertet
werden können. Ich verwende den "Serial Monitor V 1.3.1" als Terminal
Programm am Pc und der Code auf dem Controller sieht wie folgt aus:
1 | /*
|
2 | * Mein_erstes_Projekt.c
|
3 | *
|
4 | * Created: 15.06.2012 16:00:24
|
5 | * Author: Eisvogel
|
6 | */
|
7 |
|
8 | #define F_CPU 10000000UL
|
9 |
|
10 | #define FOSC 10000000
|
11 | #define BAUD 9600
|
12 | #define MYUBRR FOSC/16/BAUD-1
|
13 |
|
14 | #include <avr/io.h>
|
15 |
|
16 | unsigned char USART_Receive(void);
|
17 | void USART_Transmit( unsigned char data );
|
18 | void USART_Init( unsigned int ubrr);
|
19 | void USART_Flush(void);
|
20 |
|
21 | int main(void)
|
22 | {
|
23 | //USART initialisieren
|
24 | USART_Init(MYUBRR);
|
25 | //Ungültige Daten löschen
|
26 | USART_Flush();
|
27 |
|
28 | DDRB = (1<<PB1)|(1<<PB2)|(1<<PB3)|(1<<PB4)|(1<<PB5);
|
29 |
|
30 | unsigned char Daten;
|
31 |
|
32 | while(1)
|
33 | {
|
34 | USART_Transmit(Daten = USART_Receive());
|
35 | }
|
36 | }
|
37 |
|
38 |
|
39 | void USART_Init( unsigned int ubrr)
|
40 | {
|
41 | UBRR0H = (unsigned char)(ubrr>>8); // Set baud rate in high- and low-register
|
42 | UBRR0L = (unsigned char)ubrr;
|
43 | UCSR0C = (1<<UCSZ01)|(1<<UCSZ00); // Set frame format: 8data, 1stop bit
|
44 | UCSR0B = (1<<RXEN0)|(1<<TXEN0); // Enable receiver and transmitter
|
45 | }
|
46 |
|
47 | void USART_Transmit( unsigned char data )
|
48 | {
|
49 | /* Wait for empty transmit buffer */
|
50 | while ( !( UCSR0A & (1<<UDRE0)) )
|
51 | ;
|
52 | /* Put data into buffer, sends the data */
|
53 | UDR0 = data;
|
54 | }
|
55 |
|
56 | unsigned char USART_Receive(void)
|
57 | {
|
58 | /* Wait for data to be received */
|
59 | while ( !(UCSR0A & (1<<RXC0)) );
|
60 | /* Get and return received data from buffer */
|
61 | return UDR0;
|
62 | }
|
63 |
|
64 | void USART_Flush(void) // Flush Receive-Buffer (entfernen evtl. vorhandener ungültiger Werte)
|
65 | {
|
66 | unsigned char dummy;
|
67 | while (UCSR0A & (1<<RXC0))
|
68 | dummy = UDR0;
|
69 | }
|
Als empfangene Daten kommt entweder ein Übertragungsfehler oder ein
Fragezeichen je nach dem was für ein Programm man verwendet. Vlt kennt
sich jemand mit dem Baustein aus und kann mir weiter helfen.