Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
crucido
Anmeldungsdatum: 14.01.2006 Beiträge: 16 Wohnort: Mittelhessen
|
Verfasst am: 13.02.2006, 23:24 Titel: Schrittmotor und SELECT CASE, Verbesserungen? |
|
|
Hallo liebe Freunde des MSR,
Crucido meldet sich zurück.
Bin dabei, einen Schrittmotor mit meinem Eigenbau-Parallel-Interface zu steuern. Die Drehzahl wird über die Veränderung des Werts in FOR..NEXT (Variable z) verändert.
Code: | SUB links
OUT 888, 16
FOR T = 1 TO z
NEXT T
OUT 888, 32
FOR T = 1 TO z
NEXT T
OUT 888, 64
FOR T = 1 TO z
NEXT T
OUT 888, 128
FOR T = 1 TO z
NEXT T
END SUB
| (vollständige Version unter http://nopaste.freebasic.de/index.php?view=215). Meine Frage: Geht das auch eleganter, vielleicht sogar so, dass ich die Drehzahl während der Motor läuft ändern kann? Ist jetzt eine DO..LOOP Schleife, die muss ich immer erst beenden.
Dann hatte ich eine Version, die über die Eingänge des PP gesteuert wird (links, rechts, intervall). Das geht mit SELECT..CASE (http://nopaste.freebasic.de/index.php?view=214).
Code: |
a% = INP(889)
SELECT CASE a%
| Dann wollte ich statt den INP(889) Werten für die Variable "a" einfach die Tastatur mit INKEY$ abfragen.
Code: | a$ = inkey$
SELECT CASE a$ |
Ging aber nicht, "Falscher Datentyp". Warum? Ich hätte gern, dass der Motor auf Tastendruck sofort auf z.B. Linkslauf wechselt (die SUB "links" aufruft). Jetzt muss man immer die Schleife beenden und mit INPUT eingeben. Gefällt mir nicht!
Für Tips wäre man sehr dankbar..... _________________ "Wer weiß das er nichts weiß, ist klüger als der, der nicht weiß, dass er nichts weiß." |
|
Nach oben |
|
|
Michael Frey
Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 14.02.2006, 19:48 Titel: |
|
|
Ja, mach eine ein Sub pause, mit dem Inhalt FOR T = 1 TO z NEXT T, also
Code: | sub pause
FOR T = 1 TO z
NEXT T
end sub |
und dann wird daraus
Code: | SUB links
OUT 888, 16
pause
OUT 888, 32
pause
OUT 888, 64
pause
OUT 888, 128
pause
END SUB |
(andere Namen der Sub sind natürlich möglich)
Es gilt übrigens nicht als elegat wenn man zuviel Globisiert:
Code: | DIM SHARED z AS LONG
DIM SHARED art AS INTEGER |
besser wäre es, du übergibst das ganze über Parameter.
Nächstes Thema
Code: | DO UNTIL a$ = "e"
a$ = inkey$
SELECT CASE a$
CASE "119"
DO
rechts
LOOP UNTIL INP(889) = 63 OR INP(889) = 111 OR INP(889) = 255
OUT 888, 0
CASE "111"
DO
links
LOOP UNTIL INP(889) = 63 OR INP(889) = 119 OR INP(889) = 255
OUT 888, 0 |
So sollte es gehen. _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
|
Skilltronic
Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 14.02.2006, 21:54 Titel: |
|
|
Hallo
Hier mein Vorschlag. Die Drehrichtung wird bei laufendem Motor mit "r" und "l" gesteuert, die Geschwindigkeit mit "+" und "-".
Code: | pause = 20000
faktor = 2
wert = 128
DO
DO
wert = wert * faktor
IF wert = 256 THEN wert = 16
IF wert = 8 THEN wert = 128
OUT 888, wert
FOR p = 0 TO pause: NEXT
t$ = INKEY$
LOOP WHILE t$ = ""
SELECT CASE t$
CASE IS = "+"
pause = pause + 20000
CASE IS = "-"
IF pause > 20000 THEN pause = pause - 20000
CASE IS = "r"
faktor = 2
CASE IS = "l"
faktor = .5
END SELECT
LOOP |
Gruss
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
|
crucido
Anmeldungsdatum: 14.01.2006 Beiträge: 16 Wohnort: Mittelhessen
|
Verfasst am: 16.02.2006, 13:22 Titel: |
|
|
Vielen Dank für die schnellen Antworten und die guten Tips!
Das Problem mit dem "falschen Datentyp" ließ sich auch durch INP(96) statt inkey$ lösen. Nur hats dann immer gepiept, wenn der Speicher voll war. Die Lösung mit den Anführungsstrichen erscheiunt mir besser,
Werd den Rest am WE mal austesten. Coole Sache....
Gruß,
Crucido _________________ "Wer weiß das er nichts weiß, ist klüger als der, der nicht weiß, dass er nichts weiß." |
|
Nach oben |
|
|
crucido
Anmeldungsdatum: 14.01.2006 Beiträge: 16 Wohnort: Mittelhessen
|
Verfasst am: 16.02.2006, 13:32 Titel: |
|
|
Frage an Skill: Ich komm nicht so richtig dahinter (Kopfrechenen schwach..). Könntest du mir das System mit Wert und Faktor mal für Nichtmathematiker erklären? Bei welchem Wert beginnt er denn und warum dreht 2 in die eine und 0,5 in die andere Richtung? _________________ "Wer weiß das er nichts weiß, ist klüger als der, der nicht weiß, dass er nichts weiß." |
|
Nach oben |
|
|
Skilltronic
Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 16.02.2006, 13:33 Titel: |
|
|
Hallo
INP(96) leert im Gegensatz zu INKEY$ den Tastaturpuffer nicht, daher das piepsen. Auslesen mit INKEY$ in irgendeine unbenutzte Variable nach jedem INP verhindert das. In der Monster-FAQ und hier im Forum gibt es genaue Erklärungen zu diesem Problem.
Gruss
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
|
Skilltronic
Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 16.02.2006, 13:54 Titel: |
|
|
Ok, dann mach ich auch mal einen Doppelpost...
Mit den Werten 16, 32, 64 und 128 setzt du jeweils eins der oberen vier Bit des Bytes im Register 888 nacheinander auf 1 und schaltest so den entprechenden Ausgang ein. Im Binärsystem hat jede Stelle den doppelten Wert ihres Vorgängers. Im Dezimalsystem ist es ja immer das Zehnfache. Wenn du dort mit 10 multiplizierst oder durch 10 Teilst, wird die Zahl bzw. das Komma um eine Stelle nach Links oder Rechts verschoben. Im Binärsystem ist es das gleiche mit mal und durch 2.
Mit den beiden IF-Bedingungen wird verhindert, dass wert aus dem Bereich zwischen 16 und 128 hinausläuft, als Startwerte werden ja zu Beginn 2 für faktor und 128 für wert gesetzt. Wie es dann weitergeht ist doch eigentlich klar wenn du das Programm einfach mal "von Hand" durchgehst.
Gruss
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
|
crucido
Anmeldungsdatum: 14.01.2006 Beiträge: 16 Wohnort: Mittelhessen
|
Verfasst am: 16.02.2006, 15:07 Titel: |
|
|
Josen! habs gerallt. Jetzt ists klar. Ich hatte auch übersehen, dass er schon bei 128 (wert=128) startet. Sorry für die Kurzsichtigkeit. Das Poroblem mit dem Piepsen hatte ich auch mit besagter Methode in den Griff bekommen. Diese Methode gefällt mir aber nicht so gut.
Danke für die Erläuterung.
Gruß,
Cruz _________________ "Wer weiß das er nichts weiß, ist klüger als der, der nicht weiß, dass er nichts weiß." |
|
Nach oben |
|
|
Michael Frey
Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 16.02.2006, 18:33 Titel: |
|
|
Mir ist Gerade aufgefallen, das mein Code nicht Korrekt ist, hier die Korrektur:
Code: | DO UNTIL a$ = "e"
a$ = inkey$
SELECT CASE a$
CASE "w"
DO
rechts
LOOP UNTIL INP(889) = 63 OR INP(889) = 111 OR INP(889) = 255
OUT 888, 0
CASE "o"
DO
links
LOOP UNTIL INP(889) = 63 OR INP(889) = 119 OR INP(889) = 255
OUT 888, 0 |
Inkey liefert ja nicht die ASC Werte in einem String sondern das Zeichen . _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
|
crucido
Anmeldungsdatum: 14.01.2006 Beiträge: 16 Wohnort: Mittelhessen
|
Verfasst am: 18.02.2006, 16:28 Titel: |
|
|
@ Skill: So viele Probleme mit so wenig Code gelöst! Genau so hatte ich mir das Programm gedacht. Vielen Dank... _________________ "Wer weiß das er nichts weiß, ist klüger als der, der nicht weiß, dass er nichts weiß." |
|
Nach oben |
|
|
|