Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[44.192.95.161] |
|
Страницы: (3) 1 2 [3] все ( Перейти к последнему сообщению ) |
Сообщ.
#31
,
|
|
|
Просто я умнел на глазах с каждым примером Программы везде под large писаны, да и пользовал я тока вывод... Кстати позже я и второй пример запустил, уже вот в таком немного отредактированном виде, ну в принципе они практически не отличаются (ни от исходного ни от примеров vmp) 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 } } |
Сообщ.
#32
,
|
|
|
Цитата vadymko @ Здесь такая же ошибка, что и у меня. Только у меня поправить проще - просто добавлением строкиdword inportd (word port) { asm { mov dx, [port] db 66h in ax, dx } } shld edx,eax,16 |
Сообщ.
#33
,
|
|
|
Цитата Adil @ Здесь такая же ошибка, что и у меня. Только у меня поправить проще - просто добавлением строки shld edx,eax,16 после инструкции in Спасибо учтем. Просто инпорт я не пользовал. Мне нужен просто вывод..вот и упустил.. |
Сообщ.
#34
,
|
|
|
Vadymko, можешь дать исходники, которые получились. А то такая же проблемма возникла (тоже с PCI-1724U), а насчет работы с регистрами и асемблера я ни в зуб ногой. Буду очень благодарен.
|
Сообщ.
#35
,
|
|
|
Вобщем выкладываю сборную солянку, собранную здесь общим коллективом, на всеобщее обозрение...
Главное ее достоинство - РАБОТАЕТ !! #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); // } */ |
Сообщ.
#36
,
|
|
|
Цитата vadymko @ Вобщем выкладываю сборную солянку, собранную здесь общим коллективом, на всеобщее обозрение... Главное ее достоинство - РАБОТАЕТ !! #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" |