Forum: Mikrocontroller und Digitale Elektronik Kommunikation CP2102


von Samuel M. (samuel_m)


Lesenswert?

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.

von SNR (Gast)


Lesenswert?

Betriebsspannung?
Externer oder interner Quarz?

von Samuel M. (samuel_m)


Lesenswert?

Betriebsspannung sind 3,3V vom CP2102 und Quarz verwende ich einen 
externen 10MHz.

von SNR (Gast)


Lesenswert?

Schau mal ins Datenblatt deines Atmega ob er bei 3,3V auch 10MHz 
verträgt.
Hast Du auch sicher die Fuses auf den externen Quarz umgestellt?

von SNR (Gast)


Lesenswert?

Clkdiv8 Fuße ausgeschalten?

von Samuel M. (samuel_m)


Angehängte Dateien:

Lesenswert?

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.

von SNR (Gast)


Lesenswert?

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!

von Samuel M. (samuel_m)


Lesenswert?

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?

von SNR (Gast)


Lesenswert?

Ich könnte jetzt sagen RTFM,aber ich nehme die Spannung raus...es ist 
ein Prescaler!

von Samuel M. (samuel_m)


Lesenswert?

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?

von SNR (Gast)


Lesenswert?

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 ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.