PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Controller verschluckt 4. Zeichen



AVRbrauns
07.12.2007, 13:09
Hallo Zusammen,
wir haben das rn-Board mit dem 2560 Controller.

Wir haben die rn-Control per USB (UART) mit dem PC verbunden und auf dem PC ein Terminal gestartet.
Zu Tests habe ich ein Bascom Programm geschrieben, welches alle ankommenden Zeichen an der UART-Schnittstelle sofort wieder rauschickt.

Sendet man mit dem Terminal zum Beispiel "Test" an den Controler, so erwiedert dieser auch sämtliche Zeichen und sendet "Test" zurück.
Bei einem Wort mit 5 Buchstaben z.B. "Start" wird das 4. Zeichen verschluckt und nur "Stat" zurück an das Terminal gesendet.

Wenn ich das Terminal innerhalb des PCs mit 2 Commports verbinde, dann klappt das prima.

Vielleicht hat jemand einen Tip woran das liegen könnte ?

Vielen Dank im vorraus


Folgender Programm Code befindet sich auf dem Atmel:



$regfile = "m2560def.dat"
$hwstack = 82 '80
$framesize = 68 ' 64
$swstack = 68 '44


$crystal = 16000000 'Quarzfrequenz
$baud = 9600



'Config Scl = Portd.0 'Ports fuer IIC-Bus
'Config Sda = Portd.1

Sound Portg.5 , 400 , 450 'BEEP
Sound Portg.5 , 400 , 250 'BEEP
Sound Portg.5 , 400 , 450 'BEEP

Config Pind.5 = Output
Led Alias Portd.5

Config Pine.5 = Input
Usb Alias Pine.5 'Ist 1 wenn USB angeschlossen


'Usb Schnittstelle UART initialisierung
Config Com4 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Open "com4:" For Binary As #4 'USB Buchse


'Initialisierung LCD
Config Pinf.6 = Output
Lcd_rw Alias Portf.6
Lcd_rw = 0

Config Lcd = 20 * 4a , Chipset = Ks077
Config Lcdpin = Pin , Db4 = Portf.3 , Db5 = Portf.2 , Db6 = Portf.1 , Db7 = Portf.0 , E = Portf.5 , Rs = Portf.7
Config Lcdbus = 4

Initlcd

'Ansteuerung LCD
Cls
Locate 1 , 1 'Cursor auf 1 Zeile, 1 Spalte
Lcd "Test-Platine"
Print #4 ,"Test-Platine"

Locate 2 , 1
Lcd "Initialisierung"
Print #4 ,"Initialisierung"

Locate 3 , 1
Lcd "Ausgabe"
Print #4 ,"Initialisierung"

Locate 4 , 1
Lcd ""


Dim B As Byte
Dim L As Integer
L = 1
'Schleife Tastatureingabe replay

Do
B = Inkey(#4)
'Waitms 500

If B <> 0 Then
Print #4 , Chr(b)
Locate 4 , L
Lcd Chr(b)
L = L + 1
End If

Loop

End

roboterheld
07.12.2007, 13:49
....Wenn ich das Terminal innerhalb des PCs mit 2 Commports verbinde, dann klappt das prima. ...

wofür soll das denn gut sein he...lol...damit findest du nicht den fehler innerhalb des pc.

AVRbrauns
07.12.2007, 13:57
Die Verbindung der 2 Commports war nur zum Testen.Ob das Terminal die Daten korrekt sendet und empfängt oder der Fehler schon im Terminal liegt... ALso virtuelle Verbindung im Terminal und beide Comports des PCs mit einem COM-Kabel verbunden...
Dazu habe ich das Terminal dann 2x gestartet und jeweils mit einem Comport vorbunden, sozusagen als Chat ;-)

Das Problem ist aber beim Microcontroller.
Ich sende mit dem Terminal ein Wort zum COntroler.
Dieser empfängt das und soll es 1zu1 wieder zurück schicken.
Leider kommt dann der 4. Buchstabe des Wortes nicht an, also:
Start -> Stat

Komischerweise funktioniert ein 4 zeichen Wort Problemlos
Test -> Test

Habe ich einen Fehler im Bascom oder wo liegt denn mein Fehler ?
Ich verstehe das nicht

robodriver
07.12.2007, 14:05
Hm, also 16MHz und 9600 Baud...
klingt eigentlich gut: 0,8% fehler sollte eigentlich noch gehen. (Man sagt maximal 1%)
siehe hier: http://www.mikrocontroller.net/articles/AVR-Tutorial:_UART

Ansonsten kannst du es nur mit nem krummen Quarz probieren. Dadurch geht die Fehlerrate runter (nicht immer aber öffters)

Ansonsten: Was zeitg er denn auf dem LCD an? Start oder auch nur Stat?

Ach ja: und was passiert denn wenn du ein längeres Wort mit z.B. 12 Zeiche oder so sendest? fehlt dann immer jeder 4. Buchstabe oder wie schauts dann so aus?

AVRbrauns
07.12.2007, 14:14
Auf dem LCD wird auch nur Stat angezeigt.
Irgendwo wird also mein 4. Zeichen verschluckt.


Der Text, welcher beim Starten des Programms gesendet wird:
Test-Platine
Initialisierung
Initialisierung
Kommt auch ohne Fehler im Terminal und auf dem LCD-Display an. Es liegt also wohl Tatsächlich am Empfangen und Weiterverarbeiten...

Kann eine Änderung des Quarzes den gewünschten Erflog bringen ?

robodriver
07.12.2007, 16:21
Okay, also ich sehe grad das ich mich verrechnet hatte:
9600 Baud und 16MHz ergeben laud BASCOM berechnung 0,16% Fehler. Also absolut top.

Also ich vermute das sich dein Controller dabei etwas "verschluckt" durch das senden und wieder empfangen.
Schreib deine Schleife mal (nur zum testen) folgender maßen (der rest gleich wie oben):

PS: Die Variable L kannst du dir auch sparen ;)




