-         

Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 40

Thema: USART/RS232 gibt Zeichensalat...

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    17.06.2007
    Ort
    Bonn
    Beiträge
    28

    USART/RS232 gibt Zeichensalat...

    Anzeige

    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:
    Code:
    :~$ 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
    (http://www.roboternetz.de/wissen/ind...mprogramm_in_C)

    Meine Einstellungen in dem Programm, das auf dem RN-Control laueft: (aus dem Demo-Programm....)
    Code:
    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:
    Code:
    :~$ 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...)

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.02.2006
    Ort
    3. Planet eines kleinen Sonnensystems in einem Seitenarm der Milchstraße
    Alter
    63
    Beiträge
    622
    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
    Only entropy comes easy. - Anton Checkhov

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    20.05.2006
    Ort
    Lippe
    Alter
    48
    Beiträge
    524
    Hallo,

    ändere die init mal in

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

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    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 :
    Code:
    #ifndef F_CPU
    #define F_CPU 7342000L
    #endif
    
    #define BAUD 9600L
    
    #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)
    Im Code dann
    Code:
     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
    Software is like s e x: its better when its free.
    Linus Torvald

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    17.06.2007
    Ort
    Bonn
    Beiträge
    28
    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)\
    Code:
    #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)
    Code:
    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:
    Code:
    #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...
    Code:
    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

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    17.06.2007
    Ort
    Bonn
    Beiträge
    28
    Hier nochmal die beiden programm files als Anhang...
    Angehängte Dateien Angehängte Dateien

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.02.2006
    Ort
    3. Planet eines kleinen Sonnensystems in einem Seitenarm der Milchstraße
    Alter
    63
    Beiträge
    622
    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
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken atmega32_fuses.png  
    Only entropy comes easy. - Anton Checkhov

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    20.05.2006
    Ort
    Lippe
    Alter
    48
    Beiträge
    524
    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

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    17.06.2007
    Ort
    Bonn
    Beiträge
    28
    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

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.02.2006
    Ort
    3. Planet eines kleinen Sonnensystems in einem Seitenarm der Milchstraße
    Alter
    63
    Beiträge
    622
    Hallo Mattis,
    Zitat Zitat von 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
    Only entropy comes easy. - Anton Checkhov

Seite 1 von 4 123 ... LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •