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


von MyAvr User (Gast)


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?

von MyAvr User (Gast)


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?

von Lötkünstler (Gast)


Lesenswert?

sind sind die seriellen  Übertragungsparameter identisch?
also Baudrate,Stopbits,paritybit usw.?

Lötkünstler


<Mit der Lizenz zum löten>

von MyAvr User (Gast)


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

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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

von Spess53 (Gast)


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

von MyAvr User (Gast)


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

von Lötkünstler (Gast)


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>

von Martin L. (melvin_the_moose)


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

von MyAvr User (Gast)


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.

von Lötkünstler (Gast)


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>

von MyAvr User (Gast)


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.

von David (Gast)


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?

von MyAvr User (Gast)


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!

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.