PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Roboter mit Bascom Steuern ?!



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 :-)

01.11.2005, 10:12
hallo.
bei timer0 kann es passieren das der schalter geschaltet hat, aber die timerroutine noch nicht angesprungen wurde zum auswerten.

zum sofortigen reagieren kannst du nur den interrupt0 oder einen anderen weiteren nehmen, dann wird sofort die routine angesprungen wenn ein schalter kontakt hat.

das ausweichen geht auch nur genau, wenn du zb sharpsensoren nehmen tust und dann nach einem bestimten wert den robby steuerst.

die wait-schleifen sind relativ, weil auch mal die räder rutschen usw.

einfacher gehen die auswertungen nicht, es muss schon ein bisschen code entstehen. so mir nichts dir nichts geht es nicht. die sensoren anbringen ist einfach, aber das proggen nachher ist etwas anderes.

mfg psf

Roberto
01.11.2005, 16:00
Hallo psf


bei timer0 kann es passieren das der schalter geschaltet hat, aber die timerroutine noch nicht angesprungen wurde zum auswerten.
Ich glaube das müsste von der Zeit her schon reichen..




zum sofortigen reagieren kannst du nur den interrupt0 oder einen anderen weiteren nehmen, dann wird sofort die routine angesprungen wenn ein schalter kontakt hat.
Aber ich habe nicht so viele Interrupts..
Nachher kommen (können) ja noch mehr Sensoren (sharp) und das ghet dann mit Interrupt nicht mehr..



die wait-schleifen sind relativ, weil auch mal die räder rutschen usw.
Ja finde ich auch.
Aber auch eine Drehkontrolle, durch z.B. Encoder oder durch Stepper, bringt meines achtens auch nicht viel (wie manche so machen)
Weil da eben wieder die datenverfelschung entsteht, wenn das Rad durchdreht.
Alternative könnte man zwei zusätzliche Räder anbringen, mit Encoder, die nur mitlaufen und den Weg messen.

Aber eigentlich sollte es in die Richtung gehen, dass er sich an der Umgebung orientiert und nicht an seinem Weg..


einfacher gehen die auswertungen nicht, es muss schon ein bisschen code entstehen. so mir nichts dir nichts geht es nicht. die sensoren anbringen ist einfach, aber das proggen nachher ist etwas anderes.
Ja, genau.
Darum frage ich auch Euch, wie ihr das so gemacht habt. :-)
Finde da leider im Forum nicht viel darüber..

Vielleicht ein paar Beispiele, Lösungsansetze ?!

Mir schebt das irgendwie Modular vor.
Nicht dass ich in einem Unterprogramm, alle anderen Sensoren auch immer mitabfragen/auswerten muss.

Roberto
02.11.2005, 04:58
Hallo
Hab es jetzt doch mit einem Interrupt gemacht.
Da bleibt mir dann auch ein Timmer frei :-)
Mit Vier Dioden zum Interrupt pin Int0


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


'---Config Interrupt-----------------
Config Int0 = Falling


'---Sonstiges------------------------
Dim Sensor As Byte
Dim A1 As Word
Dim A2 As Word





'On Timer0 Sensoren_auswerten
'Enable Timer0
Enable Interrupts


'================================================= =======================
'========= Hauptprogramm ================================================
'================================================= =======================
Portb = 0
'Gosub Vor

On Int0 Sensoren_auswerten
Enable Int0


Do

Anfang:
Select Case Sensor
Case 1:
Gosub Zurueck
For A1 = 1 To 5
If Sensor <> 1 Then Goto Anfang
For A2 = 1 To 65500
Next A2
Next A1
Gosub Rechts
For A1 = 1 To 5
If Sensor <> 1 Then Goto Anfang
For A2 = 1 To 65500
Next A2
Next A1
Gosub Vor
Sensor = 0
Case 2:
Gosub Zurueck
For A1 = 1 To 5
If Sensor <> 2 Then Goto Anfang
For A2 = 1 To 65500
Next A2
Next A1
Gosub Links
For A1 = 1 To 5
If Sensor <> 2 Then Goto Anfang
For A2 = 1 To 65500
Next A2
Next A1
Gosub Vor
Sensor = 0
Case 3:
Gosub Vor
For A1 = 1 To 1
If Sensor <> 3 Then Goto Anfang
For A2 = 1 To 65500
Next A2
Next A1
Gosub Links
For A1 = 1 To 1
If Sensor <> 3 Then Goto Anfang
For A2 = 1 To 65500
Next A2
Next A1
Gosub Vor
Sensor = 0
Case 4:
Gosub Vor
For A1 = 1 To 1
If Sensor <> 4 Then Goto Anfang
For A2 = 1 To 65500
Next A2
Next A1
Gosub Rechts
For A1 = 1 To 1
If Sensor <> 4 Then Goto Anfang
For A2 = 1 To 65500
Next A2
Next A1
Gosub Vor
Sensor = 0
End Select





Loop


End



'===============UnterProgramme==================== =======================


Sensoren_auswerten:
If Pind.4 = 0 Then Sensor = 1 'Sensor links vorne
If Pind.5 = 0 Then Sensor = 2 'Sensor rechts vorne
If Pind.6 = 0 Then Sensor = 3 'Sensor links hinten
If Pind.7 = 0 Then Sensor = 4 'Sensor rechts hinten
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


Stopp:
Portb.1 = 0
Portb.2 = 0
Portb.3 = 0
Return

Das Wait mal durch For-next Schleifen ersetzt.
(später vielleicht durch Timer0)
und überrall eine Abfrage drinnen, ob die Sensor Werte noch aktuell sind.

Gibt es eine Möglichkeit, dass ich durch den Interrupt an den "Anfang" springen kann ?
Aus der ISR kann ich nicht mit Goto springen :-(

Habt ihr noch Vorschläge ??