mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RS232: µC empfängt falsche Zeichen


Autor: MyAvr User (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hoffe, es kann mir wer helfen :P

Hab ein MyAvr LPT-Board mit Atmega8. Funktioniert soweit, nur die 
serielle Kommunikation haut nicht hin. Wenn ich ein 'a' schicke, wird 
ein 'O' am LCD-Display des µC ausgegeben, schicke ich ein 'q' kommt ein 
'G' raus, usw.
Hab ein wenig die Ascii-Tabelle durchstudiert und bin auf folgendes 
draufgekommen:

'a' entspricht 0110 0001
'O' entspricht 0100 1111

Um also vom Binärcode 'a' nach 'O' zu kommen, muss man das Byte zuerst 
invertieren und dann einmal rechts schieben.

   'a'           -->           'O'
0110 0001 --> 1001 1110 --> 0100 1111

Diese "Umrechnung" funktioniert aber nur bei Zeichen, deren Binärcode 
mit einer 1 endet, z.B. 'a', 'c', 'e', ...


Also irgendwo in der Übertragung wird das gesendete Byte verfälscht.
Senden eines Bytes an den PC funktioniert gar nicht.


Hier der C-Code:

------------------------------------------------------------------------ 
-
#include "lcd.h"
#include "lcd.c"
#include <avr/io.h>
#include "stdio.h"
#define F_CPU 3686400  //Prozessortakt
#define BAUD 9600     //RS232-Baudrate
#define MYUBRR F_CPU/16/BAUD-1

void USART_INITIALISIEREN(unsigned int);
unsigned char USART_EMPFANGEN(void);
void USART_SENDEN(unsigned char);

int main(void)
{
  char Zeichen,i;



    DDRC = 0xFF;

    USART_INITIALISIEREN(MYUBRR);
  lcd_init();
    lcd_clear();

    i = 0;
    Zeichen = 'a';
  lcd_write(Zeichen);

  while(1)
  {
     Zeichen = USART_EMPFANGEN();
     lcd_write(Zeichen);
  }

  return 0;
}

void USART_INITIALISIEREN(unsigned int ubrr)
{
  //setzen der Baudrate
  UBRRH = 0;//(unsigned char) (ubrr>>8); //Setzen des HIGH-Bytes des 
Baudraten-Registers
  UBRRL = 23;//(unsigned char)  ubrr;     //Setzen des LOW -Bytes des 
Baudraten-Registers
  //UCSRA |= 0x02;
  //Einschalten des Senders und Empfaengers
  UCSRB = (1<<RXEN)|(1<<TXEN);

  //Setzen des Nachrichtenformats: 8 Datenbits, 2 Stopbits
  UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);
}

unsigned char USART_EMPFANGEN(void)
{
  //Warten bis die Daten empfangen wurden

  while( !(UCSRA & (1<<RXC)) )
    ;

  //Holen und Zurueckgenben der vom Puffer Empfangenen Daten

  return UDR;
}

void USART_SENDEN(unsigned char daten)
{
  //Warten bis der Uebertragungspuffer leer ist
  while( !(UCSRA & (1<<UDRE)) )
    ;

  //Daten inden Puffer schreiben und Uebertragen

  UDR = daten;
}
------------------------------------------------------------------------ 
---

Übrigens schließe ich das Board per USB-Seriell-Converter an den PC an, 
da der Converter aber ein Male-Stecker ist und das Board ebenso, 
verbinde ich den Converter mit dem Board über ein selbstgemachter 
Nullmodemkabel (ungeschirmte Flachbandleitung).


Hat irgendjemand ne Idee, wo der Fehler liegen könnte?

Autor: MyAvr User (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Übrigens der USB-Seriell-Converter funktioniert tadellos, mit meinem 
ATMEGA32-Board klappt der serielle Dtaenverkehr problemlos.

Könnte der Max232 kaputt sein oder muss ich Fuse-Bits setzen bevor ich 
kommunizieren kann?

Autor: Lötkünstler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sind sind die seriellen  Übertragungsparameter identisch?
also Baudrate,Stopbits,paritybit usw.?

Lötkünstler


<Mit der Lizenz zum löten>

Autor: MyAvr User (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab ich schon überprüft, das passt überein.

Was ich aber durch Googeln gefunden habe ist dieser Thread, in dem 
jemand das selbe Problem hat: Beitrag "wieder mal uart. Falsche Zeichen"

Darin wird dem falsch eingebautem Max232 die Schuld gegeben.
Könnte es sein, dass da ein Fehler im Board ist?

http://www.myavr.de/download/techb_myavr_board_lpt.pdf

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn das ein "neuer" Mega8 ist must du den erst auf externene Takt 
konfigurieren!

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>#define MYUBRR F_CPU/16/BAUD-1

Wenn der Compiler nach der Methode 'Punktrechnung vor Strichrechnung' 
arbeitet wird die Baudrate falsch berechnet:

Teste mal:     #define MYUBRR F_CPU/16/(BAUD-1).

MfG Spess

Autor: MyAvr User (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hab ich schon gemacht, der µC läuft mit 3.6864 MHz.

Aja, um die Sache noch verwirrender zu machen, an nem Seriellen 
Computer-Port direkt angeschlossen hat (zumindest das Empfangen) 
einwandfrei funktioniert

Autor: Lötkünstler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn die seriellen Parameter stimmen würde ich mal den Quarz des Boards
unter die Lupe nehmen ob der auf der richtigen Frequenz schwingt.
(Mit nem Frequenzzähler direkt messen oder mit nem Oszilloskop die 
Frequenz ermitteln die aufgedruckt ist).
Bei verdächtigen Kabeln würde ich Rxd und TXD am Kabelende verbinden
und mit einen einfachen Datenmonitor die gesendeten/empfangenen Daten
darstellen um das Kabel als Fehlerquelle auszuschließen.
Prüfen ob die Masse vom Kabel vom PC zum Board o.k.ist.
Auf den High/low-Pegel der RS 232 Schnittstelle würde ich auch mal ein 
Auge werfen (High=-5--12V Low=+5-12V)Evtl. Kann der RS 232 -Baustein 
oder die Elko`s ne Macke haben.Dann ist die Datenübertragung natürlich 
nicht sichergestellt.

Mehr fällt mir dazu im Moment auch nicht ein.

Gruß
Lötkünstler


<Mit der Lizenz zum löten>

Autor: Martin L. (melvin_the_moose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MyAvr User wrote:

> Übrigens schließe ich das Board per USB-Seriell-Converter an den PC an,
> da der Converter aber ein Male-Stecker ist und das Board ebenso,
> verbinde ich den Converter mit dem Board über ein selbstgemachter
> Nullmodemkabel (ungeschirmte Flachbandleitung).

Wenn ich mich nicht irre, ergibt diese Konstruktion eine 1:1 Verbindung 
female:female. Ein Nullmodemkabel tauscht aber zusätzlich TxD/RxD, 
CTS/RTS etc.
Ist sichergestellt, daß TxD(Board) mit RxD(PC) etc. verbunden ist?
Siehe auch Wikipedia: 
http://de.wikipedia.org/wiki/RS232#Verkabelung_und_Stecker

Gruß

Martin

Autor: MyAvr User (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, ich glaub ich komm dem Fehler langsam näher.
Wenn am PIN R1IN -8V anliegt ist RXD auf Low, der Ruhepegel müsste aber 
High sein, d.h. der MAX232 setzt nicht richtig um. Bei meinem ATMEGA32 
Board ist der Ruhepegel wie es sich gehört auf High. Obwohl beide Boards 
den selben MAX232 - Aufbau haben invertiert der MAX232 auf dem Atmega8 
Board nicht, was den Fehler verursacht. Hab die MAX232 der Boards 
ausgetauscht (der eine ist ein MAX232N, der andere ein MAX232CPE, hat 
aber nichts an der Situation verändert. Kondensatoren scheinen auch 
übereinzustimmen (es sei denn die am Atmega8-Board sind falsch 
bedruckt). Es ist mir unerklärbar wieso bei dem Atmega8 Board der 
Ruhepegel und somit warscheinlich auch die anderen Pegel verkehrt sind.

Hab die falsch gesendeten Bytes nochmal unter die Lupe genommen und bin 
mir jetzt 99% sicher, dass die Bitfehler allein durch die Invertierung 
zustande kommen, weil dadurch alle Bits invertiert sowie das Startbit 
"verschoben" wird.

Autor: Lötkünstler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Haste auch die Elko`s(manchmal sind`s auch Tantal`s)mit ausgewechselt?
Wenn einer davon defekt ist funktioniern die Spannungswandler meist
nicht mehr richtig.


Lötkünstler


<Mit der Lizenz zum löten>

Autor: MyAvr User (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, jetz bin ich komplett verwirrt. Hab die Vermutung von Martin L. 
nachgeprüft, und es waren wirklich die beiden Buchsen verkehrt, d.h. man 
braucht wirklich kein gekreuztes Nullmodemkabel. Jetzt funktioniert die 
serielle Kommunikation mit der seriellen Schnittstelle meines alten 
Computers. Seltsamerweise kann ich jetzt aber gar keine Zeichen mehr per 
USB-Seriell-Konverter senden, das Board empfängt nix.
Der Konverter is aber ok, mit dem Atmega32 Board funktioniert er.

Autor: David (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hatte schon probleme mit gewissen usb-seriell konvertern (HP), halten 
teils die spezifikationen zu wenig genau ein...
--> hast du mal einen anderen konverter ausprobiert?

Autor: MyAvr User (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Juhu, es haut hin!
Hatte doch ein Nullmodemkabel gebraucht, aber zuvor hab ich den Aufbau 
eines Solchen Kabels falsch verstanden gehabt und die falschen Leitungen 
vertauscht. Jetzt klappts einwandfrei!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.