Archiv verlassen und diese Seite im Standarddesign anzeigen : 2 Wiederholungen
Blackbumpkin
19.12.2005, 16:28
Hallo liebe Leute,
ich habe hier einen Schrittmotor (7,5°) an meinem RN-Control und jetzt habe ich 2x hintereinander einen:
Dim I As Byte
For I = To 10
Motor schritt 1-4
Next I
warum läuft nur immer der erste und den zweiten findet er nicht was mache ich falsch???
'#####################################
'Schrittmotoransteuerung an rn-control
'Art= Vollschritt bipolar
'Anschluss 1 = Orange
'Anschluss 2 = Gelb
'Anschluss 3 = Braun
'Anschluss 4 = Schwarz
'#####################################
$regfile = "m32def.dat" 'controller definieren
$crystal = 16000000 'Taktfrequenz definieren
Config Portb = Output 'Port als "Ausgang" definieren
Config Portc = Output
Config Portd = Output
1a Alias Portb.0 'Pin als Spule 1a benennen
1b Alias Portb.1 'Spule 1b
2a Alias Portc.6 'Spule 2a
2b Alias Portc.7 'Spule 2b
Portb.0 = 0 'Spule 1a definiert auf Null
Portb.1 = 0 'Spule 1b
Portc.6 = 0 'Spule 2a
Portc.7 = 0 'Spule 2b
Portd.4 = 1 'Motortreiber Spule 1 Enable
Portd.5 = 1 'Motortreiber Spule 2 Enable
Dim I As Byte
For I = 1 To 60
Dim Zeit As Byte
Zeit = 3 'Zeit zwischen den einzelnen Schritten (kleiner=schneller)
1a = 1 : 1b = 0 : 2a = 1 : 2b = 0 'Schritt 1
Waitms Zeit
1a = 1 : 1b = 0 : 2a = 0 : 2b = 1 'Schritt 2
Waitms Zeit
1a = 0 : 1b = 1 : 2a = 0 : 2b = 1 'Schritt 3
Waitms Zeit
1a = 0 : 1b = 1 : 2a = 1 : 2b = 0 'Schritt 4
Waitms Zeit
Next I
Waitms 100
Dim A As Byte
For A = 1 To 60
Dim Zeit As Byte
Zeit = 3 'Zeit zwischen den einzelnen Schritten (kleiner=schneller)
1a = 1 : 1b = 0 : 2a = 1 : 2b = 0 'Schritt 1
Waitms Zeit
1a = 1 : 1b = 0 : 2a = 0 : 2b = 1 'Schritt 2
Waitms Zeit
1a = 0 : 1b = 1 : 2a = 0 : 2b = 1 'Schritt 3
Waitms Zeit
1a = 0 : 1b = 1 : 2a = 1 : 2b = 0 'Schritt 4
Waitms Zeit
Next A
End
Yo,is nen Fehler drinne und das Listing ist schlecht strukturiert slso unübersichtlich wodurch fehler leicht herausgefordert werden.
Die Grundstruktur ist eigentlich immer gleich.
Oben kommen die Definitionen hin.
Also Variablen,benötigte Libs,welcher Controller usw.
Darunter dann die evtl. nötigen Vorbereitungen (Bei dir der Definierte Startzustand)
Ert jetzt kommt der eigentliche Programmbereich den man immer mit einem "END" abschließen sollte damit im Zweifelsfalle der Controller nicht versehentlich in die Papmpa läuft und Unsinn anstellt.(Haste ja gemacht)
Danach kommen eventuelle Daten (Datazeilen,EEProminhalte usw)
Wenn de dich dran hälst dann wirds leichter.
Ich hab mal alle Definitionen nach oben geschoben.
Die Doppelte "Dim Zeit" wird schon vom Compiler angemeckert (Is dir da nix aufgefallen ?).
Hab ich entfernt weil unsinnig.
Den rest hab ich gelassen.
So sollte es laufen.
'#####################################
'Schrittmotoransteuerung an rn-control
'Art= Vollschritt bipolar
'Anschluss 1 = Orange
'Anschluss 2 = Gelb
'Anschluss 3 = Braun
'Anschluss 4 = Schwarz
'#####################################
$regfile = "m32def.dat" 'controller definieren
$crystal = 16000000 'Taktfrequenz definieren
Dim I As Byte
Dim A As Byte
Dim Zeit As Byte
Config Portb = Output 'Port als "Ausgang" definieren
Config Portc = Output
Config Portd = Output
1a Alias Portb.0 'Pin als Spule 1a benennen
1b Alias Portb.1 'Spule 1b
2a Alias Portc.6 'Spule 2a
2b Alias Portc.7 'Spule 2b
Portb.0 = 0 'Spule 1a definiert auf Null
Portb.1 = 0 'Spule 1b
Portc.6 = 0 'Spule 2a
Portc.7 = 0 'Spule 2b
Portd.4 = 1 'Motortreiber Spule 1 Enable
Portd.5 = 1 'Motortreiber Spule 2 Enable
For I = 1 To 60
Zeit = 3 'Zeit zwischen den einzelnen Schritten (kleiner=schneller)
1a = 1 : 1b = 0 : 2a = 1 : 2b = 0 'Schritt 1
Waitms Zeit
1a = 1 : 1b = 0 : 2a = 0 : 2b = 1 'Schritt 2
Waitms Zeit
1a = 0 : 1b = 1 : 2a = 0 : 2b = 1 'Schritt 3
Waitms Zeit
1a = 0 : 1b = 1 : 2a = 1 : 2b = 0 'Schritt 4
Waitms Zeit
Next I
Waitms 100
For A = 1 To 60
Zeit = 3
1a = 1 : 1b = 0 : 2a = 1 : 2b = 0 'Schritt 1
Waitms Zeit
1a = 1 : 1b = 0 : 2a = 0 : 2b = 1 'Schritt 2
Waitms Zeit
1a = 0 : 1b = 1 : 2a = 0 : 2b = 1 'Schritt 3
Waitms Zeit
1a = 0 : 1b = 1 : 2a = 1 : 2b = 0 'Schritt 4
Waitms Zeit
Next I
End
Und gleich hinterher ein Vorschlag um das ganze etwas kleiner zu bekommen.
Erstmal das "Zeit=3" vor die Schleife denn man muß es nicht jeweils 60x auisführen.
Spart Systemzeit.
Ich vermute mal das die Ausführliche Schreibweise absicht ist aber Zweimal hintereinander das gleiche läst sich schön vereinfachen.
'#####################################
'Schrittmotoransteuerung an rn-control
'Art= Vollschritt bipolar
'Anschluss 1 = Orange
'Anschluss 2 = Gelb
'Anschluss 3 = Braun
'Anschluss 4 = Schwarz
'#####################################
$regfile = "m32def.dat" 'controller definieren
$crystal = 16000000 'Taktfrequenz definieren
Dim I As Byte
Dim A As Byte
Dim Zeit As Byte
Config Portb = Output 'Port als "Ausgang" definieren
Config Portc = Output
Config Portd = Output
1a Alias Portb.0 'Pin als Spule 1a benennen
1b Alias Portb.1 'Spule 1b
2a Alias Portc.6 'Spule 2a
2b Alias Portc.7 'Spule 2b
Portb.0 = 0 'Spule 1a definiert auf Null
Portb.1 = 0 'Spule 1b
Portc.6 = 0 'Spule 2a
Portc.7 = 0 'Spule 2b
Portd.4 = 1 'Motortreiber Spule 1 Enable
Portd.5 = 1 'Motortreiber Spule 2 Enable
Zeit = 3 'Zeit zwischen den einzelnen Schritten (kleiner=schneller)
For I = 1 To 2
Zeit = 3
For A = 1 To 60
1a = 1 : 1b = 0 : 2a = 1 : 2b = 0 'Schritt 1
Waitms Zeit
1a = 1 : 1b = 0 : 2a = 0 : 2b = 1 'Schritt 2
Waitms Zeit
1a = 0 : 1b = 1 : 2a = 0 : 2b = 1 'Schritt 3
Waitms Zeit
1a = 0 : 1b = 1 : 2a = 1 : 2b = 0 'Schritt 4
Waitms Zeit
Next A
Waitms 100
Next I
End
Natürlich läst sich das ganze noch weiter verkleinern denn Speicher ist immer Mangelware aber da wirst du vermutlich später selber noch kräftig dran feilen.
Probier erstmal obs jetzt geht.
Blackbumpkin
20.12.2005, 08:05
Hallo,
Ich danke, ich muss gestehen das, das mein erstes Programm gewesen ist. Aber ich danke dir für die ausführliche Erklärung. Werde es dann mal gleich ausprobieren...
Danke O:)
Mit besten Grüßen
Blackbumpkin
Blackbumpkin
20.12.2005, 08:16
Hallo,
jetzt weiß ich auch warum du sagtest das geht kürzer.
Ich habe gesehen ich habe da noch einen Fehler beim 2x hätter sich der Schrittmotor in die andere Richtung drehen sollen...
so schnell ist es pasiert das man einen Fehler macht!!! :-#
danke auf alle fälle sonst geht es.
gibt es noch eine andere möglichkeit so ein Programm kürzer zu machen?
ch habe gesehen ich habe da noch einen Fehler beim 2x hätter sich der Schrittmotor in die andere Richtung drehen sollen...
Ja,das hatte ich vermutet aber ich war nicht sicher.
gibt es noch eine andere möglichkeit so ein Programm kürzer zu machen?
Oh ja und auch Universeller aber dafür müßte man vieles Umbauen.
Wenn wir bei der direkten Ansteuerung bleiben dann könnte man die Schrittfolgen in ein Array setzen so das man schön adressieren kann.
Damit kannste einfach mit nem Zähler arbeiten.
Das Spart einige Zeilen.
Oder du legst alle 4 anschlüsse an einen Port dann kannste mit "Portx.y" statt zb. mit "1a = 1 : 1b = 0 : 2a = 1 : 2b = 0" Arbeiten
Was die Befehlsfolge mal eben auf eine Viertel drückt und auch etwas Platz bringt.
Aber mit nem M32 ist das erstmal kein so dringendes Problem.
32K sind viel Platz.
Was ich oben meinte ist das man sich recht früh an effektives Programieren gewöhnen sollte denn wenn das Endergebnis bei Optimierung auch in einen M8 passt dann hat man Platz und Geld gespart.
Aber probier erstmal rum.
Blackbumpkin
20.12.2005, 16:00
ja viel spielen das habe ich auch gemerkt das es nicht immer gleich so geht. Gib es eigendlich ihrgend wo eine beschreibung der befehle von Bascom-AVR oder eine Programmier hilfe in Deutsch? Um besser in das Programmieren einzusteigen ich habe bis jetzt immer nur Prog. angeschaut und verändert...
Versuch mal, ist eine variante, da dreht er sich ewig hin und her
$regfile = "m32def.dat" 'controller definieren
$crystal = 16000000 'Taktfrequenz definieren
Dim I As Byte
Dim A As Byte
Dim Zeit As Byte
Config Portb = Output 'Port als "Ausgang" definieren
Config Portc = Output
Config Portd = Output
1a Alias Portb.0 'Pin als Spule 1a benennen
1b Alias Portb.1 'Spule 1b
2a Alias Portc.6 'Spule 2a
2b Alias Portc.7 'Spule 2b
Portb.0 = 0 'Spule 1a definiert auf Null
Portb.1 = 0 'Spule 1b
Portc.6 = 0 'Spule 2a
Portc.7 = 0 'Spule 2b
Portd.4 = 1 'Motortreiber Spule 1 Enable
Portd.5 = 1 'Motortreiber Spule 2 Enable
Dim Stepp As Integer
Dim Direct As Integer
Direct = -1 ' rückwärts
Zeit = 3
Do
Direct = Direct * -1 ' ändern richtung
For A = 1 To 240
Stepp = Stepp + Direct
Stepp = Stepp And &H0003
On Stepp Gosub P_0 , P_1 , P_2 , P_3
Waitms Zeit
Next
Loop
End
P_0:
1a = 1 : 1b = 0 : 2a = 1 : 2b = 0 'Schritt 1
Return
P_1:
1a = 1 : 1b = 0 : 2a = 0 : 2b = 1 'Schritt 2
Return
P_2:
1a = 0 : 1b = 1 : 2a = 0 : 2b = 1 'Schritt 3
Return
P_3:
1a = 0 : 1b = 1 : 2a = 1 : 2b = 0 'Schritt 4
Return
Blackbumpkin
20.12.2005, 16:13
für was stehen jetzt eigendlich die DIM ... as INEGER Befehlszeile???
weil wenn sie nicht da ist geht es auch...
und kannst du mir mal das ein wenig erklären da ich es nicht wirklich verstehe wie man auf so was jetzt kommt...
super danke
Direct und stepp sind Zahlen mit Vorzeichen anders isses nicht bei Bascom
Anfang:
Direct = -1
stepp = 0 ' das macht der Bascom am Anfang freiwillig
aussere (ewige) Schleife
direct = direct * -1 ' das ergibt einmal +1 und einmal -1
Und nun 240 mal: ' 60 * 4 Schritte
stepp + direct ' ist direct = +1 geht's rauf, sonst runter
stepp and &H0003 'dadurch bleiben nur die 2 kleinsten Bits über
daher kann stepp nur 0, 1, 2 oder 3 werden ( bei +)
daher kann stepp nur 3, 2, 1 oder 0 werden ( bei - )
On stepp p-0,--- p_3
je nach der Zahl in stepp (0-3) wird ein Schritt muster gesetzt
auch entweder 1234 oder 4321
that's it
ja viel spielen das habe ich auch gemerkt das es nicht immer gleich so geht. Gib es eigendlich ihrgend wo eine beschreibung der befehle von Bascom-AVR oder eine Programmier hilfe in Deutsch? Um besser in das Programmieren einzusteigen ich habe bis jetzt immer nur Prog. angeschaut und verändert...
Klar gibts ne Beschreibung.
einmal in der Hilfe von Bascom und einmal ein ca. 30MB PDF zum Download bei Mcselec was etwas übersichtlicher ist als die Hilfe.
In Deutsch siehts allerdings mau aus.
Es gibt einige Versuche im Web aber die sind teilweise vealtet.
Ansonsten gibt es einige Bücher zu kaufen aber ich würde nicht einsehen dafür auch noch Geld hinzulegen.
Es wäre eh sinvoll Englisch zu lernen denn in der Technischen Welt ist das die Sprache schlechthin.
Fast alle Dokumentationen (Spezifikationen,Handbücher,Datenblätter,Infos usw.) werden in Englisch gemacht.
Schau dir mal Picknicks Programm an.
Da siehste schön wie man so Schreibt das man die eigentliche Arbeit mit Flags erledigen kann.
Weiter entwickelt kannste dann der Routine zb. sowas sagen "Links,390 Schritte" und das wars.
Natürlich läst sich noch viele mehr anstellen aber zuviel auf einmal ist kontraproduktiv
für was stehen jetzt eigendlich die DIM ... as INEGER Befehlszeile??? #
Schau mal bei den Variablentypen in der Hilfe rein.
Bit = ein Bit 0 und 1 ,mehr nicht
Byte = ein Byte also 8 Bit also 2^8 =256 Werte also 0-255
Word = Zwei Byte = 16 Bit also 2^16 = 65536 Werte also 0-65535
Integer = Zwei Byte wie Word aber mit Vorzeichen. -32,768 bis +32,767
Long = 32 Bit also 4 Byte wie Integer mit Vorzeichen -2147483648 bis 2147483647
Single = Flieskommazahl 32 Bit 1.5 x 10^–45 bis 3.4 x 10^38
Double = das gleiche wie Single nur 64 bit 5.0 x 10^–324 bis 1.7 x 10^308
Und zuletzt String = Zeichenkette bis 254 Zeichen.
steht aber alles in der Hilfe bzw. Handbuch.
Long ? 32 Bit
passt so, sind 32
Äh Sorry,danebengetippt.
Der Forenausfall eben hat mich kalt erwischt.
*rofl* Hoff' nur, du hast nich alles 2 mal schreiben müssen *hehehe*
normalerweise erwischt es mich :D
Das ist es ja eben.
Ich klick auf Senden und peng ,wech ist das Forum und als ob das nicht genügen würde hängt mein Browser gleich mit so das ich den Text nicht retten kann
Tja,Shit happens :D
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.