www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega8: UART Übertragung fehleranfällig


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Stephan_S (Gast)
Datum:
Angehängte Dateien:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo,

ich beschäftige mich gerade mit der Kommunikation zwischen ATmega8 und 
dem PC. Ich verwende das Starterkit aus dem Microcontroller.net Shop 
sowie den obersten Code aus dem UART-Kapitel im AVR-Tutorial 
(http://www.mikrocontroller.net/articles/AVR-Tutorial:_UART) Die einzige 
Anpassung habe ich beim Einstellen der Taktfrequenz des externen Takts 
vorgenommen, der bei 8Mhz liegt.

Mein Problem ist, dass die Übertragung zum PC nur sporadisch 
funktioniert und äußerst fehleranfällig ist, wie z.B. auf dem 
angehängten Screenshot zu sehen ist.

Die korrekte Übertragung müsste Test! in jeder Zeile liefern.

Hat jemand von den Experten eine Idee, was hier das Problem sein könnte?
Vielen Dank für Eure Hilfe!

Stephan

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

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Sieht mir entweder nach einem Wackelkontakt oder einem nicht stabilen 
Takt aus. Die Verwendung des internen 8Mhz RC-Schwingkreises könnte zb 
sowas erzeugen.

Autor: Meisel (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Solche Zeichenwildwüchse deuten oft auf einen Stringüberlauf hin.

Aber da müsstest du schon deinen ganzen Quelltext zeigen.

Ansonsten: Woher hast du den Wert für das UBRR Register? Selbst 
ausgerechnet?
Im Datenblatt des Atmels sind sämtliche Werte für die gängigsten Quarze 
zu finden (+ Angabe zum prozentualen Fehler).

Autor: Stephan_S (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Vielen Dank erst mal!
Hier der gesamte Quelltext:
 
.include "m8def.inc"
 
.def temp = R16
 
.equ F_CPU = 8000000                            ; Systemtakt in Hz
.equ BAUD  = 9600                               ; Baudrate
 
; Berechnungen
.equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)  ; clever runden
.equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))     ; Reale Baudrate
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)  ; Fehler in Promille
 
.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))       ; max. +/-10 Promille Fehler
  .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
.endif
 
    ; Stackpointer initialisieren
 
    ldi     temp, HIGH(RAMEND)
    out     SPH, temp
    ldi     temp, LOW(RAMEND)
    out     SPL, temp
 
    ; Port D = Ausgang
 
    ldi     temp, 0xFF
    out     DDRD, temp
 
    ; Baudrate einstellen
 
    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<<UCSZ1)|(1<<UCSZ0)
    out     UCSRC, temp
 
    sbi     UCSRB, RXEN                     ; RX (Empfang) aktivieren
 
receive_loop:
   sbis     UCSRA, RXC                      ; warten bis ein Byte angekommen ist
   rjmp     receive_loop
   in       temp, UDR                       ; empfangenes Byte nach temp kopieren
   out      PORTD, temp                     ; und an Port D ausgeben.
   rjmp     receive_loop                    ; zurück zum Hauptprogramm 


Ich verwende nicht den internen RC-Oszillator sondern einen externen 
Quarz. Dieser müsste eigentlich die geforderte Genauigkeit liefern.

Autor: H.Joachim Seifert (crazyhorse)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hm, das passt aber nicht zu deiner Terminalausgabe - du sendest doch gar 
nichts?

Autor: Stephan_S (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Oh sorry, tut mir leid: Hab beim Kopieren im Eifer des Gefechts einen 
Codeteil unterschlagen. Hier nochmal der ganze Code:

.include "m8def.inc"
 
.def temp    = r16                              ; Register für kleinere Arbeiten
.def zeichen = r17                              ; in diesem Register wird das Zeichen an die
                                                ; Ausgabefunktion übergeben
 
.equ F_CPU = 8000000                            ; Systemtakt in Hz
.equ BAUD  = 9600                               ; Baudrate
 
; Berechnungen
.equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)  ; clever runden
.equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))      ; Reale Baudrate
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)  ; Fehler in Promille
 
.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))       ; max. +/-10 Promille Fehler
  .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
.endif
 
    ; Stackpointer initialisieren
 
    ldi     temp, HIGH(RAMEND)
    out     SPH, temp
    ldi     temp, LOW(RAMEND)
    out     SPL, temp
 
    ; Baudrate einstellen
 
    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<<UCSZ1)|(1<<UCSZ0)
    out     UCSRC, temp
 
    sbi     UCSRB,TXEN                  ; TX aktivieren
 
loop:
    ldi     zeichen, 'T'
    rcall   serout                      ; Unterprogramm aufrufen
    ldi     zeichen, 'e'
    rcall   serout                      ; Unterprogramm aufrufen
    ldi     zeichen, 's'
    rcall   serout                      ; ...
    ldi     zeichen, 't'
    rcall   serout
    ldi     zeichen, '!'
    rcall   serout
    ldi     zeichen, 10
    rcall   serout
    ldi     zeichen, 13
    rcall   serout
    rcall   sync                        
    rjmp    loop
 
serout:
    sbis    UCSRA,UDRE                  ; Warten bis UDR für das nächste
                                        ; Byte bereit ist
    rjmp    serout
    out     UDR, zeichen
    ret                                 ; zurück zum Hauptprogramm
 
; kleine Pause zum Synchronisieren des Empfängers, falls zwischenzeitlich
; das Kabel getrennt wurde
                                    
sync:
    ldi     r16,0
sync_1:
    ldi     r17,0
sync_loop:
    dec     r17
    brne    sync_loop
    dec     r16
    brne    sync_1  
    ret


Zum Thema Wackelkontakt: Hab jetzt mal alle unschönen Lötstellen nochmal 
nachgelötet, gebracht hats bisher leider nichts...

