/* -------------------------------------------------------------- */ /* DEMO 12: Software calibration (manual tuning) */ /* Note : User need one current meter & one voltage meter */ /* to measure D/A output(current/voltage) value. By the */ /* result user decide increment or decrement Hex value */ /* that be sent to D/A converter. finally, all Hex value */ /* will store to EEPROM */ /* step 1: Run DEMO12.EXE */ /* -------------------------------------------------------------- */ #include #include #include #include #include "PIO.H" #define TIMEOUT 12000L #define PreSetN10V 100 #define PreSetP10V 16284 #define PreSet00mA 8192 #define PreSet20mA 16284 int iComPort,iChksum,j,MaxChannel; WORD wBase,wIrq,EEP; WORD wDelay1=2000; WORD wN10V[16],wP10V[16],w00mA[16],w20mA[16]; float rr[16]; char c,str1[40],str2[40],str3[40]; long int lBaudRate; int save_neg_10v_to_eeprom(void); int save_pos_10v_to_eeprom(void); int save_00mA_to_eeprom(void); int save_20mA_to_eeprom(void); int cal1_N10V(void); int cal1_P10V(void); int cal1_00mA(void); int cal1_20mA(void); int PIODA_AnalogOutput(int, int); int main() { int i,h,l; WORD wBoards,wRetVal,t1,t2,t3,t4,t5,t6; WORD wSubVendor,wSubDevice,wSubAux,wSlotBus,wSlotDevice; WORD k,wStart,wBegin1,wBegin2; char str1[80]; clrscr(); /* step1 : find address-mapping of PIO/PISO cards */ wRetVal=PIO_DriverInit(&wBoards,0x80,0x04,0x00); /* for PIO-DA16 */ printf("\n(1) Threr are %d PIO-DA16/8/4 Cards in this PC",wBoards); if ( wBoards==0 ) exit(0); printf("\n\n-------------- The Configuration Space --------------"); for(i=0;i "); ShowPioPiso(wSubVendor,wSubDevice,wSubAux); } PIO_GetConfigAddressSpace(0,&wBase,&wIrq,&t1,&t2,&t3,&t4,&t5); /* select card_0 */ /* step2 : enable all D/I/O port */ outportb(wBase,0x11); /* /RESET -> 1 */ outportb(wBase+2,0x1C); /* AUX 4/3/2 are D/O, othes D/I */ outportb(wBase+3,0); /* all D/O are Low */ printf("\n\n(2) DEMO12 D/A Calibrator test"); printf("\n(1) PIO-DA16"); printf("\n(2) PIO-DA8"); printf("\n(3) PIO-DA4\n\n"); do { printf("\rSelect (1-3): \b"); c=getche(); switch(c) { case '1': MaxChannel=16; break; case '2': MaxChannel=8; break; case '3': MaxChannel=4; break; default : MaxChannel=0; } } while(MaxChannel==0); for(;;) { clrscr(); gotoxy(1,1); printf("***************************************"); printf("\n* D/A Calibrator *"); printf("\n*-------------------------------------*"); printf("\n* (1) -10V (2) +10V *"); printf("\n* (3) 0mA (4) 20mA *"); printf("\n* (5) All (6) QUIT *"); printf("\n***************************************"); printf("\n\nSelect (1-5):");c=getche(); printf("\n\nWait ...."); switch (c) { case '1': cal1_N10V(); break; case '2': cal1_P10V(); break; case '3': cal1_00mA(); break; case '4': cal1_20mA(); break; case '5': cal1_N10V(); cal1_P10V(); cal1_00mA(); cal1_20mA(); break; case '6': return; default : return; } clrscr(); gotoxy(1,15); for (i=0; i<16; i++) { EEP_READ(i,&j,&k); l=wN10V[i]&0xff; h=(wN10V[i]>>8)&0xff; printf("\nREAD i=%2d, j=%2x, k=%2x, h=%2x, l=%2x",i,j,k,h,l); } getch(); clrscr(); gotoxy(1,15); for (i=16; i<32; i++) { EEP_READ(i,&j,&k); l=wP10V[i-16]&0xff; h=(wP10V[i-16]>>8)&0xff; printf("\nREAD i=%2d, j=%2x, k=%2x, h=%2x, l=%2x",i,j,k,h,l); } getch(); clrscr(); gotoxy(1,15); for (i=32; i<48; i++) { EEP_READ(i,&j,&k); l=w00mA[i-32]&0xff; h=(w00mA[i-32]>>8)&0xff; printf("\nREAD i=%2d, j=%2x, k=%2x, h=%2x, l=%2x",i,j,k,h,l); } getch(); clrscr(); gotoxy(1,15); for (i=48; i<64; i++) { EEP_READ(i,&j,&k); l=w20mA[i-48]&0xff; h=(w20mA[i-48]>>8)&0xff; printf("\nREAD i=%2d, j=%2x, k=%2x, h=%2x, l=%2x",i,j,k,h,l); } getch(); } outportb(wBase+3,0); /* all D/O are Low */ outportb(wBase+2,0); /* all AUX as D/I */ PIO_DriverClose(); } /* -------------------------------------------------------------- */ /* Output to DA channel */ /* channel : 0 - 15 */ /* value : 0 - 16383 (0x3FFF) */ /* -------------------------------------------------------------- */ int PIODA_AnalogOutput(int channel, int da_value) { int arg1, arg2, command; command = 0xe0 + (channel/4) * 4; /* address of D/A /CS */ arg1 = channel%4; arg1 = arg1 * 64 + da_value/256; /* da_value high byte */ arg2 = da_value%256; /* da_value low byte */ outportb(wBase+0xf0, arg2&0x0ff); outportb(wBase+0xf4, arg1&0x0ff); outportb(wBase+command, 0); return; } /* -------------------------------------------------------------- */ save_neg_10v_to_eeprom() { WORD k,high,low; EEP_WR_EN(); for (k=0; k>8)&0x0ff; EEP_WRITE(k+0,high,low); } } /* -------------------------------------------------------------- */ save_pos_10v_to_eeprom() { WORD k,high,low; EEP_WR_EN(); for (k=0; k>8)&0x0ff; EEP_WRITE(k+16,high,low); } } /* -------------------------------------------------------------- */ save_00mA_to_eeprom() { WORD k,high,low; EEP_WR_EN(); for (k=0; k>8)&0x0ff; EEP_WRITE(k+32,high,low); } } /* -------------------------------------------------------------- */ save_20mA_to_eeprom() { WORD k,high,low; EEP_WR_EN(); for (k=0; k>8)&0x0ff; EEP_WRITE(k+48,high,low); } } /* -------------------------------------------------------------- */ delay_ms(int t) { int i,j,k; float p,q,r; for (i=0; i>1; } return(k); } /* -------------------------------------------------------------- */ EEP_WR_EN() /* write Enable */ { COMM(); WR_BYTE(0x30); /* write enable command */ EEP=EEP&0x14; outportb(wBase+3,EEP); /* SK=L */ EEP=EEP&0x18; outportb(wBase+3,EEP); /* CS=L */ EEP=EEP&0x0C; outportb(wBase+3,EEP); /* DI=0 */ } /* -------------------------------------------------------------- */ EEP_WR_DIS() /* write Disable */ { COMM(); WR_BYTE(0); /* write disable command */ EEP=EEP&0x14; outportb(wBase+3,EEP); /* SK=L */ EEP=EEP&0x18; outportb(wBase+3,EEP); /* CS=L */ EEP=EEP&0x0C; outportb(wBase+3,EEP); /* DI=0 */ } /* -------------------------------------------------------------- */ EEP_WRITE(int ADDR, int HI, int LO) /* write 16-bit data to EEP */ { int i,j,k; COMM(); ADDR=ADDR|0x40; WR_BYTE(ADDR); /* write command & address */ WR_BYTE(HI); /* high 8-bit data */ WR_BYTE(LO); /* low 8-bit data */ EEP=EEP&0x14; outportb(wBase+3,EEP); /* SK=L */ EEP=EEP&0x18; outportb(wBase+3,EEP); /* CS=L */ EEP=EEP&0x0C; outportb(wBase+3,EEP); /* DI=0 */ for (i=0; i<10; i++) /* delay>250 ns (for EEP) */ { EEP=EEP|0x08; outportb(wBase+3,EEP); /* SK=H */ EEP=EEP&0x14; outportb(wBase+3,EEP); /* SK=L */ } EEP=EEP|0x04; outportb(wBase+3,EEP); /* CS=H */ for (k=0; k<10; k++) /* wait until write finish */ for (i=0; i<30000; i++) { EEP=EEP|0x08; outportb(wBase+3,EEP);/* SK=H */ j=inportb(wBase+7)&0x20; EEP=EEP&0x14; outportb(wBase+3,EEP);/* SK=L */ if (j!=0) return(0); /* write is finished */ } EEP=EEP&0x18; outportb(wBase+3,EEP); /* CS=L */ return(1); /* error --> time out ? */ } /* -------------------------------------------------------------- */ EEP_READ(int ADDR, int *HI, int *LO) /* read 16-bit data from EEP */ { int i,j,k; COMM(); ADDR=ADDR|0x80; WR_BYTE(ADDR); /* read command & address */ EEP=EEP&0x0C; outportb(wBase+3,EEP); /* DI=0 */ EEP=EEP&0x14; outportb(wBase+3,EEP); /* SK=L */ EEP=EEP|0x08; outportb(wBase+3,EEP); /* SK=H */ EEP=EEP&0x14; outportb(wBase+3,EEP); /* SK=L */ (*HI)=RD_BYTE(); /* read high 8-bit data */ (*LO)=RD_BYTE(); /* read low 8-bit data */ EEP=EEP&0x14; outportb(wBase+3,EEP); /* SK=L */ EEP=EEP&0x18; outportb(wBase+3,EEP); /* CS=L */ } /* -------------------------------------------------------------- */ cal1_N10V() { int i,j; char ch=0; j=PreSetN10V; for (i=0; i +10 , '9' => +1\n"); printf(" '1' => -10 , '3' => -1\n"); printf(" '0' => O.K\n"); do { printf("\r-10v Calibration -> chan_%2d, wN10V[%2d] = %4x ",i,i,j); ch=getch(); if (ch=='9') j=j+1; if (ch=='3') j=j-1; if (ch=='7') j=j+10; if (ch=='1') j=j-10; PIODA_AnalogOutput(i,j); delay_ms(500); } while(ch!='0'); wN10V[i]=j; } printf("\n\nWrite data to EEPROM, wait ....."); save_neg_10v_to_eeprom(); } /* -------------------------------------------------------------- */ cal1_P10V() { int i,j; char ch=0; j=PreSetP10V; for (i=0; i +10 , '9' => +1\n"); printf(" '1' => -10 , '3' => -1\n"); printf(" '0' => O.K\n"); do { printf("\r+10V Calibration -> chan_%2d, wP10V[%2d] = %4x ",i,i,j); ch=getch(); if (ch=='9') j=j+1; if (ch=='3') j=j-1; if (ch=='7') j=j+10; if (ch=='1') j=j-10; PIODA_AnalogOutput(i,j); delay_ms(500); } while(ch!='0'); wP10V[i]=j; } printf("\n\nWrite data to EEPROM, wait ....."); save_pos_10v_to_eeprom(); } /* -------------------------------------------------------------- */ cal1_00mA() { int i,j; char ch=0; j=PreSet00mA; for (i=0; i +10 , '9' => +1\n"); printf(" '1' => -10 , '3' => -1\n"); printf(" '0' => O.K\n"); do { printf("\r00mA Calibration -> chan_%2d, w00mA[%2d] = %4x ",i,i,j); ch=getch(); if (ch=='9') j=j+1; if (ch=='3') j=j-1; if (ch=='7') j=j+10; if (ch=='1') j=j-10; PIODA_AnalogOutput(i,j); delay_ms(500); } while(ch!='0'); w00mA[i]=j; } printf("\n\nWrite data to EEPROM, wait ....."); save_00mA_to_eeprom(); } /* -------------------------------------------------------------- */ cal1_20mA() { int i,j; char ch=0; j=PreSet20mA; for (i=0; i +10 , '9' => +1\n"); printf(" '1' => -10 , '3' => -1\n"); printf(" '0' => O.K\n"); do { printf("\r20mA Calibration -> chan_%2d, w20mA[%2d] = %4x ",i,i,j); ch=getch(); if (ch=='9') j=j+1; if (ch=='3') j=j-1; if (ch=='7') j=j+10; if (ch=='1') j=j-10; PIODA_AnalogOutput(i,j); delay_ms(500); } while(ch!='0'); w20mA[i]=j; } printf("\n\nWrite data to EEPROM, wait ....."); save_20mA_to_eeprom(); }