- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 4 von 4

Thema: Anfänger braucht Hilfe bei Datenübertragung PC->µC

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Benutzer Stammmitglied
    Registriert seit
    08.02.2007
    Alter
    46
    Beiträge
    40

    Anfänger braucht Hilfe bei Datenübertragung PC->µC

    Hallo !

    Ich habe das Problem wenn ich einen String von meiner PC-RS232 Schnittstelle an meinen Atmega32 sende immer nur das 1. und manchmal auch das 2. Zeichen korrekt übertragen wird... Der Rest ist immer Müll..

    Das Empfangen der Daten vom µC auf dem PC funktioniert ohne Probleme!
    Wenn ich die Zeichen aber einzeln übertrage und dazwischen jeweils eine Millisekunde Zeit lasse dann werden alle Zeichen ordnungsgemäß übertragen.

    Vom PC aus sende ich die Daten mit einem Visual Basic Programm.

    Hier der VB6 Source:

    Code:
    Private Sub Command1_Click()
        ' Call ComAusgabe("MaXX")                 ‚<- funz weil 1ms pause zw jedem Zeichen…
    
        MSComm1.Output = "MaXX"               ‘<-funzt nicht  es kommt nur „Ma…ý“ an
    End Sub
    
    Private Sub ComAusgabe(Zeile As String)
     Dim Count As Integer
     For Count = 1 To Len(Zeile)
       Sleep 1
       MSComm1.Output = Mid(Zeile, Count, 1)
     Next Count
    End Sub
    
    
    Private Sub Form_Load()
        MSComm1.CommPort = 1
        MSComm1.Settings = "9600,N,8,1"
        MSComm1.PortOpen = True
        MSComm1.RThreshold = 1
        MSComm1.SThreshold = 1
        MSComm1.InputLen = 0
    End Sub
    
    Private Sub MSComm1_OnComm()
     Select Case MSComm1.CommEvent
        Case comOverrun:   MsgBox "Datenverlust!"
        Case comRxOver:    MsgBox "Datenverlust!"
        Case comEvReceive: Text = Text & MSComm1.Input
      End Select
      code.SetFocus
      code.Text = code.Text & Text
    End Sub
    
    Private Sub Form_Close()
        MSComm1.PortOpen = False
    End Sub

    Bascom Programm
    Code:
    '------------[Meta]-------------------------------------------------------------
    $regfile = "m32def.dat"
    $crystal = 11592000
    
    $hwstack = 32
    $swstack = 10
    '$framesize = 40
    $baud = 9600
    '------------[Lib für glcdKS108]------------------------------------------------
    $lib "glcdKS108.lbx"
    
    '------------[GLCD Config]------------------------------------------------------
    Config Graphlcd = 128 * 64sed , Dataport = Portc , Controlport = Porta , Ce = 1 , Ce2 = 2 , Cd = 3 , Rd = 4 , Reset = 0 , Enable = 5
    Cls
    Setfont Font8x8
    
    On Urxc Onrxd
    Dim I As Byte
    Dim S As String * 10
    
    Ddrd.5 = 1
    
    Enable Urxc
    Enable Interrupts
    
    Main:
       Portd.5 = Not Portd.5
       Waitms 1
    Goto Main
    
    Onrxd:
       I = Udr
       Udr = I
       S = S + Chr(i)
    
       Cls
       Lcdat 1 , 1 , S
    Return
    
    '------------[Ende]-------------------------------------------------------------
    End
    $include "font8x8.font"

    Gibt es eine möglichkeit den µC zu fragen ob er empfangsbereit ist o.ä?

    Ich wäre für jede Hilfe Dankbar!

    MfG MaXX

    PS: Ich bemerke gerade dass bei längeren Strings die Wartezeit von 1ms nicht mehr ausreicht
    Angehängte Dateien Angehängte Dateien

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.09.2005
    Beiträge
    276
    Lösche LCD und jedes Zeichen dann einzehln zeigen kostet richtig Zeit.

    Ansonsten hätte ich noch viele Lösungsansätze.

    z.Z. aber Müde

    Gento

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    28.10.2004
    Ort
    Baoding
    Alter
    45
    Beiträge
    689
    Hallo TC-Maxx und Wilkommen hier im Forum

    Die Interrupt-Rotiene sollte man so kurz wie möglich halten. Da LCD-Befehle sehr Zeitaufwendig sind haben die in der Interruptrotiene nichts zu suchen. Da Arbeitet er noch das erste Zeichen ab und das nächste kommt schon. Mann kann in der Interruptrotiene ein Flag setzten das neue Daten da sind und in der Hauptschleife dann das LCD aktualisieren(wenn das Flag gesetzt ist).

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    08.02.2007
    Alter
    46
    Beiträge
    40
    Hallo und Danke für eure Antworten!

    Ich habe mein Programm abgeändert.
    Code:
    '------------[Meta]-------------------------------------------------------------
    $regfile = "m32def.dat"
    $crystal = 11592000
    $hwstack = 32
    $swstack = 10
    $framesize = 40
    $baud = 9600
    '------------[Lib für glcdKS108]------------------------------------------------
    $lib "glcdKS108.lbx"
    
    '------------[GLCD Config]------------------------------------------------------
    Config Graphlcd = 128 * 64sed , Dataport = Portc , Controlport = Porta , Ce = 1 , Ce2 = 2 , Cd = 3 , Rd = 4 , Reset = 0 , Enable = 5
    Cls
    Setfont Font8x8
    
    '------------[Programm]---------------------------------------------------------
    On Urxc Onrxd
    Dim I As Byte
    Dim S As String * 100
    Dim Flagset As Bit
    Dim Lenstr As Integer
    
    Ddrd.5 = 1
    
    Enable Urxc
    Enable Interrupts
    
    Main:
       If Flagset = 1 Then
          Portd.5 = Not Portd.5                                 'Damit die LED blinkt..
          S = S + Chr(i)
          Reset Flagset
    
          Lenstr = Len(s) * 8 : Lenstr = Lenstr - 7
          Lcdat 1 , Lenstr , Chr(i)
          Lcdat 3 , 1 , Lenstr
       End If
    Goto Main
    
    Onrxd:
       I = Udr
       Set Flagset
    '   Udr = I                                                  'Echo an UART
    Return
    
    '------------[Ende]-------------------------------------------------------------
    End
    $include "font8x8.font"
    und hatte immer noch das gleiche Problem ..



    PS: Fehler gefunden:

    $crystal = 11592000 hatte ich falsch angegeben
    Ich hab's geändert in:
    $crystal = 11059200

    MfG MaXX

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress