USB-to-UART-Modul mit CP2102 unzuverlässig

Gast #6466766
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?
Gast #6467178
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.
Gast #6467226
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
Gast #6467237
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.
Gast #6467296
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?
Gast #6467321
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren