- SF800 Solar Speicher Tutorial         
Seite 2 von 7 ErsteErste 1234 ... LetzteLetzte
Ergebnis 11 bis 20 von 64

Thema: LPT mit C++ ?

  1. #11
    gnome
    Gast
    Anzeige

    Praxistest und DIY Projekte
    ich benutze den bloodshed dev-c++ 4.0 compiler (http://ftp1.sourceforge.net/dev-cpp/devcpp4.zip) und musste die ausgabebefehle selber scripten.... und zwar mit assembler (at&t syntax)....

    Code:
    void outp(char wert, int adresse){
      __asm("MOVW %1, %%dx    \n\t"
            "MOVB %0, %%al    \n\t"
            "OUT  %%al, %%dx"
            :
            : "g" (wert), "g" (adresse) );
    }
    
    char inp(int adresse){
      char wert;
      __asm("MOVW %1, %%dx    \n\t"
            "IN   %%dx, %%al  \n\t"
            "MOVB %%al, %0"
            : "=g" (wert)
            : "g" (adresse) );
      return(wert);
    }
    sollte eigentlich selbsterklärend sein.... ansonsten nur fragen....

  2. #12
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    23.05.2004
    Beiträge
    122
    hallo

    danke ich werde es demnachst ausprobieren
    hoffendlich klappt es

    ich verstehe allerdings nicht genau was da steht
    kannst du mir das erklären

  3. #13
    Neuer Benutzer Öfters hier
    Registriert seit
    07.12.2004
    Beiträge
    10
    Zitat Zitat von FJK
    hallo

    danke ich werde es demnachst ausprobieren
    hoffendlich klappt es

    ich verstehe allerdings nicht genau was da steht
    kannst du mir das erklären

    guten leitwert flo
    ja eine erklärung wäre super!

  4. #14
    Erfahrener Benutzer Fleißiges Mitglied Avatar von Magge2k
    Registriert seit
    27.10.2004
    Beiträge
    163
    Hi Leute,

    ich programmiere unter BCB 5 und um den Druckerport unter Win2k anzusteuern benutze ich die inpout32.dll Damit ist das arbeiten sehr einfach man definiert einfach seine Druckerport addresse 0x378 und kann dann sehr schnell auf dieser ausgeben und einlesen.

    http://www.logix4u.net/inpout32.htm


    gruß Marc

  5. #15
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    23.05.2004
    Beiträge
    122
    hallo

    danke aber ich programmiere unter win98
    da sind lpt´s frei

    kannst du sonst weiterhelfen
    https://www.roboternetz.de/phpBB2/vi...?p=50698#50698

  6. #16
    Erfahrener Benutzer Fleißiges Mitglied Avatar von Magge2k
    Registriert seit
    27.10.2004
    Beiträge
    163
    Hi Flo,

    also, soweit ich weiß ist doch da was falsch?!?!

    ache auf das <== weil ich weiß daß der LPT immer aus den drei addressen 0x378 + 0x379 + 0x37A besteht. Du schreibst da aber 0x378 + 0x2 rechnet der das dann schon richtig?

    #define LPT1 0x378
    .
    .
    .
    int Steuerregister;
    Steuerregister = inp(LPT1+0x2); <== Müsste das nich 0x02 heißen?
    //Lesen des Steuerregisters
    Steuerregister = (Steuerregister|0x01);
    //STROBE auf High setzen ( Daten den LPT1 ausgeben lassen )
    outp(LPT1+0x2,Steuerregister);
    //Schreiben des Modifizierten Steuerregisters
    also kann mir jemand den lösungsvorschlag nochmal erklären


    ich weiß ja nicht ob ich jetzt kompletten unsin rede!?

    gruß Marc

  7. #17
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    23.05.2004
    Beiträge
    122
    hallo Marc

    0x378 ist doch die adresse vom lpt1
    und die 0x2 beneutet doch er soll den 2. pin ansteuern
    mit 0x3 soll er den 1. und 2. pin ansteuern oder???


    und wo kommt das hin???
    bzw muss ich teile meines alten quelltextes ändern/löschen

    int Steuerregister;
    Steuerregister = inp(LPT1+0x2); <== Müsste das nich 0x02 heißen?
    //Lesen des Steuerregisters
    Steuerregister = (Steuerregister|0x01);
    //STROBE auf High setzen ( Daten den LPT1 ausgeben lassen )
    outp(LPT1+0x2,Steuerregister);
    //Schreiben des Modifizierten Steuerregisters

  8. #18
    Erfahrener Benutzer Fleißiges Mitglied Avatar von Magge2k
    Registriert seit
    27.10.2004
    Beiträge
    163
    hä?

    So ich glaube wir haben ein problem!
    Darum erst einmal ein kleiner Basiskurs zum Druckerport.

    Die parallele Schnittstelle belegt insgesammt drei mal 8-bit-Adressen.
    Zuerst die Basisadresse in unserem Fall -> 0x378 dann folgen die 0x379 und 0x37A.

    Wobei die Adressen zu folgenden Registern führen:

    Data-Register: 0x378
    Status-Register: 0x379
    Controll-Register: 0x37A

    So schon alleine mit diesen Hintergrund informationen kann man doch schon an deinem Quellcode erkennen daß................

    int Steuerregister;
    Steuerregister = inp(LPT1+0x2);
    //Lesen des Steuerregisters

    <== Hier wird die adresse 0x378 um 0x2 erhöht und somit erhalten wird die adresse 0x37A. Nun befinden wir uns im Steuerregister (Controllregister) und fragen den aktuellen Status ab. Befehl OK!

    Steuerregister = (Steuerregister|0x01);
    //STROBE auf High setzen ( Daten den LPT1 ausgeben lassen )
    <== Hier wird irgendwas mit dem Ausgelesenen Wert des STeuerregisters gemacht keine ahnung was!

    outp(LPT1+0x2,Steuerregister);
    //Schreiben des Modifizierten Steuerregisters
    <== Hier wird versucht auf das Steuerregister zu schreiben. Ich weiß jetzt auch nicht so genau ob das Status Register Bidirektional Arbeitet oder nicht! D.H. es kann sein es können daten nur gelesen werden.

    Da ich aber noch nie etwas mit den "normalen" outp bzw. inp funktionen zu tun hatte, weiß ich aber auch nicht so genau wie diese arbeiten. Nachschauen ist gerade schwer, weil ich erst meinen PC platt gemacht habe.

    Bei der von mir verwendeten inpout32.dll von dem oben genannten link musste ich im aber um Daten am Dataregister auszugeben folgenden befehl verwenden.

    outp32(0x378, 0xFF)

    ^ ^ ^
    | | |
    | | Hier wird das Data-Register (D0-D7) auf 1 gesetzt!
    | Angabe der Druckerport Adresse des Daten-Registers
    outp32 befehl

    Ich weiß ja nicht aber vielleicht ist der aufbau des "normalen" outp befehls ja genau so wie beim outp32.

    Naja ich weiß ja nicht ob das gerade weitergeholfen hat.
    gruß Marc

  9. #19
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    23.05.2004
    Beiträge
    122
    doch danke.

    aber das program läuft es ist nur dummer weise eine konsolen anwendung

    wenn ich jetzt aber mit edit, button und co arbeiten möchte (nicht in einer konsolen anwendung), was muss ich dann machen

    kannst du mir da weiter helfen

    ist das outp32(0x378, "Bytezahl") auch für eine konsolen anwendung???

  10. #20
    Erfahrener Benutzer Fleißiges Mitglied Avatar von Magge2k
    Registriert seit
    27.10.2004
    Beiträge
    163
    Jup, gut daß ich dir Helfen konnte!

    Ja klar kann man den inp32/outp32 befehl auch in einer konsolen anwendung verwenden. So wird es auch in dem beispiel programm erklärt.

    Ich habe mir dann daraus ein kleines Tool erstellt mit dem ich die 8 Datenleitungen über eine grafische oberfläche ansteuern kann erstellt. Dazu kommen ein paar Lauflichteffekte in verschiedenen unter modis!
    Bild im anhang!

    Da aber die Konsolenprogrammierung ein wenig von der der grafischen Oberfläche abweicht kann man das Programm nicht einfach übernehmen.

    Aber hier als beispiel:

    //---------------------------------------------------------------------------

    #include <vcl.h>
    #pragma hdrstop

    #include "Project1.h"

    #include <stdio.h>
    #include <conio.h>
    #include <windows.h>
    #include <math.h>

    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;

    #define port 0x378
    int y;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    Timer1->Enabled = true;
    Timer1->Enabled = true;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Timer1(TObject *Sender)
    {
    if (y == 0) { y = y + 0x01; goto end;}
    if (y == 1) { y = y + 0x02; goto end;}
    if (y == 3) { y = y + 0x04; goto end;}
    if (y == 7) { y = y + 0x08; goto end;}
    if (y == 15) { y = y + 0x10; goto end;}
    if (y == 31) { y = y + 0x20; goto end;}
    if (y == 63) { y = y + 0x40; goto end;}
    if (y == 127) { y = y + 0x80; goto end;}
    if (y == 255) { y = y - 0x01; goto end;}
    if (y == 254) { y = y - 0x02; goto end;}
    if (y == 252) { y = y - 0x04; goto end;}
    if (y == 24 { y = y - 0x08; goto end;}
    if (y == 240) { y = y - 0x10; goto end;}
    if (y == 224) { y = y - 0x20; goto end;}
    if (y == 192) { y = y - 0x40; goto end;}
    if (y == 12 { y = y - 0x80; goto end;}
    end:
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Timer2(TObject *Sender)
    {
    (oup32)(port, y);
    Label1->Caption = "0x" + IntToHex( y, 2);
    Label2->Caption = y;
    }
    //---------------------------------------------------------------------------

    Für dieses Beispiel benötigst du einen Button, zwei Timer und zwei Labels. Der Quelltext ist eine vereinfachte form von dem was ich in dem LED Programm verwendet habe.

Seite 2 von 7 ErsteErste 1234 ... LetzteLetzte

Benutzer, die dieses Thema gelesen haben: 0

Derzeit gibt es keine Benutzer zum Anzeigen.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen