PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : if-Then Bedingung - ich hab da mal ein Problem ** gelöst **



nechegris
12.12.2008, 08:54
Hallo erstmal,
ich stöbere schon seit einiger Zeit in dem Forum, echt gut die Plattform!
Jetzt hat es die Zeit zugelassen, und ich habe mir aus ein paar Teilen einen kleinen Bot geklöppelt - nicht schön, aber selten O:)



Die Aufgabe ist eigentlich nur einer Linie zu folgen. Dafür hat er 2 umgebaute Servos, die mit einem 293 angesteuert werden und 3 Sensoren an der Nase.

Die Hardware habe ich überprüft, die Sensoren liefern die entsprechenden Signale, und die Motoren drehen, wie sie sollen.

Ich als c64-Kind habe mich für Bascom entschieden und da mal was geschrieben, was eigentlich funktionieren sollte - tut es aber nicht ](*,)

Ich befürchte, dass ich den Wald vor lauter Bäumen nicht sehe, denn der Code ist alles andere als elegant oder kompliziert.

Es wäre klasse, wenn da mal einer reinschauen könnte.

Vielen Dank

************************************************** ***
' Taktfrequenz des Quarzes einstellen (3,686411 MHz -> 1 Takt=0,00000027127s=0,27127us)
$crystal = 3686411
$baud = 9600
' Verwendete CPU festlegen (ATmega8)
$regfile = "m8def.dat"
'ports definieren
Config Portb = Output
Config Portd = Input
'Ddrd = &B00000000
'sensor rechts
Ls1 Alias Pind.2
'Sensor mitte
Ls2 Alias Pind.3
'Sensor links
Ls3 Alias Pind.4
' Hauptprogrammschleife
Do
' sensor 1 und 3 auf schwarzer Linie --> vor
If Ls1 = 0 Then
If Ls3 = 0 Then
Gosub Vor
End If
End If
' Sensor 1 Auf Schwarzer Linie --> Links
If Ls1 = 0 Then
If Ls3 = 1 Then
Gosub Links
End If
End If
' sensor 3 auf schwarzer Linie --> rechts
If Ls3 = 0 Then
If Ls1 = 1 Then
Gosub Vor
End If
End If
'kein sensor auf linie --> stop
If Ls1 = 1 Then
If Ls3 = 1 Then
'Print "stop"
Gosub Stop
End If
End If

'Waitms 100
Loop
Vor:
Portb = &B00000000
Portb = &B00101011
Return
Rueck:
Portb = &B00000000
Portb = &B00011101
Return
Links:
Portb = &B00000000
Portb = &B00101000
Return
Rechts:
Portb = &B00000000
Portb = &B00000011
Return
Stop:
Portb = &B00000000
Return
End

************************************************** ***

Sauerbruch
12.12.2008, 12:05
Hmmm.... auf den ersten Blick sehe zumindestens ich nichts in dem Code, was ein Problem sein könnte.

Die Sequenzen in den GoSub´s
Portb = &B00000000
Portb = &B00101011
versteh´ ich zwar nicht ganz - sie sollten aber kein ernsthafts Problem verursachen.

Kannst Du mal beschreiben, was genau passiert? Das wäre für die Fehlersuche hilfreich!

Gruß & Co.,

Daniel

P.S.: Ich habe zwar noch niemals mit Robotern herumexperimentiert, frage mich aber gerade folgendes: Wenn die Sensoren am vorderen Ende sind und Ls1 der rechte ist - müsste das Maschinchen dann nicht auch nach rechts fahren, wenn der Sensor die Linie sieht? In Deinem Code scheint das genau andersrum zu sein...

raggy
12.12.2008, 14:19
Hallo nechegris
Hier ein Stueck Code wie ich es machen wuerde.


'Taktfrequenz des Quarzes einstellen (3,686411 MHz -> 1 Takt=0,00000027127s=0,27127us)

$regfile = "m8def.dat" 'Das ist immer die erste Zeile damit Bascom weiß welcher Chip das ist!!
$crystal = 3686411
$baud = 9600
' Verwendete CPU festlegen (ATmega8)

'ports definieren
Config Portb = Output
Config Portd = Input
'Ddrd = &B00000000 **************??? Pullup ????? =&B11111111
'sensor rechts
Ls1 Alias Pind.2
'Sensor mitte
Ls2 Alias Pind.3
'Sensor links
Ls3 Alias Pind.4
' Hauptprogrammschleife
Do
' sensor 1 und 3 auf schwarzer Linie --> vor
If Ls1 = 0 And Ls3 = 0 Then
'Portb = &B00000000
Portb = &B00101011
End If
' Sensor 1 Auf Schwarzer Linie --> Links
If Ls1 = 0 And Ls3 = 1 Then
'Portb = &B00000000
Portb = &B00101000
End If
' sensor 3 auf schwarzer Linie --> rechts
If Ls3 = 0 And Ls1 = 1 Then
'Portb = &B00000000
Portb = &B00000011
End If
'kein sensor auf linie --> stop
If Ls1 = 1 And Ls3 = 1 Then
Portb = &B00000000
End If

'Waitms 100
Loop
End

PortB= &B00000000 habe ich auskommentiert Du wuerdest immer alles Abschalten und es müßte neu gestartet werden wenn ich es richtig verstanden habe.
Problem Sensor Pullup eventuell einschalten ?
Gruß raggy

nechegris
12.12.2008, 16:09
Also ersmal vielen Dank für die Antworten.

@sauerbruch:
Die Sub's schalten nur die Motoren ( oder heißt es Motore?), pro Motor 3Ports, evtl. wird der Enable-Eingang noch gepulst, aber jetzt muss das Teil erstmal funktionieren.
Wenn der Sensor logisch 0 liefert, ist er auf der Linie. Somit muss bei Logisch 1 vom rechten Sensor die Fuhre nach rechts geschwenkt werden.

@raggy
Den Pullup habe ich danach probiert, leider kein Erfolg.
Die und-Verknüpfung hatte ich auch schon drin, war auch Ich melde mich wenn ich durch bin, wird aber wahrscheinlich heute nichts mehr.

Sauerbruch
12.12.2008, 17:29
Wenn der Sensor logisch 0 liefert, ist er auf der Linie. Somit muss bei Logisch 1 vom rechten Sensor die Fuhre nach rechts geschwenkt werden.


Aber so kommt er doch nur noch weiter nach rechts, oder??
Bis der linke Sensor auch nach rechts über die Linie verschwunden ist - und dann bleibt er stehen. Könnte das sein?

nechegris
13.12.2008, 07:53
ja klar, sollte meinen, dass das rechte Rad angetrieben wird, damit die Nase nach links schwenkt. ](*,)

nechegris
13.12.2008, 08:32
Es funzt, der Fehler lag, wie so oft zwischen den Kopfhörern. ](*,)
Nachdem ich Held in die Sub 'vor' verzweigt bin, kann das Teil natürlich nicht das Teil natürlich nicht das rechte Rad antreiben. [-X