PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : USART/RS232 gibt Zeichensalat...



mattis
24.07.2008, 16:57
Hallo,
ich habe jetzt den ganzen Tag ausprobiert USART mit dem RN-Control hinzubekommen, aber alles was am PC ankommt sind irgendwelche Fragezeichen und so ein Zeugs, bzw. irgendwelche Zeichen aus anderen Sprachen....

hier ein beispiel:


:~$ hexdump /dev/ttyUSB1 -v -C
00000000 79 3d 3d 3d 35 35 35 35 5b 0a 0a 19 23 23 23 23 |y===5555[...####|
00000010 23 00 06 06 06 06 06 43 48 45 4b 1f 35 3d 29 3f |#......CHEK.5=)?|
00000020 35 23 31 27 2d 19 2f 01 00 43 48 45 4b 1f 35 3d |5#1'-./..CHEK.5=|
00000030 29 3f 35 23 31 27 2d 19 2f 01 00 44 4f 46 0b 2a |)?5#1'-./..DOF.*|
00000040 7a 3a 01 00 44 4f 46 0b 2a 7a 3a 01 00 44 4f 46 |z:..DOF.*z:..DOF|
00000050 0b 2a 7a 3a 01 00 2b 1d 1d 05 75 00 2b 1d 1d 05 |.*z:..+...u.+...|
00000060 75 00 79 3d 3d 3d 35 35 35 35 5b 0a 0a 35 1b 3f |u.y===5555[..5.?|
00000070 2d 2f 1b 35 3f 6f 2d 27 33 35 3d 65 6b 6b 6b 6b |-/.5?o-'35=ekkkk|
00000080 00 79 3d 3d 3d 35 35 35 35 5b 0a 0a 19 23 23 23 |.y===5555[...###|
00000090 23 23 00 79 3d 3d 3d 35 35 35 35 5b 0a 0a 35 1b |##.y===5555[..5.|
000000a0 3f 2d 2f 1b 35 3f 6f 2d 27 33 35 3d 65 6b 6b 6b |?-/.5?o-'35=ekkk|



Als programm benutze ich einfach das RN-Control-Beispielprogramm
(https://www.roboternetz.de/wissen/index.php/RN-Control_Demprogramm_in_C)

Meine Einstellungen in dem Programm, das auf dem RN-Control laueft: (aus dem Demo-Programm....)



void init_USART(void)
{
UCSRB |= (1<<TXEN); //UART TX (Transmit - senden) einschalten
UCSRC |= (1<<URSEL)|(3<<UCSZ0); //Modus Asynchron 8N1 (8 Datenbits, No Parity, 1 Stopbit)
UBRRH = 0; //Highbyte ist 0
UBRRL = 103; //Lowbyte ist 103 (dezimal) -> (Frequenz_in_Hz / (Baudrate * 16)) - 1 <- Quarfrequenz = 16*1000*1000 Hz!!!!
}


Meine Einstellungen bei stty:


:~$ stty -F /dev/ttyUSB1 -a
speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread clocal -crtscts
-ignbrk brkint ignpar -parmrk -inpck istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke


Achja, ich hab auch noch ausprobiert das ganze mit dem Hyperterminal zu machen wo ich das gleiche ergebnis bekommen hab...
Wenn ich an den einstellungen von stty rumspiele komm ich uebrigens auch an andere ergebnisse - aber nie lesbares...

danke im vorraus..
mattis

*edit* hab ich ganz vergessen: ich hab das Standart-RN-Control board.. also mit ATMega32 und 16MHz Quarz (auch wenn ich nich weiss was ein Quarz ist...)

fhs
24.07.2008, 17:10
Hallo mattis,

Deine USART-Initialisierung ist so OK für 9600Bd und 8N1, wenn Dein Prozessor tatsächlich mit 16MHz läuft (hast Du die Fuses überprüft?). Bitte zeig uns doch auch Deine Sende-Routine, am besten als abgespecktes (aber kompilierbares) Programm, das auch die Senderoutine und den zu sendenden String zeigt, damit es nicht zum Rätselraten wird.

Gruß

Fred

McJenso
24.07.2008, 20:32
Hallo,

ändere die init mal in



void init_USART(void)
{
UBRRH = 0; //Highbyte ist 0
UBRRL = 103; //Lowbyte ist 103 (dezimal) -> (Frequenz_in_Hz / (Baudrate * 16)) - 1 <- Quarfrequenz = 16*1000*1000 Hz!!!!
UCSRB |= (1<<TXEN); //UART TX (Transmit - senden) einschalten
UCSRC |= (1<<URSEL)|(3<<UCSZ0); //Modus Asynchron 8N1 (8 Datenbits, No Parity, 1 Stopbit)

}



Gruß

Jens

izaseba
24.07.2008, 20:57
Hallo,
warum setzt Du direkte Werte in die UBRR Register ein ?
das ist sowas von Fehleranfällig...

Dazu hat man den Preprozessor erfunden.
Einmal solche Formel erstellen :


#ifndef F_CPU
#define F_CPU 7342000L
#endif

#define BAUD 9600L

#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)


Im Code dann


UBRRH = UBRR_VAL >> 8;
UBRRL = UBRR_VAL & 0xFF;


Und gut ist.
In der Zukunkt nur Baudrate und F_CPU anpassen und nie wieder im Dattenblatt nach den Werten gucken.

Gruß Sebastian

mattis
25.07.2008, 12:18
Danke fuer die Antworten schonmal!

Also..
@Jens -> aendert gar nichts

@Fred:
Meine Fusebits sind die hier:

LowFuse: 1111 1111
HighFuse: 1101 1010

Frag mich nicht was genau das heisst.. ich hab das alles noch nicht so ganz verstanden...

*edit*: hab grade noch herausgefunden was das heisst:
Ext. Crystal High Freq. / Startup time: 16K CK + 64ms
(wobei das mir das trotzdem nichts sagt ;) )

@Sebastian:
Ich hab die veranderung mal gemacht - dann kommt was anderes an - aber immer noch zeichensalat.... - weisst du ob der F_CPU-Wert richtig ist? (fuer nen 16MHz ATMega32)\


#ifndef F_CPU
#define F_CPU 16000000
#endif

#define BAUD 9600L

#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)

void init_USART(void)
{
UBRRH = UBRR_VAL >> 8;
UBRRL = UBRR_VAL & 0xFF;

UCSRB |= (1<<TXEN); //UART TX (Transmit - senden) einschalten
UCSRC |= (1<<URSEL)|(3<<UCSZ0); //Modus Asynchron 8N1 (8 Datenbits, No Parity, 1 Stopbit)
}


Die Senderoutine ist die hier: (auch von dem Tutorial von RN-Wissen kopiert)


void sendchar(unsigned char c)
{
while(!(UCSRA & (1<<UDRE))) {} //Warten, bis Senden möglich ist
UDR = c; //schreibt das Zeichen aus 'c' auf die Schnittstelle
}


void sendUSART(char *s) //*s funktiniert wie eine Art Array - auch bei einem String werden die Zeichen (char) einzeln ausgelesen - und hier dann auf die Sendeschnittstelle übertragen
{
while(*s)
{
sendchar(*s);
s++;
}
}


Und dann das Programm einfach:


#include <stdlib.h>
#include <avr/io.h>
#include "rncontrol.h"

int main(void)
{
init_USART(); //USART konfigurieren
while(1){}
return 0;
}

Und hier das Ergebniss...


mattis@mattis-dell:~$ hexdump /dev/ttyUSB0 -v -C
00000000 a9 3a 3a 0a 02 a9 3a 3a 0a 02 a9 3a 3a 0a 02 a9 |.::...::...::...|


Mattis

mattis
25.07.2008, 12:24
Hier nochmal die beiden programm files als Anhang...

fhs
25.07.2008, 12:35
Hallo Mattis,

ob Du tatsächlich einen 16MHz-Quarz verbunden hast, musst Du schon selbst feststellen: auf dem kleinen metallenen 2-beinigen Teil steht die Frequenz aufgedruckt! Daneben sollten 2 kleine Kondensatoren montiert sein.
Da Du den ATmega32 bei 16MHz mit 5V betrieben musst, schlage ich die Fuse-Einstellungen in der Anlage vor (BOD aktiviert, kein Bootloader Support, lange Startzeit -- musst Du ggfs. ändern!).

Wenn Du nicht feststellen kannt, wie schnell Dein Prozessor läuft, schreib Dir eine Timer-Routine und lass eine LED blinken, dann kannst Du die Taktfrequenz abschätzen.

Gruß

Fred

McJenso
25.07.2008, 13:54
Hallo,
was mich irritiert ist die menge der Zeichen. Wie viele Zeichen werden vom PC empfangen? Im ersten Posting sind es sehr viele, im zweiten schon weniger. Dafür das nur 5 Zeichen abgeschickt werden aber noch zu viel. Werden vielleicht ständig Zeichen vom PC empfangen? Das würde auf einen sich immer wiederholenden Reset hindeuten.

Wenn ich dem Link RN-Control folge, komme ich auf eine Seite mit einem Schaltplan. Dort ist ein 8Mhz Quarz eingezeichnet.


Gruß

Jens

mattis
25.07.2008, 14:20
Ok also auf dem kleinen Silbernen teil steht QA16.000 ich nehme an das steht fuer 16MHz?

Beim ersten war es noch ein laengerer text, der gesendet wurde - Ich habe das programm nun zur leichteren fehlersuche verkleinert... und ja - soviele zeichen wie beim 2. mal kommen an und auch nur einmal pro programmdurchlauf...
wobei die sich ja irgendwie wiederholen - ich weiss nicht ob dies an hexdump liegt... aber es kommt hald wirklich nur eine zeile an.

gruss mattis

fhs
25.07.2008, 14:56
Hallo Mattis,

...auf dem kleinen Silbernen teil steht QA16.000 ich nehme an das steht fuer 16MHz?...
ja, das sind wohl 16MHz, und Deine Fuses sind entsprechend eingestellt. Ich weiß inzwischen aber wirklich nicht mehr, was jetzt funktioniert und was nicht. Dir bleibt da nichts weiter, als das Programm so zu verkürzen, dass wirklich nur 1x ein kurzer String gesendet wird. Dann solltest Du uns sagen, was in diesem String steht und was am anderen Ende ankommt. Am besten zeigst Du uns das ganze Programm, ohne Dich auf andere Software zu beziehen und ohne es in Teile zu zerlegen. In dem was Du "Programm einfach" nennst, wird nur die USART-Initialisierung gemacht und gar nichts gesendet. Bitte einfach den Code einstellen und kein ZIP-Archiv.
Gruß

Fred

kater
25.07.2008, 14:58
Laut dem Programm wird die Senderoutine doch ueberhaupt garnicht aufgerufen also wird garncihts gesendet. Vllt falschen COM Port gewählt und du bekommst den Zeichensalat der Maus?

oberallgeier
25.07.2008, 15:26
Hallo mattis,


... aber es kommt hald wirklich nur eine zeile an. ...find ich ja nett, dass überhaupt was ankommt:

while (1)
{}
return ß;

bei meinen Controllern käm da garnix an. Versuchs doch mal mit

sendUSART ("\r\r\tVielleicht geht es so 25jul08 1625\r\n");

statt des while(1)
{}
.

Welches Terminal hast Du denn? kann das nur hex?

mattis
25.07.2008, 15:55
sorry, ich hab ne zeile vergessen weil ich der uebersichtshalber die kommentare entfernt habe:


#include <stdlib.h>
#include <avr/io.h>
#include "rncontrol.h"

int main(void)
{
init_USART(); //USART konfigurieren
sendUSART("hallo");
while(1) {}
return 0;
}


ich hab linux... cat /dev/ttyUSB0 gibt im prinzip nur fragezeichen aus

fhs
25.07.2008, 16:08
Hi,


sendUSART("hallo");

Du sendest nur 1x "hallo" und bekommst viele, viele Zeichen. Die Initialisierung des Controllers scheint zu stimmen. Was empfängt Dein Terminal, wenn der μC gar nichts sendet?

Gruß

Fred

mattis
25.07.2008, 16:10
dann bekomm ich gar nichts..
ich habe jetz grade auch nochmal cat /dev/ttyUSB0 ausprobiert


mattis@mattis-dell:~$ cat /dev/ttyUSB0
�::
�::

wobei das schon 2 programmdurchlauefe waren (mit reset-knopf ;) )
ich nehme ma an das mit den vielen zeichen lag an Hexdump...

McJenso
25.07.2008, 16:11
Hallo,

noch einmal. Werden ständig Zeichen ausgegeben? Dein Programm sollte nur 5 Zeichen ausgeben. Wenn die Baudrate nicht stimmt, können auch mehr Zeichen empfangen werden. Wird aber ständig etwas empfangen, resetet der Controller ständig und der Weg zur Lösung ist ein ganz anderer.

Gruß

Jens

mattis
25.07.2008, 16:14
nein, es werden bei cat /dev/ttyUSB0 nur immer ein fragezeichen und 2 doppelpunkte ausgegeben... (lies kurz den post vor deinem.. ich glaub da warst du schon am schreiben)

*edit*: achja.. die baudrate am computer ist auf 9600 eingestellt -> sonst kommt gar nichts an

fhs
25.07.2008, 16:15
Hi,

wie sieht es denn mit der Hardware (CMOS=>RS232) aus? Immerhin bekommst Du ja bei 2 Durchläufen 2 fast identische Zeilen (wenn auch mit falschen Zeichen).

Gruß

Fred

PS: Du kannst es meist z.B. so (http://www.uchobby.com/index.php/2007/06/11/ttl-to-rs232-adaptor-explained/) machen (der obere Teil der Schaltung reicht für Controller=>[pseudo]-RS232) oder z.B. einen MAX232 einsetzen.

izaseba
25.07.2008, 17:49
Hallo,

nimm doch ein Terminalprogramm
Kermit wäre schon mal was, oder wen es grafisch sein soll gtkterm oder oder oder, such mal in Deiner Distri danach ](*,)

Gruß Sebastian

McJenso
25.07.2008, 18:11
Hallo,

sorry das ich da so drauf rum geritten bin. Aber wir würden sonst in die absolut falsche Richtung gehen. Für mich deutet alles auf einen kleineren Quarz in der Schaltung oder auf eine zu hohe Baudrate am PC hin aber das hast du schon geprüft. Willst du nicht doch mal nur so zum Test UBRRL = 51 für nen 8Mhz Quarz probieren?

Gruß

Jens

kater
25.07.2008, 18:30
Das RN COntrol hat überhaupt keinen USB Anschluss. Wie schliesst du das denn dann an USB an? Und einmal ist es ttyUSB0 und dann ttyUSB1.

Furtion
25.07.2008, 18:38
Hi,

wie wäre es denn wenn man ein kleines Programm in Bascom schreibt. Was
ganz einfaches was in 1 Sekunden Tank was sendet. Wenn das geht
kann man schon mal ausschließen das es an der Software liegt und schauen
ob es an der Hardware liegt.

mattis
27.07.2008, 16:17
Das RN COntrol hat überhaupt keinen USB Anschluss. Wie schliesst du das denn dann an USB an? Und einmal ist es ttyUSB0 und dann ttyUSB1.

Achso, das habe ich vergessen zu erwaehnen, da ich davon ausgegangen bin das diese funktioniert. Ich habe das MySmartUSB von myavr.de
http://www.myavr.de/shop/article.php?artDataID=36
Gibt es eine Moeglichkeit dieses zu testen? (zum Beispiel Eingang und Ausgang verbinden und sich selbst Nachrichten schicken??)

Ansonsten werde ich mich jetzt mal ein bisschen in Bascom einarbeiten und das auf dem Laptop von meinen Eltern zu machen (das WinXP hat), damit ihr mir einfacher helfen koennt und man ein Linux-spezifisches Problem ausschliessen kann.
Ich melde mich dann mal sobald ich damit Ergebnisse hab.

*edit* Das mit dem 8-MHz Quarz probiere ich dann gleich in Bascom aus...

kater
27.07.2008, 16:32
Du hast den MySmarUSB auch so eingestellt, dass er als RS232-USB interface agiert?

mattis
27.07.2008, 19:53
ja, sonst haette ich ja auch gar nichts bekommen, oder?

kater
27.07.2008, 20:03
Vllt hättest du dann Zeichensalat bekommen ;)

mattis
28.07.2008, 10:30
JUUUUUUUUUUUUUUUUHUUUUUUUUUUUUUUUUUUUUUUUUUUU!!!!! !!!

frag mich nicht woran es lag... ich habe jetzt alles neu verkabelt, mit BASCOM dran was gemacht und noch ausprobiert den eingang und ausgang vom pc zu verbinden um die funktion zu testen... aus irgendeinem grund funktioniert jetzt alles... wenn ich wissen sollte woran es lag werd ich mich nochmal melden... ;)

DANKE!!!

ossy
12.08.2008, 20:40
Hallo Mattis, hast du rausgefunden an was es gelegen hat?

Ich habe das selbe Problem. Ich arbeite mit Pic´s. Habe schon verschiedene Pics ausprobiert. Habe verschiedene Programme in den Pic
Programmiert. Die Programme aus dem Netz und selbst geschriebene, weil ich dachte ich habe irgend einen Fehler drin. Immer das gleiche, es kommen nur falche zeichen an. Auch verschiedene Schaltungen habe ich ausprobiert. So zum Beispiel: mit MAX232 oder direkte verbindung beim Senden PIC zum Computer. Dann habe ich noch verschiedene Computer
ausprobiert. Es kommen wirre Zeichen oder Buchstaben, die in unseren Alphabet nicht vorkommen.

Nichts zu machen ich finde den Fehler nicht.

Vielleicht kann mir jemand noch einen Tip geben.

Gruß Wolfgang

Besserwessi
13.08.2008, 19:47
Das typische Problem das wire Zeichen verursacht, ist eine falsche Baudrate. Das kann dabei eine völlig fasche sein oder eine nur zu große tolleranz des taktes.
Bei nur einem Stopbit und nicht so guter hardware auf der Gegenseite, kann es auch recht lange dauern bis beide Seiten sich einig sind wo die Bytes anfangen. Zum Testen also besser mit 2 Stopbits anfangen.

ossy
19.08.2008, 08:26
Hallo Besserwessi,

ich habe das mal ausprobiert mit den Stopbits. Dann ist mir noch folgendes aufgefallen, wenn ich das Programm HTERM starte dann können wire zeichen empfangen werden. Dann hatte ich nochmals am PIC auf reset gedrückt und es kamen lesbare zeichen. Also wenigstens weis ich jetzt das die sache weitergeht.

Gruß und Danke

Wolfgang

mattis
19.08.2008, 16:49
Hallo,
nochmal kurz fuer alle die durch google hier hinkommen.
Das Problem war, dass durch die USB-UART bridge schon ein Max232 vorhanden war, der aber zusaetzlich auf dem board schon drauf war... klappt natuerlich war ;)

HannoHupmann
08.09.2008, 20:09
Hallo

kann mir vielleicht einer helfen? Ich hab ein ähnliches Problem, ich verwende auch einen Mega32 und möchte meine Daten über

Terminal/RS232 bzw. UART an den PC ausgeben.

Ich hab den Code von hier versucht und den aus dem RN-Control Demoprogramm, aber irgendwie funktioniert es nicht.

Sicher weis ich, dass der Mega32 funktioniert, er verwendet einen 7,3728 Mhz Quarz und einen MAX232 um die Serielle Schnittestelle zu erzeugen. Leider bin ich mir nicht sicher wie ich die Fuse Bits einstellen muss (verwendet AVR Studio).

In Sachen GCC-Programmierung und AVR bin ich noch absoluter Einsteiger daher wäre ich wirklich froh, wenn mir jemand ein bischen helfen könnte mit einem Beispielcode für ein einfache Senden über UART, für eben genau diese Konfiguration Mega32 und 7,3728.

danke schon mal
HannoHupmann

Hubert.G
08.09.2008, 20:20
Hilfe für Fuses hier: http://palmavr.sourceforge.net/cgi-bin/fc.cgi
Ext Cristal/Resonator Medium Frequ, den zweiten Eintrag.
Eventuell JTAG abschalten.

