Hallo!
Hat jemand eine Idee, wie ich einen Schrittmotor langsam in der Drehzahl
hochfahren kann? Es handelt sich um einen unipolaren Motor mit 5
Anschlüssen.
Wenn Code's dann bitte nur in BASCOM, ich versteh kein C. ;-)
Danke schon im Voraus.
Grüße
Thomas
In die Schleife, in der die Takte für den Motor erzeugt werden, muß
eine variable Zeitschleife rein!
also definiere zuerst 3 Konstanten
-Startfrequenz
-Arbeitsfrequenz
-Bremsfrequenz
zb wird:
beim Start wird die Zeitschleife pro Schritt immer ein wenig kürzer bis
die Arbeitsfrequenz erreicht ist.
......
Somit kanst Du eine Start.- bzw Bremsrampe erzeugen!
Gruß Fred
Lass dir das Bier schmecken! :-)
Der Code funktioniert übrigens einwandfrei, ich möchte nur noch einen
Sofstart haben und deshalb bin ich ja auch hier. ;-)
Grüße
Thomas
Du müsstest abhängig von der Position den
Timer0 = 217
unterschiedlich schnell laufen lassen.
Denn der schaltet deine Schritte weiter.
BTW:
Wenn ich das Listing so ansehe, dann war es doch ein weiser Entschluss,
C zu lernen.
Frage an Thomas E.
> unipolaren Motor mit 5 Anschlüssen
da ist doch bestimmt einer grün/gelb? -> Schutzleiter
ein unipolarer Motor hat mindestens 6 Anschlüsse! (7)
(2 Wicklungen mit je einer Mittelanzapfung + SL)
dh Du hast einen bipolaren vor Dir!
Unipolare Motoren werden mit 8 nicht 4 Zuständen
berieben. (Vollschritt) Sonst weiß der arme Kerl
ja garnicht in welcher Richtung er losdrehen soll!
zb Rechtsdrehung
Schritt Phase1 Phase2 Feld
1 +1 0 oben
2 +1 +1 oben/rechts
3 0 +1 rechts
4 -1 +1 unten/rechts
5 -1 0 unten
6 -1 -1 unten/links
7 0 -1 links
8 +1 -1 oben/links
das - zeig einen Stomfluß umgekehrt durch die Phase an!
Dises kanst Du durch eine H-Brücke erreichen.
-> Du brauchst pro Motor (min) 4 Ausgänge (haste richtig gemacht)
2 x für Stom an
2 x für die Stromrichtung
lass mal am Anfang die vier verschidenen Bewegeungen weg
(90 Grad links usw)
und programmiere erstmal eine Tabelle (2) und eine Sub mit den Schritten
um nach links drehen zukönnen! Danach sollte es Dir leichtfallen
auch nach rechts drehen zu können.
Da ich aus Deiner Software sehe das du noch keine entspechende
Hardware besitzt :) und keinerlei Erfahrung mit Schritty's hast,
kannst Du das auch erstmal mit LED's an den Pin's simulieren!
zu den Rampen und der Stromharmonisierung usw werde ich Dir
dann auch weiterhelfen.
Gruß Fred
Fred, ich sagte doch, der Motor hat fünf Anschlüsse und der von mir oben
gepostete Code funktioniert auch und macht was er soll. Hardware ist
vorhanden und alles läuft soeben vor mir auf dem Tisch. Ich möchte nur
einen Softstart haben, das ist alles.
edit
es ist ein schlechter Stil
die Variablen nicht nach ihre Funktion und Wertebereich zu benennen
Zeit zb für Programmphase
Dim Schritt As Byte
Dim Zeit As Byte
Dim Position As Long
besser
Dim _b_Schritt As Byte
Dim _b_Zeit As Byte
Dim _l_Position As Long
Gruß Fred
> wenn das Funktioniert?
While Zeit = 4
If Schritt = 1 And Position < 4400 Then
S1 = 0
S2 = 0
S3 = 0
S4 = 1
Incr Position
End If
If Schritt = 2 And Position < 4400 Then
S1 = 0
S2 = 0
S3 = 1
S4 = 0
Incr Position
End If
If Schritt = 3 And Position < 4400 Then
S1 = 0
S2 = 1
S3 = 0
S4 = 0
Incr Position
End If
If Schritt = 4 And Position < 4400 Then
S1 = 1
S2 = 0
S3 = 0
S4 = 0
Incr Position
End If
> gehört die Zeitschleife hier hin!
Wend
Fred
Hi
>ein unipolarer Motor hat mindestens 6 Anschlüsse! (7)>(2 Wicklungen mit je einer Mittelanzapfung + SL)
Nein. Es gibt unipolare Motoren mit 5 Anschlüssen. Bei denen sind die
Mittelanzapfungen zusammengefasst. Einen Schutzleiter habe ich bis jetzt
bei den wenigsten Schrittmotoren gefunden.
@Thomas
Das ändert aber nichts daran, das mir die Ansteuerung sehr suspekt
vorkommt. Normalerweise werden immer zwei Wicklungshälften bestromt. Das
der Motor trotzdem läuft ist kein Kriterium für korrekte Ansteuerung.
Zu deinem Softstart: Wenn du 'Timer0 = 217' durch 'Timer0 = Variable'
erstzt
und die von einem hohen Startwert bei jedem Schritt bis auf die 217
verringert bekommst du einen Softstart.
MfG Spess
spess53 wrote:
> @Thomas> Das ändert aber nichts daran, das mir die Ansteuerung sehr suspekt> vorkommt. Normalerweise werden immer zwei Wicklungshälften bestromt. Das> der Motor trotzdem läuft ist kein Kriterium für korrekte Ansteuerung.
Er läuft schon, nur mit vermindertem Drehmoment. Mittlerweile nehme ich
zwei Wicklungshälften und er hat mehr Kraft.
spess53 wrote:
Wenn du 'Timer0 = 217' durch 'Timer0 = Variable'
> erstzt> und die von einem hohen Startwert bei jedem Schritt bis auf die 217> verringert bekommst du einen Softstart.
Das werd ich mal versuchen, danke für den Tipp.
LG
Thomas
@spess53
>Nein. Es gibt unipolare Motoren mit 5 Anschlüssen.
ist mir noch keiner untergekommen!
Die Mittelanzapfungen sind eigendlich IMMER getrennt, um den
Motor (unipolar) auch an bipolaren Endstufen beteiben zu können!
Aber das kann ja Thomas E. leicht ausklingeln
Gruß Fred
Hi
Ein bipolarer würde mit der Ansteuerung gar nicht laufen. In meiner
Schrittmotorsammlung habe ich jetzt ganz spontan 3 Stück gefunden. Zwei
davon sind von EPSON.
MfG Spess
unterhalten wir uns um ausgebauten Bastelkram
oder
um Schrittmotoren mit dem was antreiben kann?
(außer leichte Druckköpfe)
bei den EPSON Motoren handelt es sich bestimmt um spez. Anfertigungen
für einen spez. Drucker. EPSON kann es sich leisten für jede Anwendung
einen spez. Motor herstellen zu lassen. (daher kein SL und zusammen
gefasste Mittelanzapfungen) Dieser Bastelkram ist aber
nach kürzester Zeit für keinen von uns mehr Verfügbar.
wenn Thomas E. wirklich was über Schritty's wissen will
sollte er sich nicht mit diesem Zeug beschäftigen!
eine gute Seite ist:
http://www.roboternetz.de/schrittmotoren.html
Gruß Fred
>Warum so gereizt?
Ich doch nicht. Wenn Du mich sehen könntest, würdest Du feststellen
das ich noch im Kleinsignalbereich laufe.
Aber größere Motoren werden nicht mit Spielzeugspannungen(anfangs)
bertieben! -> Schutzleiter
120V sind üblich um möglichst schnell Strom fließen zulassen.(H)
Gut mit Thomas E. lag ich wohl daneben! Wenn der Motor wirklich
ein unipolarer mit gemeinsahmer Mittelanzapfung ist!
Fred :)
@ Thomas E. (tomedl)
Kannst du lesen? Ja? Wäre schön wenn du mal die Regeln des Forums
beherrzigen würdest. Stehen direkt über dem Eingabefenster. Danke.
Falk
Wieso erinnert mich das Programm so sehr an eins, das ein Mitschüler
damals (1992; Turbo Pascal) "programmiert" hat?
Der hat eine Laufschrift programmiert, die für jeden Buchstaben ein
eigenen Programmteil geschrieben - Felder waren ihm wohl unbekannt.
Zum Programm:
Man lässt einen Timer laufen, in dessen ISR man den Schrittmotor einen
Schritt weiter machen lässt. (Schritt zählen, die Ausgabemaske in einem
Feld mit 4-8 Index großen Feld speichern - dann spart man sich all die
Abfragen).
Die ISR wird immer dann angesprungen, wenn der Timer einen bestimmten
Vergleichswert erreicht hat (z.B. CTC-Mode).
Beim Start wird der Vergleichswert relativ hoch angesetzt, um eine
niedrige Frequenz zu erreichen.
Eine Rampe kann man jetzt abhängig der bereits gemachten Schritte
fahren, indem man den Vergleichswert bis zu einem bestimmten (maximale
Schrittfrequenz) dekrementiert. "Beschleunigungsrampe"
Wenn dann eine bestimmte Schrittanzahl erreicht wurde, vergrössert man
den Vergleichswert wieder. Dann hat man die "Bremsrampe".
Das muß man nur noch in die entsprechende Programmiersprache umsetzten.
Welche das ist, sollte egal sein.
spess53 wrote:
> Wieso. Meinen Vorschlag von 18:36 wollte Thomas ausprobieren. Nur bis> jetzt keine Rückmeldung.
So, hier nun die Rückmeldung:
Deine Idee habe ich umgesetzt und es funktioniert einwandfrei.
Mittlerweile habe ich einen Softstart und einen Softstopp realisieren
können.
Ihr habt mir damit sehr geholfen, auch wenn die Diskussion über die
Anschlüsse etwas unnötig war (mein Motor hat trotzdem fünf Anschlüsse).
@Falk
Ich denke du meinst den langen Code weiter oben? Sry, der kommt das
nächste Mal in den Anhang.
@Rahul
Ich verstehe was du meinst, allerdings weiß ich noch nicht so genau, wie
das mit den Feldern gehen soll. Vielleicht hat jemand ein Beispiel in
BASCOM?
Grüße
Thomas
>Vielleicht hat jemand ein Beispiel in BASCOM?
Such im Bascom-Handbuch nach "Array"!
Dein Feld müsste dann so aussehen:
Initialisierung:
DIM A(4) as byte
A(1) = 16
A(2) = 8
A(3) = 4
A(4) = 2
im Programm wird dann der Port vermutlich so gesetzt:
PortD = A(Schritt)
Dann solltest du noch eine Richtungs-Variable benutzen, und damit
entscheiden, in welche Richtung der Motor drehen soll.
Das kann man dann dadurch realisieren, dass man den Feld-Index entweder
hoch- oder herunterzählt.
Von Bascom habe ich sonst keine Ahnung...
So, nun hab ich etwas weiter gebastelt und bin iweder auf Probleme
gestoßen.
Den Softstart habe ich so realisiert, wie von spess53 vorher oben
beschrieben.
Dazu zähle ich den Timer-Startwert pro Timer-Überlauf um eins hoch und
dadurch vergeht immer weniger Zeit, um den Timer zum Überlaufen zu
bringen -> der Schrittmotor wird immer schneller.
Allerdings ist diese "Beschleunigungsrampe" nicht linear, sondern folgt
eher mehr einer e-Funktion, da ja bei jedem Timer-Überlauf auch der
nächste Startwert des Timers um eins erhöht wird.
In BASCOM sieht das ganze so aus:
1
ISR vom Timer0:
2
Timer0 = x
3
If x < 255 then Incr x
4
Incr y
5
If y = 5 then y=1
6
Return
x ist die Variable für den Sartwert, der Startwert selber wird mit
Timer0 = x gesetzt. Als nächstes folgt die Bedingung für die
Erhöhung des Startwertes:
1
Wenn x kleiner 255 dann erhöhe x um eins
Anschließend wird noch die Variable y erhöht, welche die Schrittfolge
vorgibt. Da ich nur vier Schritte benötige, wird die Variable bei
erreichen von dem Wert 5 auf 1 zurückgesetzt.
Das funktioniert auch recht gut, bis auf jene Tatsache, dass die
"Beschleunigungsrampe" die Fomr einer e-Funktion besitzt. Warum verstehe
ich ja, nur Abhilfe dagegen weiß ich keine. Wenn ihr mir da einen
kleinen Tipp geben könntet, wäre ich dankbar.
Als nächstes wollte ich die von Rahul der trollige angesprochenen Felder
angehen. Da ich leider momentan für die nächsten Stunden nicht an den
AVR kann, aber dennoch sehr neugierig bin, frage ich einfach hier mal,
ob das so funktionieren kann.
Ich hab mich mal im Tutorial von der Roboternetz-Seite schlau gemacht
und habe mir dort ein wenig die Seite über Tabellen in BASCOM
durchgelesen. Wenn ich das richtig verstanden habe, kann ich damit
gewisse Schaltzustände der Ports einfach "abspeichern" und danach wieder
abrufen.
Der Code für so eine Tabelle würde laut Tutorial so aussehen:
1
Schrittfolge:
2
DATA &B00000110 'Schritt1
3
DATA &B00001100 'Schritt2
4
DATA &B00011000 'Schritt3
5
DATA &B00010010 'Schritt4
Das auslesen aus der Tabelle geschieht so:
1
PORTB = LOOKUP(0 , Schrittfolge)
Mittlerweile habe ich es programmiert und es läuft, also das mit den
Tabellen funktioniert prächtig, und ich spare einiges an Speicher.
Trotzdem belibt noch das Problem mit der Beschleunigungsrampe....
Grüße
Thomas
Hi
Also mir geht es es eigentlich auch wie Rahul :Von Bascom habe ich sonst
keine Ahnung...
Das mit der Start/ Stoprampe ließe sich evtl. auch mit einer Tabelle
realisieren. Dort werden die Timerwerte abgelegt. Damit lässt sich jeder
Verlauf realisieren.
>Das auslesen aus der Tabelle geschieht so:>PORTB = LOOKUP(0 , Schrittfolge)
In deinem Programm hast du den Schrittmotor an Port D hängen, also
sollte das auch hier so sein. Zum anderen überschreibst du mit PORTD=...
den kompletten Port. Solange nur der Motor dranhängt gibt es keine
Probleme. Ansonsten erst PortD (ich meine wirklich PortD und nicht PIND)
einlesen, ein
'and &B11100001' und dann 'or' mit dem Lookupwert. Das ganze dann
ausgeben.
MfG Spess
Hi!
Sry, im "echten" Programm hab ich eh PORTD stehen.
>Zum anderen überschreibst du mit PORTD=...>den kompletten Port. Solange nur der Motor dranhängt gibt es keine>Probleme. Ansonsten erst PortD (ich meine wirklich PortD und nicht PIND)>einlesen, ein>and &B11100001' und dann 'or' mit dem Lookupwert. Das ganze dann>ausgeben.
Sry, dass verteh ich jetzt nicht.
>Das mit der Start/ Stoprampe ließe sich evtl. auch mit einer Tabelle>realisieren. Dort werden die Timerwerte abgelegt. Damit lässt sich jeder>Verlauf realisieren.
Werd ich mal versuchen.
>eher mehr einer e-Funktion
Eher 1/x, da man ja die Periodendauer verkürzt...
>Tabellen in BASCOM durchgelesen.
Tabellen sind nicht das gleiche wie Felder!
Die Linearität der Frequenz kann man dadurch halbwegs erzeugen, indem
man nicht bei jedem Durchlauf den Vergleichswert ändert, sondern in
nicht linearen Abständen. Irgendwo hatte ich dazu noch eine Art Tabelle
(müsste ich jetzt suchen).
Darin habe ich die Differenzfrequenz und die damit zusammenhängede
Periodendauer zwischen zwei Schrittfrequenzen berechnen lassen
(OpenOffice.Org Calc...).
Hi
Wenn du z.B. '&B00010010' auf den Port gibst werden deine Ausgänge 7,6,5
und 0 (die die nicht mit dem Motor verbunden sind) unweigerlich 0, egal
was vorher dort stand. Deshalb erst Einlesen, diese Bits sichern und mit
den zu setzenden Bits verknüpfen.
MfG Spess
Rahul Der trollige wrote:
> Tabellen sind nicht das gleiche wie Felder!
Und was sind dann Felder?
>Wenn du z.B. '&B00010010' auf den Port gibst werden deine Ausgänge 7,6,5>und 0 (die die nicht mit dem Motor verbunden sind) unweigerlich 0, egal>was vorher dort stand. Deshalb erst Einlesen, diese Bits sichern und mit>den zu setzenden Bits verknüpfen.
Warum soll ich die Ports einlesen? Da hängt ja eh nix dran außer Motor.
Hi
Ich hatte geschrieben: 'Solange nur der Motor dranhängt gibt es
keine...'
Aber wenn noch etwas anderes dranhängt dann wird es problematisch. Auch
bei Eingängen würde z.B. falls benutzt, der interne PullUp ausgeschaltet
werden. Es gehört einfach zur sauberen Programmierung, das nur die Bits
geändert werden, die geändert werden sollen. Bei so kleinen Programmen
hast du noch den Überblick. Bei grösseren Sachen artet das sehr schnell
in unnötigen Stress aus.
MfG Spess
Rahul Der trollige wrote:
>>Und was sind dann Felder?>> Man kann sie auch Vektoren, Matrizen oder Array nennen.> Ich habe im anderen Post eins als Beispiel gebracht...
Habe nun versucht mich schlau zu machen, allerdings hab ich im I-net nix
über Arrays gefunden. Kann mir jemand einen vollständigen Beispielcode
mit einem funktionierenend Array posten?
Gru´
Thomas
spess53 wrote:
> Hi>> Wie wärs mal mit der BASCOM-Hilfe?>> MfG Spess
Tja, entweder bin ich zu blöd, die BASCOM-Hilfe zu verstehen oder ich
kann einfach kein Englisch. Jedenfalls check ich's net.
Gruß
Thomas
Hallo!
Okay, ich habs jetzt in gefunden (genau auf Seite 233, danke Spess! ;-)
)
Soweit ich das verstehe, ist ein Array etwas ähnliches wie eine Tabelle,
nur mit dem Unterschied, dass mit den Daten im Array gearbeitet werden
kann (sie können verändert werden, z.B. Wert um eins erhöhen, falls
irgendeine Bedingung erfüllt wird).
Um ein Array zu erstellen, muss ich folgenden Code tippen:
1
Dim A(10) as Byte
2
Dim B as Byte
3
For B = 1 To 10
4
A(b) = B
Mit Dim A(10) as Byte erstelle ich das Array.
Mit DimB as Byte erstelle ich eine Variable des Typs Byte.
Mit For B = 1 To 10 definiere ich, dass die Variable B in die zehn
Felder des Arrays gefüllt werden soll.
Und was mach ich mit A(b) = B?
Wie liest man aus dem Array aus?
Fragen über Fragen - aber ihr seht, ich bin schon ein Stückchen weiter!
;-)
lg
Thomas
>Und was mach ich mit A(b) = B?
Damit weist man den aktuellen Wert von B dem Array A an der Stelle B zu.
Zuweisen und Auslesen geht genauso wie mit "normalen" Variablen.
Rahul Der trollige wrote:
>>Und was mach ich mit A(b) = B?>> Damit weist man den aktuellen Wert von B dem Array A an der Stelle B zu.> Zuweisen und Auslesen geht genauso wie mit "normalen" Variablen.
Aha, also wird das Array nicht mit Zahlen von 1 bis 10 bezeichnet,
sondern mit Buchstaben? Da könnte man dann ja nur 26 Felder haben? Mir
kommt vor, da verstehe ich was nicht richtig.
Also gut, nochmal von vorne:
1
Dim A(10) as Byte 'Array mit 10 Feldern erstellen
2
Dim B as Byte 'Variable B als Byte definieren
3
For B = 1 To 10 'Variable B in die 10 Felder füllen
4
A(b) = B 'dem Feld b vom Array A den Wert von B zuweisen
Auslesen würde dann so funktionieren:
1
If A(b) = 8 then Led=1 else Led=0 'nur ein Beispiel
Hi
>Aha, also wird das Array nicht mit Zahlen von 1 bis 10 bezeichnet,>sondern mit Buchstaben?
B ist eine Variable und kann deshalb so gross werden, wie der
Variablentyp, den du mit DIM vereinbart hast.
Nimm mir es bitte nicht übel, aber du hast noch einige Defizite.
Versuche doch mal in einer Bibliothek ein Buch über BASIC zu bekommen.
Da kannst du dich mal über grundlegende Funktionen, Datentypen und
Programmiertechniken informieren. Das Internet ist auch nicht das Non
plus Ultra.
MfG Spess
spess53 wrote:
> Nimm mir es bitte nicht übel, aber du hast noch einige Defizite.> Versuche doch mal in einer Bibliothek ein Buch über BASIC zu bekommen.> Da kannst du dich mal über grundlegende Funktionen, Datentypen und> Programmiertechniken informieren. Das Internet ist auch nicht das Non> plus Ultra.
Wieso sollte ich es dir übel nehmen? Ich habe erst vor zwei Monaten mit
der µC-Spielerei begonnen und bin mir daher im Klaren, dass ich noch
lange nicht der perfekte Programmierer bin. Aber aus diesem Grund frag
ich hier ja nach, um meine Projekte zu verwirklichen. Ich werde mich mal
nach einem guten Buch umsehen, danke für den Tipp.
Grüße
Thomas
spess53 wrote:
> Hi>> Sieh mal hier im Forum unter Buchtipps nach. Das Buch von Kühnel könnte> etwas für dich sein.>> MfG Spess
Ich werde die Bücher von Dr. Claus Kühnel und Ronald Walter bestellen.
Grüße
Thomas
Um eine konstante Beschleunigung zu erhalten, musst Du die Frequenz
linear mit der Zeit erhöhen, nicht linear mit der Schrittzahl.
Und die vergangene Zeit kannst Du errechnen, indem Du alle bisherigen
Timerwerte zusammenaddierst.
Oder Du machst es so:
Frequenz = Startfrequenz;
Beschleunigung = Startbeschleunigung; //z.B. +1
Wartezeit = 0;
loop:
Frequenz += Beschleunigung * Wartezeit;
if(Frequenz == Zielfrequenz){Beschleunigung = 0;}
//oder if(Schrittzahl == BeschlEnde){Beschleunigung = 0;}
else if(Schrittzahl == BremsBeginn){Beschleunigung = -1;}
else if(Schrittzahl == BremsEnde){MotorStop;}
Wartezeit = Taktfrequenz / Frequenz;
Es ist angebracht, die Frequenz nicht in Hertz, sondern in z.B.
Achtelhertz zu berechnen (Fixed-Point-Arithmetik).
Statt der Division Wartezeit = Taktfrequenz / Frequenz;
kannst Du auch eine Tabelle verwenden.
Um welche Frequenzen geht es denn hier?
Hallo!
Danke für die Antwort, eProfi, aber ich habe das Problem bereits gelöst.
Es läuft parallel zum Haupttimer ein zweiter Timer mit, der beim
Überlauf den Startwert des Haupttimers um eins erhöht. Damit bekomme ich
eine lineare Beschleunigungsrampe.
Das einzige, was mir jetzt noch zu schaffen macht, ist das von spess53
angesprochene Problem mit dem überschreiben des gesamten PortD.
Ich kann die LED, die an PortD.0 hängt nicht mehr benutzen, da ich bei
jedem Schritt den gesamten PortD neu überschreibe. Die Tabelle dazu:
1
Data &B00000110
2
Data &B00001100
3
Data &B00011000
4
Data &B00010010
Jetzt müsste ich irgendwie den PortD.0 dazu kriegen, nicht von dieser
Tabelle erfasst zu werden und damit jederzeit und unabhängig zu ändern
ist.
Grüße
Thomas
Hallo!
Ich habe das Problem jetzt folgendermaßen gelöst:
1
If X = 1 Then A = Lookup(0 , Schritte)
2
If X = 2 Then A = Lookup(1 , Schritte)
3
If X = 3 Then A = Lookup(2 , Schritte)
4
If X = 4 Then A = Lookup(3 , Schritte)
5
6
A = A Or B
7
8
Portd = A
9
10
If Y < 50 Then B = 1 Else B = 0
In die Variable A wird der Wert aus der Tabelle geschrieben (z.B.
&B00000110) und mit PortD = A ausgegeben. Die Variable B kann die Werte
0 oder 1 annehmen. Ganz unten prüfe ich dann noch den Wert von Y, falls
dieser 50 überschreitet wird der Wert von B geändert.
Das Ganze funktioniert auch einwandfrei, aber eine Frage hab ich noch.
Was wird mit A = A Or B gemacht? Für mich wäre das ein Widerspruch, da
ich einfach sage: A istgleich A oder B. Damit wäre ja A eigentlich
unbestimmt oder?
Vielleicht weiß ja jemand die Antwort auf meine Frage.
LG
Thomas
>A istgleich A oder B. Damit wäre ja A eigentlich unbestimmt oder?
Das ist kein Vergleich, sondern eine Zuweisung.
Man könnte es auch so schreiben:
X = A Or B
A = X
Am Ende steht in A das gleiche wie bei A = A or B
Aber auch dann hast Du keine lineare Beschleunigung, da die
SchrittFrequenz ja TimerFrequenz / Teilerwert ist und Du den Teilerwert
linear änderst, dann hast Du ja eine 1/x Funktion.
Naja, ist aber trotzdem schon mal besser als das Incrementen mit der
Schrittfrequenz, da die Funktion bei Deinen Werten vermutlich doch
ziemlich linear verläuft (deshalb habe ich nach Deinen Frequenzen
gefragt).
Nochwas: Es ist oft viel einfacher, beim Zählen nicht bei 1, sondern bei
0 zu beginnen.
Außerdem kannst Du den Schrittzähler und den "StepState" in ein- und der
selben Variablen speichern.
Ich würde folgendes vorschlagen:
Portd = Lookup(0,StepCnt AND 3) OR Ledzustand
Oder numeriert BASCOM ein Array ab 1? Das wäre ein Grund, den Compiler
sofort beiseite zu legen.
Aber ich sehe schon, Du kannst auf dem Gebiet der Binärzahlen und der
Boolschen Algebra noch viel lernen. Mit der Zeit bekommt man ein Gefühl
dafür.
Viel Spass dabei!
Hi
>Ich habe das Problem jetzt folgendermaßen gelöst:> If X = 1 Then A = Lookup(0 , Schritte)> If X = 2 Then A = Lookup(1 , Schritte)> If X = 3 Then A = Lookup(2 , Schritte)> If X = 4 Then A = Lookup(3 , Schritte)
Für so etwas gibt es 'Switch case'
MfG Spess
> If X = 1 Then A = Lookup(0 , Schritte)> If X = 2 Then A = Lookup(1 , Schritte)> If X = 3 Then A = Lookup(2 , Schritte)> If X = 4 Then A = Lookup(3 , Schritte)
Nicht, dass ich eine Ahnung von Basic hätte,
aber in C könnte ich die 4 Zeilen oben so schreiben:
A = Lookup(X-1 , Schritte)
????
Hi
Sollte natürlich 'select case' heissen. Mein einziger Kontakt zu BASCOM
war bisher, daß ich mal vor einigen Jahren mal die Codebegrenzung der
Demoversion gehackt habe. Um weiteren Diskussionen vorzubeugen: Ich habe
das nie genutzt und auch nicht weitergegeben.
MfG Spess
>> A = Lookup(X-1 , Schritte)>das wird Dein Comp. ähnlich übersetzen!
Wie was?
Der Bascom-Compiler übersetzt
> If X = 1 Then A = Lookup(0 , Schritte)> If X = 2 Then A = Lookup(1 , Schritte)> If X = 3 Then A = Lookup(2 , Schritte)> If X = 4 Then A = Lookup(3 , Schritte)
in
> A = Lookup(X-1 , Schritte)
Dann wäre er wirklich gut.
>Portd = Lookup(0,StepCnt AND 3) OR Ledzustand
Das würde voraussetzen, dass man immer mit Schritt "0" anfängt.
Wenn man eine bestimmte Strecke fährt (z.B. 30 Schritte) und dann eine
weitere (z.B. 45 Schritte), dann setzt man den Schrittzähler i.d.R.
wieder auf 0 zurück. da sich weder 30 noch 45 durch 4 teilen lassen,
hätte man einen selbstgemachten Schrittfehler.
Für diese Anwendung mag
>Portd = Lookup(0,StepCnt AND 3) OR Ledzustand
funktionieren - bei Erweiterungen gäbe es Probleme.
Carsten wrote:
>> A = Lookup(X-1 , Schritte)>> das wird Dein Comp. ähnlich übersetzen!
Das wird mein C (?) Compiler garantiert NICHT in ein switch/case oder if
Konstrukt übersetzen.
STK500-Besitzer:
"Das würde voraussetzen, dass man immer mit Schritt "0" anfängt."
Nein, der StepCnt ist ein globaler Zähler, der alle Steps (increment für
vorwärts und decrement für rückwärts) mitzählt und gleichzeitig die
untersten Bits als Pointer in die Tabelle zeigen.
Zähler ist dafür vielleicht ein suboptimaler Name, StepState ginge auch.
Nochmal, diese Variable ist.
Schade, dass fast keine Schrittmotoren 256 Schritte pro Umdrehung haben.
Beispiel:
Wenn Du bei Schritt 123 stehst und 30 Schritte nach rechts machst, steht
er danach auf Schritt 153. Danach 45 Schritte nach links --> Schritt 108
30 Schritte nach rechts:
Schritt Pointer Bitmuster
123 3 1000
124 0 0001
125 1 0010
...
152 0 0001
153 1 0010
jetzt Drehrichtung umkehren (45 Schritte nach links):
152 0 0001
151 3 1000
...
109 1 0010
108 0 0001
Man bracht keine Fallunterscheidung o.ä. für die Richtung. Man
subtrahiert einfach 1 und fertig.
Das geht übrigens auch über eine Umdrehung hinaus.
Zum Setzen der Bits:
PortD = PortD AND $1e OR stepTable[StepCnt AND 3]