Forum: Mikrocontroller und Digitale Elektronik USB-to-UART-Modul mit CP2102 unzuverlässig


von Steff (Gast)


Lesenswert?

Hallo,
habe hier ein USB-to-UART-Modul mit CP2102 von Silabs.
Es funktioniert ziemlich unzuverlässig.
Mir ist aufgefallen, dass auf dem Modul gar kein Quarz verbaut ist.
Woher bezieht der CP2102 dann seinen Takt?

Kann man allgemein sagen, dass ein solches Modul mit einem CP2102 ohne 
12MHz-Quarz sehr viel unzuverlässiger arbeitet als ein Modul mit einem 
CH340G und einem 12MHz-Quarz?

von Hack S. (hackspider)


Angehängte Dateien:

Lesenswert?

Hi Steff,

"Internal Clock"

Datenblatt S.1

Grüße

von Jim M. (turboj)


Lesenswert?

Steff schrieb:
> Woher bezieht der CP2102 dann seinen Takt?

Aus dem USB selbst. Mit den SOF Tokens, die jede ms ankommen, wird eine 
PLL synchronisiert. Das ist für USB genau genug.

Die CP2102 hier waren eigentlich ganz zuverlässig, mit welchen 
Parametern arbeitest Du?

von Gustl B. (-gb-)


Lesenswert?

Mit dem Stein hatte ich 2014 schon Probleme:
Beitrag "RS232 Daten in Datei Aufnehmen bei 921600 Baud."

Mittlerweile verwende ich überall FT232R (mit PySerial) und bin 
zufrieden. Da laufen Übertragungen mehrere Monate durchgehend bei 921600 
Baud fehlerfrei.

von dummschwaetzer (Gast)


Lesenswert?

>Es funktioniert ziemlich unzuverlässig.
Was ist unzuverlässig?
Schaltplan?
Welche Kabel in welcher länge?
HUBs dazwischen?

von Steff (Gast)


Lesenswert?

Jim M. schrieb:
> Die CP2102 hier waren eigentlich ganz zuverlässig, mit welchen
> Parametern arbeitest Du?

8N1, 9600


dummschwaetzer schrieb:
> Was ist unzuverlässig?
Mal ging es, mal nicht (aktuelle geht es gar nicht)

> Schaltplan?
Rx an Tx, Tx an Rx, GND an GND, Atmega hat seine eigenen 5V.

> Welche Kabel in welcher länge?
Kabel zum Modul ca. 10cm, USB-Kabel ca. 150cm

> HUBs dazwischen?
nein

Modul wird von Win als COM3 erkannt.

von Steff (Gast)


Lesenswert?

Takt mit Quarz 8MHz.
(auch schon mit Baudratenquarz getestet, bringt keine Änderung)

von dummschwaetzer (Gast)


Lesenswert?

>eigenen 5V.
wenn ich mich recht erinnere hat der CPxxxx 3,3V Logik.
Hast du mal die TX und RX Leitungen mit dem Oszi angeschaut?

von Steff (Gast)


Lesenswert?

dummschwaetzer schrieb:
> wenn ich mich recht erinnere hat der CPxxxx 3,3V Logik.

Das wäre böse!

Hiermit funktioniert es jetzt:
https://www.xennis.org/wiki/AVR-GCC_-_UART

Puh

von Steff (Gast)


Lesenswert?

Was bedeutet hier eigentlich die Variable *s? Hat das Sternchen eine 
spezielle Bedeutung?
void uart_puts( char *s )
1
/*
2
 * uart.c
3
 *
4
 * Created: 20.11.2012
5
 * Author: Fabi Rosenthal, Florian T.
6
 */ 
7
#include "uart.h"
8
9
/* 
10
 * USART Initialization (Datasheet page 178)
11
 */
12
void uart_init(void)
13
{
14
  /* Set baud rate */
15
  UBRRnH = UBRR_VAL >> 8;
16
  UBRRnL = UBRR_VAL & 0xFF;
17
  /* Enable receiver and transmitter */
18
  UCSRnB |= (1<<TXEN0);
19
  /* Set frame format: 8data, 2stop bit */
20
  UCSRnC |= (1<<USBS0)|(3<<UCSZ00);}
21
22
/*
23
 * Sending Frames with 5 to 8 Data Bit (Datasheet page 179)
24
 */
