www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme RS232


Autor: Stefan S. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Forum,
meine RS232 Datenübertragung ist extrem Fehlerhaft. Ich sende Daten vom 
Atmega 8 zum PC über nen Adapter (hab ihn gebaut wie hier im Forum 
beschrieben mit MAX 232).
Was der Atmega raussendet sieht ja ganz gut aus(Kanal 2),
aber was der Adapter daraus macht ist mir unklar (Kanal 3).
Habe schon vieles probiert, alle elektrischen Geräte in der Nähe aus, am 
Laptop damit ich unabhängig vom Netzt bin...
Den Adapter direkt an den Laptop anschließen, damit ich kein langes 
Kabel habe...
Nix hilft...
Hat jemand eine Idee?

Gruß Stefan

Autor: Stefan S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab die Störung grad mal gemessen, das sind 50kHz

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da ist wahrscheinlich mit der Beschaltung des MAX232 ein Problem. Kannst 
Du ein Schema posten?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder noch besser: Photo
Denn wenn du die Schaltung nach Tut aufgebaut hast, sollte
das eigentlich funktionieren (wenn wir mal davon ausgehen,
dass die Komponenten nicht fehlerhaft sind). Nun passiert
es aber manchmal, dass man zwar den richtigen Schaltplan
hat, aber in Wirklichkeit was anderes aufgebaut hat.
Ein zweites Augenpaar wirkt da oft Wunder.

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
-zu kleine Kondensatoren?
-verpolt?

Autor: Stefan S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich überprüf noch mal alles,
hab im Moment leider kein Photoapperat hier...

Autor: Stefan S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab 22 uF Kondensatoren anstatt 1 u wie im Wiki

Autor: Alexander (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Stefan,

das sieht so aus als würde die Ladungspumpe des MAX232 nicht korrekt 
arbeiten. Sieh dir doch mal mit dem Oszilloskop die Spannung an Pin 2 
(+8,5V) und Pin 6 (-8,5V) an. Ich denke, dass bei der negativen Spannung 
eine große Restwelligkeit ist. Prüfe mal, ob du alle Kondensatoren 
korrekt angeschlossen hast und ob die Werte stimmen.

Gruß,
Alexander

Autor: Bruno (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hatte auch mal einen Fehler bei den Kond. das sah dann auch so aus.

Autor: Stefan S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Alexander
Vielen Dank für deinen Tip,
an Pin 6 war eine hohe Restwelligkeit, dort war eine kalte Lötstelle...

So, nun sehen meine Signal gut aus,
aber es treten immer noch krass viele Fehler in der Kommunikation auf...
Momentan hab ich nur eine Endlosschleife die mir
"255" ausgeben soll, ich bekomme aber nur 191 oder 253,
grundsätzlich scheinen Bit 2 und Bit 7 zukippen...

Hat da jemand noch ne Idee?

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan S. wrote:

> "255" ausgeben soll, ich bekomme aber nur 191 oder 253,
> grundsätzlich scheinen Bit 2 und Bit 7 zukippen...

Was zeigt nun das Oszilloskop?

Autor: Einhart (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Passt die Baudrate? Woher kommt der µC Takt?

Autor: Einhart (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wartet deine Programmschleife bis das letzte Zeichen 'raus ist?

Autor: Stefan S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Oszi zeigt den richtigen Wert an...
Baudrate passt, habe auch schon verschiedene ausprobiert.
Der uC Takt kommt von einem QUarz, 8 Mhz

Autor: Stefan S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Einhart

Gute Frage, damit hab ich mich nicht beschäftigt,
aber hier der Quellcode meiner Funktion zum Daten senden.
Da würde ich spontan sagen, nein die wartet nicht
USART_Transmit:
  sbis      UCSRA,UDRE
  rjmp      USART_Transmit
  out      UDR,temp
  ret

Autor: Stefan S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab mir grad noch das das wiki über uart durchgelesen,
also liegt es wohl auch nicht daran das die Schleife nicht wartet

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan S. wrote:
> hab mir grad noch das das wiki über uart durchgelesen,
> also liegt es wohl auch nicht daran das die Schleife nicht wartet

Die ist ok.
Sie wartet, korrekterweise, bis das Register zum Senden frei ist.

Die wahrschinlichste Ursache ist nach wie vor, dass die Baudrate,
bzw. der Takt aus dem die Baudrate abgeleitet wird, nicht stimmt.

Autor: Norgan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sag dochmal etwas mehr ... Welche Baudrate hast du eingestellt? 115k? 
Welcher Teiler?

Autor: Stefan S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe verschiedene probiert, 300,9600,19200 und 38400,

hier noch die Berechnung für die Register
.equ         F_CPU = 8000000        ; Systemtakt in Hz
.equ         BAUD  = 300           ; Baudrate
 
; Berechnungen
.equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)  ; 
.equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))     ; Reale Baudrate

;initialisierung

   ldi       temp, HIGH(UBRR_VAL)
   out      UBRRH, temp
   ldi       temp, LOW(UBRR_VAL)
   out       UBRRL, temp
 
    ; Frame-Format: 8 Bit
   ldi       temp, (1<<URSEL)|(1<<UCSZ0)|(1<<UPM1)|(1<<USBS);even parity, 2 Stopbits
   out       UCSRC, temp
 
   sbi       UCSRB,TXEN                    ; TX aktivieren


Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> .equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)  ;

