Hallo Leute

Habe mir da so einen kleinen Bot gebaut:
https://www.roboternetz.de/phpBB2/ze...ag.php?t=13915

Den habe ich mal so gesteuert:
Code:
'--------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:
Code:
'--------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.




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