Hallo allerseits,
ich hab ein kleines problemchen mit meinem code. mein robby hat vorne 3 taster un soll bei kollision erst ein stück zurückfahren, sich dann um ca. 90 grad (bei kollision am mittleren taster etwas mehr) drehen und dann weiterfahren. Dass das drücken eines anderen tasters bei dem ausweichvorgang auch wahrgenommen werden kann, hab ich versucht, das ganze mit timer0 zu ralisieren, was auch eigentlich ganz gut funktioniert.
Jetzt aber zum problem: es kommt von zeit zu zeit vor, dass sich der controller einfach "neu startet" also wieder von ganz am anfang anfängt. das kann allerdings nicht an den timern liegen, da ich dieses problem auch schon mit einem anderen code hatte. und ein neues problem ist dazugekommen: es kommt vor, dass der timer auf einmal aufhört zu zählen (an unterschiedlichen werten vom zaehler).Beide motoren drehen sich dann endlos rückwärts, bis man den strom aus und wieder einschaltet. könnte es enventuell daran liegen, dass ich keine diode vor den relais habe, die den motor schalten? oder liegts an was ganz anderem?
mfg Markus
Code:
$regfile = "2313def.dat"
$crystal = 3686400
$baud = 9600
Dim Zaehler As Byte
Ddrd.2 = 1 'motor links vorwärts
Ddrd.3 = 1 'motor links rückwärts
Ddrd.4 = 1 'motor rechts vorwärts
Ddrd.5 = 1 'motor rechts rückwärts
Ddrb.0 = 0 'taster links vorne
Ddrb.1 = 0 'taster mitte vorne
Ddrb.2 = 0 'taster rechts vorne
Portb.0 = 1
Portb.1 = 1
Portb.2 = 1
Mlinksvor Alias Portd.2
Mlinksrueck Alias Portd.3
Mrechtsvor Alias Portd.4
Mrechtsrueck Alias Portd.5
Schalterlinks Alias Pinb.0
Schaltermitte Alias Pinb.1
Schalterrechts Alias Pinb.2
Config Timer0 = Timer , Prescale = 1024
Enable Timer0
Start Timer0
Enable Interrupts
On Timer0 Ontimer
Main:
Mlinksvor = 1
Mlinksrueck = 0
Mrechtsvor = 1
Mrechtsrueck = 0
If Schalterlinks = 0 Then
Zaehler = 0
Gosub Links
End If
If Schaltermitte = 0 Then
Zaehler = 0
Gosub Mitte
End If
If Schalterrechts = 0 Then
Zaehler = 0
Gosub Rechts
End If
Goto Main
Links:
If Schaltermitte = 0 Then
Zaehler = 0
Gosub Mitte
End If
If Schalterrechts = 0 Then
Zaehler = 0
Gosub Rechts
End If
If Zaehler < 33 Then
Mlinksvor = 0
Mlinksrueck = 1
Mrechtsvor = 0
Mrechtsrueck = 1
End If
If Zaehler > 33 Or Zaehler = 33 Then
Mlinksvor = 1
Mlinksrueck = 0
Mrechtsvor = 0
Mrechtsrueck = 1
End If
If Zaehler = 83 Then
Gosub Main
End If
Goto Links
Mitte:
If Schalterlinks = 0 Then
Zaehler = 0
Gosub Links
End If
If Schalterrechts = 0 Then
Zaehler = 0
Gosub Rechts
End If
If Zaehler < 33 Then
Mlinksvor = 0
Mlinksrueck = 1
Mrechtsvor = 0
Mrechtsrueck = 1
End If
If Zaehler > 33 Or Zaehler = 33 Then
Mlinksvor = 1
Mlinksrueck = 0
Mrechtsvor = 0
Mrechtsrueck = 1
End If
If Zaehler = 101 Then
Gosub Main
End If
Goto Mitte
Rechts:
If Schalterlinks = 0 Then
Zaehler = 0
Gosub Links
End If
If Schaltermitte = 0 Then
Zaehler = 0
Gosub Mitte
End If
If Zaehler < 33 Then
Mlinksvor = 0
Mlinksrueck = 1
Mrechtsvor = 0
Mrechtsrueck = 1
End If
If Zaehler > 33 Or Zaehler = 33 Then
Mlinksvor = 0
Mlinksrueck = 1
Mrechtsvor = 1
Mrechtsrueck = 0
End If
If Zaehler = 83 Then
Gosub Main
End If
Goto Rechts
Ontimer:
Incr Zaehler
Print Zaehler
Return
Lesezeichen