Forum: Mikrocontroller und Digitale Elektronik usb-rs232 probleme mit entzifferung.


von avr_noob (Gast)


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

von Oliver J. (skriptkiddy)


Lesenswert?

Für sowas nutze ich immer picocom:

picocom /dev/ttyUSB0 -b baudrate

Gruß Skriptkiddy

von avr_noob (Gast)


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

von Oliver J. (skriptkiddy)


Lesenswert?

Stimmt denn die Baudrate?

von avr_noob (Gast)


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

von Oliver J. (skriptkiddy)


Lesenswert?

Was für ein Quarz?
Wie sehen die Fuses aus?

von avr_noob (Gast)


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



}

von spess53 (Gast)


Lesenswert?

Hi

>ich denke schon.

Und bist du auch sicher, das dein AVR mit 16MHz läuft?

MfG Spess

von avr_noob (Gast)


Lesenswert?

ja

von Matthias (Gast)


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.

von avr_noob (Gast)


Lesenswert?

>Vergleiche mal mit dem Oszi die Bitdauer beim Senden eines Zeichens vom
µC mit der vom PC.

Hab leider kein oszi.

von avr_noob (Gast)


Lesenswert?

>Die Baudrate auf dem PC ist wesentlich höher

Ist dies für euch klar, das einfach was mit der baudrate nicht stimmt?
weil auf win funktionierts ja und dort hab ich auch 9600 eingestellt...

von AVR_noob (Gast)


Angehängte Dateien:

Lesenswert?

so siehts auf win aus

von AVR_noob (Gast)


Lesenswert?

nur wer will schon desswegen die ganze Zeit windows brauchen...

Das muss auch auf linux gehen!!

von Oliver J. (skriptkiddy)


Lesenswert?

Versuchs mal mit:

picocom /dev/ttyUSB0 -b 1200

Gruß Skriptkiddy

von avr_noob (Gast)


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

von Simon K. (simon) Benutzerseite


Lesenswert?

Das sieht doch genau so aus. Das Setzen der Baudrate des USB-RS232 
Wandlers klappt wohl nicht. Treiber kaputt?

von AVR_noob (Gast)


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

von g457 (Gast)


Lesenswert?

..und jetzt versuchs noch mit 600 baud..

Wenn das nix bringt dann hift als nächstes ein Oszi. Oder ein 
Brutforceangriff.

HTH

von Lukas K. (carrotindustries)


Lesenswert?

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

Was für ein steinzeitliches Linux bzw. was für einen schrägen 
USB/Seriell Wandler hast du? Normalerweise erledigt das udev 
automatisch.

von AVR_noob (Gast)


Lesenswert?

>..und jetzt versuchs noch mit 600 baud..

bringt nichts...

glaube es liegt wohl an den Treibern aber da ich nur glaube, hoffe ich 
aufs forum ;)

von AVR_noob (Gast)


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

von Lukas K. (carrotindustries)


Lesenswert?

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

1 Jahr! (Ubuntu 11.04 ist akutell)
Das ist in der Opensource-Welt ne halbe Ewigkeit.

von AVR_noob (Gast)


Lesenswert?

gutgut ich update mal kurz und schau was sich dann tut...
melde mich dann wieder falls es geht oder auch nicht.

Gruss

von g457 (Gast)


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

von Simon K. (simon) Benutzerseite


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.

von AVR_noob (Gast)


Lesenswert?

>etwas mehr als eine Stunde für sowas verschwenden?

und was soll ich in dieser stunde deiner meinung nach tun?

Gruss

von g457 (Gast)


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.

von Karl H. (kbuchegg)


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.

von AVR_noob (Gast)


Lesenswert?

>HTH

Vielen Dank mit ubrr = 51 funktionierts.
Heist das jetzt, das ich eine baudrate von 19200 habe oder das mein 
quarz keine 16MHz macht?

Gruss

von Karl H. (kbuchegg)


Lesenswert?

AVR_noob schrieb:
>>HTH
>
> Vielen Dank mit ubrr = 51 funktionierts.
> Heist das jetzt, das ich eine baudrate von 19200 habe oder das mein
> quarz keine 16MHz macht?
>

Wenns auf Windows funktioniert und auf Linux nicht, dann wird wohl kaum 
der AVR der Schuldige sein.

von AVR_noob (Gast)


Lesenswert?

Vielen Dank euch allen!!

Bis zum nächsten mal.

Gruss AVR_noob

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.