Kommunikation CP2102

OP #2720335
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.
OP #2720392
Ich denke nicht das ich irgend eine Fuse ausgeschalten habe, kenne mich 
mit den dingern nicht so aus und spiele desshalb auch nicht rum mit den 
Dingern. Das einzige was ich eingestellt habe ist der Quarz wie in dem 
Bild zu sehen ist. Laut Datenblatt soll der Controller ohne Probleme mit 
10MHz bei 3,3V funktionieren.
Angehängte Dateien:
Gast #2720399
Clkdiv8 den Haken raus machen!
Wenn Du ein Oszi hast kannst du auch mal bei CLKOUT ein Haken rein 
machen und am CLKOUT-Pin den Takt des Controllers messen!
OP #2720422
Genial, danke das war es.
Jetzt funktioniert die Übertragung ohne Probleme :-)
Wenn mir jetzt noch einer verraten könnte was es mit dem Clkdiv8 auf 
sich hat dann wär ich sogar noch ein bisschen lauer :-) Vermutlich 
irgend was mit Takt durch 8 teilen oder?
OP #2720440
Okay danke.
Noch eine kurze Frage ganz am Ende, kann ich eigentlich auch den 
intigrierten Quarz verwenden? Als ich meine Schaltung geplant habe hat 
mir jeder davon abgeraten weil der so ungenau sein soll und des Probleme 
mit dem UART gibt. Stimmt das?
Gast #2720444
Es gibt nur einen internen RC Oszillator!
Man kann ihn abgleichen sodass der UART funktioniert
Wenn sich dann aber die Temperatur oder die Betriebsspannung verändert 
ist dies aber evtl hinfällig und es funktioniert nicht mehr ;-)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.