usb-rs232 probleme mit entzifferung.

Gast #2314003
Lesenswert?

Hallo Zusammen

Ich habe einen AVR Atmega32 und möchte die serielle Schnittstelle 
benutzen. Dafür habe ich ein USB-Serial Adapter gekauft (pl2303).
Auf Windows funktioniert dies mit dem Terminalprogramm von Br@y 
tadellos.
Mit Linux habe ich noch ein bisschen Schwierigkeiten. Wie unten 
aufgelistet habe ich versucht die Treiber zu laden und der Adapter wird 
auch erkannt. Nur wird mir nicht der richtige Text angezeigt sondern 
irgend so ein Zeichengewirr...

root@netbook:/home/usr# lsmod
Module                  Size  Used by
pl2303                 15910  0
usbserial              33694  1 pl2303


[ 1549.204162] usb 4-1: new full speed USB device using uhci_hcd and 
address 13
[ 1549.354791] usb 4-1: configuration #1 chosen from 1 choice
[ 1549.357743] usbserial_generic 4-1:1.0: generic converter detected
[ 1549.358126] usb 4-1: generic converter now attached to ttyUSB0

root@netbook:/home/usr# cat /dev/ttyUSB0
f~��`���x��fx��fx`f���f~��`���x��fx��fx`f���f~��`���x��fx��fx`f���
f~��`���x��fx��fx`f���f~��`���x��fx��fx`f���f~��`���x��fx��fx`f���
f~��`���x��fx��fx`f���f~��`���x��fx��fx`f���

sollte eigentlich heissen "Switch 2 pressed" ein par mal hintereinander.

Hat irgend jemand eine Ahnung was hier das Problem ist?

Vielen Dank für die Hilfe!!

Grüsse AVR_noob
Gast #2314016
Lesenswert?

1
usr@netbook:~$ picocom /dev/ttyUSB0 -b 9600
2
picocom v1.4
3

4
port is        : /dev/ttyUSB0
5
flowcontrol    : none
6
baudrate is    : 9600
7
parity is      : none
8
databits are   : 8
9
escape is      : C-a
10
noinit is      : no
11
noreset is     : no
12
nolock is      : no
13
send_cmd is    : ascii_xfr -s -v -l10
14
receive_cmd is : rz -vv
15

16
Terminal ready
17
f~��`���x��fx��fx`f���f~��`���x��fx��fx`f���f~��`���x��fx
18
�fx`f���f~��`���x��fx��fx`f���f~��`���x��fx��fx`f���f~��`�
19
�x��fx��fx`f���f~��`���x��fx��fx`f���f~��`���x��fx��fx`f��
20
f~��`���x��fx��fx`f���f~��`���x��fx��fx`f���f~��`���x��fx
21
�fx`f���

Immer noch dasselbe, aber danke trotzdem!
Habe echt keine Ahnung was das soll :)
Gast #2314021
Lesenswert?

ich denke schon.
ist wie folgt initialisiert


//Initialize the USART:

  UCSRB |= (1<<RXEN); //Receiver enable

  UCSRB |= (1<<TXEN); //Transmitter enable

  UCSRC |= ((1<<UCSZ0) | (1<<UCSZ1)); //8 Data Bits, 1 Stop Bit, 
Asynchronous

  UBRRH = 0; //Write UBRRH Register

  UBRRL = 103; //9600 Baud //Write UBRRL Register
Gast #2314026
Lesenswert?

Das ganze sollte eigentlich schon funktionieren, da es das auf windoof 
auch tut.
ausprobieren tue ich dies so:


@main
if(!(PINA & (1<<0))) //if switch 2 pressed

    {

      UART_send("Switch 2 pressed");



    }


void UART_send(char *text)

{



  while(*text) //End of string = 0

  {

    while (!(UCSRA & (1<<UDRE))) // Wait until Buffer is empty - ready 
to send.

    {

    }



    UDR = *text;



    text++;

  }



  //Next line in the terminal:



  while (!(UCSRA & (1<<UDRE))) // Wait until Buffer is empty - ready to 
send.

  {

  }

  UDR = 0x0D; //Carriage Return



  while (!(UCSRA & (1<<UDRE))) // Wait until Buffer is empty - ready to 
send.

  {

  }

  UDR = 0x0A; //Line Feed



}
Gast #2314038
Lesenswert?

> Habe echt keine Ahnung was das soll :)

