;Control de temperatura con PIC16F84 y ADC0831
indo equ 00h
status equ 03h
fsr equ 04h
ptoa equ 05h
ptob equ 06h
loops equ 0dh ;utilizado en retardos (milisegundos)
loops2 equ 0eh ;utilizado en retardos
rota equ 0fh ;d¡gito de unidades
decena equ 10h ;d¡gito de decenas
unidad equ 11h
decont equ 14h
unicont equ 15h
timesu equ 16h
timeba equ 17h
histe equ 18h
control equ 19h
decide equ 1ah
conba equ 1bh
conal equ 1ch
trisa equ 85h ;registro de configuraci¢n del puerto A
trisb equ 86h ;registro de configuraci¢n del puerto B
z equ 02h ;bandera de cero del registro de estados
c equ 00h ;banderq de carry del registro de estados
w equ 00h ;indica que el resultado se guarda en W
r equ 01h
CS equ 0 ;definiciones para el ADC0831
CLK equ 1
IN equ 2
conta equ 12h
recep equ 13h
eedata equ 08h ;registro de datos de la memoria EEPROM
eeadr equ 09h ;registro de direcciones de la memoria EEPROM
eecon1 equ 88h ;registro de control de la memoria EEPROM
eecon2 equ 89h ;registro de control de la memoria EEPROM
;bits especiales del registro eecon1
eeif equ 04h
wrerr equ 03h
wren equ 02h
wr equ 01h
rd equ 00h
org 0 ;el vector de reset es la direcci¢n 00
goto inicio ;se salta al inicio del programa
retarms ;subrutina de retardo en milisegundos
;el registro loops contiene el número
movwf loops ;de milisegundos del retardo
top2 movlw D'110' ;
movwf loops2 ;
top nop
nop
nop
nop
clrwdt
nop
decfsz loops2 ;pregunta si termin¢ 1 ms
goto top
decfsz loops ;pregunta si termina el retardo
goto top2
retlw 0
reloj bsf ptoa,CLK ;pulso de reloj para las conversiones
movlw 1fh
movwf loops
reloj2 decfsz loops
goto reloj2
bcf ptoa,CLK
movlw 1fh
movwf loops
reloj3 decfsz loops
goto reloj3
return
;rutina de lectura del ADC0831 a 7 bits
recibir movlw 07h ;inicia contador de bits
movwf conta
bcf ptoa,CS ;baja chip select para empezar
nop
call reloj
btfsc ptoa,IN ;verifica dato en 0 lógico (start bit)
return
clrf recep
otrobit call reloj
bsf status,c
btfss ptoa,IN
bcf status,c
rlf recep,1
decfsz conta,1
goto otrobit
bsf ptoa,CS
bcf ptoa,CLK
movf recep,w
return
leer bsf status,5 ;se ubica en segundo banco de RAM
bsf eecon1,rd ;pone el bit que inicia la lectura
bcf status,5 ;vuelve al primer banco de memoria
movf eedata,w
return
escrib bsf status,5 ;se ubica en el segundo banco de RAM
bsf eecon1,wren ;habilita escritura en memoria EEPROM
bcf eecon1,eeif ;se asegura que la bandera esté en cero
movlw 055h ;esta secuencia es obligatoria
movwf eecon2 ;para escribir en la memoria de datos EEPROM
movlw 0aah
movwf eecon2
bsf eecon1,wr ;orden de escribir el dato que se cargó
;previamente en el registro eedata en la
;posición de memoria direccionada por eeadr
espera clrwdt
btfss eecon1,eeif ;pregunta si terminó la escritura
goto espera ;si no, espera a que termine
bcf eecon1,eeif ;borra la bandera de fin de escritura
bcf eecon1,wren ;deshabilita la escritura en memoria EEPROM
bcf status,5 ;se ubica en el primer banco de RAM
retlw 0
;RUTINA QUE CONVIERTE BINARIO EN BCD
decimal CLRF decena ;BORRAR REGISTROS DE TRABAJO
OTRA MOVLW D'10'
SUBWF unidad,r ;RESTAR 10 AL VALOR INICIAL
BTFSS status,c ;VERIFICA EL CARRY
GOTO SUM ;SI ES CERO DEJA DE RESTAR 10
INCF decena ;SI ES 1 INCREMENTA decena
GOTO OTRA ;VOLVER A RESTAR
SUM ADDWF unidad ;SUMARLE 1
RETURN ;EL VALOR DE LA CONVERSION BINARIO A DECIMAL
;SE DEVUELVE EN LOS REGISTROS DECENA Y UNIDAD
;RUTINA QUE CONVIERTE BINARIO EN BCD
decicon movf control,w
movwf unicont
CLRF decont ;BORRAR REGISTROS DE TRABAJO
OTRA2 MOVLW D'10'
SUBWF unicont,r ;RESTAR 10 AL VALOR INICIAL
BTFSS status,c ;VERIFICA EL CARRY
GOTO SUM2 ;SI ES CERO DEJA DE RESTAR 10
INCF decont ;SI ES 1 INCREMENTA decena
GOTO OTRA2 ;VOLVER A RESTAR
SUM2 ADDWF unicont ;SUMARLE 1
RETURN ;EL VALOR DE LA CONVERSION BINARIO A DECIMAL
;SE DEVUELVE EN LOS REGISTROS DECENA Y UNIDAD
display ;rutina de display multiplexado
bsf ptob,4 ;envía unos a los transistores para apagarlos
bsf ptob,5
movlw decont ;según el selector escoge dato a mostrar
btfss ptoa,3
movlw decena ;con el registro selector (fsr) se apunta
movwf fsr ;al primer dato que se va a mostrar
movlw 0f0h ;colocar en cero el dato del display
andwf ptob ;para apagarlos
bcf ptob,5 ;activa transistor de decenas
movf indo,w ;lee el dato del registro apuntado por el fsr
andlw 0fh
iorwf ptob ;envia dato leído al display
movlw 03h
call retarms ;retardo de 3 milisegundos para visualización
incf fsr ;apunta al próximo dígito a mostrar
movlw 0f0h
andwf ptob
bsf ptob,5
bcf ptob,4
movf indo,w
andlw 0fh
iorwf ptob
movlw 03h
call retarms
bsf ptob,4
return
; *********** PROGRAMA PRINCIPAL ***********
inicio
bsf status,5 ;se ubica en el segundo banco de RAM
movlw 0ch ;se carga el registro W
movwf trisa ;se programan los pines del puerto A
movlw 0c0h ;se carga el registro W
movwf trisb ;se programa el puerto B como salidas
bcf status,5 ;se ubica en el primer banco de memoria RAM
clrf ptoa
clrf ptob
bsf ptoa,CS ;inicia chip select en alto
clrf timesu
clrf timeba
bcf ptoa,4
bcf decide,0
movlw d'50' ;retardo al inicio para estabilización
call retarms
clrf eeadr
call leer ;al reiniciar el sistema
movwf control ;se recupera el valor de control
call decicon
goto ciclo2
ciclo1
clrf eeadr ;almacena nuevos datos en EEPROM
movf control,w ;cada vez que se cambia el valor de control
movwf eedata
call escrib
ciclo2
bsf status,5 ;se ubica en el segundo banco de RAM
movlw 0ch ;se carga el registro W
movwf trisa ;se programan los pines del puerto A
movlw 0cfh ;programa puerto b para leer
movwf trisb ;los jumper de calibración
nop ;de la histéresis
bcf status,5
movf ptob,w
movwf histe
bsf status,5
movlw 0c0h ;se carga el registro W
movwf trisb ;se programa el puerto B
bcf status,5 ;se ubica en el primer banco de memoria RAM
call display
call recibir ;lee el dato del convertidor
movwf unidad
call decimal
movlw 03h
andwf histe,r ;toma la histéresis y le suma uno
;movlw 01h
;addwf histe,r
;bcf status,c ;duplica la histéresis
;rlf histe,r
movf histe,w ;obtenemos valores alto y bajo de control
addwf control,w ;según la histéresis medida
movwf conal ;se guardan en conal y conba
sublw d'80'
btfsc status,c
goto sigue
movlw d'80'
movwf conal
sigue movf histe,w
subwf control,w
btfsc status,c
goto sigue2
clrw
sigue2 movwf conba
movf recep,w
subwf conal,w
btfsc status,c
goto sigue3
bcf decide,0
goto relevo
sigue3 movf conba,w
subwf recep,w
btfss status,c
bsf decide,0
nop
relevo btfss decide,0
goto rele2
bsf ptoa,4
goto sigue4
rele2 bcf ptoa,4
sigue4 btfss ptoa,3 ;pregunta selector para revisar pulsadores
goto ciclo2
prusube btfsc ptob,7 ;pregunta botón de subir
goto prubaja
incf timesu
movf timesu,w
xorlw d'30'
btfss status,z
goto ciclo2
clrf timesu
incf control
call decicon
movf control,w
xorlw d'81' ;hace operaci¢n xor para ver si es igual a 0ah
btfss status,z ;prueba si el contador lleg¢ a 0ah (diez)
goto ciclo1 ;si no es igual se incrementa normalmente
clrf control
call decicon
goto ciclo1
prubaja btfsc ptob,6
goto ciclo2
incf timeba
movf timeba,w
xorlw d'30'
btfss status,z
goto ciclo2
clrf timeba
decf control
call decicon
movf control,w
xorlw 0ffh ;hace operaci¢n xor para ver si es igual a 0ah
btfss status,z ;prueba si el contador lleg¢ a 0ah (diez)
goto ciclo1 ;si no es igual se incrementa normalmente
movlw d'80'
movwf control
call decicon
goto ciclo1
goto ciclo2
; ********* VALOR DE CONTROL INICIAL ********
org 2100h ;inicia memoria eeprom de datos
de d'27'
end
;======================================================================
; Fusibles de programaci¢n
; Osc XT
; Watchdog OFF
; Code protect ON
; Power-Up-Timer ON = LOW
; Micro. PIC16F84
;======================================================================