/**************************************************/ /* Software control function generator */ /* Using the printer port */ /* Free running Square wave generator */ /* Frequency depends on the loop value entered */ /**************************************************/ #include #include #include #include #include unsigned char inval, top, topcnt, printcontrol ; int loop, base, angle ; float maxv, minv ; /***********************************************/ /* Reads the input data */ /***********************************************/ unsigned char readport() { unsigned char dummy ; dummy = inp(base + 2) ; outp((base + 2), (dummy & 0X0D)) ; inval = (inp(base + 1) & 0XF0) >> 4 ; outp((base + 2), (dummy | 0X02)) ; inval = (inval | inp(base + 1) & 0XF0) ^ 0X88 ; return inval ; } /***********************************************/ /* Reads a port and prints the value */ /***********************************************/ unsigned char readwrite() { inval = readport() ; gotoxy(10, 17) ; printf("%d",inval) ; return inval ; } /*************************************************/ /* output a test waveform */ /*************************************************/ void out_test() { unsigned int cnt, cntmax, cntmin, bincode ; unsigned char pol, inprt ; int dummy, int_vout, hilo ; float vout, hvout, lvout ; time_t t, end_t ; if (maxv >= 0 ) { pol = 1 ; hvout = maxv ; } else { pol = 0 ; hvout = maxv * -1 ; } vout = 511.0 * (hvout / 5.0) ; int_vout = vout ; if (pol == 1) bincode = int_vout + 0X0200 ; else bincode = 0X0200 - int_vout ; cntmax = bincode & 0X3FF ; if (minv >= 0 ) { pol = 1 ; lvout = minv ; } else { pol = 0 ; lvout = minv * -1 ; } vout = 511.0 * (lvout / 5.0) ; int_vout = vout ; if (pol == 1) bincode = int_vout + 0X0200 ; else bincode = 0X0200 - int_vout ; cntmin = bincode & 0X3FF ; for (hilo = 0 ; hilo < 2 ; ++hilo) { if (hilo == 1 ) cnt = cntmax ; else cnt = cntmin ; inprt = cnt ; topcnt = cnt >> 8 ; topcnt = topcnt & 0X03 ; if (topcnt == 0X00) top = (top & 0X02) | 0X01 ; if (topcnt == 0X01) top = top & 0X02 ; if (topcnt == 0X02) top = top | 0X05 ; if (topcnt == 0X03) top = (top & 0X02) | 0X04 ; gotoxy(10, 12) ; printf("Hilo %4d maxv %4.1f minv %4.1f ",hilo, maxv, minv) ; outp(base, inprt) ; outp(base + 2, top) ; t = time(NULL) ; end_t = t + (loop / 2) ; while (t < end_t) { t = time(NULL) ; } /* for (dummy = 0 ; dummy < loop ; ++dummy) delay(500) ;*/ } } /*****************************************************/ /* Main Program */ /*****************************************************/ int main(void) { int LPT1 = 0X378 ; int LPT2 = 0X278 ; int LPT3 = 0X3BC ; int dummy ; clrscr() ; base = LPT2 ; top = 0 ; printf ("FREE RUNNING SQUARE WAVE GENERATOR \n\n") ; printf ("Enter Period in seconds ") ; scanf("%d", &loop) ; fflush(stdin) ; printf ("Enter max Voltage ") ; scanf("%f", &maxv) ; fflush(stdin) ; printf ("Enter min Voltage ") ; scanf("%f", &minv) ; fflush(stdin) ; while (!kbhit()) out_test() ; return 0 ; }