Do
B = Inkey(#4)
'Waitms 500

If B <> 0 Then
Locate 4 , L
Lcd Chr(b)
L = L + 1
End If

Loop



So und dann sag mal was dein LCD so ausspuckt

AlKI
07.12.2007, 17:20
wie sieht es eigentlich mit 6-stelligen Texten aus? kommt dann statt "Start2" "Sta2"???

AVRbrauns
10.12.2007, 09:26
Hallo, leider konnte ich das erst jetzt testen...

Mit dem Code von robodriver wird das Wort "Start" nun korrekt auf dem Display angezeigt.
Wenn ich aber das Wort "Starte" eingeben dann wird auch hier nur "stare" angezeigt.
Das Problem hat sich jetzt also um ein Zeichen verschoben...

Vielen Dank

AlKI
10.12.2007, 10:44
wie sieht es bei deinem alten code aus?

ich hätte nämlich gerade auf eine zu klein deklarierte Variable getippt, kenn mich aber in dem bereich senden/empfangen noch nicht so gut aus....

AVRbrauns
10.12.2007, 11:01
Wenn man bei der alten Version ein Wort mit 5 Buchstaben sendet "Start2", dann erhält man als Ausgabe auf dem Display und dem Terminal "Stat2"

Er verschluckt also immer das 4. Zeichen :-(

peterfido
10.12.2007, 13:23
Wenn der Code kleiner wird, dafür aber ein Zeichen mehr ankommt, dann würde ich mal auf Eingangsbufferüberlauf tippen. Es könnte sein, dass durch den LCD Befehl eine Pause mit eingebracht wird. Wie sieht es denn ohne ausgabe auf dem LCD aus? Lässt sich der Eingang evtl per Interrupt abfragen?

robodriver
10.12.2007, 21:00
Ja, das Problem bei BASCOM ist das man keine Bufferlänge für die RS232 einstellen kann.

Aber peterfido hat recht:
Das "schreiben" auf dem LCD nimmt generell sehr viel Zeit in Anspruch. Es kann sein das er durch das lange schreiben dann ein Zeichen am RS232 verschluckt.

Also probiers doch mal mit dieser Schleife:



Do
B = Inkey(#4)
If B <> 0 Then Print #4 , Chr(b)
Loop


Ach ja, und tu uns mal den gefallen: Teste das ganze doch auch mal mit längeren Zeichenketten. Mit 10 Zeichen am Stück oder so. Dann sieht man sowas auf einem Blick obs immer das vorletzte Ist oder immer das 4. und immer jedes 4. oder ob der Fehler immer in unregelmäßigen Abständen auftritt.
Also ruhig mal mit 10 Zeichen und 11 und 12 und 13 und so probieren.

Gruß Robodriver

AVRbrauns
11.12.2007, 11:22
Ersteinmal vielen Dank für eurer Bemühungen.

Wenn ich das LCD Display nicht anspreche, dann reagiert der Controller viel schneller.

Folgendes kann ich dann übertragen, aber auch hier sind noch Fehler vorhanden. Das kann doch net sein oder ?
Wir haben mittlerweile auch schon eine 2. Platine versucht, aber bei dieser tritt der gleiche Effekt auf.
Ist der Quellcode an sich schlecht oder liegt es an Bascom ?


start1 start1
starte1 start1
rrrssstttt rrrsstt
123456789ab 123458b
123456789abc 123458bc
123456789abcdefghijkl 123458behkl

robodriver
11.12.2007, 14:39
Hm, also der Fehler scheint doch recht unregelmäßig zu kommen.

Vielleicht schauen wir nochmal kurz auf die Hardware:
Bitte miss mal die Spannung am MAX232 Baustein nach. Vielleicht reichen die Pegel nicht ganz aus.

Und ansonsten würde mir jetzt nur noch eins einfallen:
Schick den empfangenen String mal erst dann zurück wenn er vollständig übertragen wurde (erfordert ein <Enter> am Ende des Strings (chr10 und chr13):




dim str as string * 15
dim Buchstabe as string * 1
str=""
Do
B = Inkey(#4)
buchstabe = chr(b)
If b = 13 then
Print #4 , str
str = ""
Else
str = str + buchstabe
End If
Loop


Probier dann mit diesem Code nochmal die Zeichenketten die du oben schonmal probiert hast. Wenns dann immer noch net klappt muss es eigentlich an der Hardware liegen.

Gruß Robodriver

peterfido
11.12.2007, 22:44
Max232 bei USB? Ich nutze für USB den FTDI und habe bei 57600 keine Probleme. Der Fehler muss irgendwo anders sein. Evtl mal die Hardware überprüfen und die Kondensatoren an der Versorgunsspannung nicht weglassen.

robodriver
12.12.2007, 06:45
Hm, das angesprochene Board hab ich hier leider noch nicht gefunden.
Und da ich in einer Schaltung auch Daten über USB übertrage und das ganze über FT232 --> MAX232 läuft, dachte funktioniert das hier genauso (oder halt über den FTDI)
Irgend eine Wandlung muss drinne sein, denn im Programm spricht er ja RS232 an.
Und da ist immer das Problem das der Controller mit TTL-Pegel arbeitet aber RS232 immer erst auf den +12/-12V Pegel gewandelt werden muss.
5V ist für RS232 ein undefinierter zustand. Desshalb ist es immer wichtig das die 12 Volt vernünftig erzeugt werden

AVRbrauns
12.12.2007, 08:24
Also wenn das vion Interesse sein könnte, wir haben dieses Board:

http://www.shop.robotikhardware.de/shop/catalog/product_info.php?cPath=64&products_id=162

robodriver
12.12.2007, 10:24
okay, das ist ein fetiger USB treiber. Welcher genau steht leider nicht drinne. Aber offensichtlich wird dort mit keinen echten RS232 Pegeln sondern nur mit den TTL Pegeln gearbeitet. Also meine Vermutung ist damit schonmal zunichte.

Aber ich habe gesehen dass das Board auch noch eine echte RS232 Schmittstelle mit echten Pegeln hat (MAX232).
Kannst ja mal versuchen diese an deinen PC anzuschließen und das ganze nochmal zu versuchen.


Bitte vergiss aber nicht mal das von gestern 15:39 Uhr mal um zu setzen. Denn damit müsste es eigentlich dann funktionieren. Wenn nicht muss es ein Hardware fehler sein.