PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Code für Schrittmotorsteuerung stimmt nicht



Charly_cs
14.07.2005, 16:07
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:


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ß

PicNick
14.07.2005, 16:36
... 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.

Charly_cs
14.07.2005, 16:59
Hi!

Danke für die rasche Antwort! Kann mit ihr aber leidernichts anfangen. Was sind denn "HW / SW-Stack u. Frame Werte" ?
Vom PC aus schalt ich mit einer Digital I/O-Karte. Ich lasse die High/Low-Zustände extra 1 s gesetzt, dass der µ-Controller genug Zeit hat sich diese anzuschauen und die entsprechenden Subs zu starten. Nur scheint er dies nicht zu tun. Woran liegt das?

PicNick
14.07.2005, 17:07
Der PC is ein armes Ferkel, der kann da nix dazu.

Schreib am Anfang des BasCOm Programmes:
$HWSTACK = 64
$SWSTACK = 96
$FRAMESIZE = 32
(type "HELP" for help)

Immer, wenn irgendwelche Subprogramme irgendwie seltsam reagieren, stehen diese Werte unter Verdacht.

Charly_cs
14.07.2005, 17:21
Habs gemacht und jetzt mag er es mir nicht compilieren.
Bringt mir für alle drei Zeilen einen assignment error.
Kannst du mir da auch weiterhelfen?

PicNick
15.07.2005, 08:01
Tut mir, leid, war unterwegs.



Action

Sets the available space for the Hardware stack.

Syntax

$HWSTACK = var

Remarks

Var A numeric decimal value.




Syntax

$SWSTACK = var

Remarks

Var A numeric decimal value.

Syntax

$FRAMESIZE = var

Remarks

Var A numeric decimal value.



Is mir jetzt nicht klar, was ihm nicht passen könnte.

kannst du das Stück Code und die .ERR Liste posten ?

Charly_cs
15.07.2005, 10:14
Guten Morgen!

Danke das du mir noch weiterhilfst.
Hier der Code inclusive deinem:


$regfile = "m32def.dat"
$hwstack = 64
$swstack = 96
$framesize = 32

Declare Sub Schrittmotor() 'Subs Ports und Variablen declarieren
Declare Sub Rechts0()
Declare Sub Rechts()
Declare Sub Links0()
Declare Sub Links()
Dim I As Integer


$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 'Hauptprogramm
For I = 0 To 2
If Portc.i = 1 Then
Call Schrittmotor
Else
Waitms 20
End If
Next I
Loop
End

Sub 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()
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


Der Errorcode:



Error : 46 Line : 2 Assignment error [$HWSTACK: 112 64: 112] , in File : C:\DOKUMENTE UND EINSTELLUNGEN\CHARLY1\DESKTOP\BASCOM-BEISPIELE\SCHRITTMOTOR üBER COMPUTER.BAS
Error : 46 Line : 3 Assignment error [$SWSTACK: 112 96: 112] , in File : C:\DOKUMENTE UND EINSTELLUNGEN\CHARLY1\DESKTOP\BASCOM-BEISPIELE\SCHRITTMOTOR üBER COMPUTER.BAS
Error : 46 Line : 4 Assignment error [$FRAMESIZE: 112 32: 112] , in File : C:\DOKUMENTE UND EINSTELLUNGEN\CHARLY1\DESKTOP\BASCOM-BEISPIELE\SCHRITTMOTOR üBER COMPUTER.BAS


Gruß

PicNick
15.07.2005, 10:43
Seltsam. Ich hab deinen Code, wie er ist, mit Copy & Paste meinem Bascom in die Hand gedrückt und er hat das Ganze mit wohligem Grunzen
ohne irgendwelche Kommentare übersetzt.
*ratlos*
Ich werd' mal versuchen, irgendwie den gleichen Fehler bei mir zu provozieren
*brabbel*

Charly_cs
15.07.2005, 11:20
Ich verstehs auch nicht. Wenn ich z.B. das Testprogramm von der RN-Control compilier gibt er mir für die drei Zeilen keinen Fehler aus. Wenns in meinem Programm ist, dann schon. komisch...

PicNick
15.07.2005, 11:26
Ist nur ein versuch: im gleichen directory wie das programm.BAS programm gibt's nach dem Übersetzen eine file programm.CFG

Lösch' die mal und versuchs nochmal. (er macht eh eine neue)

Charly_cs
15.07.2005, 12:20
habs gemacht und es kommt schon wieder der selbe Fehler.
Mir ist grad aufgefallen, dass er das auf der mitgelieferten CD vorhandene Programm "rncontroltest.BAS" compiliert und bei "rncontroltestmega32.BAS" genau den selben Fehler bringt. Hab bisher nur das erste genutzt. Hier sind die drei Zeilen von dir auch nicht vorhanden im zweiten schon. Nutze die Bascom 1.11.7.4 Demo. Kanns vielleicht daran liegen? Hab die lib-Dateien, so wies auf der CD heißt aktualisiert. So sollte doch eigentlich alles funktionieren?

PicNick
15.07.2005, 12:30
Ach, das mit Demo könnte sein, da die Parameter ja SRAM verlangen und da gibt's ja Restriktionen.
Geh halts symetrisch mit den Werten runter, bis er das Maul hält. Es geht, glaub ich, um die Größe.

Charly_cs
15.07.2005, 12:56
Ich komm glaub ich nicht drum herum mir die Vollversion zu kaufen. Das Hobby geht echt gut ins Geld...
Kannst du mir die Hex-Datei bitte per Email schicken? Wenn dann alles funktioniert, kauf ich sie mir.
Vielen Dank nochmal für deine Hilfe!

PicNick
15.07.2005, 13:00
Kann ich machen, aber da schau ich nochmal kurz deine (gewünschte) Funktionsbeschreibung und das Programm an, sonst ist das ja ev. sinnlos, wenn's nicht läuft.

PicNick
15.07.2005, 13:36
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

Charly_cs
15.07.2005, 13:54
... und siehe da es funktioniert. Dein Code schaut natürlich viel besser aus als meiner. Hab deinen auch verstanden bis auf "Command = Pinc And &H07". Was bedeutet das &h07??
Ich würde aber auch mal gerne mein Programm als hex haben und schauen obs funktioniert. Kannst du es bitte auch posten wenns nichts ausmacht?
Man bin ich jetzt glücklich!! Vielen vielen Dank! Dieses Forum ist echt spitze!

PicNick
15.07.2005, 14:17
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.

Charly_cs
15.07.2005, 14:33
Mein Prog funktioniert jetzt auch! Sobald genug Geld über ist, kommt mir die Vollversion ins Haus. Deine Programmierung ist viel resourcenfreundicher als meine. Naja hab mich bis jetzt vorm strukturierten Programmieren gedrückt und alles mit Labview gemacht. Kannst du mir ein gutes Buch empfehlen, mit dem ich Bascom und die AVR-Programmierung besser zu verstehen lerne? Natürlich sollte da sehr viel Beispielcode dabei sein. Danke!

PicNick
15.07.2005, 14:50
Du, schau mal bei www.robotikhardware.de da gibt's auch Bücher (in Deutsch)

Ansonsten ist es wie mit dem Schwimmen und der Liebe: Üben, nicht dumm sein und aufpassen