PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anfänger braucht Hilfe bei Datenübertragung PC->µC



tc-maxx
09.02.2007, 23:56
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:




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


'------------[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

Gento
10.02.2007, 06:21
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

Rofo88
10.02.2007, 08:56
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).

tc-maxx
10.02.2007, 14:51
Hallo und Danke für eure Antworten!

Ich habe mein Programm abgeändert.


'------------[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