/***************************************************************************** * Filename: test_dac.c * * Author: Marco Ziglioli (Doctor Stein) * * Date: 12/06/2001 * * Description: Little test program for Analog Output section of PCI6025E * *----------------------------------------------------------------------------* * Notes: Connect a multimeter to DAC1 output (pin 21) and watch * * tension value. Use '+' and '-' on numeric pad to increase * * and decrise voltage * * With this program it's possible to point out possible * * offset errors. To correct them no software are written but * * in National board package there's the program to calibrate * * the board. Otherwise you can see how much is the offset * * and you can compensate it through software value * *****************************************************************************/ #include #include #include #define TASK_VOLT_PERIOD 150E3 #define TASK_VOLT_WCET 080E3 #define TASK_DAC_PERIOD 050E3 #define TASK_DAC_WCET 020E3 #define CONV 10/2048 #define TASK_GROUP 1 WORD dac0_value = 0, dac1_value = 0; BYTE sys = 0; BYTE dac = 0; //some colors int black = rgb16(0, 0, 0), white = rgb16(255, 255, 255); void drawInterface(void); void endfun(KEY_EVT *); void inc(KEY_EVT *); void dec(KEY_EVT *); void change_dac(KEY_EVT *); void close_event(void *); TASK Voltage_body(int); TASK DAC_Check_body(int); int main(int argc, char **argv) { int modenum; KEY_EVT k; HARD_TASK_MODEL m, d; PID pid_m, pid_d; sys_atrunlevel(close_event, NULL, RUNLEVEL_BEFORE_EXIT); keyb_set_map(itaMap); k.flag = CNTR_BIT; k.scan = KEY_X; k.ascii = 'x'; keyb_hook(k, endfun); k.flag = CNTL_BIT; keyb_hook(k, endfun); k.flag = 0; k.scan = 78; k.ascii = 43; keyb_hook(k, inc); k.flag = 0; k.scan = 74; k.ascii = 45; keyb_hook(k, dec); k.flag = 0; k.scan = KEY_V; k.ascii = 'v'; keyb_hook(k, change_dac); hard_task_default_model(m); hard_task_def_wcet(m, TASK_VOLT_WCET); hard_task_def_mit(m, TASK_VOLT_PERIOD); hard_task_def_group(m, TASK_GROUP); pid_m = task_create("Voltage", Voltage_body, &m, NULL); if(pid_m == NIL){ sys = 30; sys_end(); } hard_task_default_model(d); hard_task_def_wcet(d, TASK_DAC_WCET); hard_task_def_mit(d, TASK_DAC_PERIOD); hard_task_def_group(d, TASK_GROUP); pid_d = task_create("DAC Check", DAC_Check_body, &d, NULL); if(pid_d == NIL){ sys = 31; sys_end(); } //Check if PCI bus is present if(pci_init()==-1){ sys = 10; sys_end(); } //Check if a NI board is on PCI bus if(!reMap()){ sys = 11; sys_end(); } if(grx_init()==-1){ sys = 20; sys_end(); } modenum = grx_getmode(800, 600, 16); if(modenum == -1){ sys = 21; sys_end(); } grx_setmode(modenum); drawInterface(); //Analog output section set up DAC_Init(); /* *AI_TIMEBASE div by 2; OUT_TIMEBASE div by 2; single DAC mode *TMRDACWR = 3 OUT_TIMEBASE period; FIFO flags polarity active low *TMRDACWR disabled; DMA PIO control = FIFO DATA interface mode *UPDATE signal timebase = AO_UPDATE pulse width *UPDATE pulsewidth = 3-3.5 OUT_TIMEBASE period *UPDATE signal polarity = HIGH Z */ DAC_boardInit(0x02, 0x4000); /* *LDAC0 source = UPDATE *DAC0 update immediately *LDAC1 source = UPDATE *DAC1 update immediately */ DAC_LDACSourceUpdate(0x00); //End of Analog output section setup group_activate(TASK_GROUP); return 0; } /* * Every time operator select a new value to send to a DAc this TASK makes * actions needed to perform the operation */ TASK Voltage_body(int dac_work) { WORD old0_value, old1_value; char buf[6]; float volt; old0_value = dac0_value; old1_value = dac1_value; while(1){ if(dac){ if(dac1_value != old1_value){ DAC_output(DAC1, dac1_value); old1_value = dac1_value; sprintf(buf, "%04d", dac1_value); grx_text(buf, 70, 120, rgb16(180, 0, 0), rgb16(255,255,140)); sprintf(buf, "%04x", dac1_value); grx_text(buf, 300, 120, rgb16(180, 0, 0), rgb16(255,255,140)); if( (dac1_value & 0x0800) == 0 ) volt = (float)dac1_value * (float)CONV; else volt = (float)(dac1_value-0x0FFF) * (float)CONV; sprintf(buf, "%05.2f", volt); grx_text(buf, 70, 177, rgb16(180, 40, 180), black); } } else { if(dac0_value != old0_value){ DAC_output(DAC0, dac0_value); old0_value = dac0_value; sprintf(buf, "%04d", dac0_value); grx_text(buf, 521, 120, rgb16(180, 0, 0), rgb16(255,255,140)); sprintf(buf, "%04x", dac0_value); grx_text(buf, 754, 120, rgb16(180, 0, 0), rgb16(255,255,140)); if( (dac0_value & 0x0800) == 0 ) volt = (float)dac0_value * (float)CONV; else volt = (float)(dac0_value-0x0FFF) * (float)CONV; sprintf(buf, "%05.2f", volt); grx_text(buf, 521, 177, rgb16(180, 40, 180), black); } } task_endcycle(); } } /* * This TASK show which is the DAC active */ TASK DAC_Check_body(int dummy) { BYTE old = dac; char buf[8]; while(1){ if(dac != old){ old = dac; sprintf(buf, "DAC %d", dac); grx_text(buf, 385, 90, rgb16(255*dac, 255*(1-dac), 0), black); } task_endcycle(); } } void drawInterface(void) { grx_rect(1, 1, 799, 69, rgb16(105, 0, 0)); grx_rect(2, 2, 798, 68, rgb16(155, 0, 0)); grx_rect(3, 3, 797, 67, rgb16(205, 0, 0)); grx_rect(4, 4, 796, 66, rgb16(255, 0, 0)); grx_text("Test program for Analog output section of PCI6025E", 7, 10, rgb16(50, 255, 50), black); grx_text("Use '+' and '-' on numeric pad to change tension", 7, 25, rgb16(0, 255, 255), black); grx_text("Connect a tester to DAC1 output (pin21) or to DAC0 output (pin20)", 7, 33, rgb16(0, 255, 255), black); grx_text("Use 'v' to alternate change active DAC", 7, 40, rgb16(0, 255, 255), black); grx_text("CTRL-X for Exit", 7, 55, rgb16(200, 200, 0), black); grx_rect(1, 80, 355, 150, rgb16(0, 105, 0)); grx_rect(2, 81, 354, 149, rgb16(0, 155, 0)); grx_rect(3, 82, 353, 148, rgb16(0, 205, 0)); grx_rect(4, 83, 352, 147, rgb16(0, 255, 0)); grx_rect(1, 160, 355, 199, rgb16(0, 105, 0)); grx_rect(2, 161, 354, 198, rgb16(0, 155, 0)); grx_rect(3, 162, 353, 197, rgb16(0, 205, 0)); grx_rect(4, 163, 352, 196, rgb16(0, 255, 0)); grx_rect(455, 80, 799, 150, rgb16(105, 105, 0)); grx_rect(456, 81, 798, 149, rgb16(155, 155, 0)); grx_rect(457, 82, 797, 148, rgb16(205, 205, 0)); grx_rect(458, 83, 796, 147, rgb16(255, 255, 0)); grx_rect(455, 160, 799, 199, rgb16(105, 105, 0)); grx_rect(456, 161, 798, 198, rgb16(155, 155, 0)); grx_rect(457, 162, 797, 197, rgb16(205, 205, 0)); grx_rect(458, 163, 796, 196, rgb16(255, 255, 0)); grx_rect(360, 80, 450, 105, rgb16(85, 85, 255)); grx_rect(361, 81, 449, 104, rgb16(125, 125, 255)); grx_rect(362, 82, 448, 103, rgb16(175, 175, 255)); grx_rect(363, 83, 447, 102, rgb16(225, 225, 255)); grx_rect(153, 93, 195, 103, rgb16(255, 0, 0)); grx_text("DAC 1", 155, 95, rgb16(255, 170, 170), black); grx_rect(607, 93, 649, 103, rgb16(255, 0, 0)); grx_text("DAC 0", 609, 95, rgb16(255, 255, 210), black); grx_text("Decimal", 7, 120, rgb16(120, 120, 255), black); grx_text("Hexadecimal", 200, 120, rgb16(120, 120, 255), black); grx_text("Tension", 7, 177, rgb16(120, 120, 255), black); grx_text("Decimal", 461, 120, rgb16(255, 120, 120), black); grx_text("Hexadecimal", 654, 120, rgb16(255, 120, 120), black); grx_text("Tension", 461, 177, rgb16(255, 120, 120), black); } void close_event(void *arg) { grx_close(); switch(sys){ case 0 : cprintf("Regular End\n"); break; case 1 : cprintf("End fun invoked\n"); break; case 10: cprintf("Pci bus not found\n"); break; case 11: cprintf("No National board found\n"); break; case 20: cprintf("Cannot initialize graphic envirorment\n"); break; case 21: cprintf("Cannot start envirorment in 800x600x16\n"); break; case 30: cprintf("Cannot create task \n"); break; case 31: cprintf("Canot create task \n"); break; case 40: cprintf("Break on clock end event\n"); break; default: cprintf("Unkwon exit event\n"); break; } } void endfun(KEY_EVT *k) { sys = 1; sys_end(); } /* * Capture correct key event and increase output tension of active DAC */ void inc(KEY_EVT *k) { if(dac){ if( (dac1_value & 0x0800) == 0 && dac1_value > 0x07FF ) dac1_value = 0; else dac1_value++; } else { if( (dac0_value & 0x0800) == 0 && dac0_value > 0x07FF ) dac0_value = 0; else dac0_value++; } } /* * Same as above but decrease tension */ void dec(KEY_EVT *k) { if(dac){ if(dac1_value < 1) dac1_value = 0x0FFF; else dac1_value -= 1; } else { if(dac0_value < 1) dac0_value = 0x0FFF; else dac0_value -= 1; } } /* * Capture correct key event and change active DAC */ void change_dac(KEY_EVT *k) { if(dac) dac = 0; else dac = 1; }