На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (3) 1 2 [3]  все  ( Перейти к последнему сообщению )  
> DOS, Borland C и 32 бита.... , Обращение к 32 битному PCI - устройству
    Цитата cppasm @
    Ну это реально мистика :)

    Просто я умнел на глазах с каждым примером :lool:
    Программы везде под large писаны, да и пользовал я тока вывод...

    Кстати позже я и второй пример запустил, уже вот в таком немного отредактированном виде, ну в принципе они практически не отличаются (ни от исходного ни от примеров vmp)

    ExpandedWrap disabled
      dword inportd (word port) {
        asm {
          mov dx, [port]
          db 66h
          in ax, dx
        }
      }
      outportd (word port, dword num) {
        asm {
          db 66h  
          mov ax, dword ptr [num]
          mov dx, [port]
          db 66h
          out dx ,ax
        }
      }
      Цитата vadymko @
      ExpandedWrap disabled
        dword inportd (word port) {
          asm {
            mov dx, [port]
            db 66h
            in ax, dx
          }
        }
      Здесь такая же ошибка, что и у меня. Только у меня поправить проще - просто добавлением строки
      ExpandedWrap disabled
          shld  edx,eax,16
      после инструкции in :)
        Цитата Adil @
        Здесь такая же ошибка, что и у меня. Только у меня поправить проще - просто добавлением строки

        shld edx,eax,16

        после инструкции in :)


        Спасибо учтем. Просто инпорт я не пользовал. Мне нужен просто вывод..вот и упустил.. :whistle:
          Vadymko, можешь дать исходники, которые получились. А то такая же проблемма возникла (тоже с PCI-1724U), а насчет работы с регистрами и асемблера я ни в зуб ногой. Буду очень благодарен.
            Вобщем выкладываю сборную солянку, собранную здесь общим коллективом, на всеобщее обозрение...
            Главное ее достоинство - РАБОТАЕТ !! :D

            ExpandedWrap disabled
              #include <dos.h>
              #include <stdio.h>
              #include <conio.h>
              #include <stdlib.h>
              #include "..\hardware\PCI.H"
               
              /************
               * Global variable declare
               ************/
              //typedef   signed char schar;
              //typedef unsigned char byte;
              //typedef unsigned short word;
              //typedef unsigned long dword;
               
              #define outportv(addr,data) _DX = (addr); _EAX = (dword)(data); asm db 0x66; asm out dx,ax;
              #define inportv(addr,v) _DX = (addr); asm db 0x66; asm in ax,dx; v = _EAX;
               
              dword dwDACBaseAddr;         //Base address
               
              union wrdstr
              {
                  int     wrd[2];
                  dword   lng;
              } dat;
               
              int Init1724(void)
              {
                  int  wVendorId, wDeviceId, wIndex;
                  int   iErrCode;
                  byte  ucBusNumber, ucDevAndFunc;
                  dword dwData;
               
                  wIndex = 0;
                  wVendorId = 0x13fe;
                  wDeviceId = 0x1724;
               
                  /***************************
                   * Get 1724's resource
                   ***************************/
                  //
                  // Search PCI-1724
                  //
                  iErrCode = find_pci_device(
                                    wDeviceId,
                                    wVendorId,
                                    wIndex,
                                    &ucBusNumber,
                                    &ucDevAndFunc );
                  if (iErrCode == NOT_SUCCESSFUL )
                  {
                      //printf("\nPCI-1724 search fail\n");
                      return -1;
                  }
               
                  //
                  //Get base address, from PCI base address range 2
                  //
                  iErrCode = read_configuration_dword(
                                    ucBusNumber,
                               ucDevAndFunc,
                               PCI_CS_BASE_ADDRESS_2,
                               &dwData);
                  if (iErrCode == NOT_SUCCESSFUL)
                  {
                      //printf("\nPCI-1724 gets base address fail\n");
                      return -2;
                  }
                  else
                      dwDACBaseAddr = dwData & 0xfffffffc;
              //  printf("\n\n\n\n\tPCI-1724 BaseAddress: %lx\r\n\n",dwDACBaseAddr);
              return 0;
              }
               
              int AnalogOutput(unsigned int wChannel, unsigned int wValue)
              {
                  // MAX= 2^14 = 16383 = 0x3fff
                  // Middle    = 8191  = 0x1fff
               
                  int GroupGX,ChannelCX;
                  if (wValue > 0x3fff)
                      wValue = 0x3fff;
               
                  GroupGX   = 0x0001 << (wChannel/8);
                  ChannelCX = wChannel%8;
               
                  dat.wrd[1] = (GroupGX << 4)+ ChannelCX;
                  dat.wrd[0] = wValue + 0xC000;
                  
                  if (dwDACBaseAddr==0)
                      return(1);
                  
                  outportv(dwDACBaseAddr, dat.lng);
               
                  return(0);
              }
               
              void main(void)
              {
                int wChannel;
                  int wValue,ch,i;
                  Init1724();
                  wChannel=0;
                  clrscr();
                  // простой тестик - выдает по кругу значение на ЦАП...
                  do
                  {
                      if (wValue>=0x3fff) {wValue =0;clrscr();} else wValue+=1;
                      gotoxy(20,2);
                      AnalogOutput(wChannel,wValue);
                      putch('\n');
                      for (i=0;i<wValue/205;i++)
                      if (i<0x3fff/410) putch ('_'); else putch('-');
                      putch('\r');
                      delay(1);
               
                  } while (!kbhit());
              }
               
              /*
               
              //////////////////////////////////
              //  Из вольт в данные переводила вот такая простенькая процедурка...
              // Analog OUTPUT 14 bit = 0 - 8192 - 16384  -/+ 10V
              // РАБОТАЕМ С МИЛИВОЛЬТАМИ
              void SetU(double val)
              {
                      // значения max,min в принципе подбирал по вольтметру на каждый канал
                      // ну это по желанию...
                  unsigned int max = 16260;   //  +10V ( 9.999)
                  unsigned int min = 270;     //  -10V (-9.999)
                  double delta=20000.0/(max-min);
                  unsigned int wValue=(val+10000.0)/delta+min;
                  AnalogOutput(chan0, wValue);    //
              }
               
              */
            Сообщение отредактировано: vadymko -
              Цитата vadymko @
              Вобщем выкладываю сборную солянку, собранную здесь общим коллективом, на всеобщее обозрение...
              Главное ее достоинство - РАБОТАЕТ !! :D

              ExpandedWrap disabled
                #include <dos.h>
                #include <stdio.h>
                #include <conio.h>
                #include <stdlib.h>
                #include "..\hardware\PCI.H"
                 
                /************
                 * Global variable declare
                 ************/
                //typedef   signed char schar;
                //typedef unsigned char byte;
                //typedef unsigned short word;
                //typedef unsigned long dword;
                 
                #define outportv(addr,data) _DX = (addr); _EAX = (dword)(data); asm db 0x66; asm out dx,ax;
                #define inportv(addr,v) _DX = (addr); asm db 0x66; asm in ax,dx; v = _EAX;
                 
                dword dwDACBaseAddr;         //Base address
                 
                union wrdstr
                {
                    int     wrd[2];
                    dword   lng;
                } dat;
                 
                int Init1724(void)
                {
                    int  wVendorId, wDeviceId, wIndex;
                    int   iErrCode;
                    byte  ucBusNumber, ucDevAndFunc;
                    dword dwData;
                 
                    wIndex = 0;
                    wVendorId = 0x13fe;
                    wDeviceId = 0x1724;
                 
                    /***************************
                     * Get 1724's resource
                     ***************************/
                    //
                    // Search PCI-1724
                    //
                    iErrCode = find_pci_device(
                                      wDeviceId,
                                      wVendorId,
                                      wIndex,
                                      &ucBusNumber,
                                      &ucDevAndFunc );
                    if (iErrCode == NOT_SUCCESSFUL )
                    {
                        //printf("\nPCI-1724 search fail\n");
                        return -1;
                    }
                 
                    //
                    //Get base address, from PCI base address range 2
                    //
                    iErrCode = read_configuration_dword(
                                      ucBusNumber,
                                 ucDevAndFunc,
                                 PCI_CS_BASE_ADDRESS_2,
                                 &dwData);
                    if (iErrCode == NOT_SUCCESSFUL)
                    {
                        //printf("\nPCI-1724 gets base address fail\n");
                        return -2;
                    }
                    else
                        dwDACBaseAddr = dwData & 0xfffffffc;
                //  printf("\n\n\n\n\tPCI-1724 BaseAddress: %lx\r\n\n",dwDACBaseAddr);
                return 0;
                }
                 
                int AnalogOutput(unsigned int wChannel, unsigned int wValue)
                {
                    // MAX= 2^14 = 16383 = 0x3fff
                    // Middle    = 8191  = 0x1fff
                 
                    int GroupGX,ChannelCX;
                    if (wValue > 0x3fff)
                        wValue = 0x3fff;
                 
                    GroupGX   = 0x0001 << (wChannel/8);
                    ChannelCX = wChannel%8;
                 
                    dat.wrd[1] = (GroupGX << 4)+ ChannelCX;
                    dat.wrd[0] = wValue + 0xC000;
                    
                    if (dwDACBaseAddr==0)
                        return(1);
                    
                    outportv(dwDACBaseAddr, dat.lng);
                 
                    return(0);
                }
                 
                void main(void)
                {
                  int wChannel;
                    int wValue,ch,i;
                    Init1724();
                    wChannel=0;
                    clrscr();
                    // простой тестик - выдает по кругу значение на ЦАП...
                    do
                    {
                        if (wValue>=0x3fff) {wValue =0;clrscr();} else wValue+=1;
                        gotoxy(20,2);
                        AnalogOutput(wChannel,wValue);
                        putch('\n');
                        for (i=0;i<wValue/205;i++)
                        if (i<0x3fff/410) putch ('_'); else putch('-');
                        putch('\r');
                        delay(1);
                 
                    } while (!kbhit());
                }
                 
                /*
                 
                //////////////////////////////////
                //  Из вольт в данные переводила вот такая простенькая процедурка...
                // Analog OUTPUT 14 bit = 0 - 8192 - 16384  -/+ 10V
                // РАБОТАЕМ С МИЛИВОЛЬТАМИ
                void SetU(double val)
                {
                        // значения max,min в принципе подбирал по вольтметру на каждый канал
                        // ну это по желанию...
                    unsigned int max = 16260;   //  +10V ( 9.999)
                    unsigned int min = 270;     //  -10V (-9.999)
                    double delta=20000.0/(max-min);
                    unsigned int wValue=(val+10000.0)/delta+min;
                    AnalogOutput(chan0, wValue);    //
                }
                 
                */

              Здравcтвуйте.

              Можете выложить этот файлик?
              #include "..\hardware\PCI.H"
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:
              Страницы: (3) 1 2 [3]  все


              Рейтинг@Mail.ru
              [ Script execution time: 0,0381 ]   [ 16 queries used ]   [ Generated: 8.10.24, 03:46 GMT ]