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:

LPT Interface mit QBasic

 
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
westcoast



Anmeldungsdatum: 14.03.2008
Beiträge: 9

BeitragVerfasst am: 14.03.2008, 19:31    Titel: LPT Interface mit QBasic Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
RatsDevSoftware



Anmeldungsdatum: 22.11.2007
Beiträge: 48

BeitragVerfasst am: 14.03.2008, 21:17    Titel: Antworten mit Zitat

Du musst die Bits verknüpfen, mehr zum Thema unter:
http://franksteinberg.de/progss.htm zwinkern
_________________
visit our Homepage!
shift ist verschwendung...
...o gott - ich fang schon wieder an zu spammen...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
westcoast



Anmeldungsdatum: 14.03.2008
Beiträge: 9

BeitragVerfasst am: 15.03.2008, 20:11    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Paul
aka ICC, HV-Freak


Anmeldungsdatum: 11.09.2004
Beiträge: 588
Wohnort: Uelzen

BeitragVerfasst am: 16.03.2008, 13:32    Titel: Antworten mit Zitat

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.

zwinkern
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
westcoast



Anmeldungsdatum: 14.03.2008
Beiträge: 9

BeitragVerfasst am: 16.03.2008, 15:03    Titel: Antworten mit Zitat

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... zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Skilltronic



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

BeitragVerfasst am: 17.03.2008, 13:42    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 14.03.2008
Beiträge: 9

BeitragVerfasst am: 17.03.2008, 22:15    Titel: Antworten mit Zitat

Danke,

funktioniert auch super genau das was ich noch gesucht habe...

aber da wäre noch... mit den Augen rollen

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 mit dem Kopf durch die Mauer wollen vllt geht es ja auch in meinen code gar nicht rein...

MfG

westcoast
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Skilltronic



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

BeitragVerfasst am: 18.03.2008, 02:09    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 14.03.2008
Beiträge: 9

BeitragVerfasst am: 18.03.2008, 17:39    Titel: Antworten mit Zitat

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



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

BeitragVerfasst am: 18.03.2008, 22:45    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 14.03.2008
Beiträge: 9

BeitragVerfasst am: 19.03.2008, 15:47    Titel: Antworten mit Zitat

Hi,

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. 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
Benutzer-Profile anzeigen Private Nachricht senden
HorstD



Anmeldungsdatum: 01.11.2007
Beiträge: 107

BeitragVerfasst am: 20.03.2008, 01:36    Titel: Antworten mit Zitat

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



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

BeitragVerfasst am: 20.03.2008, 02:00    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 14.03.2008
Beiträge: 9

BeitragVerfasst am: 20.03.2008, 20:57    Titel: Antworten mit Zitat

@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... grinsen
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... neutral

MfG

westcoast
Nach oben
Benutzer-Profile anzeigen Private Nachricht 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