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:

OUT

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
triti



Anmeldungsdatum: 23.04.2009
Beiträge: 44

BeitragVerfasst am: 30.07.2009, 11:39    Titel: OUT Antworten mit Zitat

Hallo!
Ich habe noch eine COM Frage wenns erlaubt ist:
OUT (764),1 schaltet DTR ein
OUT (764),2 schaltet RTS ein aber auch DTR aus.
OUT (764),3 beide ein. Null ist aus. Gut.

Ich will aber die zwei pins ganz getrennt voneinander ein/ausschalten. Geht das?
Also z.B. DTR ein (der bleibt ein) und dann RTS ein/aus, ein aus,...

So wie beim TxD:
OUT (763),1 - ein
OUT (763),0 - aus
Oder habe ich einen Knopf im Hirn?

lg
Triti
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Flo
aka kleiner_hacker


Anmeldungsdatum: 23.06.2006
Beiträge: 1210

BeitragVerfasst am: 30.07.2009, 14:12    Titel: Antworten mit Zitat

lies mit inp(764) den aktuellen status ein, oder merk ihn dir in ner variable (sollte schneller gehen denke ich mal...)

jetzt hast du, sagen wir mal in der variable status, eine zahl.

jetzt mal ein bisschen binäre zahlen und boolesche algebra:

0 ist 0000 0000
1 ist 0000 0001
2 ist 0000 0010
3 ist 0000 0011

wie du siehst, scheint das letzte bit den DTR zu steuern, und das vorletzte bit den RTS zu steuern.

jetzt zur booleschen algebra:

es gibt bei den binärzahlen einige operatoren.
z.B. AND, OR, XOR und NOT.
NOT macht einfach überall, wo eine 1 war, ne 0 hin und umgekehrt.
AND, liefert an allen positionen, wo bei BEIDEN eingaben ne 1 war, auch ne 1, sonst ne null.
1 and 1=1
0 and 1=0
1 and 0=0
0 and 0=0

OR liefert überall, wo bei einer der beiden eingaben ne eins war, ne eins
0 or 0=0
1 or 0=1
0 or 1=1
1 or 1=1

XOR heißt "exklusives oder" oder "entweder-oder".
es liefert 1, wenn genau eine der beiden eingabebits ne 1 ist.
0 xor 0=0
1 xor 0=1
0 xor 1=1
1 xor 1=0

soo.. damit kannst du nun einzelne bits manipulieren.

nehmen wir an, du hast das byte 00001111.
jetzt setzen wir mal das erste bit.
0000 1111 OR <-- ausgangszahl
1000 0000 = <-- bitmaske. alle zu setzenden bits sind 1, andere 0
1000 1111
und jetzt löschen wir vom ergebnis das letzte bit
1000 1111 AND
1111 1110 = <-- alle nicht zu verändernden bits sind 1, die zu löschenden sind 0
1000 1110
und jetzt will ich das vorletzte umschalten. also von 0 auf eins oder von 1 auf 0, egal.
1000 1110 XOR
0000 0010 = <-- alle umzuschaltenden bits sind 1, andere sind 0
1000 1100

cool, oder?

so, jetzt verwenden wir das mal...
angenommen, DTR ist aus, RTS ist an, und du willst DTR anmachen, und RTS nicht verändern.

status ist vorher gleich 2, also 10 im binärsystem (ich lass die nuller weg, die stören nur happy)
jetzt schreib: status=status OR &b01.
das setzt das letzte bit, die anderen lässt es gleich.
das &b sagt QB, dass es sich hier um ne binärzahl handelt)
das ergebnis wird sein: &b11, also 3. und das ist "beide ein". cool!

jetzt machen wir mal RTS aus...
status=status AND (NOT &b10)
das ist ein bisschen getrickst, weil ich zu faul war, haufenweise einsen zu schreiben.
mit dem NOT in klammern kannst du eine bitmaske, die die zu löschenden bits als 1 enthält, zu der maske, die AND braucht, "umwandeln"

du könntest auch schreiben:
status=status AND &b1111111111111101
ist aber ekelhaft lang...

das war jetzt recht ausführlich, und falls sich fehler eingeschlichen haben, sagt mir das bitte jemand happy

die binärzahlen oben müssten nat. alle ein &b vornedran kriegen, und die leerzeichen müssten entfernt werden, damit qb es versteht. ist aber so einfacher zu lesen...
_________________
MFG
Flo

Satoru Iwata: Wer Spaß am Spielen hat, fragt nicht nach Grafik.

zum korrekten Verstaendnis meiner Beitraege ist die regelmaessige Wartung des Ironiedetektors unerlaesslich.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
triti



Anmeldungsdatum: 23.04.2009
Beiträge: 44

BeitragVerfasst am: 30.07.2009, 22:28    Titel: Antworten mit Zitat

Ganz vielen Dank für die lange Antwort. Hoffentlich nicht die Finger verstaucht?

Binär...öh... www.arndt-bruenner.de/mathe/scripts/Zahlensysteme.htm rechnet hoffentlich richtig.

> cool, oder?
Schon, mächtig cool. Nur: Ich versuchs zu verstehen, aber so ganz....

