Roberto
01.11.2005, 06:17
Hallo Leute
Habe mir da so einen kleinen Bot gebaut:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=13915
Den habe ich mal so gesteuert:
'--------Roboter KKL Steuerung --------------------
' Mit externen 10MHz Quarz
$regfile = "m8def.dat"
$crystal = 8000000
'---Config Port's--------------------
Config Portd = Input
Portd = 255
Config Portb = Output
'---Sonstiges------------------------
Dim A As Word
Links_vorne Alias Pind.3
Links_hinten Alias Pind.4
Rechts_vorne Alias Pind.1
Rechts_hinten Alias Pind.0
'================================================= =======================
'========= Hauptprogramm ================================================
'================================================= =======================
Portb = 0
Gosub Vor
Do
If Links_vorne = 0 Then
Gosub Zurueck
Wait 2
Gosub Rechts
Wait 2
Gosub Vor
End If
If Rechts_vorne = 0 Then
Gosub Zurueck
Wait 2
Gosub Links
Wait 2
Gosub Vor
End If
Loop
End
'===============UnterProgramme==================== =======================
Links:
Portb.1 = 1
Portb.2 = 1
Portb.3 = 0
Return
Rechts:
Portb.1 = 1
Portb.2 = 0
Portb.3 = 1
Return
Zurueck:
Portb.1 = 1
Portb.2 = 1
Portb.3 = 1
Return
Vor:
Portb.1 = 1
Portb.2 = 0
Portb.3 = 0
Return
Stopen:
Portb.1 = 0
Portb.2 = 0
Portb.3 = 0
Return
Noch mit Waits.... aber es funktionierte schonmal :-)
Nächster Schritt:
'--------Roboter KKL Steuerung --------------------
' Mit externen 10MHz Quarz
'$sim
$regfile = "m8def.dat"
$crystal = 8000000
'---Config Port's--------------------
Config Portd = Input
Portd = 255
Config Portb = Output
'---Config Timer -------------------
Config Timer0 = Timer , Prescale = 64
'---Sonstiges------------------------
Dim Sensor As Byte
Links_vorne Alias Pind.0
Rechts_vorne Alias Pind.1
Links_hinten Alias Pind.2
Rechts_hinten Alias Pind.3
On Timer0 Sensoren_auswerten
Enable Timer0
Enable Interrupts
'================================================= =======================
'========= Hauptprogramm ================================================
'================================================= =======================
Portb = 0
Gosub Vor
Do
If Sensor = 1 Then
Gosub Zurueck
Wait 2
Gosub Rechts
Wait 2
Gosub Vor
End If
If Sensor = 2 Then
Gosub Zurueck
Wait 2
Gosub Links
Wait 2
Gosub Vor
End If
If Sensor = 3 Then
Gosub Vor
Waitms 500
Gosub Links
Waitms 500
Gosub Vor
End If
If Sensor = 4 Then
Gosub Vor
Waitms 500
Gosub Rechts
Waitms 500
Gosub Vor
End If
Loop
End
'===============UnterProgramme==================== =======================
Sensoren_auswerten:
'Timer0 = 0
Sensor = 0
If Links_vorne = 0 Then Sensor = 1
If Rechts_vorne = 0 Then Sensor = 2
If Links_hinten = 0 Then Sensor = 3
If Rechts_hinten = 0 Then Sensor = 4
'Gosub Zurueck
Return
Links:
Portb.1 = 1
Portb.2 = 1
Portb.3 = 0
Return
Rechts:
Portb.1 = 1
Portb.2 = 0
Portb.3 = 1
Return
Zurueck:
Portb.1 = 1
Portb.2 = 1
Portb.3 = 1
Return
Vor:
Portb.1 = 1
Portb.2 = 0
Portb.3 = 0
Return
Stopen:
Portb.1 = 0
Portb.2 = 0
Portb.3 = 0
Return
Da verwende ich einen Timer0 als interrupt,.
der Soll mir immer die Sensoren (bei Überlauf)
(derzeit noch 4 Mikroschalter, später vielleicht mehr Sensoren..),
Life auslesen und auch Life reagieren.
Natürlich passen hier die Waits noch nicht, weil er so seinen Ausweichschritt fertig macht und dann erst neu auf Sensoren reagiert.
Habe das mal so probiert, funktioniert aber nicht, weil man aus einem Interrupt wohl nicht verzweigen darf.
'--------Roboter KKL Steuerung --------------------
'$sim
$regfile = "m8def.dat"
$crystal = 8000000
'---Config Port's--------------------
Config Portd = Input
Portd = 255
Config Portb = Output
'---Config Timer -------------------
Config Timer0 = Timer , Prescale = 64
'---Sonstiges------------------------
Dim Sensor As Byte
Links_vorne Alias Pind.0
Rechts_vorne Alias Pind.1
Links_hinten Alias Pind.2
Rechts_hinten Alias Pind.3
On Timer0 Sensoren_auswerten
Enable Timer0
Enable Interrupts
'================================================= =======================
'========= Hauptprogramm ================================================
'================================================= =======================
Portb = 0
Gosub Vor
Do
Goto Sprung
Ausweichen_rechts:
Gosub Zurueck
Wait 2
Gosub Rechts
Wait 2
Gosub Vor
Goto Sprung
Ausweichen_links:
Gosub Zurueck
Wait 2
Gosub Links
Wait 2
Gosub Vor
Goto Sprung
R_ausweichen_links:
Gosub Vor
Waitms 500
Gosub Links
Waitms 500
Gosub Vor
Goto Sprung
R_ausweichen_rechst:
Gosub Vor
Waitms 500
Gosub Rechts
Waitms 500
Gosub Vor
Goto Sprung
Sprung:
Loop
End
'===============UnterProgramme==================== =======================
Sensoren_auswerten:
'Timer0 = 0
Sensor = 0
If Links_vorne = 0 Then Goto Ausweichen_rechts
If Rechts_vorne = 0 Then Goto Ausweichen_links
If Links_hinten = 0 Then Goto R_ausweichen_rechst
If Rechts_hinten = 0 Then Goto R_ausweichen_links
Return
Links:
Portb.1 = 1
Portb.2 = 1
Portb.3 = 0
Return
Rechts:
Portb.1 = 1
Portb.2 = 0
Portb.3 = 1
Return
Zurueck:
Portb.1 = 1
Portb.2 = 1
Portb.3 = 1
Return
Vor:
Portb.1 = 1
Portb.2 = 0
Portb.3 = 0
Return
Stopen:
Portb.1 = 0
Portb.2 = 0
Portb.3 = 0
Return
Mein Ziel wäre es, dass er z.B.:
Wenn z.B. der Linke vordere Schalter schaltet, soll er ein Stück rückwärts und dann nach rechts ausweichen.
Während er aber ausweicht, sollte er auf alle anderen Sensoren auch noch reagieren. (z.B. die hinteren. )
Hat jemand eine Idee/Vorschlag wie man das am besten aufbauen kann?!
Es sollte auch Modular sein..
Ich dachte zuerst so:
Der Interrupt fragt immer die Sensoren selbstständig ab, und speichert einen Wert für einen Sensor in einer Variablen namens "Sensor"
z.B. Taster Links_vorne = 1 u.s.w. (wie im vorletzten Beispiel)
Die Variable Sensor, müsste ich dann extra im Hauptprogramm abfragen und dann je nach Wert, in ein Unterprogramm verzweigen... (z.B nach ausweichen_rechts)
Im Unterprogramm selbst,müsste ich auch wieder den Sensorwert auswerten (nach allen möglichkeiten)...um das Unterprogramm abzubrechen, falls sich ein Sensor ändert.. :-(
Irgendwie wird das dann alles zu aufgebläht :-(
Geht das irgendwie einfacher ?
Irgendwie sollte das dann auch so funktionieren, dass man im einfach auch was lernen kann... (also nicht nur "fixer" Code..)
Also bestimmte Bedingungen einfach beschreiben kann, auf die er dann reagieren soll...
Irgendwie sehe ich noch keinen rechten Weg, wie es funktionieren könnte...
Vielleicht mit Tabellen ..?!
Vielleicht wisst ihr ja mehr..
l.G. aus Graz :-)
Habe mir da so einen kleinen Bot gebaut:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=13915
Den habe ich mal so gesteuert:
'--------Roboter KKL Steuerung --------------------
' Mit externen 10MHz Quarz
$regfile = "m8def.dat"
$crystal = 8000000
'---Config Port's--------------------
Config Portd = Input
Portd = 255
Config Portb = Output
'---Sonstiges------------------------
Dim A As Word
Links_vorne Alias Pind.3
Links_hinten Alias Pind.4
Rechts_vorne Alias Pind.1
Rechts_hinten Alias Pind.0
'================================================= =======================
'========= Hauptprogramm ================================================
'================================================= =======================
Portb = 0
Gosub Vor
Do
If Links_vorne = 0 Then
Gosub Zurueck
Wait 2
Gosub Rechts
Wait 2
Gosub Vor
End If
If Rechts_vorne = 0 Then
Gosub Zurueck
Wait 2
Gosub Links
Wait 2
Gosub Vor
End If
Loop
End
'===============UnterProgramme==================== =======================
Links:
Portb.1 = 1
Portb.2 = 1
Portb.3 = 0
Return
Rechts:
Portb.1 = 1
Portb.2 = 0
Portb.3 = 1
Return
Zurueck:
Portb.1 = 1
Portb.2 = 1
Portb.3 = 1
Return
Vor:
Portb.1 = 1
Portb.2 = 0
Portb.3 = 0
Return
Stopen:
Portb.1 = 0
Portb.2 = 0
Portb.3 = 0
Return
Noch mit Waits.... aber es funktionierte schonmal :-)
Nächster Schritt:
'--------Roboter KKL Steuerung --------------------
' Mit externen 10MHz Quarz
'$sim
$regfile = "m8def.dat"
$crystal = 8000000
'---Config Port's--------------------
Config Portd = Input
Portd = 255
Config Portb = Output
'---Config Timer -------------------
Config Timer0 = Timer , Prescale = 64
'---Sonstiges------------------------
Dim Sensor As Byte
Links_vorne Alias Pind.0
Rechts_vorne Alias Pind.1
Links_hinten Alias Pind.2
Rechts_hinten Alias Pind.3
On Timer0 Sensoren_auswerten
Enable Timer0
Enable Interrupts
'================================================= =======================
'========= Hauptprogramm ================================================
'================================================= =======================
Portb = 0
Gosub Vor
Do
If Sensor = 1 Then
Gosub Zurueck
Wait 2
Gosub Rechts
Wait 2
Gosub Vor
End If
If Sensor = 2 Then
Gosub Zurueck
Wait 2
Gosub Links
Wait 2
Gosub Vor
End If
If Sensor = 3 Then
Gosub Vor
Waitms 500
Gosub Links
Waitms 500
Gosub Vor
End If
If Sensor = 4 Then
Gosub Vor
Waitms 500
Gosub Rechts
Waitms 500
Gosub Vor
End If
Loop
End
'===============UnterProgramme==================== =======================
Sensoren_auswerten:
'Timer0 = 0
Sensor = 0
If Links_vorne = 0 Then Sensor = 1
If Rechts_vorne = 0 Then Sensor = 2
If Links_hinten = 0 Then Sensor = 3
If Rechts_hinten = 0 Then Sensor = 4
'Gosub Zurueck
Return
Links:
Portb.1 = 1
Portb.2 = 1
Portb.3 = 0
Return
Rechts:
Portb.1 = 1
Portb.2 = 0
Portb.3 = 1
Return
Zurueck:
Portb.1 = 1
Portb.2 = 1
Portb.3 = 1
Return
Vor:
Portb.1 = 1
Portb.2 = 0
Portb.3 = 0
Return
Stopen:
Portb.1 = 0
Portb.2 = 0
Portb.3 = 0
Return
Da verwende ich einen Timer0 als interrupt,.
der Soll mir immer die Sensoren (bei Überlauf)
(derzeit noch 4 Mikroschalter, später vielleicht mehr Sensoren..),
Life auslesen und auch Life reagieren.
Natürlich passen hier die Waits noch nicht, weil er so seinen Ausweichschritt fertig macht und dann erst neu auf Sensoren reagiert.
Habe das mal so probiert, funktioniert aber nicht, weil man aus einem Interrupt wohl nicht verzweigen darf.
'--------Roboter KKL Steuerung --------------------
'$sim
$regfile = "m8def.dat"
$crystal = 8000000
'---Config Port's--------------------
Config Portd = Input
Portd = 255
Config Portb = Output
'---Config Timer -------------------
Config Timer0 = Timer , Prescale = 64
'---Sonstiges------------------------
Dim Sensor As Byte
Links_vorne Alias Pind.0
Rechts_vorne Alias Pind.1
Links_hinten Alias Pind.2
Rechts_hinten Alias Pind.3
On Timer0 Sensoren_auswerten
Enable Timer0
Enable Interrupts
'================================================= =======================
'========= Hauptprogramm ================================================
'================================================= =======================
Portb = 0
Gosub Vor
Do
Goto Sprung
Ausweichen_rechts:
Gosub Zurueck
Wait 2
Gosub Rechts
Wait 2
Gosub Vor
Goto Sprung
Ausweichen_links:
Gosub Zurueck
Wait 2
Gosub Links
Wait 2
Gosub Vor
Goto Sprung
R_ausweichen_links:
Gosub Vor
Waitms 500
Gosub Links
Waitms 500
Gosub Vor
Goto Sprung
R_ausweichen_rechst:
Gosub Vor
Waitms 500
Gosub Rechts
Waitms 500
Gosub Vor
Goto Sprung
Sprung:
Loop
End
'===============UnterProgramme==================== =======================
Sensoren_auswerten:
'Timer0 = 0
Sensor = 0
If Links_vorne = 0 Then Goto Ausweichen_rechts
If Rechts_vorne = 0 Then Goto Ausweichen_links
If Links_hinten = 0 Then Goto R_ausweichen_rechst
If Rechts_hinten = 0 Then Goto R_ausweichen_links
Return
Links:
Portb.1 = 1
Portb.2 = 1
Portb.3 = 0
Return
Rechts:
Portb.1 = 1
Portb.2 = 0
Portb.3 = 1
Return
Zurueck:
Portb.1 = 1
Portb.2 = 1
Portb.3 = 1
Return
Vor:
Portb.1 = 1
Portb.2 = 0
Portb.3 = 0
Return
Stopen:
Portb.1 = 0
Portb.2 = 0
Portb.3 = 0
Return
Mein Ziel wäre es, dass er z.B.:
Wenn z.B. der Linke vordere Schalter schaltet, soll er ein Stück rückwärts und dann nach rechts ausweichen.
Während er aber ausweicht, sollte er auf alle anderen Sensoren auch noch reagieren. (z.B. die hinteren. )
Hat jemand eine Idee/Vorschlag wie man das am besten aufbauen kann?!
Es sollte auch Modular sein..
Ich dachte zuerst so:
Der Interrupt fragt immer die Sensoren selbstständig ab, und speichert einen Wert für einen Sensor in einer Variablen namens "Sensor"
z.B. Taster Links_vorne = 1 u.s.w. (wie im vorletzten Beispiel)
Die Variable Sensor, müsste ich dann extra im Hauptprogramm abfragen und dann je nach Wert, in ein Unterprogramm verzweigen... (z.B nach ausweichen_rechts)
Im Unterprogramm selbst,müsste ich auch wieder den Sensorwert auswerten (nach allen möglichkeiten)...um das Unterprogramm abzubrechen, falls sich ein Sensor ändert.. :-(
Irgendwie wird das dann alles zu aufgebläht :-(
Geht das irgendwie einfacher ?
Irgendwie sollte das dann auch so funktionieren, dass man im einfach auch was lernen kann... (also nicht nur "fixer" Code..)
Also bestimmte Bedingungen einfach beschreiben kann, auf die er dann reagieren soll...
Irgendwie sehe ich noch keinen rechten Weg, wie es funktionieren könnte...
Vielleicht mit Tabellen ..?!
Vielleicht wisst ihr ja mehr..
l.G. aus Graz :-)