'GENERADOR DE SEÑALES 'REALIZADO POR: COLINA, JULIO ' ALBANI, ILEANA '**************************************************************************************** 'Variables y Constantes '**************************************************************************************** 'Constantes Interval Con 515 'uSecs for output StepsPerCycle Con 32 'steps per 1 complete cycle saltalinea con SCRRAM+$40 'Comando para ir a la línea inferior de la pantalla 'Variables contador var byte 'Contador para la seleccion de las opciones del menu i var byte OutIndex var byte Sx var byte(32) Dx var byte(32) Accum var word Freq var long FStep var long PhaseAdder var word Ftemp var long frecd var long aa var byte co var byte INPUT p0 'Pulsador de seleccion TRISA = 1 OUTPUT P7 tabla_frec floattable 60.0,80.0,100.0,120.0 ,0 'Tabla con los valores de la opcion de frecuencia '**************************************************************************************** 'Programa Principal Principal: low p12 gosub IniciaLCD 'Inicializa la LCD frecd=60.0 DO BUTTON P0,1,500,0,co,1,despliegue 'Entrada al menu WHILE (1) goto Principal '**************************************************************************************** 'SUBRUTINAS '**************************************************************************************** 'Rutina para iniciar la pantalla LCD IniciaLCD: PAUSE 500 LCDWRITE P1\P3\P2, OUTB, [INITLCD1, INITLCD2,TWOLINE] PAUSE 100 LCDWRITE P1\P3\P2, OUTB, [INITLCD1, INITLCD2,TWOLINE,CLEAR,HOME,SCR] 'Pantallas iniciales LCDWRITE P1\P3\P2, OUTB, [" UNEFA--MARACAY "] LCDWRITE P1\P3\P2, OUTB, [saltalinea," COLINA-ALBANI "] PAUSE 2000 LCDWRITE P1\P3\P2, OUTB, [clear,home," SIGNAL GEN "] LCDWRITE P1\P3\P2, OUTB, [saltalinea," >>"] LCDWRITE P1\P3\P2, OUTB, [CGRAM+00,$1B,$1B,$1B,$1B,$00,$11,$0A,$04] 'CARACTERES ESPECIALES LCDWRITE P1\P3\P2, OUTB, [CGRAM+08,$00,$04,$06,$1F,$1F,$06,$04,$00] LCDWRITE P1\P3\P2, OUTB, [CGRAM+16,$08,$15,$15,$15,$15,$15,$15,$02] LCDWRITE P1\P3\P2, OUTB, [CGRAM+24,$00,$00,$01,$03,$05,$09,$11,$00] '**************************************************************************************** despliegue: 'Menu del programa en la LCD contador=contador+1 OUTH = $0 SOUND P7,[50\4500] 'Tono de 4.5 Khz durante 50 ms IF (contador=1) THEN LCDWRITE P1\P3\P2, OUTB, [clear,home,"Frecuencia:",real frecd] LCDWRITE P1\P3\P2, OUTB, [saltalinea,"OK ",1," ",0] PAUSE 500 DO IF(INAX0=1) THEN PAUSE 100 GOTO frecuencia ENDIF PAUSE 80 IF (IN0=1) THEN GOTO despliegue ENDIF WHILE(1) ELSEIF (contador=2) LCDWRITE P1\P3\P2, OUTB, [clear,home,"Calculos"] LCDWRITE P1\P3\P2, OUTB, [saltalinea,"OK ",1," ",0] PAUSE 500 DO IF(INAX0=1) THEN PAUSE 100 GOTO calculos ENDIF PAUSE 80 IF (IN0=1) THEN GOTO despliegue ENDIF WHILE(1) ELSEIF (contador=3) LCDWRITE P1\P3\P2, OUTB, [clear,home,"SENOIDAL ",2] LCDWRITE P1\P3\P2, OUTB, [saltalinea,"OK ",1," ",0] PAUSE 500 DO IF(INAX0=1) THEN PAUSE 100 GOTO SENOIDAL ENDIF PAUSE 80 IF(IN0=1) THEN GOTO despliegue ENDIF WHILE(1) ELSEIF (contador=4) LCDWRITE P1\P3\P2, OUTB, [clear,home,"D. DE SIERRA ",3,3] LCDWRITE P1\P3\P2, OUTB, [saltalinea,"OK ",1," ",0] PAUSE 500 DO IF(INAX0=1) THEN PAUSE 100 GOTO DDSIERRA ENDIF PAUSE 80 IF(IN0=1) THEN GOTO despliegue ENDIF WHILE(1) ELSEIF (contador>4) contador=0 GOTO despliegue ENDIF RETURN '**************************************************************************************** 'Rutina para la medicion de TEMPERATURA por AXO calculos: For i = 0 to 31 Sx(i) = Sin(i*8)+128 Dx(i) = i*8 Next Dirh =$0 outh=$0 Freq = frecd ;Hz FStep = Float (StepsPerCycle) fmul (Freq fmul Float(Interval)) FStep = FStep fdiv 1000000.0 FTemp = (FStep fmul 256.0) PhaseAdder = int FTemp contador=0 GOTO despliegue RETURN '**************************************************************************************** frecuencia: aa=0 do LCDWRITE P1\P3\P2, OUTB, [clear,home,"frecuencia=",real tabla_frec(aa)] LCDWRITE P1\P3\P2, OUTB, [saltalinea,"OK ",1," ",0] pause 500 frecd=tabla_frec(aa) if (in0=1) then pause 50 if (in0=1) then aa=aa+1 if (aa>3) then aa=0 endif endif endif while(INAX0=0) contador=0 goto despliegue return '**************************************************************************************** SENOIDAL: do Accum = Accum + PhaseAdder OutIndex = Accum.HighByte // 32 outh =Sx(outIndex) while(IN0=0) contador=0 goto despliegue return '***************************************************************************************** DDSIERRA: do 'Acum = 0 'do Accum = Accum + PhaseAdder OutIndex = Accum.HighByte // 32 outh =Dx(outIndex) while outIndex < 30 'outIndex = 0 'while(IN0=0) contador=0 goto despliegue return '*****************************************************************************************