status=INP(764)
print status
Da kommt momentan 15 raus
Wie frage ich im Programm ab, ob die letzen 2 Stellen 1 oder 0 sind?
So: if status=15 then print "DTR + RTS = ON" ?

Die 15 muss ich mir jetzt in binär übersetzen?
Das soll 1111 sein.
Ist das jetzt weil ich ein byte also 8 Stellen brauche 0000 1111 ?

Weil die letzten 2 Stellen auf 1 sind, sind DTR und RTS also ON.
Damit ich DTR und RTS umschalte, brauche ich nur die letzten 2 Stellen verändern.
Jetzt will ich mal die letzte STelle (DTR) ausschalten:
Und zwar mit Nullen, da tu ich mir leichter, mich stören die nicht. Da weiss ich wenigstens wo was steht lächeln

status= status AND 00001110 Gibt 6, also 110 funktioniert also.


Bei status = status AND (NOT &b10) kommt aber "ÜBERLAUF".

Und wieso kann man da nur 10 schreiben? Kapiert der PC, dass man nur die 2 rechten Stellen meint?

Habe jetzt STATUS=STATUS XOR 00000010 probiert. Das geht. QB4.5 bessert mir das aus in XOR 10
print Status -> gibt 5. Binär 101

Komisch:
STATUS = INP (764)
PRINT STATUS -> 15
STATUS = STATUS AND 1110 (QB bessert 00001110 so aus)
PRINT STATUS -> 6
STATUS = INP (764) 'nochmal einlesen, ob sich was geändert hat
PRINT STATUS -> 15
Warum 15? Soll nicht 6 bleiben? Ich hab ja umgeschaltet ??

Momentan bin ich unter XP im Dos-Fenster, weil ich mein Netzteil vom DOS-rechner getötet habe. Wollte einen Scheibenwischermotor antreiben. War keine gute Idee. Muss mir erst eins besorgen. Samstag, am Schrottplatz eins rausschrauben.
Hat das vieleicht was mit XP zu tun?

lg
Triti
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 30.07.2009, 22:50    Titel: Antworten mit Zitat

Hallo!

Zitat:
Bei status = status AND (NOT &b10) kommt aber "ÜBERLAUF".

QB kennt das Präfix &B noch nicht; das gibt es erst in FreeBASIC. Im QB-Programm müssen die Zahlen dezimal angegeben werden, sodass man zunächst vom Dual- ins Dezimalsystem umrechnen muss.

Viele Grüße!
Sebastian
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
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: 01.08.2009, 12:58    Titel: Antworten mit Zitat

Hallo

Um die Ausgänge des COM zu schalten, brauchst du nichts einzulesen (warum auch den Status von Ausgängen Einlesen?) und auch keine großen Rechnungen anzustellen. Im Prinzip hast du dir deine Frage schon selbst beantwortet:

triti hat Folgendes geschrieben:
OUT (764),1 schaltet DTR ein
OUT (764),2 schaltet RTS ein aber auch DTR aus.
OUT (764),3 beide ein. Null ist aus.


Das sind ja schon alle vier Zustände, die die beiden Ausgänge annehmen können. Wen du jetzt DTR einschalten und RTS blinken lassen willst, schreibst du einfach:

Code:
DO
 OUT 764, 1       'DTR ein, RTS aus
 SLEEP 1
 OUT 764, 3       'DTR ein, RTS ein
 SLEEP 1
LOOP


Wolltest du es umgekehrt haben, also RTS ein und DTR blinkt, dann folglich:

Code:
DO
 OUT 764, 2       'DTR aus, RTS ein
 SLEEP 1
 OUT 764, 3       'DTR ein, RTS ein
 SLEEP 1
LOOP


Beide im Wechsel blinken lassen ginge so:

Code:
DO
 OUT 764, 1       'DTR ein, RTS aus
 SLEEP 1
 OUT 764, 2       'DTR aus, RTS ein
 SLEEP 1
LOOP


Die beiden Ausgänge werden über die beiden niederwertigsten Bit des Registers gesteuert. Das erste mit dem Stellenwert 1 für DTR, das zweite mit dem Stellenwert 2 für RTS. Alle anderen Bit sind hier komplett uninteressant.

Code:
binär    dezimal    RTS   DTR
-------------------------------
  00        0       aus   aus
  01        1       aus   ein
  10        2       ein   aus
  11        3       ein   ein


Das Register 764 ist übrigens für COM2 zuständig, 1020 wäre für COM1, die Klammer um die Registeradresse brauchst du nur bei INP.
Ansonsten siehe auch hier oder hier.

Gruß
Skilltronic
_________________
Elektronik und QB? www.skilltronics.de !
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
triti



Anmeldungsdatum: 23.04.2009
Beiträge: 44

BeitragVerfasst am: 02.08.2009, 13:31    Titel: Antworten mit Zitat

mit dem Kopf durch die Mauer wollen
Alles klar!
Da hab ich doch einen Knopf im Hirn gehabt.
Danke!

lg
Triti
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 -> Allgemeine Fragen zu QBasic. 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