Code für Schrittmotorsteuerung stimmt nicht
Hallo!
Bastel grad an meinem ersten Roboter und bin ein totaler Bascomneuling. Möchte über einen PC + RN-Control 1.4 meinen Schrittmotor für die Lenkung steuern. Am PC läuft Labview. An der RN-Control hängt die standart L297/L298 Schaltung.
Portbeschaltung der RN-Control:
Portd.2 = CLOCK
Portd.3 = Direction
Portd.7 = Enable
Die Ports von Portc.0 bis einschließlich Portc.2 hab ich als Eingänge definiert. Sie sind mit meinem PC verbunden.
Das Board soll nun die oben genannten c-Ports in einer Endlosschleife abfragen, bis einer auf High gesetzt ist. Sollte das der Fall sein, muss das Unterprogramm Schrittmotor ausgeführt werden. Hier wird nun geprüft, wie die c-Ports geschaltet sind. Sie bleiben vom PC für eine Sekunde beschaltet, bevor alles wieder auf low gesetzt wird. Die Unterscheidung der Laufrichtung des Schrittmotors hängt von der Zusammensetzung der Low-High-Zustände der c-Ports ab. Je nachdem wie sie beschaltet sind wird im Schrittmotor-Unterprogramm ein entsprechendes weiteres Unterprogramm geöffnet.
Nun zu meinem Problem… es tut sich gar nichts am Motor. Meine Vermutung wäre, dass ich in einem Unterprogramm kein weiteres öffnen kann. Wäre echt dankbar, wenn mir hier jemand helfen würde.
So hier noch mein Quellcode:
Code:
Declare Sub Schrittmotor() 'Subs Ports und Variablen declarieren
Declare Sub Rechts0()
Declare Sub Rechts()
Declare Sub Links0()
Declare Sub Links()
Dim I As Integer
$regfile = "m16def.dat"
$crystal = 16000000
$baud = 9600
Config Pinc.0 = Input
Config Pinc.1 = Input
Config Pinc.2 = Input
Portc.0 = 0
Portc.0 = 0
Portc.0 = 0
Config Pind.2 = Output
Config Pind.3 = Output
Config Pind.7 = Output
Do 'Endlosschleife
For I = 0 To 2
If Portc.i = 1 Then
Call Schrittmotor
Else
Waitms 20
End If
Next I
Loop
End
Sub Schrittmotor() 'Unterprogramm Schrittmotor
If Portc.0 = 1 And Portc.1 = 0 Then
If Portc.2 = 0 Then
Call Links0
Else
Call Links
End If
Else
If Portc.0 = 0 And Portc.1 = 1 Then
If Portc.2 = 0 Then
Call Rechts0
Else
Call Rechts
End If
End If
End If
End Sub
Sub Links0() 'Unterprogramme, die je nach beschaltung der C-Ports ausgeführt werden
Portd.7 = 1
Portd.3 = 0
For I = 0 To 500
Portd.2 = 1
Waitms 5
Portd.2 = 0
Waitms 5
Next I
Portd.7 = 0
Portd.3 = 0
End Sub
Sub Links()
Portd.7 = 1
Portd.3 = 0
For I = 0 To 1000
Portd.2 = 1
Waitms 5
Portd.2 = 0
Waitms 5
Next I
Portd.7 = 0
Portd.3 = 0
End Sub
Sub Rechts0()
Portd.7 = 1
Portd.3 = 1
For I = 0 To 500
Portd.2 = 1
Waitms 5
Portd.2 = 0
Waitms 5
Next I
Portd.7 = 0
Portd.3 = 0
End Sub
Sub Rechts()
Portd.7 = 1
Portd.3 = 1
For I = 0 To 1000
Portd.2 = 1
Waitms 5
Portd.2 = 0
Waitms 5
Next I
Portd.7 = 0
Portd.3 = 0
End Sub
Neben bei noch, die Schrittmotorschaltung funktioniert wunderbar. Hab sie schon mit der rn-control zum laufen bekommen.
Gruß
Re: Code für Schrittmotorsteuerung stimmt nicht
Zitat:
Zitat von Charly_cs
... Meine Vermutung wäre, dass ich in einem Unterprogramm kein weiteres öffnen kann.
Sind deine HW / SW-Stack u. Frame Werte ausreichend ?
mit den defaultwerten kommst du nicht weit.
Liste der Anhänge anzeigen (Anzahl: 1)
So.
Ich hab mir das durchgesehen und ein bißchen ausgebessert
Vorsicht fürs nächste Mal:
Port Lesen geht über var = PINC
Port Schreiben über PORTC = var
Ich hab das Programm so hergerichtet (zusammengestrichen), daß es eigentlich auch mit der Demo-Version gehen sollte.
Probier's mal und laß hören, das kriegen wir schon hin.
Ich kann dir zur Vollversion nur raten. Es gehen damit auch ganz gefinkelte sachen und alles sehr intuitiv und einfach (+Übung, ist klar)
GCC kost' zwar nix, ist für den Anfang aber schon ein bißchen streng
Liste der Anhänge anzeigen (Anzahl: 1)
Im Anhang jetzt deine Version, nur die Pin/port geschichte ausgebessert
VORSICHT: Die Namen sind gleich (charly.*)
&H07
Das ist eine Maske &H07 = &B00000111 dadurch landen in einem eigenen Zwischenfeld (Command) nur diese 3 Bit vom PC, der Rest ist auf alle Fälle Null, egal, wie die anderen Pins sonst definiert sind.
und diese 3 Bit hab ich dann einfach als Zahl genommen und abgefragt.
Gosub ist vom Speicher her sehr viel billiger als Call sub() und genügt vollig, wenn man keine Parameter übergeben will oder locale daten braucht.