25
void uart_putc( unsigned char data )
26
{
27
  /* Wait for empty transmit buffer */
28
  while ( !( UCSRnA & (1<<UDREn)) );
29
  /* Put data into buffer, sends the data */
30
  UDRn = data;
31
}
32
33
/*
34
 * Sending strings
35
 */
36
void uart_puts( char *s )
37
{
38
  /* while *s != '\0' so unequally "string-end characters (terminator) */
39
  while (*s)
40
  {
41
    uart_putc(*s);
42
    s++;
43
  }
44
}

Quelle:
https://www.xennis.org/wiki/AVR-GCC_-_UART

von dummschwaetzer (Gast)


Lesenswert?

>Was bedeutet hier eigentlich die Variable *s
musst du anders betrachten: char*
also Zeiger auf char

von Steff (Gast)


Lesenswert?

dummschwaetzer schrieb:
> wenn ich mich recht erinnere hat der CPxxxx 3,3V Logik.
Sieht wohl so aus:
https://www.mikrocontroller.net/attachment/478966/cp2102.png

(rechte Spalte unter Supply Voltage)

Kann ich den Atmega einfach auf 3,3V runterfahren und dann passt es?
(bei der Versorgungsspannung ist das Projekt flexibel, habe 3,3V und 5V 
zur verfügung)

von Steff (Gast)


Lesenswert?

dummschwaetzer schrieb:
>>Was bedeutet hier eigentlich die Variable *s
> musst du anders betrachten: char*
> also Zeiger auf char

Danke!

von dummschwaetzer (Gast)


Lesenswert?

wenn ich das DB vom CP2102 richtig interpretiere:
Seite8: Vout high: VDD-0.1, .. (je nach Stom)
VDD sind die 3,3V des internen Reglers

von dummschwaetzer (Gast)


Lesenswert?

>Kann ich den Atmega einfach auf 3,3V runterfahren und dann passt es
ja.
du könntest den ATMega auch vom PIN 6 des CPxxxx(VDD) speisen.
Falls nicht, aus eigener Erfahrung: Mach Serienwiderstände in die TX und 
RX Leitung. Ich hatte mal mit einem MSP430 einige Probleme(LatchUp?) 
wenn die USB-Spannung bereits da war, der MSP aber noch keine Spannung 
hatte.

von Steff (Gast)


Lesenswert?

dummschwaetzer schrieb:
> du könntest den ATMega auch vom PIN 6 des CPxxxx(VDD) speisen.
> Falls nicht, aus eigener Erfahrung: Mach Serienwiderstände in die TX und
> RX Leitung.

Beides gut zu wissen. Der Atmega wird nun mit externen 3,3V betrieben 
und die Datenübertragung funktioniert weiterhin :)



Noch etwas, weil ich mit itoa den Inhalt einer Variablen (uint16_t) 
ausgeben möchte, habe ich mich hieran orientiert:
1
  #include <stdlib.h>
2
  char Buffer[20];
3
  int i = 25;
4
5
  itoa( i, Buffer, 10 );
6
  uart_puts( Buffer );

Das funktioniert auch so weit, zwei Dinge sind aber noch unklar.

1. char Buffer[20]; - Bedeutet die 20, dass maximal 20 Ziffern möglich 
sind?

2. itoa( i, Buffer, 10 ); - Was bedeutet hier die 10?

von Einer K. (Gast)


Lesenswert?

Steff schrieb:
> 1. char Buffer[20]; - Bedeutet die 20, dass maximal 20 Ziffern möglich
> sind?
Nein.
19 + nul

Steff schrieb:
> 2. itoa( i, Buffer, 10 ); - Was bedeutet hier die 10?
http://www.cplusplus.com/reference/cstdlib/itoa/

von Steff (Gast)


Lesenswert?

Danke A. Fanboy!

Steff schrieb:
> 2. itoa( i, Buffer, 10 ); - Was bedeutet hier die 10?
10 = Variable i wird in Dezimal-String umgewandelt

------------------------------------------------------------------------ 
-
16 an der Stelle wäre: Variable i wird in Hexadezimal-String umgewandelt

2 an der Stelle wäre: Variable i wird in Binär-String umgewandelt

8 an der Stelle wäre: Variable i wird in Oktal-String umgewandelt

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.