PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timing-Probleme mit RS232 ..



linuxer7
04.02.2011, 10:49
Hallo Leute.

Ich hoffe ich bin hier richtig, wenn nicht bitte von den Admins verschieben. ;)

Ich habe ein kleines Problem mit RS232 und hoffe Ihr könnt mir helfen und
bevor jetzt jemand sagt:

Nimm "C"..
Nimm "Asembler"..
Schau in die Doku ...
etc.
Ich habe Bascom, und die Doks vorwärts und Rückwärts gewälzt. Ich habe gegoogelt und Bekannte gefragt, aber leider keine Lösung für mein Problem gefunden.

Zur Vorgeschichte:
Ich habe mir vor ein paar Wochen einen kleinen Roboter gebaut. Aus Geldmangel habe ich mir meinen IR-Sensor selber gebaut.
Wenn der groß ist soll er mal ein autonomer Staubsauger werden.

http://www.youtube.com/watch?v=D4ZRUNkrvfs

Mit dieser Sensor Platine kann ich bis zu 8 Sensoren einzeln ansteuern.
Der Controller des Robis ist ein atmega16.
Programmiert habe ich in Bascom.

Nun habe ich kleines Programm in Gambas2 (Linux Basic) geschrieben das mir grafisch den Robi darstellt und wo ich gezielt einzelne Sensoren und die Motoren abfragen kann.
Das Programm ist erst mal rudimentär und soll später ausgebaut werden.
Momentan ist die Verbindung zum Robi über ein RS232-Kabel.

Zum Problem:
Ich habe nun auf meinem Robi das Problem das wenn ich per RS232 in den Testmodus gehe er bei Abfrage der Motoren die befehle sauber ausführt.
Die Befehle die ich per RS232 mit Hterm für die Motoren übertrage sind:

links
rechts
beide
stop

Der Robi steuert dann dementsprechend die Motoren auch an und quittiert die empfangenen Befehle.

Bei den Sensoren habe ich das Problem das er nicht mehr den Sensor ausschaltet.
Ich kann den Sensor starten in Hterm mit den Befehlen..
sensor1 ein
sensor2 ein
sensor3 ein

..und sollte dann den jeweiligen Sensor auch wieder ausschalten können mit..
sensor aus.
Das ist der Plan.

Bei der Motor Steuerung funktioniert es. Bei den Sensoren nicht.
Während der Motor zustand zurück gesendet wird, werden beim Sensor der Stopp-Befehl abgeschnitten und das sieht dann so aus.
Siehe Anhang:

Ich bin ehrlich gesagt etwas mit meinem Latein am ende.
Wenn ich aus der Schleife den Befehl "call ir_1()" raus nehme und den Sensor abfrage funktioniert es. Es scheint also
irgendwie ein Timing-Problem zu sein.

Ich bin eigentlich davon ausgegangen das wenn der Controller per RS232 ein Zeichen empfängt das er es irgendwo zwischen puffert (Frame) bis zum Überlauf, oder bis zur Abfrage mit dem Input-befehl.

Hier habe ich die entscheidenden Sub-Routinen.


Do

If Ischarwaiting() = 1 Then
Input Empfangen
Call Decode()
End If
.
.
.
loop
end

Sub Ir_1()
Id1 = 1
For X = 0 To Max_ping
Ir1 = 1
Waitus 300
Ir1 = 0
Waitus 100
If Eingang = 1 And Sensor_test = 0 Then
Status_led = 1
Print "sensor1"
Call Vollbremsung
Waitms 200
Call Zurueck_setzen()
Waitms 200
Call Vollbremsung()
Schwenk = 1
Else
Status_led = 0
End If
If Eingang = 1 And Sensor_test = 1 Then
Status_led = 1
Print "sensor1"
Else
Status_led = 0
End If
Next X
Id1 = 0
End Sub


Sub Decode()
If Empfangen = "links" Then
Call Test_motor(1)
End If
If Empfangen = "rechts" Then
Call Test_motor(2)
End If
If Empfangen = "beide" Then
Call Test_motor(3)
End If
If Empfangen = "sensor1 ein" Then
Call Test_sensor(1)
End If
If Empfangen = "sensor2 ein" Then
Call Test_sensor(2)
End If
If Empfangen = "sensor3 ein" Then
Call Test_sensor(3)
End If
End Sub


Sub Test_sensor(byval Wert As Byte)
Dim Sens_nr As Byte

Sensor_test = 1
Sens_nr = Wert

Schleife_sensor_test:
If Sens_nr = 1 Then
Call Ir_1()
End If
If Sens_nr = 2 Then
Call Ir_2()
End If
If Sens_nr = 3 Then
Call Ir_3()
End If
If Ischarwaiting() = 1 Then
Input Empfangen
If Empfangen = "sensor aus" Then
Print "Sensor aus"
Sensor_test = 0
Exit Sub
End If
End If
Goto Schleife_sensor_test
End Sub


Sub Test_motor(byval Wert As Byte)
Call Odo_reset()
If Wert = 1 Then
Print "linker motor"
Call Nur_links()
End If
If Wert = 2 Then
Print "rechter motor"
Call Nur_rechts()
End If
If Wert = 3 Then
Print "beide motoren"
Call Voraus()
End If

Call Vollgas()
Call Anfahren()
Schleife_test:
If Ischarwaiting() = 1 Then
Input Empfangen
If Empfangen = "stop" Then
Call Vollbremsung()
Exit Sub
End If
End If
' Call Odometer()
Goto Schleife_test
End Sub


Ich weiß der eine oder andere wird jetzt die Hände über dem Kopf zusammenschlagen und etwas von Spagetticode murmeln.
Der Code ist gewachsen und wenn die primären Funktionen erst mal tun überarbeite ich den ganzen Code.
Versprochen. ;)

Aber erstmal muss die ganze Elektronik mit der Software zusammenspielen und ich muss wissen wieso er den Befehl "sensor aus" nicht ganz empfängt/auswertet.
Wieso er nur die beiden Anfangsbuchstaben anzeigt und den Rest des Befehls verschluckt.

Ich hoffe ich habe mich einigermaßen verständlich ausgedrückt und mein Problem geschildert.

Das sind die Werte für:


$regfile = "m16def.dat"
$framesize = 100
$swstack = 100
$hwstack = 100
$crystal = 16000000
$baud = 19200


Der Controller wird mir 16Mhz getaktet.

Ich hoffe Ihr findet den Fehler und habt eine Lösung für mein Problem.
Ich weiß nämlich nicht mehr weiter. ](*,)

Gruß
Thomas

PicNick
04.02.2011, 13:37
Wenn Empfangen = "sensorx ein" rufst du Test_sensor
In Test sensor checkst du den Sensor
dann fragst du, ob "sensor aus" empfangen wurde
wenn nein, machst du "goto" schleife_sensor_test (die du allerdings nicht herzeigst)
Aber wenn du da mal drin bist, fragst du NIE WIEDER auf "sensor aus" ab.

linuxer7
04.02.2011, 13:43
Hallo Leute.

Danke hat sich erledigt.
Habe die Lösung hier gefunden :)

http://halvar.at/elektronik/kleiner_bascom_avr_kurs/uart_rs232_vom_computer_2/

Gruß
Thomas

linuxer7
04.02.2011, 16:19
Hallo Robert.

Wie gesagt hat sich erledigt.
Will Dir aber trotzdem gerne Antworten.
"schleife_sensor_test"ist nur ein Label auf den gesprungen wird.

Schleife_sensor_test:
If Sens_nr = 1 Then
Call Ir_1()
End If
If Sens_nr = 2 Then
Call Ir_2()
End If
If Sens_nr = 3 Then
Call Ir_3()
End If
If Ischarwaiting() = 1 Then
Input Empfangen
If Empfangen = "sensor aus" Then
Print "Sensor aus"
Sensor_test = 0
Exit Sub
End If
End If
Goto Schleife_sensor_test

Ich verstecke nix ;)
Alles Da.

Gruß
Thomas