Forum: Mikrocontroller und Digitale Elektronik UART ist zu schnell


von Herbert Morich (Gast)


Lesenswert?

Hi Leute,
ich versuche schon seit Tagen zwischen uC und Pc eine verbindung via
UART und RS323 Schnittstelle herzustellen
Dabei soll der uC etwa 400 Hex Zahlen an den PC senden
das gelingt aber erst immer nach einer gewissen Zeit,
das heißt der uC beginnt mit den senden und nachdem schon etwa
40 bis 60 Byte's auf der Datenautobahn abgerauscht sind empfängt der
PC auch mal was, den Rest bekommt er einwandfrei mit nur eben der
Anfang bringt Schwierigkeiten
Alle Einstellungen über Baut Stopbit sind korrekt
Hatte jemand schon mal etwes ähnliches?

von Thorsten (Gast)


Lesenswert?

Welche Software benutzt du auf PC-Seite? Vielleicht verschluck die die
Zeichen.

von Thomas Burkhardt (Gast)


Lesenswert?

Hi, du nennst die RS232 "Datenautobahn"? Das ist doch eher eine
Datenlandstrasse :)

Mhh. Poste doch mal deinen Code. Ansonsten wirklich mal ein anderes
Terminal benutzen, auch wenn der Fehler ziemlich eigentümlich
erscheint.

von Herbert Morich (Gast)


Lesenswert?

Hi
Zu Thorsten. So kommt es mir auch vor. Ich denke der PC benötigt eine
kleine Zeit um "Aufzuwachen" (synchronisieren oder so etwas
ähnliches) und da huschen ihm immer ein paar Byte's durch die Lappen
Ich benutze auf PC-Seite ein selbstgeschriebenes Programm in Borland
C++ das unter DOS läuft(Eingabeaufforderung). Die Routienen zum
einlesen der Daten müßten aber funsen da es immer die selben sind und
nach einer gewissen Zeit das ganze auch tadellos funktioniert.
Zu Thomas:
OK ich nehme die Autobahn zurück, Landstraße ist, glaub ich auch, doch
richtiger:)

Hier ist der Code(chen) des uC
.nolist
.include"8515def.inc"
.list

.def cnt  = r18
.def prm1 = r17
.def temp = r16
.equ CLOCK = 4000000
.equ BAUD = 9600
.equ UBRRVAL = CLOCK/(BAUD*16)-1
.equ Ram =$060


.cseg

rjmp Initial    ; Einsprung nach Reset


ZRegNull:
    ; Anfangsadresse des Ramspeicher
    ; in den Z-Pointer laden
    ldi ZH,high(Ram)
    ldi ZL,low(Ram)
    ret
;-------------------------------------------
LoescheSpeicher:
    ; Ramspeicher von $060 bis
    ; $0FA0 auffüllen
    rcall ZRegNull
    ldi temp,$00
LS01:
    st z+,temp
    inc temp

    cpi ZL,$50
    brne LS01
    cpi ZH,$02
    brne LS01
    ret
;-------------------------------------------
SendeSpeicher:
    ; Den Inhalt des Speichers an der
    ; UART Schnittstelle aussenden

    rcall ZRegNull


    sbi UCR,TXEN
OT1:
    ld prm1,Z+
    rcall SendDat

    cpi ZL,$50
    brne OT1
    cpi ZH,$02
    brne OT1
    ret

;----------------------------------------------
SendDat:
serout:
        sbis USR,UDRE             ; Warten bis UDR für das nächste
                                  ; Byte bereit ist
        rjmp serout
    nop
    nop
    nop
    nop
        out UDR, prm1

    nop
    nop
    nop
        ret                               ; zurück zum Hauptprogramm
;-----------------------------------------------

Main:
    ; Hauptprogramm
    rcall LoescheSpeicher
    rcall SendeSpeicher

Ma1:
    rjmp Ma1
;--------------------------------------------
Initial:
       ; Stackpointer initialisieren
        ldi temp, LOW(RAMEND)
        out SPL, temp
        ldi temp, 2
        out SPH, temp


        ; Baudrate einstellen
        ldi temp, 77
        out UBRR, temp
  rjmp Main

von Thorsten (Gast)


Lesenswert?

Besorge dir am besten mal ein Terminal Programm für DOS und teste damit.

von thkais (Gast)


Lesenswert?

Ich hatte mal ähnliche Probleme. Bei mir lag es daran, daß beim Reset
des Controllers ein kurzer Impuls auf der TX-Leitung durchrutschte und
so dem PC ein Start-Bit suggerierte. Die Anschließend gesendeten Daten
paßten dann nicht mehr ins Timing (z.B. falsches Stop-Bit).
Nachdem ich nach der Initialisierung des UART eine Warteschleife von
der Dauer von 2 Bytes eingebaut hatte, war das Problem erledigt.
Allerdings sind mir bestenfalls 3-4 Bytes durch die Lappen gegangen.

von Herbert Morich (Gast)


Lesenswert?

Hallo,
glaube ich hab den Fehlerteufel entdeckt. Hab mein Programm auf
PC-Seite auf ein Minimum abgespeckt(nur noch Port überwachen +
empfangene Daten anzeigen) und siehe da, es funst. Also Schande über
mein Haupt:((
Hab da wahrscheinlich 'ne C-Funktion erwischt die den Rechner leicht
aus der Bahn wirft(kommt davon wenn man vorgekauten Müll benutzt und
sich nicht die Mühe macht alles selber zu schreiben)
Möchte mich noch bei allen bedanken die ihre grauen Zellen in Wallung
brachten und sich den Kopf über meine Problemchen zerbrachen.
Gentleman's es war mir'ne Ehre mit Euch zusammen arbeiten zu dürfen
Also dann vielen Dank und ab zum nächsten Bug

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.