HannoHupmann
08.09.2008, 20:40
Den kenn ich schon, aber aus den ganzen Sachen werde ich nicht schlau.

Hubert.G
09.09.2008, 09:19
Warum? Was hast du für Fragen dazu.

HannoHupmann
09.09.2008, 11:14
1) ich hab keine Ahnung welche Fuses bits eingestellt sind und welche ich einstellen muss. Ich hab im Prinzip die Schaltung von www.kreatives-chaos.com nachgebaut und programmiere mit AVR Studio. Leider weis ich nicht was ich einstellen muss damit der Takt richtig ist.

2) ich hab keine Ahnung wo und wie ich das machen muss

3) ich hab keine Ahnung wie ich den Code auf die Taktzahl des µC einstellen muss um Zeichen zu empfangen.

4) ich fang gerade an mich auf dem Gebiet einzuarbeiten.

Hubert.G
09.09.2008, 11:51
Wenn du über das AVR-Studio programmierst, du connected zum Programmer bist, dann auf den Reiter Fuses klicken und es werden die eingestellten Fuses angezeigt. Entwerder ein Haken oder Text.
Unterhalb steht auch noch das High/Low Byte.
Wo du das im Code einstellst kann ich dir nur sagen wenn ich deinen Code sehe.

HannoHupmann
09.09.2008, 17:12
@Hubert G danke schon mal, das hab ich gefunden, die Frage ist jetzt nur noch welche Haken ich setzten muss und welche nicht. Taktzahl und µC stehen ja oben aber ich bin mir nicht sicher was ich im AVR Studio einstellen soll.

Hubert.G
09.09.2008, 17:21
Die Einstellung erfolgt im UBRR Register wenn du den UART initialisierst. Zeig mal den Code den du verwenden willst.

HannoHupmann
11.09.2008, 11:48
@Hubert.G ich hab den Fehler gefunden, es lag an Rx und Tx die hatte ich vertauscht.