MONTAJE EN ISIS 7.7 SP2
MICROCONTROLADOR : PIC16F877
LCD 2x16
FUNCIONES :
- VOLTIMETRO
- AMPERIMETRO
- CONTADOR
- FRECUENCIA
- PERIODO
- CICLO UTIL
- OHMETRO
- CAPACIMETRO
CODIGO :
; MULTIMETRO DIGITAL
Device 16F877 ;SE SELCCIONA EL PIC
Declare XTAL 20 ;SE CONFIGURA UN CRISTAL DE 20MHZ
PORTB_PULLUPS = 1 ;SE CONFIGURAS LAS RESISTENCIAS INTERNAS PULL-UP DEL PUERTO B
'***************************CONFIGURACION CONVERTIDOR ANALOGICO DIGITAL ******************
Declare ADIN_RES 10 'CONFIGURA EL ADC A 10 BIT DE RESOLUCION
Declare ADIN_TAD FRC 'ASIGNA EL OSCILADOR INTERNO PARA EL MUESTREO
Declare ADIN_STIME 50 ' CONFIGURA A 50uSEG EL TIEMPO DE MUESTREO
ADCON1 = %10000010 ' Se CONFIGURA EL ADC TODO ANALOGICO
;******************************************************************************************************
;CONFIGURACION DE PUERTOS
TRISD=001111 ;SE CONFIGURA EL PUERTO D
TRISC=000000 ;SE CONFIGURA EL PUERTO C
TRISB=000001 ;SE CONFIGURA EL PUETO B
TRISA=011111 ;SE CONFIGURA EL PUERTO A
TRISE=000001 ;SE CONFIGURA EL PUERTO E
Clear PORTD ; LIMPIA EL PUERTO D
Clear PORTB ; LIMPIA EL PUERTO B
Clear PORTC ; LIMPIA EL PUERTO C
Clear PORTE ; LIMPIA EL PUERTO E
'INICIALIZACON DE PANTALLA LCD
Declare LCD_TYPE 0 ;PANTALLA ALFANUMERICA
Declare LCD_DTPIN PORTB.4 ;SE USAN 4 LINEAS DE DATOS
Declare LCD_RSPIN PORTB.3 ;SE CONFIGURA EL PIN RB3 PARA EL RS DEL LCD
Declare LCD_ENPIN PORTB.2 ;SE CONFIGURA EL PIN RB2 PARA EL PIN EN DEL LCD
Declare LCD_LINES 2 ;LCD DE DOS LINEAS
'DECLARACION DE VARIABLES
Dim Frec As Word ;SE DECLARA LA VAR FREC DE 16 BITS
Dim Cont As Byte
Dim var1 As Byte
Dim volt As Float
Dim OHM As Float
Dim CAD As Word
Dim amper As Float
Dim temp As Float
Dim periodo As Float
Dim ciclo_h As Word
Dim ciclo_l As Word
Dim porc_ciclo_util As Float
Dim capacitancia2 As Word
Dim capacitancia As Float
;SE ALMACENAN LOS SIMBOLOS ESPECIALES EN LA MEMORIA CGRAM DE LA PANTALLA LCD
' CARGANDO EL 1ER. CARACTER PERSONALIZADO EN LA CGRAM BORDE ESQUINA SUPE IZ - CARACTER 0
Print 254,64, $1F,$1E,$1C,$1C,$18,$18,$10,$00
'CARGANDO EL 2DO. CARACTER PERSONALIZADO EN LA CGRAM BORDE ESQUINA INF IZQ- CARACTER 1
Print 254,72, $00,$10,$18,$18,$1C,$1C,$1E,$1F
'CARGANDO EL 3RO. CARACTER PERSONALIZADO EN LA CGRAM SUPER DER - CARACTER 2
Print 254,80, $1F,$0F,$0F,$07,$07,$03,$03,$01
'CARGANDO EL 4TO. CARACTER PERSONALIZADO EN LA CGRAM INF DER - CARACTER 3
Print 254,88, $01,$03,$03,$07,$07,$0F,$0F,$1F
'CARGANDO EL 5TO. CARACTER PERSONALIZADO EN LA CGRAM SIGNO MENOS - CARACTER 4
Print 254,96, $00,$00,$00,$1F,$1F,$00,$00,$00
'CARGANDO EL 6TO. CARACTER PERSONALIZADO EN LA CGRAM FLECHA DER - CARACTER 5
Print 254,104, $00,$10,$18,$1C,$1C,$18,$10,$00
'CARGANDO EL 7MO. CARACTER PERSONALIZADO EN LA CGRAM FACHA ARRIBA - CARACTER 6
Print 254,112, $00,$00,$00,$04,$0E,$0E,$1F,$1F
'CARGANDO EL 8VO. CARACTER PERSONALIZADO EN LA CGRAM FLECHA ABAJO - CARACTER 7
Print 254,120, $1F,$1F,$0E,$0E,$04,$00,$00,$00
Cls ;LIMPIA EL LCD
Print At 1,1,0, " MULTIMETRO ",2 ;
Print At 2,1,1, " DIGITAL ",3
DelayMS 3000
Cls
;INICIO PROGRAMA PRINCIPAL
Cont = 0 ; CONTADOR DE INDICADOR DE FUNCION A SELECCIONAR
INICIO:
If PORTD.1 = 1 Then
DelayMS 300
Cont= Cont + 1
If Cont = 7 Then
Cont = 6
End If
End If
If PORTD.0 = 1 Then
DelayMS 300
Cont= Cont - 1
If Cont = 255 Then
Cont = 0
End If
End If
; SE SELECCIONA UNA OPCION DEPENDIENDO DEL VALOR DE LA VARIABLE CONT
Select Case Cont
Case 0 :
Print At 1,1,"1-",5, $FE, $0C, "VOLTIMETRO "
Print At 2,1,"2-", " AMPERIMETRO ",7
If PORTD.2=1 Then
Call VOLTIMETRO
End If
Case 1 :
Print At 1,1,"2-",5, "AMPERIMETRO ",6
Print At 2,1,"3-", " MED. FREC ",7
If PORTD.2=1 Then
Call AMPERIMETRO
End If
Case 2 :
Print At 1,1,"3-",5, "MED. FREC ",6
Print At 2,1,"4-", " MED. PERIODO",7
If PORTD.2=1 Then
Call FRECUENCIMETRO
End If
Case 3 :
Print At 1,1,"4-",5, "MED. PERIODO",6
Print At 2,1,"5-", " % CICLO UTIL",7
If PORTD.2=1 Then
Call MED_PERIODO
End If
Case 4 :
Print At 1,1,"5-",5, "% CICLO UTIL",6
Print At 2,1,"6-", " OHMETRO ",7
If PORTD.2=1 Then
Call CICLO_UTIL
End If
Case 5 :
Print At 1,1,"6-",5, "OHMETRO ",6
Print At 2,1,"7-", " CAPACIMETRO ",7
If PORTD.2=1 Then
Call OHMETRO
End If
Case 6 :
Print At 1,1,"7-",5, "CAPACIMETRO ",6
Print At 2,1," ", " "
If PORTD.2=1 Then
Call Capacimetro
End If
End Select
GoTo INICIO ; REGRESA A LA ETIQUETA INICIO
;;FIN DEL PROGRAMA PRNCIPAL
;;****************** RUTINA PARA EL FRECUENCIMETRO ***********************************
FRECUENCIMETRO:
Cls
Repeat
Frec = Counter PORTB.0,200 ;RELIZA UN CONTEO DE PULSOS EN EL PUERTO B PIN 0 POR UN PERIODO DE 200 MS
Frec = Frec * 5
Print At 1,1, " FREC = ",Dec Frec , " HZ "
Until PORTD.3=1 ;SE EJECUTA LA RUTIMA HASTA QUE SE PRESIONES SALIR
Return
;*********** RUTINA PARA LA MEDICION DE PERIODOS ************************************
MED_PERIODO:
Cls
Repeat
Frec = Counter PORTB.0,200 ;RELIZA UN CONTEO DE PULSOS EN EL PUERTO B PIN 0 POR UN PERIODO DE 200 MS
Frec = Frec * 5
periodo = 1000 / Frec
Print At 1,1, " T = ",DEC2 periodo , " mSeg "
Until PORTD.3=1 ;SE EJECUTA LA RUTIMA HASTA QUE SE PRESIONES SALIR
Return
;**************** RUTINA DEL VOLTIMETRO*************************
VOLTIMETRO:
Cls
Repeat
CAD = ADIn 1 ; DEVUELVE UN VALOR ENTRE 0 Y 1023 PORQUE ES 10 BIT
volt = CAD * 10/1023
Print At 1,1, "Volt = ", DEC2 volt , " VDC " ;
Until PORTD.3=1 ;SE EJECUTA LA RUTIMA HASTA QUE SE PRESIONES SALIR
Return
;*********RUTINA PARA LA MEDICION DE RESISTENCIA *******************************
OHMETRO:
Cls
;SE UTILIZA UN DIVISOR DE TENSION VOUT = R2*VIN/(R1+R2)
Repeat
CAD = ADIn 3
volt = CAD * 5000/1023
OHM = (volt * 10000 )
OHM = OHM /( 5000 - volt)
Print At 1,1, " RES = ", DEC2 OHM , " OHM " ;
Until PORTD.3=1 ;SE EJECUTA LA RUTIMA HASTA QUE SE PRESIONES SALIR
Return
;*********************** RUTINA PARA EL AMPERIMETRO*********************************
AMPERIMETRO:
Cls
Repeat
CAD = ADIn 2
amper= CAD * 20 /1023
Print At 1,1, " Corr = ", DEC2 amper , " mA " ;
Until PORTD.3=1 ;SE EJECUTA LA RUTIMA HASTA QUE SE PRESIONES SALIR
Return
;******************************* RUTINA PARA LA MEDICION DE CICLO UTIL****************
CICLO_UTIL:
Cls
Repeat
ciclo_l = PulsIn PORTB.0,0 ;CUENTA EL TIEMPO DE DURACION DEL UN PULSO EN ESTADO BAJO
DelayMS 10
ciclo_h = PulsIn PORTB.0,1 ;CUENTA EL TIEMPO DE DURACION DEL UN PULSO EN ESTADO ALTO
porc_ciclo_util = (ciclo_h*100)
porc_ciclo_util= porc_ciclo_util /(ciclo_l + ciclo_h)
Print At 1,1, "Ciclo Ut= ", DEC1 porc_ciclo_util ," " ;
Until PORTD.3=1
Return
;************************* RUTINA PARA CALCULAR LA CAPACITACIA **********************
Capacimetro:
Cls
Repeat
For var1 = 1 To 100
High PORTE.0 ' Discharge the cap
DelayMS 10
capacitancia2 = RCIn PORTE.0 , High ;CALCULA EL TIEMPO DE DESCARGA DEL CAPACITOR
capacitancia = (capacitancia2/64) + capacitancia ; SE SUMA EL RESULTADO EN LA VARIABLE 100 VECES
Next
capacitancia= capacitancia /100 ; SE DIVIDE ENTRE 100 PARA SACAR EL PROMEDIO
Print At 1,1, " Cap = ", Dec capacitancia , 223, " uF " ;
Until PORTD.3=1
Return