/***************************************************************************** * Filename: test_mes.c * * Author: Marco Ziglioli (Doctor Stein) * * Date: 25/06/2001 * * Description: Test file for single period and pulsewidth measurement feature* * of PCI6025E timers/counters * *----------------------------------------------------------------------------* * Notes: board is configured to provide a frequency of 1 MHZ through its FOUT* * pin (50). PFI3 (41) and PFI6 (45) are configured like source pins * * counter 0 and counter 1. PFI4 (42) and PFI 5(44) are the gates for * * the two counters. Please connect DIO7(32) to PFI4 and DIO6(30) to * * PFI 5. * * With 'g' key a task is started which generate a square wave on DIO7 * * with a period of 2 secs. With 'h' key the same square wave is * * generated on DIO6. * * When measurement is performed data are stored into Hardware Save * * Registers: use key 's' to show this values * *****************************************************************************/ #include #include #include #include #include #define TASK_MET 20000 #define TASK_WCET 50000 #define TASK_PERIOD 100000 #define PERIOD 1000000 void endFun(KEY_EVT *); void gateEvent(KEY_EVT *); void drawInterface(void); void closeEvent(void *); TASK show_body(int); TASK gate_body(int); BYTE sys = 0; PID c0_gate_pid, c1_gate_pid, show_pid; int black = rgb16(0, 0, 0); int main(int argc, char **argv) { KEY_EVT k; int modenum; SOFT_TASK_MODEL show_model; HARD_TASK_MODEL gating; sys_atrunlevel(closeEvent, NULL, RUNLEVEL_BEFORE_EXIT); k.flag = CNTL_BIT; k.scan = KEY_X; k.ascii = 'x'; keyb_hook(k, endFun); k.flag = CNTR_BIT; keyb_hook(k, endFun); k.flag = 0; k.scan = KEY_G; k.ascii = 'g'; keyb_hook(k, gateEvent); k.scan = KEY_H; k.ascii = 'h'; keyb_hook(k, gateEvent); k.scan = KEY_S; k.ascii = 's'; keyb_hook(k, gateEvent); if(pci_init()==-1){ sys = 10; sys_end(); } if(!reMap()){ sys = 11; sys_end(); } soft_task_default_model(show_model); soft_task_def_level(show_model, 1); soft_task_def_met(show_model, TASK_MET); soft_task_def_wcet(show_model, TASK_WCET); soft_task_def_aperiodic(show_model); soft_task_def_period(show_model, TASK_PERIOD); if( (show_pid = task_create("Show task", show_body, &show_model, NULL)) == NIL ){ sys = 20; sys_end(); } hard_task_default_model(gating); hard_task_def_mit(gating, PERIOD); hard_task_def_wcet(gating, 20000); hard_task_def_arg(gating, C0); if( (c0_gate_pid = task_create("C0 Gate task", gate_body, &gating, NULL)) == NIL ){ sys = 21; sys_end(); } hard_task_def_arg(gating, C1); if( (c1_gate_pid = task_create("C1 Gate task", gate_body, &gating, NULL)) == NIL ){ sys = 22; sys_end(); } if(grx_init()==-1){ sys = 30; sys_end(); } if( (modenum = grx_getmode(800, 600, 16)) == 0 ){ sys = 31; sys_end(); } grx_setmode(modenum); drawInterface(); //Enable DIO to manage gates DIO_init(); DIO_setup(0xFF); DIO_write(0x00); //All PFI configured as input PFIprogramming(0x0000); //Fout provide 1MHz: timebase = 20MHz; divided by 2; on FOUT pin also divided by 10 setIntClock(0, 1, 10); //Reset both counters TIM_reset(2); //Source PFI3(41); Gate PFI 4(42); Measure period TIM_timeMeasurement(C0, 0x04, 0x45, 0, 0x00, 0); //Source PFI6(45); Gate PFI 5(44); Measure pulsewidth TIM_timeMeasurement(C1, 0x87, 0x46, 1, 0x00, 0); //Arm both counter TIM_arm(2); return 0; } TASK show_body(int dummy) { DWORD val; char buf[20]; while(1){ val = TIM_readHWSaveReg(C0); sprintf(buf, "%d", val); grx_text(buf, 600, 471, rgb16(0, 255, 0), black); val = TIM_readHWSaveReg(C1); sprintf(buf, "%d", val); grx_text(buf, 200, 471, rgb16(255, 0, 0), black); task_endcycle(); } } TASK gate_body(int counter) { BYTE out; if(counter == C0) out = 0x80; else out = 0x40; while(1){ DIO_write(out); if(counter == C0){ if(out) out = 0x00; else out = 0x80; } else { if(out) out = 0x40; else out = 0x00; } task_endcycle(); } } void drawInterface(void) { grx_rect(1, 1, 799, 120, rgb16(105, 0, 0)); grx_rect(2, 2, 798, 119, rgb16(155, 0, 0)); grx_rect(3, 3, 797, 118, rgb16(205, 0, 0)); grx_rect(4, 4, 796, 117, rgb16(255, 0, 0)); grx_text("Test program for single period and pulsewidth measurement features", 7, 10, rgb16(200, 200, 0), black); grx_text("This program measures single period and pulsewidth of a square wave", 7, 20, rgb16(0, 255, 0), black); grx_text("with frequency of 0.5 Hz", 7, 28, rgb16(0, 255, 0), black); grx_text("Please connect PFI3 & PFI6 (41 & 45) to FOUT pin (50) or to 1Mhz frequency source", 7, 40, rgb16(255, 0, 0), black); grx_text("Connect also DIO7 (32) to PFI4 (42) and DIO6 to PFI5 (44)", 7, 48, rgb16(255, 0, 0), black); grx_text("Commands:", 7, 60, rgb16(0, 120, 0), black); grx_text("Use 'g' to start wave generation on DIO7", 7, 70, rgb16(0, 255, 255), black); grx_text("Use 'h' to start wave generation on DIO6", 7, 78, rgb16(0, 255, 255), black); grx_text("Use 's' to show Hardware Save Registers content", 7, 86, rgb16(0, 255, 255), black); grx_text("CTRL-X to exit", 7, 105, rgb16(255, 255, 0), black); grx_rect(197, 127, 603, 423, rgb16(0, 255, 0)); grx_rect(198, 128, 602, 422, rgb16(0, 205, 0)); grx_rect(199, 129, 601, 421, rgb16(0, 155, 0)); grx_rect(200, 130, 600, 420, rgb16(0, 105, 0)); grx_line(215, 405, 215, 150, rgb16(255, 255, 255)); grx_line(210, 400, 580, 400, rgb16(255, 255, 255)); grx_line(220, 395, 220, 170, rgb16(0, 0, 255)); grx_line(220, 170, 390, 170, rgb16(0, 0, 255)); grx_line(390, 170, 390, 395, rgb16(0, 0, 255)); grx_line(390, 395, 560, 395, rgb16(0, 0, 255)); grx_line(220, 150, 560, 150, rgb16(0, 255, 0)); grx_line(220, 155, 390, 155, rgb16(255, 0, 0)); grx_rect(1, 450, 390, 503, rgb16(105, 0, 0)); grx_rect(2, 451, 389, 502, rgb16(155, 0, 0)); grx_rect(3, 452, 388, 501, rgb16(205, 0, 0)); grx_rect(4, 453, 387, 500, rgb16(255, 0, 0)); grx_text("Pulsewidth: [us]", 7, 471, rgb16(255, 0, 0), black); grx_rect(410, 450, 799, 503, rgb16(105, 0, 0)); grx_rect(411, 451, 798, 502, rgb16(155, 0, 0)); grx_rect(412, 452, 797, 501, rgb16(205, 0, 0)); grx_rect(413, 453, 796, 500, rgb16(255, 0, 0)); grx_text("Period: [us]", 416, 471, rgb16(0, 255, 0), black); } void endFun(KEY_EVT *k) { sys_end(); } void gateEvent(KEY_EVT *k) { if(k->scan == KEY_G) task_activate(c0_gate_pid); if(k->scan == KEY_H) task_activate(c1_gate_pid); if(k->scan == KEY_S) task_activate(show_pid); } void closeEvent(void *arg) { TIM_disarm(2); grx_close(); switch(sys){ case 0: cprintf("OK\n"); break; case 10: cprintf("No PCI bus found\n"); break; case 11: cprintf("No NATIONAL board found\n"); break; case 20: cprintf("task down!!\n"); break; case 21: cprintf("task down!!!\n"); break; case 22: cprintf("task down!!!\n"); break; case 30: cprintf("Cannot init graphic envirorment\n"); break; case 31: cprintf("graphic mode 800x600x16 not supported\n"); break; default: cprintf("???????????????\n"); break; } }