Autor: Krapao (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Das sieht nach Störungen aus, die nicht von der Software kommen.

Ich würde an deiner Stelle die Hardware näher untersuchen, also den 
Aufbau des µC Boards und die Verbindung zwischen PC und µC. Bei COM14 
vermute ich, dass zusätzlich ein USB-RS232 Wandler im Spiel ist.

> Starterkit aus dem Microcontroller.net Shop

Dieses?

AVR Starterkit (inkl. USB Programmer)
http://shop.embedded-projects.net/index.php?module...

Dort kannst du den AVR aus der IC-Fassung entfernen und RXD-TXD an der 
Fassung brücken. Alle vom PC aus gesendeten Zeichen müssen dann 
fehlerfrei an den PC zurück kommen, wenn der Rest der Hardware OK ist 
(Loopback-Test).

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

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Auch mal an allen Kabeln und Steckern wackeln.

Ich hab zb einen USB Stick, den ich beim Einstecken etwas in eine 
Richtung 'verkanten' muss, sonst wird der Stick nicht korrekt erkannt. 
Nachweislich auf 5 Rechnern ausprobiert. Es liegt am Stick und dessen 
mechanischem Steckeraufbau.

Autor: Falk Brunner (falk)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
@  Karl Heinz Buchegger (kbuchegg) (Moderator)

>Ich hab zb einen USB Stick, den ich beim Einstecken etwas in eine
>Richtung 'verkanten' muss, sonst wird der Stick nicht korrekt erkannt.
>Nachweislich auf 5 Rechnern ausprobiert. Es liegt am Stick und dessen
>mechanischem Steckeraufbau.

Klingt nach Wackelkontakt oder kalter Lötstelle. Würde ich umgehend 
entsorgen.

Autor: Stephan_S (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Vielen Dank für die weiteren Tipps!

Krapao schrieb:
>> Starterkit aus dem Microcontroller.net Shop
>
> Dieses?
>
> AVR Starterkit (inkl. USB Programmer)
> http://shop.embedded-projects.net/index.php?module...
>
> Dort kannst du den AVR aus der IC-Fassung entfernen und RXD-TXD an der
> Fassung brücken. Alle vom PC aus gesendeten Zeichen müssen dann
> fehlerfrei an den PC zurück kommen, wenn der Rest der Hardware OK ist
> (Loopback-Test).

Ja genau dieses Starterkit verwende ich! Den Loopback-Test habe ich 
durchgeführt -> Funktioniert! Wenn ich RXD und TXD brücke, dann kommen 
genau die eingegebenen Zeichen zurück (ohne Störungen)! (Ach ja, ein 
USB-RS232 ist auch im Spiel, aber an dem dürfte es ja dann auch nicht 
liegen,oder?)

Die richtige Folgerung wäre doch eigentlich, dass irgendwas an der 
Ausgabe des Controllers nicht stimmt!?! Um Verbindungsfehler 
auszuschließen habe ich auch die entscheidenden Pins zwischen MAX232 und 
µC direkt verbunden... erfolglos...
Oder der externe Quarz auf dem Board ist zu ungenau? Würde mich aber 
wundern, wenn das noch keinem zuvor aufgefallen wäre...

Autor: spess53 (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hi

>Oder der externe Quarz auf dem Board ist zu ungenau? Würde mich aber
>wundern, wenn das noch keinem zuvor aufgefallen wäre...

Unwahrscheinlich. Bist du Sicher, das der Quarzoszillator wirklich (per 
Fuse) aktiviert ist?

MfG Spess

Autor: Stephan_S (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
spess53 schrieb:
> Unwahrscheinlich. Bist du Sicher, das der Quarzoszillator wirklich (per
> Fuse) aktiviert ist?

Ich sag mal zu 99% ja.
Ich setz die Fuses übers AVR-Studio. Bei der Option SUT_CKSEL habe ich 
"Ext. Crystal/Resonator high Freq; Start-up time: 16 CK + 64ms" 
eingestellt. An den andren Fuses habe ich nichts verändert.
Dies führt dann zu folgender Bitkombination:

HIGH: 0xD9
LOW:  0x3F

Diese wiederum entspricht den Empfehlungen im Tutorial...
Weiß jetzt irgendwie nicht mehr weiter...

Autor: Kai Klaas (klaas)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Mit dem Oszi mal angeschaut, was am Ende des Kabels ankommt? Stimmt das 
Timing für 9600 Baud? Ist da ein Wackler im Kabel? Gehts mit einem 
anderen Kabel?

Autor: Paul Baumann (paul_baumann)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Miss mal von Anschluß 2 und Anschluß 6 des MAX232 gegen Masse, ob da
ca +10 Volt bzw. -10 Volt anstehen.

Ich hatte auch mal so ein Fehlerbild wie Du und da lag es an dem MAX232.
Von 10 Stück hatte einer eine Macke.

MfG Paul

Autor: Stephan_S (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Also ich hab jetzt nochmal etwas rumgespielt und verschiedenste Sachen 
ausprobiert (auch Kabel z.T. erneuert etc.) und jetzt funktioniert es 
tatsächlich.

Vielen Dank nochmal für eure Hilfe!

Autor: Kai Klaas (klaas)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
>Also ich hab jetzt nochmal etwas rumgespielt und verschiedenste Sachen
>ausprobiert (auch Kabel z.T. erneuert etc.) und jetzt funktioniert es
>tatsächlich.
>
>Vielen Dank nochmal für eure Hilfe!

Und woran lag es jetzt?

Autor: Stephan_S (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
So wie es aussieht war es tatsächlich ein Wackelkontakt an einer 
Lötstelle, wie bereits von ein paar Seiten vermutet wurde.

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




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 erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net