PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 2 Wiederholungen



Blackbumpkin
19.12.2005, 15: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

Ratber
20.12.2005, 02:15
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, 07: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, 07: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?

Ratber
20.12.2005, 14:17
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, 15: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...

PicNick
20.12.2005, 15:01
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, 15: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

PicNick
20.12.2005, 15:22
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

Ratber
20.12.2005, 15:24
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.

PicNick
20.12.2005, 15:28
Long ? 32 Bit

passt so, sind 32

Ratber
20.12.2005, 15:29
Äh Sorry,danebengetippt.
Der Forenausfall eben hat mich kalt erwischt.

PicNick
20.12.2005, 15:32
*rofl* Hoff' nur, du hast nich alles 2 mal schreiben müssen *hehehe*

normalerweise erwischt es mich :D

Ratber
20.12.2005, 15:37
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