mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART ist zu schnell


Autor: Herbert Morich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welche Software benutzt du auf PC-Seite? Vielleicht verschluck die die
Zeichen.

Autor: Thomas Burkhardt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Herbert Morich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thorsten (Gast)
Datum:

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

Autor: thkais (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Herbert Morich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.