|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
westcoast
Anmeldungsdatum: 14.03.2008 Beiträge: 9
|
Verfasst am: 14.03.2008, 19:31 Titel: LPT Interface mit QBasic |
|
|
Hallo QBasic User,
im rahmen eines elektrotechnischen Projektes habe ich eine Software gesucht mit der ich den LPT Port meines Rechners ansteuern kann dabei bin ich auf QBasic gestoßen den es ist meines Erachtens leicht zu erlernen da es nicht so einen großen Syntax besitzt wie z.B. C++ oder andere Programmiersprachen.
Nun habe ich einige Tage damit gearbeitet und bin begeistert alles was ich probiert habe klappt einwandfrei.
Jetzt habe ich aber folgendes Problem ich will mit dem Programm ein selbst gebautes Interface steuern das ich mir auch bereits fräsen lassen habe, nun hab ich aber bemerkt das ich nicht 2 Ports gleichzeitig öffnen kann das heißt wenn ich
OUT 888, 1
SLEPP 10
PRINT „Port 1 ist an“
OUT 888, 2
SLEEP 10
PRINT „Port 2 ist an“
Geht Port 1 aus wenn Port 2 angeht das will ich aber nicht ich will die Ports getrennt voneinander schalten das ich jedes unabhängig voneinander ein und ausschalten kann oder bestimmte Port auch gleichzeitig öffnen kann wie im oberen Beispiel aber das geht aus mir unerklärlichen gründen nicht. Ich hoffe ich habe mein Problem verständlich erklärt.
Ich bin für jede noch so kleine hilfe dankbar.
MfG
westcoast |
|
Nach oben |
|
|
RatsDevSoftware
Anmeldungsdatum: 22.11.2007 Beiträge: 48
|
Verfasst am: 14.03.2008, 21:17 Titel: |
|
|
Du musst die Bits verknüpfen, mehr zum Thema unter:
http://franksteinberg.de/progss.htm _________________ visit our Homepage!
shift ist verschwendung...
...o gott - ich fang schon wieder an zu spammen... |
|
Nach oben |
|
|
westcoast
Anmeldungsdatum: 14.03.2008 Beiträge: 9
|
Verfasst am: 15.03.2008, 20:11 Titel: |
|
|
Danke für die schnelle antwort klappt alles wunderbar!
ich hab den befehlen nun buchstaben zugeordnet das heißt wenn ich auf die taste e druecke geht relais 1 und 2 an
der code sieht dabei so aus
Code: | LOCATE 10, 4
print "(E)rechts"
|
weiter unten dan
Code: | case "e"
out 888, 3
|
usw.
alles super ich kann die buchstaben zum aktivieren der bits bytes jederzeit wechseln.
aber was ist jetzt wen ich einer der pfeiltasten einen befehl zuordnen will geht das auch was muss ich dan in die klammer bzw. anführungszeichen schreiben ?
Hoffe man kann mir nochmal helfen.
MfG
westcoast |
|
Nach oben |
|
|
Paul aka ICC, HV-Freak
Anmeldungsdatum: 11.09.2004 Beiträge: 588 Wohnort: Uelzen
|
Verfasst am: 16.03.2008, 13:32 Titel: |
|
|
Pfeiltasten sind:
CHR$(0) + "H" 'oben
CHR$(0) + "H" 'unten
CHR$(0) + "K" 'links
CHR$(0) + "M" 'rechts
Achja, falls auch mehrere Relais gleichzeitig gedrückt werden sollen, kannste das auch so machen:
Code: |
do
select case inkey$
case "a": if bit0 = 0 then bit0 = 1 else bit0 = 0
case "b": if bit1 = 0 then bit1 = 1 else bit1 = 0
...
end select
out 888, bit7 * 128 + bit6 * 64 + bit5 * 32 + bit4 * 16 + bit3 * 8 + bit2 * 4 + bit1 * 2 + bit0
loop
|
So werden die Relais getogglet, d.h. mit einem einzigen Tastendruck geht es an, mit einem weiteren wieder aus.
_________________
|
|
Nach oben |
|
|
westcoast
Anmeldungsdatum: 14.03.2008 Beiträge: 9
|
Verfasst am: 16.03.2008, 15:03 Titel: |
|
|
danke geht super...
was basic alles kann wird ja immer besser....
hätte da noch eine Frage kann man es auch so machen das z.B. nur solange die pfeiltaste gedrückt wird der bit bzw. das relais anzieht und sobald die taste losgelassen wird das relais ausgeht also der kontakt nicht mehr besteht... |
|
Nach oben |
|
|
Skilltronic
Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 17.03.2008, 13:42 Titel: |
|
|
Hallo
Geht alles. Hier ist ein Beispiel, wie du die acht Ausgänge über die Zahlentasten 1 bis 8 so steuern kannst, dass sie an sind, so lange die entsprechende Taste gedrückt wird. Damit wird der Tastaturpuffer auf eine andere Art ausgelesen, als mit INKEY$. Jede Taste hat einen Wert von 0-127 wenn sie gedrückt wird und diesen Wert +128 wenn sie losgelassen wird. Die Werte entsprechen nicht dem ASCII-Wert! Die Zahlen 1-9 (oben, nicht im Nummernblock rechts) haben die Werte 2-10, Escape hat den Wert 1. Siehe auch: http://www.antonis.de/faq/qbmonfaq-dateien/1975975598.html
Code: | CLS
DO
talt = -3
DO
t = INP(96)
t$ = INKEY$ 'Tastaturpuffer leeren
LOOP WHILE t = talt
IF t = 1 THEN END 'Ende mit Escape
talt = t
LOCATE 3, 1: PRINT "t ="; 'Tastenwert ansehen
PRINT USING "###"; t
IF (t > 1) AND (t < 12) THEN 'Taste wurde gedrueckt
bit(t - 2) = 1
ELSEIF (t > 129) AND (t < 140) THEN 'Taste wurde losgelassen
bit(t - 130) = 0
END IF
LOCATE 1, 1
PRINT "Bits 0-7 :";
byte = 0
FOR s = 0 TO 7 'Die 8 Bit zu einem Byte zusammenbauen
byte = byte + bit(s) * 2 ^ s
PRINT bit(s);
NEXT
PRINT : PRINT "Ausgabewert:"; byte
OUT 888, byte 'Am LPT ausgeben
LOOP |
Gruß
Skilltronic
EDIT: Habe oben einen Tippfehler im Programm behoben und bei
Code: | t& = inkey& 'Tastaturpuffer leeren |
das & durch ein $ ersetzt. _________________ Elektronik und QB? www.skilltronics.de !
Zuletzt bearbeitet von Skilltronic am 18.03.2008, 02:14, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
westcoast
Anmeldungsdatum: 14.03.2008 Beiträge: 9
|
Verfasst am: 17.03.2008, 22:15 Titel: |
|
|
Danke,
funktioniert auch super genau das was ich noch gesucht habe...
aber da wäre noch...
Ich hab es jetzt schon selbst versucht und herumgefrickelt aber bekom es einfach nicht auf die reihe und zwar mein LPT interface hat einen Stromkreislauf mit dem ich auf alle anderen Kreisläufe energie gebe.
Bevor ich diesen kreislauf also nicht aktiviere kann ich auch keinen der anderen kreisläufe ansteuern weil diese folglich keinen saft haben. Also wäre es gut wenn ich in den code noch einen mechanismus einbauen könnte mit dem ich erst den Hauptkreislauf anmachen kann um später dan die anderen mit dem code von Skilltronic ansteuern zu können.
Dieser eine Kreislauf dient dann sozusagen als Notschalter wen ich ihm den Stromwegnehme geht alles aus.
also das was ich mir bis jetzt zurechtgebogen habe sieht so aus:
Code: | CLS
LOCATE 2, 30
PRINT " STEUERN "
LOCATE 3, 30
PRINT "================="
LOCATE 7, 2
PRINT "<E>=Ein"
LOCATE 8, 2
PRINT "<A>=Aus"
LOCATE 9, 2
PRINT "<Esc>=ENDE"
OUT 888, 0 'Relais geht aus
LOCATE 12, 30
PRINT "System: AUS"
Anfang1:
SELECT CASE INPUT$(1)
CASE "e": 'Relais wird durch die Taste <e>
'angeschaltet
OUT 888, 1
LOCATE 12, 30
PRINT "System: EIN"
GOTO Anfang1
CASE "a": 'Relais wird durch die Taste <a>
'ausgeschaltet
OUT 888, 0
LOCATE 12, 30
PRINT "System: AUS"
GOTO Anfang1
CASE CHR$(27): 'Prozedur wird
'wiederholt, bis man <Esc>
OUT 888, 0 'drueckt
LOCATE 12, 30
PRINT "System: AUS"
END SELECT |
Hier müsste nun irgendwo der code von skilltronic implementiert werden aber ich hab keinen plan wie vllt geht es ja auch in meinen code gar nicht rein...
MfG
westcoast |
|
Nach oben |
|
|
Skilltronic
Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 18.03.2008, 02:09 Titel: |
|
|
Ist im Prinzip ganz einfach. Statt der Strings "a", "e" oder chr$(27), kannst du mit SELECT CASE die entsprechenden Zahlen, die du mit INP(96) für diese Tasten bekommst. unterscheiden. 30 für "a", 18 für "e" und 1 für "ESC". Das loslassen ist bei diesen Funktionen ja uninteressant. Tritt sonst eine Aktion an der Tastatur auf (CASE ELSE), wird mit IF...THEN geprüft, ob an einer der Tasten 1-7 etwas passiert ist, ob sie gedrückt oder losgelassen wurde und das entsprechende Bit auf 1 oder 0 gesetzt. Da das erste Relais [bit(0)] als "Hauptschalter" belegt ist, bleiben ja nur sieben weitere. Du könntest die Relaistasten bei ausgeschaltetem System auch sperren, indem du sie nur beachtest, wenn Bit(0) auf 1 gesetzt ist.
Code: | CLS
LOCATE 2, 29
PRINT " STEUERN "
LOCATE 3, 29
PRINT "================="
LOCATE 7, 2
PRINT "<E>=Ein"
LOCATE 8, 2
PRINT "<A>=Aus"
LOCATE 9, 2
PRINT "<1-7>=Relais 1-7"
LOCATE 10, 2
PRINT "<Esc>=ENDE"
LOCATE 15, 23
PRINT "Relais: 1 2 3 4 5 6 7"
LOCATE 16, 23
PRINT "-----------------------------"
LOCATE 17, 23
PRINT "Status: 0 0 0 0 0 0 0"
OUT 888, 0 'Relais geht aus
LOCATE 12, 32
PRINT "System: AUS"
talt = INP(96)
t$ = INKEY$ 'Tastaturpuffer leeren
DO
DO 'Warten, bis an der Tastatur
t = INP(96) 'etwas passiert.
LOOP WHILE t = talt
t$ = INKEY$ 'Tastaturpuffer leeren
talt = t
SELECT CASE t
CASE 18 'Taste "e" wurde gedrueckt
bit(0) = 1 'Hauptrelais an
LOCATE 12, 32
PRINT "System: EIN"
CASE 30 'Taste "a" wurde gedrueckt
bit(0) = 0 'Hauptrelais aus
LOCATE 12, 32
PRINT "System: AUS"
CASE ELSE
IF t > 1 AND t < 11 THEN 'Zahlentaste 1-7 wurde gedrueckt
bit(t - 1) = 1
ELSEIF t > 129 AND t < 139 THEN 'Zahlentaste wurde losgelassen
bit(t - 129) = 0
END IF
END SELECT
byte = 0
LOCATE 17, 31
FOR s = 1 TO 7 'Die 8 Bit zu einem Byte zusammenbauen
byte = byte + bit(s) * 2 ^ s
PRINT bit(s); 'Bitstatus anzeigen
NEXT
OUT 888, byte 'Am LPT ausgeben
LOOP UNTIL t = 1
OUT 888, 0 'Alle 8 Pins ausschalten
END 'Programmende |
Gruß
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
|
westcoast
Anmeldungsdatum: 14.03.2008 Beiträge: 9
|
Verfasst am: 18.03.2008, 17:39 Titel: |
|
|
Hi,
skilltronic danke für deine bemühungen aber der code geht irdendwie nicht
der hauptkreislauf bzw. die ports gehen nicht an???
MfG
westcoast |
|
Nach oben |
|
|
Skilltronic
Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 18.03.2008, 22:45 Titel: |
|
|
Oh, das kommt davon, dass ich die Funktion der LPT-Ausgänge nicht getestet habe. Die Schleife, die das Ausgabebyte aus den einzelnen Bits zusammenbaut, läuft nur von 1 bis 7, Bit(0) wird nicht beachtet.
Code: | FOR s = 1 TO 7 'Die 8 Bit zu einem Byte zusammenbauen |
Die muss natürlich, wie im vorigen Beispiel, von 0 bis 7 laufen. Folglich sollte es heißen:
Code: | FOR s = 0 TO 7 'Die 8 Bit zu einem Byte zusammenbauen |
So sollte es gehen. Sorry für den Fehler, aber dass du ihn nicht selbst gefunden hast, deutet darauf hin, dass du nicht alles verstanden hast. Frage ruhig nach, wenn was unklar ist, du sollst ja wissen, was das Programm macht.
Gruß
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
|
westcoast
Anmeldungsdatum: 14.03.2008 Beiträge: 9
|
Verfasst am: 19.03.2008, 15:47 Titel: |
|
|
Hi,
also ich muss zugeben ich versteh das programm an machen stellen nicht ganz und zwar ab da wo die einzelnen tasten also 1 2 3 usw. defeniert werden. Ich möchte nämlich in den code irgendwie die pfeiltasten einbauen also das wen ich z.B. die pfeiltaste nach oben druecke relais 3 schließt und wen ich wieder loslasse es wieder ausgeht oben bei der taste e und a seh ich wie es mit case defeniert ist aber bei den anderen halt nicht das würd mich interessieren wie ich das noch für jede pfeiltaste bzw. normale taste defenieren könnte.
Desweiteren möchte ich noch einen blinker einbauen den ich mit der taste r einschalten und mit d wiederausschalten kann den code wo ich mir dafür geschrieben habe sieht so aus:
Code: | SELECT CASE INPUT$(1) 'E/A-Prozedur
CASE "r": 'Relais wird durch Taste <b>
'eingeschaltet
DO 'Blink-Prozedur
OUT 888, 1 'Relais ein
LOCATE 10, 30
PRINT "Blinker: EIN"
SLEEP 1
OUT 888, 0 'Relais aus
LOCATE 10, 30
PRINT "Blinker: AUS"
SLEEP 1
LOOP WHILE INKEY$ <> CHR$(27) 'Prozedur l„uft bis
'<a> gedrckt wird
END SELECT
|
Hoffe er ist nicht zu erbärmlich. Er hat auch nen Fehler ich kann ihn nur mit ESC ausschalten wen ich den wert 27 auf z.B. 30 für die taste a zum abschalten ändere geht das aus mir unerklärlichen gründen nicht.
Hoffe aber trotzdem das man den fehler beseitigen kann und das ganze in den richtigen code bekommt.
PS: gibt es irgedwo eine liste aus der man lesen kann welche taste welchen zahlenwert hat z.B. 18 ist e 30 íst a. |
|
Nach oben |
|
|
HorstD
Anmeldungsdatum: 01.11.2007 Beiträge: 107
|
Verfasst am: 20.03.2008, 01:36 Titel: |
|
|
@westcoast
Dieses Programm zeigt dir die Tastencodes an.
Beachte das Groß- und Kleinbuchstaben unterschiedliche Codes haben.
Code: |
DEFINT A-Z
CLS
PRINT TAB(25); "Taste drcken. Abruch ESC"
PRINT TAB(25); STRING$(26, 126)
PRINT
PRINT "Taste Code"
PRINT
DO
DO
a$ = INKEY$
LOOP UNTIL LEN(a$)
IF LEN(a$) = 1 THEN
PRINT " "; CHR$(34); a$; CHR$(34); TAB(26); USING "###"; ASC(a$)
ELSE PRINT " Sondertaste 0,"; LTRIM$(STR$(ASC(RIGHT$(a$, 1))))
END IF
IF a$ = CHR$(27) THEN
EXIT DO
END IF
LOOP
|
|
|
Nach oben |
|
|
Skilltronic
Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 20.03.2008, 02:00 Titel: |
|
|
Hallo
Das Programm von HorstD zeigt die ASCII-Werte an. Die kann mann z.B. auch im QB-Editor in der Hilfe unter Themen ansehen.
INP(96) funktioniert anders und liefert ganz andere Zahlen. Der ASCII-Wert von "1" ist z.B. 49, der Tastaturcode der Taste 1 ist dagegen 2. Daher auch das:
westcoast hat Folgendes geschrieben: | Er hat auch nen Fehler ich kann ihn nur mit ESC ausschalten wen ich den wert 27 auf z.B. 30 für die taste a zum abschalten ändere geht das aus mir unerklärlichen gründen nicht. |
Die 30 ist der Tastaturcode der Taste a, der ASCII-Wert des Zeichens "a" ist 97. Deshalb geht es nicht. CHR$ arbeitet mit dem ASCII-Wert. Der ist 27 bei Escape. Der Tastaturcode der ESC-Taste ist 1. Klar?
Das Besondere ist, dass mit INP(96) auch geprüft werden kann, ob eine Taste losgelassen wurde. Dann wird nämlich der Tastaturcode + 128 gesendet. Wird die ESC-Taste gedrückt also eine 1, wird sie losgelassen, eine 129 (1+128). Das ist bei allen Tasten so. So kannst du die Tastaturcodes ansehen:
Code: | CLS
DO
DO
t = INP(96)
LOOP WHILE t = talt 'Warten, bis was passiert
t$ = INKEY$ 'Tastaturpuffer leeren, t$ ist unwichtig
talt = t
PRINT t
LOOP UNTIL t = 1 'Ende mit Escape |
westcoast hat Folgendes geschrieben: | also ich muss zugeben ich versteh das programm an machen stellen nicht ganz neutral und zwar ab da wo die einzelnen tasten also 1 2 3 usw. defeniert werden. |
Die Zahlentasten 1-8 haben die Tastaturcodes 2-9 beim Drücken, und folglich 130-137 beim Loslassen. In meinem Programm wird also geprüft, ob eine Taste in diesem Bereich losgelassen oder gedrückt wurde und setzt entsprechend die Bits.
westcoast hat Folgendes geschrieben: | Desweiteren möchte ich noch einen blinker einbauen den ich mit der taste r einschalten und mit d wiederausschalten kann |
Ich habe hier mal Pfeiltasten und Blinker eingebaut:
Beispiel mit Blinker
Gruß
Skilltronic _________________ Elektronik und QB? www.skilltronics.de !
Zuletzt bearbeitet von Skilltronic am 21.03.2008, 13:46, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
westcoast
Anmeldungsdatum: 14.03.2008 Beiträge: 9
|
Verfasst am: 20.03.2008, 20:57 Titel: |
|
|
@HorstD
schönes programm kann ich sicher mal brauchen Danke.
@skilltronic
Danke ,
für deine bemühungen ich glaub ich hab es jetzt gerafft ist ja echt super...
die Datei wo ich bei dir runtergeladen hab ist klasse die kann ich nun mit meinen doch ein bisschen erweiterten wissen über Basic total auf meine Bedürfnisse anpassen...
Falls ich aber doch noch eine Frage habe frag ich hier einfach noch mal nach...
MfG
westcoast |
|
Nach oben |
|
|
|
|
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.
|
|