logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Kod w C 3.1 Borland do sterowania portem LPT na Windows XP

Meerkat 06 Gru 2005 17:43 1299 2
  • #1 2059415
    Meerkat
    Poziom 11  
    Posty: 21
    przegrzebalem juz forum i niestety nic nie znalazlem. mam prosbe zeby ktos napisal albo chociaz wkleil kod za pomoca ktorego moglbym sterowac
    portem LPT. Chodzi mi o sam szkielet i linijke wystawiajaca na wyjsciach lpt same jedynki badz inna liczbe binarna. Chodzi mi konklretnie o program pod C 3.1 innego nie posiadam. Mam winde Xp i biblioteki inpoud32.dll. probowalem kozydstac z WinIo ale kompilator krzyczy ze sa bledy. Pomocy ! :)

    PS to ma byc program do sterowania robotem na podwoziu czolgowym. ale musze miec mozliwosc ingerencji w program w celu dokonania przerobek.
  • #2 2061868
    rokita
    Poziom 13  
    Posty: 96
    Pomógł: 2
    Ocena: 15
    Może to ci coś pomoże jest to jednak jak narazie programik pracujący w oknie MS Dos-a

    steruje dwoma silnikami krokowymi
    pierwsze cztery bity to jeden silnik kolejne 4 to drugi.

    lecz sama inicjacja bibloteki inpout32.dll działa też C++ obiektowym

    można też dołożyć funkcję

    if (kbhit())
    {
    if (znak!=getch()) return;
    }

    w miejsce jak na przykładzie poniżej
    będziesz mógł wyskoczyć wcześniej z funkcji jeżeli zmienisz obroty

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

    #include <stdio.h>
    #include <conio.h>
    #include <iostream.h>
    #include <vcl.h>
    //---------------------------------------------------------------------------

    #pragma hdrstop

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

    #pragma argsused


    HINSTANCE hDLL;
    typedef USHORT _stdcall(*InPortType) (USHORT BasePort);
    typedef void _stdcall(*OutPortType) (USHORT BasePort, USHORT value);
    InPortType InPort;
    OutPortType OutPort;

    USHORT PortAddress=0x378;
    USHORT Value=0;
    // Funkcje

    void skret_w_prawo(int czas,char znak)
    {
    OutPort(PortAddress,17);
    Sleep(czas);
    /* Opcja celem wyskoczenia z funkcji należy ją wstawić za każdą funkcją Sleep
    if (kbhit())
    {
    if (znak!=getch()) return;
    } */
    OutPort(PortAddress,34);
    Sleep(czas);
    OutPort(PortAddress,68);
    Sleep(czas);
    OutPort(PortAddress,136);
    Sleep(czas);
    OutPort(PortAddress,0);
    }

    void skret_w_lewo(int czas)
    {
    OutPort(PortAddress,136);
    Sleep(czas);
    OutPort(PortAddress,68);
    Sleep(czas);
    OutPort(PortAddress,34);
    Sleep(czas);
    OutPort(PortAddress,17);
    Sleep(czas);
    OutPort(PortAddress,0);
    }

    void do_przodu(int czas)
    {
    OutPort(PortAddress,129);
    Sleep(czas);
    OutPort(PortAddress,66);
    Sleep(czas);
    OutPort(PortAddress,36);
    Sleep(czas);
    OutPort(PortAddress,24);
    Sleep(czas);
    OutPort(PortAddress,0);
    }
    void do_tylu(int czas)
    {
    OutPort(PortAddress,24);
    Sleep(czas);
    OutPort(PortAddress,36);
    Sleep(czas);
    OutPort(PortAddress,66);
    Sleep(czas);
    OutPort(PortAddress,129);
    Sleep(czas);
    OutPort(PortAddress,0);
    }



    // Koniec funkcji


    int main(int argc, char* argv[])
    {
    hDLL=LoadLibrary("inpout32.dll");
    if(hDLL)
    {
    InPort=(InPortType) GetProcAddress(hDLL,"Inp32");
    OutPort=(OutPortType) GetProcAddress(hDLL,"Out32");
    }
    else
    ShowMessage("Bład przy ladowaniu pliku");
    //

    int czas=10;
    char znak;

    while('p'!=(znak=getch()))
    {
    switch(znak)
    {
    case char(72):
    do_przodu(czas,znak);
    break;
    case char(80):
    do_tylu(czas,znak);
    break;
    case char(75):
    skret_w_lewo(czas,znak);
    break;
    case char(77):
    skret_w_prawo(czas,znak);
    break;
    case 'a':
    czas=czas+1;
    cout<< "szybkosc = " << czas << endl;
    break;
    case 'z':
    czas=czas-1;
    cout<< "szybkosc = " << czas << endl;
    break;
    }
    }


    // zakończenie i wyzerowanie
    OutPort(PortAddress,0);

    return 0;
    }
  • #3 2063402
    Meerkat
    Poziom 11  
    Posty: 21
    Ja wspomagajac sie stronka www.rafal.waw.pl i kodem zrodlowym tam zamieszczonym wystukalem cos takiego:
    
    #include <stdio.h>
    #include <conio.h>
    #include <math.h>
    #include <dos.h>
    #include <windows.h>
    #include <ctime.h>
    
    int dpa(int a,int b,int d)
    {
        a=GetTickCount();
       // printf("a= %d\n",a);
        do 
        {
        b=GetTickCount();
        //printf("b= %d\n",b);
        }
            while(
            (b-a)<d
            );
    }
         typedef short _stdcall (*inpfuncPtr)(short portaddr);
         typedef void _stdcall (*oupfuncPtr)(short portaddr, short datum);
    
    int main(void)
    {
         HINSTANCE hLib;
         inpfuncPtr inp32;
         oupfuncPtr oup32;
         
         short x;
         int a,b,d;
         int i,adres;
         char w,klawisz;
         adres=0x378;
    //     ********************************************************//
         
         /* Load the library */
         hLib = LoadLibrary("inpout32.dll");
         if (hLib == NULL) {
              printf("LoadLibrary Failed.\n");
              return -1;
         }
         /* get the address of the function */
         inp32 = (inpfuncPtr) GetProcAddress(hLib, "Inp32");
         if (inp32 == NULL) {
              printf("GetProcAddress for Inp32 Failed.\n");
              return -1;
         }
         oup32 = (oupfuncPtr) GetProcAddress(hLib, "Out32");
         if (oup32 == NULL) {
              printf("GetProcAddress for Oup32 Failed.\n");
              return -1;
         }
    /***************************************************************/
    
    
         /*****  Write the data register */
    
         x=0;
         printf("podaj predkosc \n");
         scanf("%d",&d);
         
         (oup32)(adres,x);
         /*jazda do przodu 1 silnik*/
         przod:;
         klawisz=getch();
                        if (klawisz=='w')
                        {
                        x=1;
                        (oup32)(adres,x);
                        dpa(a,b,d);
                        x=2;
                        (oup32)(adres,x);
                        dpa(a,b,d);
                        };
        // klawisz=getch();
                        if (klawisz=='s')
                        { 
                        x=8;
                        (oup32)(adres,x);
                        dpa(a,b,d); 
                        x=4;
                        (oup32)(adres,x);
                        dpa(a,b,d);
                        }; 
                        if (klawisz=='k')
                        {goto koniec;};                  
         klawisz=getch();
                        if (klawisz=='w')
                        {
                        x=4;                    
                        (oup32)(adres,x);
                        dpa(a,b,d);
                        x=8;
                        (oup32)(adres,x);
                        dpa(a,b,d);
                        };
        // klawisz=getch();                                        
                       
                        if (klawisz=='s')
                        {    
                        x=2;     
                        (oup32)(adres,x);
                        dpa(a,b,d);                  
                        x=1;
                        (oup32)(adres,x);
                        dpa(a,b,d);  
                        } ; 
                        if (klawisz=='k')
                        {goto koniec;}; 
         goto przod;                
              koniec:;
              printf("koniec jazdy \n");
              x=0;
              (oup32)(adres,x);
         getch();
        
         FreeLibrary(hLib);
         return 0;
         getch();
    }
    


    wszystko powyzej " /***** Write the data register */" nie jest moje i pochodzi z pliku na stronie pod adresem podanym powyzej.
    Kod pochodzi z Dev-C++. w miare mozliwosci prosze o optymalizacje.
    ma dzialac tak:
    naciskam W jedzie do przodu, naciskam S i jedzie do tylu. przechodzenie z jazdy do przodu i do tylu nie jest plynne i w miare mozliwosc prosze o optymalizacje, chodzi mi o zmiane kierunku jazdy co jeden krok a nie co dwa tak jak jest teraz. zastanawialem sie nad jakims odpowiednikiem Pascalowego SHL i SHR. narazie dla jednego silnika potem dorobie reszte dla drugiego :)
REKLAMA