'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2014 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 03/09/2014 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
DEFINE OSC 4
@ DEVICE pic16F877A
@ DEVICE pic16F877A, WDT_off
@ DEVICE pic16F877A, PWRT_ON
@ DEVICE pic16F877A, PROTECT_OFF
@ DEVICE pic16F877A, XT_OSC
ADCON1=%10000010
TRISA=%11111111
TRISB=%11111111
TRISC=%00000000
TRISD=%00000000
OPTION_REG=%10000010
INTCON=%10100001
TMR0=0
T2CON = %00000110
PR2=124
cmcon=6
DEFINE LCD_DREG PORTD
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTD
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG PORTD
DEFINE LCD_EBIT 3
DEFINE LCD_BITS 4
DEFINE LCD_LINES 4
DEFINE CCP1_REG PORTC
DEFINE CCP1_BIT 2
DEFINE ADC_BITS 10
DEFINE ADC_CLOCK 3
DEFINE ADC_SAMPLEUS 50
SYMBOL SUMAR_DUTY = PORTB.0
SYMBOL RESTAR_DUTY = PORTB.1
SYMBOL FREC_SUBIR = PORTB.2
SYMBOL FREC_BAJAR = PORTB.3
SYMBOL TIPO_CELDA = PORTB.4
SYMBOL PARAR = PORTB.5
SYMBOL MOD_SUBIR = PORTB.6
SYMBOL MOD_BAJAR = PORTB.7
CAMBIO_CELDA VAR PORTC.3
LED1 VAR PORTC.1
LED2 VAR PORTC.0
MODS VAR BIT
T_SALIDA_C VAR BIT
VOLT VAR WORD
HAM VAR WORD
HVD var word
AMPER var word
MV VAR BYTE
MA VAR BYTE
U VAR BYTE
W VAR BYTE
ADR VAR BYTE
CONTADOR VAR BYTE
DUTY VAR BYTE
I VAR WORD
HAM_DUTY VAR WORD
TIEMPO VAR WORD
AUXILIAR1 VAR BYTE
AUXILIAR2 VAR BYTE
AUXILIAR3 VAR BYTE
AUXILIAR4 VAR BYTE
AUXILIAR5 VAR BYTE
FRECUENCIA VAR WORD
PORTB=0
PORTC=0
PORTD=0
ON INTERRUPT GoTo CORTAR
PAUSE 200
LCDOUT $FE,1
ARRANQUE:
LCDOUT $fe,$c0,"HHO PWM CONTROL"
LCDOUT $fe,$90,"BioEEA TorresAM"
PAUSE 500
LCDOUT $FE,1
VOLT=0
DUTY=0:LED1=0:LED2=1
GOSUB FREC_LEER
GOSUB DISPLAY_LCD
GOSUB CTRL_DUTY
GOSUB PWM_ON
;--------------------------------------------------------------
;--------------------------------------------------------------
INICIO:
IF DUTY>0 THEN
IF TIPO_CELDA=0 AND T_SALIDA_C=0 THEN
T_SALIDA_C=1
AUXILIAR3=DUTY
GOTO CAMBIO
ENDIF
IF TIPO_CELDA=0 AND T_SALIDA_C=1 THEN
T_SALIDA_C=0
AUXILIAR3=DUTY
GOTO CAMBIO_1
ENDIF
ENDIF
IF PARAR=0 and duty>0 THEN
GOTO DETENER
ENDIF
IF MOD_BAJAR=0 THEN
AUXILIAR1 = 1
GOSUB RESTAR_TIEMPO
ENDIF
IF MOD_SUBIR=0 THEN
AUXILIAR2 = 1
GOSUB SUMAR_TIEMPO
ENDIF
GOSUB FREC_LEER
GOSUB DUTY_CONTROL
GOSUB CTRL_FREC
PAUSE TIEMPO
IF AUXILIAR1 = 1 THEN GOSUB PWM_OFF
IF AUXILIAR2 = 1 THEN GOSUB PWM_OFF
PAUSE TIEMPO
GOSUB PWM_ON
ADCIN 0,HAM
IF ADCON0.2=1 THEN INICIO
PAUSE 5
GOSUB LECTURA_V
ADCIN 1,HAM
PAUSE 5
GOSUB LECTURA_A
GOTO INICIO
;--------------------------------------------------------------
;--------------------------------------------------------------
LECTURA_V:
HVD=((HAM+1)*/875)/10
RETURN
LECTURA_A:
HVD=(HAM+1)*/250
AMPER=HVD/100
MA=HVD//100
RETURN
;--------------------------------------------------------------
;--------------------------------------------------------------
;--------------------------------------------------------------
;--------------------------------------------------------------
SUMAR_TIEMPO:
IF TIEMPO= 900 THEN RETURN
TIEMPO=TIEMPO + 100
RETURN
RESTAR_TIEMPO:
IF TIEMPO= 0 THEN RETURN
TIEMPO=TIEMPO - 100
RETURN
CTRL_FREC:
IF FREC_SUBIR=0 THEN
WHILE FREC_SUBIR=0:WEND
PR2=PR2-1
gosub CTRL_DUTY
IF PR2<5 THEN PR2=5
ENDIF
IF FREC_BAJAR=0 THEN
WHILE FREC_BAJAR=0:WEND
PR2=PR2+1
gosub CTRL_DUTY
IF PR2>124 THEN PR2=124
ENDIF
GOSUB DISPLAY_LCD
RETURN
;----------------------------------------------------------------
;----------------------------------------------------------------
DUTY_CONTROL:
IF SUMAR_DUTY =0 THEN
CONTADOR=0
DUTY=DUTY+1
IF DUTY=101 THEN DUTY=100
gosub CTRL_DUTY:GOSUB DISPLAY_LCD
WHILE SUMAR_DUTY=0
W=1
IF CONTADOR=>50 THEN
W=0:CONTADOR=50
DUTY=DUTY+1:GOSUB DELAY
IF DUTY=101 THEN DUTY=100
ENDIF
GOSUB CTRL_DUTY
GOSUB DISPLAY_LCD
WEND
W=0:CONTADOR=0
ELSE
W=0:CONTADOR=0
ENDIF
IF RESTAR_DUTY=0 THEN
CONTADOR=0
DUTY=DUTY-1
IF DUTY=255 THEN DUTY=0
GOSUB CTRL_DUTY
GOSUB DISPLAY_LCD
WHILE RESTAR_DUTY=0
W=1
IF CONTADOR=>30 THEN
W=0:CONTADOR=30
DUTY=DUTY-1:GOSUB DELAY
IF DUTY=255 THEN DUTY=0
ENDIF
GOSUB CTRL_DUTY
GOSUB DISPLAY_LCD
WEND
W=0
ELSE
W=0:CONTADOR=0
ENDIF
RETURN
;----------------------------------------------------------------
;----------------------------------------------------------------
CAMBIO:
DUTY=DUTY-1:GOSUB DELAY
IF DUTY>100 THEN
CAMBIO_CELDA=1:LED1=1:LED2=0
GOTO DUTY_SUBIR
ENDIF
GOSUB CTRL_DUTY:GOSUB DISPLAY_LCD
GOTO CAMBIO
;----------------------------------------------------------------
;----------------------------------------------------------------
DUTY_SUBIR:
DUTY=DUTY+1:GOSUB DELAY
GOSUB CTRL_DUTY:GOSUB DISPLAY_LCD
IF DUTY=AUXILIAR3 THEN
GOTO INICIO
ENDIF
GOTO DUTY_SUBIR
;----------------------------------------------------------------
;----------------------------------------------------------------
DETENER:
DUTY=DUTY-1:GOSUB DELAY
GOSUB CTRL_DUTY:GOSUB DISPLAY_LCD
IF DUTY=0 THEN
GOTO INICIO
ENDIF
GOTO DETENER
;----------------------------------------------------------------
;----------------------------------------------------------------
CAMBIO_1:
DUTY=DUTY-1:GOSUB DELAY
IF DUTY>100 THEN
CAMBIO_CELDA=0:LED1=0:LED2=1
GOTO DUTY_SUBIR
ENDIF
GOSUB CTRL_DUTY:GOSUB DISPLAY_LCD
GOTO CAMBIO_1
;----------------------------------------------------------------
;----------------------------------------------------------------
DELAY:
FOR I=0 TO 255:NEXT
RETURN
DELAY1:
FOR I=0 TO 150:NEXT
RETURN
;----------------------------------------------------------------
;----------------------------------------------------------------
FREC_LEER:
FRECUENCIA=62500/(PR2+1) ;FRECUENCIA=62500/(PR2+1) = 500Hz
RETURN
;----------------------------------------------------------------
;----------------------------------------------------------------
CTRL_DUTY:
HAM_DUTY=(PR2+1)*DUTY/25
CCP1CON.4=ham_DUTY.0
CCP1CON.5=HAM_DUTY.1
CCPR1L=HAM_DUTY>>2
return
;----------------------------------------------------------------
;----------------------------------------------------------------
PWM_ON:
CCP1CON.2=1
CCP1CON.3=1
RETURN
;----------------------------------------------------------------
;----------------------------------------------------------------
PWM_OFF:
CCP1CON.2=0
CCP1CON.3=0
RETURN
;----------------------------------------------------------------
;----------------------------------------------------------------
DISPLAY_LCD:
LCDOUT $FE,$80,"Duty %",#DUTY
IF DUTY<100 THEN
GOSUB CONFIG_DIGITO1
LCDOUT $FE,ADR,$20
ENDIF
lcdout $fe,$C0,"FREC.=",#FRECUENCIA
GOSUB CONFIG_DIGITO2
LCDOUT $fe,$90,"VOLT =",DEC VOLT,",",DEC1 MV
LCDOUT $fe,$D0,"AMPER=",DEC2 AMPER,",",DEC2 MA
RETURN
;----------------------------------------------------------------
;----------------------------------------------------------------
CONFIG_DIGITO1:
IF DUTY<100 OR DUTY>9 THEN ADR=$88
IF DUTY<10 THEN ADR=$87
RETURN
CONFIG_DIGITO2:
IF FRECUENCIA>10000 THEN LCDOUT $FE,$CD,"Hz"
IF FRECUENCIA<10000 AND FRECUENCIA>999 THEN LCDOUT $FE,$CC,"Hz "
IF FRECUENCIA<1000 THEN LCDOUT $FE,$CB,"Hz "
RETURN
;*****************************************************************
;++++++++++++++++++++++++ INTERRUPCION +++++++++++++++++++++++++++
;*****************************************************************
DISABLE
CORTAR:
IF W=1 THEN
CONTADOR=CONTADOR+1
IF CONTADOR=101 THEN CONTADOR=0
ENDIF
INTCON.2=0
RESUME
ENABLE
END
;*****************************************************************
;*****************************************************************