Was hat denn das "+BAUD*8" da zu suchen?

Autor: Stefan S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab mir nicht so viele Gedanken über den Text gemacht,
hab das von irgendwo übernommen.
Also muss das "*8" raus?

Autor: Stefan S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das hab ich aus dem Tutorial von hier...

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also eigentlich nimmt man diese Formel:
.equ UBRR_VAL = ((F_CPU)/((BAUD)*16)-1)  ;

> das hab ich aus dem Tutorial von hier...

Hm, stimmt, man kann damit natürlich eine Rundung des letzten Bit 
erzeugen.

Autor: Stefan S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was bringt mir denn diese Rundung?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan S. wrote:
> Was bringt mir denn diese Rundung?

ohne Rundung: 19/10 = 1
mit Rundung: 19/10 = 2

Autor: Stefan S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also dürfte das aber nicht zu fatalen Fehlern in fast jedem Bit führen 
oder?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, das ist nicht die Fehlerursache, nur ein Fehler von mir. ;-)

Autor: Stefan S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat sonst jemand ne Idee,
im übrigen nutze ich HTerm 0.6.5 beta...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also kramen wir mal das übliche raus:

.equ         F_CPU = 8000000        ; Systemtakt in Hz

Ist verifiziert, dass der µC auch wirklich mit 8Mhz läuft?

Autor: Stefan S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja,
habe einen 8 MHz Quarz,
habe mich gerade noch mal vergewissert

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und der AVR läuft auch damit, oder vielleicht doch noch mit dem internen 
RC-Oszillator? Fuses checken!

Autor: Stefan S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bin mir ziemlich sicher das die Fuses richtig sind,
dummerweise hat mein Programmer grad die Hufe hochgerissen :-(
Was kann ich noch alles checken sobald ich nen neuen Programmer hab, bzw 
meinen wieder hinbekommen hab?

Autor: Frank Jorga (fjorga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Stefan ..

hier ein paar Tipps.

Um sicherzustellen, daß der µc geht
- RxD mit TxD direkt am Chip verbinden
- Prüfmuster 0x00 0xaa 0x55 0xff senden
- selbst wieder empfangen und testen

wenn das klappt dann hinter dem MAX232:
- wie oben ...

wenn es bis hierher klappt kann nur noch die Baudrate nicht stimmen oder 
das Problem liegt im PC oder der Leitung

Parity even mit 2 Stoppbits ist SEHR exotisch
nimm besser N81 (No Parity, 8 Datenbits, ein Stoppbit)
Hatte bei einem PC Probleme damit weil dessen UART das nicht richtig 
konnte:

Hab ich leder nur in C zur Hand ...

    UBRRH = 0;
    UBRRL = UBRR_16MHZ_115200;    // direkt setzen
    SB3(UCSRB, RXEN, TXEN, RXCIE);    // Rx und Tx einschalten
    SB3(UCSRC, URSEL, UCSZ1, UCSZ0);    // N81
    UDR; UDR;
    SB2(UCSRA, RXC, TXC);      // opt. Interrupt einschalten
    sei();

SB2 und SB3 sind Macros die das hässliche (bitnr<<1) .. ersetzen

Für die Baudrate UBRL den festen Wert aus dem Datenblatt setzen. 
Manchmal verrechnen sich die Compiler im Präprozessor (hat mich schon 
mal eine Nacht gekostet)

Vielleicht hilft das weiter :-)

viel Erfolg
Frank

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.