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?
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?
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.
>Es funktioniert ziemlich unzuverlässig.
Was ist unzuverlässig?
Schaltplan?
Welche Kabel in welcher länge?
HUBs dazwischen?
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.
Takt mit Quarz 8MHz. (auch schon mit Baudratenquarz getestet, bringt keine Änderung)
>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?
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
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
>Was bedeutet hier eigentlich die Variable *s
musst du anders betrachten: char*
also Zeiger auf char
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)
dummschwaetzer schrieb: >>Was bedeutet hier eigentlich die Variable *s > musst du anders betrachten: char* > also Zeiger auf char Danke!
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
>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.
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?
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/
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.