Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Schrittmotor und SELECT CASE, Verbesserungen?

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
crucido



Anmeldungsdatum: 13.01.2006
Beiträge: 16
Wohnort: Mittelhessen

BeitragVerfasst am: 13.02.2006, 22:24    Titel: Schrittmotor und SELECT CASE, Verbesserungen? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 14.02.2006, 18:48    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 14.02.2006, 20:54    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
crucido



Anmeldungsdatum: 13.01.2006
Beiträge: 16
Wohnort: Mittelhessen

BeitragVerfasst am: 16.02.2006, 12:22    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
crucido



Anmeldungsdatum: 13.01.2006
Beiträge: 16
Wohnort: Mittelhessen

BeitragVerfasst am: 16.02.2006, 12:32    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 16.02.2006, 12:33    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 16.02.2006, 12:54    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
crucido



Anmeldungsdatum: 13.01.2006
Beiträge: 16
Wohnort: Mittelhessen

BeitragVerfasst am: 16.02.2006, 14:07    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 16.02.2006, 17:33    Titel: Antworten mit Zitat

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 mit den Augen rollen.
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
crucido



Anmeldungsdatum: 13.01.2006
Beiträge: 16
Wohnort: Mittelhessen

BeitragVerfasst am: 18.02.2006, 15:28    Titel: Antworten mit Zitat

@ 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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz