Voltímetro de CD de 0-250 V Programa ;Programa para un voltimetro de CD de 0 - 250 volts ; ; Instituto Tecnologico de Morelia ; Por: Gustavo Velazquez G. ; Noviembre del 2006 ; ;*************************************************** list p=16f873 include "P16F873.inc" VOLT equ 0x20 CONTA equ 0x21 CENTENAS equ DECENAS equ UNIDADES equ SIGNO equ 0x25 org goto 0x22 0x23 0x24 0x00 Inicio org Inicio clrf clrf clrf bsf movlw movwf movlw movwf movlw movwf movlw movwf bcf movlw movwf movlw movwf movlw 0x20 PORTA PORTB PORTC STATUS,RP0 B'111111' TRISA B'00111111' TRISB B'00000000' TRISC B'00000001' ;RA0,RA1,RA2,RA5=Analogas ADCON1 ;RA3=VREF+,VSS=VREFSTATUS,RP0 movwf CCP1CON ;Reloj de conv =FOSC/8,Canal 0, modulo encendido ;Justificacion izquierda ;Se enciende el TMR1, reloj interno ;preescala 1:8 ;Modo COMPARE,se activa PIR1<CCP1IF> cuando ;TMR1=CCPR1 ;No se afecta el estado del pin RC2/CCP1 call call MedioSegundo IniLCD ;Estabilizacion de la fuente de alimentacion ;Rutina de inicializacion del modulo LCD ADCON0,CHS0 DiezMiliSeg ADCON0,GO ;Se conecta el canal 1 ;Tiempo de adquisicion ;Inicia la conversion A/D IniConvAD1 bsf call bsf nop ConvAD1 btfsc goto movf btfsc goto movwf movlw movwf goto IniConvAD0 bcf call bsf nop ConvAD0 goto movf movwf movlw movwf ConvBD B'01000001' ADCON0 B'110001' T1CON B'001010' ADCON0,GO ConvAD1 ADRESH,W STATUS,Z IniConvAD0 VOLT "-" SIGNO ConvBD ;Espera a que termine ;la conversion A/D ; Es el voltaje medido > 0 ? ;No ;Si, se guarda el resultado de la conversion ;con signo ;negativo ADCON0,CHS0 ;Se conecta el canal 0 DiezMiliSeg ;Tiempo de adquisicion ADCON0,GO ;Inicia la conversion A/D btfsc ADCON0,GO ;espera a que termine ConvAD0 ;la conversion A/D ADRESH,W ;Se guarda el resultado VOLT ;de la conversion " " ;omitiendo el SIGNO ;signo call call goto ConversionBD ActualizarLCD IniConvAD1 ;Conversion Binario/Decimal ;Actualizacion del display ;................................................ IniLCD movlw 0x30 ;1 Linea, 8 bits call Comando movlw 0x0C ;No cursor, no parpadeo call Comando movlw 0x01 ;Limpiar pantalla y cursor a casa call Comando movlw 0x06 ;Incremental sin desplazamiento call Comando clrf CONTA ;Se inicializa en cero movf CONTA,W ;el contador de caracteres call Mensaje ;Se obtiene el caracter a enviar call Caracter ;Se envia el caracter incf CONTA,F ;Se incrementa el contador de caracteres movf CONTA,W xorlw D'14' btfss STATUS,Z ;Se enviaron todos los caracteres ? goto Msj ;No retlw 0 ;Si ;............................. Comando movwf PORTC ;Se carga el comando al puerto C bcf PORTB,6 ;Se pone el modulo LCD en modo de comando bsf PORTB,7 ;Se aplica al modulo LCD nop ;el pulso bcf PORTB,7 ;de estrobo call DiezMiliSeg ;Espera de ejecucion del comando call DiezMiliSeg ;por parte del modulo LCD retlw 0 ;............................. Caracter movwf PORTC ;Se carga el caracter al puerto C bsf PORTB,6 ;Se pone el modulo LCD en modo de caracter bsf PORTB,7 ;Se aplica al modulo LCD nop ;el pulso bcf PORTB,7 ;de estrobo call DiezMiliSeg ;Espera de actualizacion del display retlw 0 ;............................. Mensaje addwf PCL,F retlw 'V' retlw 'o' retlw 'l' retlw 't' retlw 'a' retlw 'j' retlw 'e' retlw '=' retlw ' ' retlw ' ' Msj retlw ' ' retlw ' ' retlw ' ' retlw 'V' ;................................. ConversionBD clrf CENTENAS clrf DECENAS clrf UNIDADES Cien movlw D'100' subwf VOLT,F btfss STATUS,C goto Sum100 incf CENTENAS,F goto Cien Sum100 addwf VOLT,F Diez movlw D'10' subwf VOLT,F btfss STATUS,C goto Sum10 incf DECENAS,F goto Diez Sum10 addwf VOLT,W movwf UNIDADES retlw 0 ;............................ ActualizarLCD movlw 0x88 ;Se ubica el cursor del modulo LCD en la posicion 0x88 call Comando ; 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F ; V o l t a j e = _ V ; movf SIGNO,W ;Se envia el signo call Caracter movf CENTENAS,F btfss STATUS,Z ;CENTENAS = 0 ? goto envCENT ;No movlw ' ' ;Si, se envia un espacio en blanco call Caracter goto prDECE envCENT movlw 0x30 ;No, se obtiene addwf CENTENAS,W ;el codigo ASCII de CENTENAS call Caracter ;y se envia goto envDECE ;Ir a enviar las DECENAS prDECE movf DECENAS,F btfss STATUS,Z ;DECENAS = 0 ? goto envDECE ;No movlw ' ' ;Si, se envia un espacio en blanco goto envUNI ;In a enviar las UNIDADES envDECE movlw 0x30 ;No, se obtiene addwf DECENAS,W ;el codigo ASCII de DECENAS envUNI call Caracter ;y se envia movlw 0x30 ;Se obtiene addwf UNIDADES,W ;el codigo ASCII de UNIDADES call Caracter ;y se envia call MedioSegundo ;Tiempo de actualizacion call MedioSegundo ;del display retlw 0 ;................................ MedioSegundo clrf TMR1H clrf TMR1L movlw 0xF4 movwf CCPR1H movlw 0x24 movwf CCPR1L bcf PIR1,CCP1IF nop MedioSeg btfss PIR1,CCP1IF goto MedioSeg retlw 0 ;................................. DiezMiliSeg clrf TMR1H clrf TMR1L movlw 0x04 movwf CCPR1H movlw 0xE2 movwf CCPR1L bcf PIR1,CCP1IF nop DiezMS btfss PIR1,CCP1IF goto DiezMS retlw 0 ;............................ end