LPT1 Pin2 geht nicht aus....

  • VB.NET

Es gibt 37 Antworten in diesem Thema. Der letzte Beitrag () ist von Dodo.

    LPT1 Pin2 geht nicht aus....

    Hallo liebe Gemeinde ^^

    ich bin komplett neu auf dem Gebiet der VB Programmierung.
    Bisher habe ich nur PHP programmiert - und ich fühle mich jetzt hilflos in VB ^^

    Leider kann ich in dem Unterforum "Hardware-/Schnittstellenprogrammierung" keinThread eröffnen... warum auch immer.
    Entschuldigt bitte wenn diese frag ezum 1000. mal besprochen wurde, jedoch verstehe ich immer nicht wieso und warum es gerade der Quellcode ist und warum es bei mir dennoch nicht funktioniert....

    Mein Problem ist folgendes:

    ich habe bereits ein kleines Programm geschriben welches mir auf Pin2 des LPT Kabels Strom gibt.
    Es leuchtet dann eine LED. Jetzt habe ich eine 2. LED in den Pin3 gesteckt und die Funktion des tools entschrechend erweitert.
    Leider passiert aber nun nicht folgendes:
    Button "Pin2 an" => LED an
    Button "Pin2 aus" => LED aus

    Button "Pin3 an" => LED2 an
    Button "Pin3 aus" => LED2 aus

    sondern:

    Button "Pin2 an" => LED bleibt aus
    Button "Pin2 aus" => LED an

    Button "Pin3 an" => passiert nichts
    Button "Pin3 aus" => LED geht aus, LED2 geht an

    Ich denke es liegt daran, das ich jeweils in den "aus" Buttons keine Anweisung habe, um einfach den Pin2 zu deaktivieren.

    Schaut euch bitte einmal den Quelltext an, habt ihr eine einfache Lösung parat und könntet mir in 1,2 Sätzen erklären was nun falsch gelaufen ist ?

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public Declare Function Inp Lib "inpout32.dll" Alias _
    3. "Inp32" (ByVal PortAddress As Integer) As Integer
    4. Public Declare Sub Out Lib "inpout32.dll" Alias "Out32" _
    5. (ByVal PortAddress As Integer, ByVal Value As Integer)
    6. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    7. 'inpout32.bas
    8. '&h378 ist die Hexadezimaladresse des Parallelports
    9. '1 steht für Datenleitung 0
    10. Out(&H378, 1)
    11. End Sub
    12. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    13. 'inpout32.bas
    14. '&h378 ist die Hexadezimaladresse des Parallelports
    15. '1 steht für Datenleitung 0
    16. Out(&H378, 2)
    17. End Sub
    18. Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    19. 'inpout32.bas
    20. '&h378 ist die Hexadezimaladresse des Parallelports
    21. '1 steht für Datenleitung 0
    22. Out(&H378, 3)
    23. End Sub
    24. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    25. 'inpout32.bas
    26. '&h378 ist die Hexadezimaladresse des Parallelports
    27. '1 steht für Datenleitung 0
    28. Out(&H378, 4)
    29. End Sub
    30. End Class





    (Für die Zukunft: ich bin auf jeden fall bereit VB zu lernen, denn das könnte ich als GUI verwenden und mit PHP verknüpfen... wuhahaha^^)

    Viele grüße aus dem hohen Norden,
    WerWolf
    Danke für deine Antwort.

    (Die Datenelitungen, beginnend ab 1):

    Pin1 (also data1) = 1
    Pin 2 = 2
    Pin 3 = 4
    Pin 5 = ????

    Wie geht es dann weiter ?

    Auf einer Webseite steht:
    Der Wert gibt die Zustände der Datenleitungen an, so wird z.B. Datenleitung 0 mit dem Wert 1 angesteuert, Leitung 2 hat den Wert 4. Also immer 2^n (n=Datenleitung 0 - 7)


    Wie soll ich das verstehen ?

    Habe das Programm mal umgeschrieben:

    mit 0 gehen tatsächlich alle aus, und mit 255 gehen alle LEDs a (okay... es hängen auch nur 2 LEDs an Data 1&2).

    Besteht die Möglichkeit gezielt z.b. Data1 auszuschalten ?
    Mit 0 gehen ja nur alle.

    Grüße
    Wolf
    Pin 5 = 8
    Pin 6 = 16
    Pin 7 = 32
    Pin 8 = 64
    Pin 9 = 128

    Zu deinem Problem:
    Ich würde 2 Variablen deklarieren:
    L1 ist LED1, L2 ist LED2

    VB.NET-Quellcode

    1. Dim L1 as Integer
    2. Dim L2 As Integer


    Zum einschalten von LED1 setze L1 auf 1, zum ausschalten auf 0.
    Das gleiche machst du mit LED2, halt nur mit 2 statt 1.

    So, dass es nun auch geschieht:

    VB.NET-Quellcode

    1. Out(&H378,L1 + L2)
    Heyho,

    nur zu meiner Verständniss:

    müssen die Variabeln L1 und L2 nicht deklariert werden ?

    Du schreibst:

    VB.NET-Quellcode

    1. Dim L1 As Integer


    wie ist aber L1 deklariert ?
    In PHP würde ich das so machen:

    $L1 = "Hans Wurst";

    Wie/als wasdeklariere ich denn nun L1, oder ist "As Integer" bereits die Deklation ?
    Warum ist es so ?
    Du sprichst die Ports ja nun nicht mehr so an:

    VB.NET-Quellcode

    1. Out(&H378, 1)


    sondern:

    VB.NET-Quellcode

    1. Out(&H378, L1)


    Woher soll aber nun VB wissen, das L1 für den Data1 steht ?
    Man müsste doch noch schreiben irgendwie "L1=Data1" oder so...

    Wie gesagt, mir sind die Begriffe alle fremd :(
    okay... das war wirklich einfach... da stand ich wohl aufm Schlauch ^^

    Der Logik nach (oder ich versteh die Logik noch nicht so ganz^^) würde ich jetzt die Deklation z.b.:

    Button 1 {
    setzt L1 auf 1 }

    und ans Ende häte ich dann gesetzt:
    Out(&H378, L1+L2)

    geht aber nicht, da "Out" nicht deklariert ist laut VB...

    Jetzt habe ich immer Out unter die L1=... gesetzt, der effekt ist jedoch:
    LED1 an: led 1 geht an
    LED2 an: led1 geht aus, led2 geht an
    LED2 aus: led2 geht aus, led1 an
    LED1 aus: led 1 geht aus


    der quellcode: wo ist der Denkfehler ?

    VB.NET-Quellcode

    1. ublic Class Form1
    2. Public Declare Function Inp Lib "inpout32.dll" Alias _
    3. "Inp32" (ByVal PortAddress As Integer) As Integer
    4. Public Declare Sub Out Lib "inpout32.dll" Alias "Out32" _
    5. (ByVal PortAddress As Integer, ByVal Value As Integer)
    6. Dim L1 As Integer
    7. Dim L2 As Integer
    8. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    9. L1 = 1
    10. Out(&H378, L1 + L2)
    11. End Sub
    12. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    13. L1 = 0
    14. Out(&H378, L1 + L2)
    15. End Sub
    16. Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    17. L2 = 1
    18. Out(&H378, L1 + L2)
    19. End Sub
    20. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    21. L2 = 0
    22. Out(&H378, L1 + L2)
    23. End Sub
    24. End Class
    *anlauf nehm* .... *hoch spring*... *mit kopf auf Tischkante knall*

    argh... da kam wieder der PHP ler in mir durch...

    Vielen vielen dank für deine so schnelle und kompetente Hilfe :)
    Jetzt funzt es so wie es soll ;)
    Klasse klasse klasse.

    Sollte ich wieder probleme haben, melde ich mich.
    Ansonsten:

    wenn wir mit unserem Projekt fertig sind, wird es die Scannersteuerung und ein HowTo zum Download geben.

    Hintergrund:

    Das VB Programm soll die Steuerung werden für die Microcontroller in einem selbstgebauten Scanner.
    (Diese Scanner: planetdj.com/images/DYNASTYSCAN.jpg)

    Vielen dank :) :) :thumbsup: :thumbsup:
    Hier mal ein erster screenshot.
    Es funktioniert bereits:
    man kann die (testweise angeschlossenen) LEDs über die Buttons und den Tasten aufm keyboard steuern.
    Später hängen an den Pins Microcontroller und Relaise.

    Wie gesagt: danke vielmals ^^
    Jiha ^^

    Heute morgen schön Zugübung (Feuerwehr) gehabt und nun wieder bei der Sache :)



    Neu hinzu:
    - Symbole für Shutter und Relais (Bessere ideen für die Icons?!)
    - Symbole für Pan/Tilt (Tastatur nachgebildet, W,A,S,D)
    - Autopilot

    Funktionen die noch kommen:
    - W,A,S,D Keys werden noch programmiert auf die Data Ports 4-7
    - Autopilot: Mit Buttons ein/ausschaltbar *

    * zu diesem Thema werde ich ganz einfach die Pins mit Strom belegen und wieder nicht und so weiter, dadurch ergeben sich dann die Komandos für die Relaise und Microcontroller.

    Ich weiß noch nicht wie ich das realisiere.. mal schaun... in Bascom kann man solche späße wie waitms() machen.
    z.B.
    PortB = .....;
    PortC = .....;
    waitms (2000)
    [..]
    loop;

    oder so.. aber ich denke das werd ich mir aus der Forensuche zusammlesen können.

    Im Anhang noch ein neueres Bild.
    Wenn die WASD Funktion geht, wirds auch Version 0.6 :)
    soppa ^^

    die nächste Frage:

    ich programmiere gerade das steuern der Ports über die Tastatur.
    Ich möchte folgendes:

    Taste: [W] => Pin5 an/aus
    Taste: [ S ] => Pin 6 an/aus

    ich kann die Funktion so programmieren das er bei einem Tastendruck einschaltet, und beim nächsten ausschaltet.
    Ich möchte es aber gerne so, das die LED nur leuchtet wenn die Taste gedrückt wird.

    Aus meiner früheren Delphi zeit (und dem Editor ^^) habe ich es in erinnerung irgendwie mit
    if Form1.Button1_pressed [blabla...]

    Wie mache ich das in VB ?

    Ach ja: die Servo Motoren sind da :)
    Wen die zu "steuernde Hardware" interessiert: hier gibts die Bilder welche immer mal wieder aktualisiert werden.



    Viele grüße,
    Wolf
    geht sehr einfach:

    VB.NET-Quellcode

    1. Private Sub Form1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
    2. If e.KeyCode = Keys.W Then
    3. 'Pin5 an
    4. End If
    5. End Sub
    6. Private Sub Form1_KeyUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyUp
    7. If e.KeyCode = Keys.W Then
    8. 'Pin5 aus
    9. End If
    10. End Sub


    für Taste "S" musst du "Keys.S" nehmen