Die Baudrate auf dem PC ist wesentlich höher als auf dem ATmega.
Vergleiche mal mit dem Oszi die Bitdauer beim Senden eines Zeichens vom 
µC mit der vom PC.
Gast #2314075
Lesenswert?

usr@netbook:~$ picocom /dev/ttyUSB0 -b 1200
picocom v1.4

port is        : /dev/ttyUSB0
flowcontrol    : none
baudrate is    : 1200
parity is      : none
databits are   : 8
escape is      : C-a
noinit is      : no
noreset is     : no
nolock is      : no
send_cmd is    : ascii_xfr -s -v -l10
receive_cmd is : rz -vv

Terminal ready
f~��`���x��fx��fx`f���f~��`���x��fx��fx`f���f~��`���x��fx
Gast #2314087
Lesenswert?

>Das sieht doch genau so aus.

Ja das sehe ich auch :)

die treiber habe ich so geladen:
modprobe usbserial vendor=0x... product=0x....
modprobe pl2303

den pl2303 lädt es auch aber irgendwie verwendet es ihn nicht.
kann ich das bei usbserial irgend wie einstellen?

Gruss
Gast #2314098
Lesenswert?

>Was für ein steinzeitliches Linux bzw. was für einen schrägen USB/Seriell Wandler 
hast du?

ubuntu 10.04 (weis ich sollet mal updaten aber so lange ist noch nicht 
her)

pl 2303 von prolific

Gruss
Gast #2314112
Lesenswert?

Der..

> pl 2303 von prolific

..läuft hierzuworkstation (Debian) seit Jahren einwandfrei, daran 
(alleine) liegst also höchstwahrschenlich nicht. Irgendwo(tm) vermurskt 
Du was.

Geh doch mal (auf AVR-Seite) alle Baudraten durch, z.B. so in der Art
[pseudocode]
   UBRR = 1;
   while (1)
   {
      uart_send("ubbr: " +UBRR++);
      delayms(1000);
   }
[/pseudocode]

Übertragungsfehler wie oben liegen fast immer an einer falschen 
Baudrate, seis beim AVR oder beim PC.

HTH
Persönliche Seite #2314155
Lesenswert?

g457 schrieb:
> Geh doch mal (auf AVR-Seite) alle Baudraten durch, z.B. so in der Art
Wenn ich mich recht erinnere ist das UBRR ein 12 Bit Register. 4096 also 
etwas mehr als eine Stunde für sowas verschwenden?

> Übertragungsfehler wie oben liegen fast immer an einer falschen
> Baudrate, seis beim AVR oder beim PC.
Aber nicht, wenn der String immer gleich aussieht, egal welche Baudrate 
am PC eingestellt wird.
Gast #2314188
Lesenswert?

>> Übertragungsfehler wie oben liegen fast immer an einer falschen
>> Baudrate, seis beim AVR oder beim PC.
> Aber nicht, wenn der String immer gleich aussieht, egal welche Baudrate
> am PC eingestellt wird.

Dochebenschon, weil das Schluss nahe legt dass der TO die Baudrate am PC 
nicht richtig(tm) einstellt. Deswegen der Hinweis auf das durchchecken 
der Baudraten am ∗AVR∗ - weil dann trifft man irgendwann(tm) schon die 
richtige(tm) Einstellung sodass am PC (trotz möglicherweise vermurkster 
Konfiguration) was lesbares ankommt. Dann kann man weiter sehen.

Und wenn einem eine läppische Stunde vollautomatische Fehlersuche zu 
lang sind dann drehe derjenige halt die Wartezeiten etwas runter.

Nix für ungut.
#2314202
Lesenswert?

Oder einen schnellen Vortest machen.
Grob geschätzt stehen die Chancen nicht schlecht, dass er tatsächlich 
auf einer der üblichen Baudraten steht und nicht itrgendwo dazwischen

Also: Ein Array mit den Konstanten für die üblichen Baudraten.
300, 600, 1200, 2400, 4800, 9600, 19200
(oder die Konstanten vom Compiler ausrechnen lassen, ist sowieso 
eleganter als da mit seltsamen Konstanten zu hantieren) und dann der 
Reihe nach alle durchprobieren. Wenn man dann vorher im Text auch noch 
die eingestellten Werte ausgibt, dann steht sogar im Klartext am 
Terminal, welche Baudrate funktioniert hat.

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