Archivo

Anuncio
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
Descargar