title 'Servo control de temperatura'
;////////Objetivo controlar los cuatro dig0s en un conteo descendente///////////////
LIST P = 16F877 ;Indicamos el modelo de PIC a utilizar
include <p16f877.inc> ; Definición de registros
;¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ Definición de constantes
w EQU 0 ; Destino de operación = w
f EQU 1 ; Destino de operación = registro
RBPU EQU 7
TMROcharge64us EQU -d'64'
up EQU d'1'
;¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ Definición de variables
contador EQU 0X22 ; Contador
dig0 EQU 0X23 ; Para almacenar el dígito
R1 EQU 0X24
R2 EQU 0X25
dig1 EQU 0X26
dig2 EQU 0X27
dig3 EQU 0X28
dig4 EQU 0X33
;gradoC EQU 0X29
w2 EQU 0X2A
;flagUpDown EQU 0X15 ;bandera de subida y bajada.
dataRef EQU 0X2B ;Variable de referencia
lmax EQU 0X2C
lmin EQU 0X2F
temp EQU 0X30
temp2 EQU 0X31
temp3 EQU 0X32
mdig0 EQU 0X34 ; Para almacenar el dígito
mdig1 EQU 0X35
mdig2 EQU 0X36
mdig3 EQU 0X37
mdig4 EQU 0X38
conta EQU 0x39
tecla EQU 0X3A
cont1 EQU 0X3B
cont2 EQU 0X3C
cont3 EQU 0X3D
guardaW EQU 0X3E
guardaSTATUS EQU 0X3F
registroA EQU 0X40
guardaRegistroA EQU 0X41
registroB EQU 0X42
guardaRegistroB EQU 0X43
; Comienzo del programa.
ORG 0X00 ; Cubrimos el vector de reset
GOTO inicio ; Saltamos a la primera dirección tras el vector de interrupción
; ************************ Inicialización de variables *************************
ORG 0X04
GOTO servicioInterrupcion
inicio
BCF STATUS,RP1 ;BANCO UNO
BSF STATUS,RP0 ; Cambiamos a la segunda página de memoria
CLRF TRISC
CLRF TRISD ; Programa la puerta B como de todo salidas
MOVLW 0xF0 ; Las patillas RB0-RB3 representan las filas del
MOVWF TRISB ; teclado, y son salidas
BCF OPTION_REG,RBPU ; Las patillas RB4-RB7 representan las columnas,
; y son entradas
BCF STATUS,RP0 ; Volvemos a la página 0.
MOVLW b'10101000' ;Autoriza interrupcion TOI, RBIE Y GIE.
MOVWF INTCON
MOVLW TMROcharge64us
MOVWF TMR0
CLRF PORTC ;LIMPIA LOS PUERTOS
CLRF PORTD ; Apaga el display, por si había residuos
CLRF contador ; Borra el contador (dirección 0x0C)
CLRF w2
CLRF dig0
CLRF dig1
CLRF dig2
CLRF dig3
CLRF mdig0
CLRF mdig1
CLRF mdig2
CLRF mdig3
CLRF mdig4
CLRF dataRef
CLRF lmax
CLRF lmin
CLRF temp
CLRW ; Borramos el registro W
;********************************Carga de variables
MOVLW d'4'
MOVWF w2
CALL converto7seg
CALL refreshAct
main ;CARGA DE LIMITES...........
CALL converto7seg
CALL refreshRef
MOVF tecla,W
BCF STATUS,Z
XORLW up ; Chekea si el dígito sobrepasa el valor 9
BTFSC STATUS,Z
GOTO main
INCF contador,f
MOVF contador,W
MOVWF w2
GOTO main
;############# SERVICIO DE INTERRUPCION ##############################
servicioInterrupcion ;Guarda registros que pueden ser modificados
MOVWF guardaW
SWAPF STATUS,W
MOVWF guardaSTATUS
BCF STATUS,RP0 ;Para asegurarse que trabaja dentro del Banco 0
BCF STATUS,RP1
MOVLW TMROcharge64us ;Recarga TMR0
MOVWF TMR0
;Verficar la causa de la interrupcion
BTFSC INTCON,RBIF
CALL InterrupcionRBI
BTFSC INTCON,T0IF
CALL InterrupcionTOI
;Aqui se efectua el servicio de interrupcion
SWAPF guardaSTATUS,W
MOVWF STATUS
SWAPF guardaW,F
SWAPF guardaW,W
BCF INTCON,T0IF
BCF INTCON,RBIF
RETFIE
;+++++++++++++++++++++++++Surutinas
InterrupcionRBI ;lectura de las teclas
CALL borrar
cuerpo CLRF tecla ; Tecla actual=0
MOVLW 0x0E
MOVWF PORTB ; Saca 0 a la fila 1, para testearla
chkcol BTFSS PORTB,4 ; Chequea la columna 0 en busca de un '0'
GOTO numtecla ; si encuentra un 0 muestra el número
; de tecla pulsada
INCF tecla,1 ; si no encuentra el 0, incrementa el número de tecla (el numero 1 indica como y donde se ejecuta la instrucción.)
BTFSS PORTB,5 ; Chequea la columna 1 en busca de un '0'
GOTO numtecla ; si encuentra un 0 muestra el número ;de tecla pulsada
INCF tecla,1 ; si no encuentra el 0, incrementa el número de tecla
BTFSS PORTB,6 ; Chequea la columna 2 en busca de un '0'
GOTO numtecla ; si encuentra un 0 muestra el número de tecla pulsada
INCF tecla,1 ; si no encuentra el 0, incrementa el número de tecla
BTFSS PORTB,7 ; Chequea la columna 3 en busca de un '0'
GOTO numtecla ; si encuentra un 0 muestra el número de tecla pulsada
INCF tecla,1 ; si no encuentra el 0, incrementa el número de tecla
UltTec? MOVLW 0x10 ; Carga W con el número de tecla +1
BCF STATUS,Z ;Antes de probar si hubo tecla+1, borramos el indicador para asegurar
SUBWF tecla,w ; y lo compara con el valor actual de tecla
BTFSC STATUS,Z ; Si hemos llegado a Tecla+1 acabamos
; el ciclo de filas
GOTO cuerpo ; y no se habrá pulsado ninguna tecla
BSF STATUS,C ; Y ponemos a 1 el bit C para...
RLF PORTB,1 ; que la fila 1 pase a ser un 1 ; y el 0 se desplace
GOTO chkcol
numtecla MOVF tecla,W ;0
;MOVF tecla,W
;MOVWF w2
RETURN ;Fin de lectura de teclas
InterrupcionTOI
CALL DISP0 ;control del display correspondiente
MOVF mdig0,W ; Coloca el siguiente dígito a evaluar en W
CALL Tablac
MOVWF PORTD ;mostramos el resultado en el display
CALL DELAY ;retardo para apreciar la visualización.
CALL DISP1 ;control de display
MOVF mdig1,W
CALL Tablac
MOVWF PORTD
CALL DELAY
CALL DISP2
MOVF mdig2,W
CALL Tablac
MOVWF PORTD
CALL DELAY
CALL DISP3
MOVF mdig3,W
CALL Tablac
MOVWF PORTD
CALL DELAY
CALL DISP4
MOVF mdig4,W
CALL Tablac
MOVWF PORTD
CALL DELAY
RETURN
borrar CLRF cont1 ; Borra el contador
CLRF cont2 ; Borra el contador
MOVLW 0x08
MOVWF cont3 ; Carga el retardo de 0.5 segundos
RETURN
pausa DECFSZ cont1,1 ; Bucle anidado de 3 niveles
GOTO pausa ; que retarda aprox. 0.5 segundos
DECFSZ cont2,1
GOTO pausa
DECFSZ cont3,1
GOTO pausa
RETURN
;cargar datos transformadores para marcar dato inicial en el display
;el dato a convertir se carga en w2
converto7seg
CLRF temp
CLRF dig0
CLRF dig1
CLRF dig2
CLRF dig3
asigna CALL UNIDADES_ASC
INCF temp,f
MOVF temp,W
BCF STATUS,Z
SUBWF w2,W
BTFSS STATUS,Z ;2; XORLW 0xFA ;BTFSC STATUS,Z
GOTO asigna
return
refreshRef
MOVF dig0,W
MOVWF mdig0
MOVF dig1,W
MOVWF mdig1
RETURN
refreshAct
MOVF dig0,W
MOVWF mdig2
MOVF dig1,W
MOVWF mdig3
MOVF dig2,W
MOVWF mdig4
RETURN
UNIDADES_ASC ;Tranform to seven segment display (ONLY COUNT ASCENDENT)
INCF dig0,f
MOVF dig0,W ; Pone el valor del dígito en W
BCF STATUS,Z
XORLW 0x0A ; Chekea si el dígito sobrepasa el valor 9
BTFSC STATUS,Z ; Comprobando con un xor si W vale 0 (Z=1)
CALL DECENAS_ASC ; Si Z=1 resetea el dígito y comienza de nuevo la cuenta
RETURN ; con el siguiente dígito
DECENAS_ASC
Reset1 CLRF dig0 ; Comienza a contar por el 0
INCF dig1,f ; Incrementa el valor del dígito al siguiente
MOVF dig1,W ; Pone el valor del dígito en W
BCF STATUS,Z
XORLW 0x0A ; Chekea si el dígito sobrepasa el valor 9
BTFSC STATUS,Z ; Comprobando con un xor si W vale 0 (Z=1)
CALL CENTENAS_ASC ; Si Z=1 resetea el dígito y comienza de nuevo la cuenta
return
CENTENAS_ASC
Reset2 CLRF dig1 ; Comienza a contar por el 0
INCF dig2,f ; Incrementa el valor del dígito al siguiente
MOVF dig2,W ; Pone el valor del dígito en W
BCF STATUS,Z
XORLW 0x0A ; Chekea si el dígito sobrepasa el valor 9
BTFSC STATUS,Z ; Comprobando con un xor si W vale 0 (Z=1)
CALL MILLARES_ASC ; Si Z=1 resetea el dígito y comienza de nuevo la cuenta
return
MILLARES_ASC
Reset3 CLRF dig2 ; Comienza a contar por el 0
INCF dig3,f ; Incrementa el valor del dígito al siguiente
MOVF dig3,W ; Pone el valor del dígito en W
BCF STATUS,Z
XORLW 0x0A ; Chekea si el dígito sobrepasa el valor 9
BTFSC STATUS,Z ; Comprobando con un xor si W vale 0 (Z=1)
CLRF dig3
return
Tablac ADDWF PCL,f ; Suma al ffset, es decir,
; el valor del dígito. Así se genera un PC distinto según su valor,
; asegurando que vaya a la línea correcta de la tabla
RETLW 0x3F ; 0 en código 7 segmentos
RETLW 0x06 ; 1 en código 7 segmentos
RETLW 0x5B ; 2 en código 7 segmentos
RETLW 0x4F ; 3 en código 7 segmentos
RETLW 0x66 ; 4 en código 7 segmentos
RETLW 0x6D ; 5 en código 7 segmentos
RETLW 0x7D ; 6 en código 7 segmentos
RETLW 0x07 ; 7 en código 7 segmentos
RETLW 0x7F ; 8 en código 7 segmentos
RETLW 0x6F ; 9 en código 7 segmentos
DELAY MOVF 0X04,W
MOVWF R2
CICLO1 DECFSZ R1,1
GOTO CICLO1
CICLO2 DECFSZ R2,1
GOTO CICLO1
RETURN
DISP0
BCF PORTC,4
BCF PORTC,3 ;Habilita )
BCF PORTC,2
BCF PORTC,1
BSF PORTC,0
RETURN
DISP1
BCF PORTC,4
BCF PORTC,3 ;Habilita display )
BCF PORTC,2
BCF PORTC,0
BSF PORTC,1
RETURN
DISP2
BCF PORTC,4
BCF PORTC,3 ;Habilita display)
BCF PORTC,1
BCF PORTC,0
BSF PORTC,2
RETURN
DISP3
;Habilita display )
BCF PORTC,4
BCF PORTC,2
BCF PORTC,1
BCF PORTC,0
BSF PORTC,3
RETURN
DISP4
;Habilita display)
BCF PORTC,3
BCF PORTC,2
BCF PORTC,1
BCF PORTC,0
BSF PORTC,4
RETURN
END