Buenas tardes, aqui les dejo el circuito y el programa en assembler.
Disculpen, el asm esta un tanto desordenado, gracias LIST p=16f873A
#include p16f873a.inc
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
estado equ 0x03
intcon equ 0x0b 0x03
porta equ 0x05
portb equ 0x06
portc equ 0x07
adcon0 equ 0x1f ;registro de control de operacion de C A/D
adcon1 equ 0x9f ;sirve para configurar las patitas como entradas analogicas o E/S digitales
adresl equ 0x9e ;parte baja del resultado de la conversion
EEDATA EQU 0X10C ;aqui se guarda valores limite superior e inferior
EEADR EQU 0X10D ;registros especificos de escritura-lectura eeprom
EECON1 EQU 0X18C
EECON2 EQU 0X18D
unidad EQU 0X20 ;aqui se guarda adresl
decena EQU 0X21 ;unidad-decena para conversion BCD
alfa equ 0x22 ;registros utilizados para retardo
beta equ 0x23
delta equ 0x24
superior equ 0x25
inferior equ 0x26
memoria1 equ 0x27
memoria2 equ 0x28
sensar_bit equ 0x29
sensar_bit_2 equ 0x3a
org 0x00
goto inicio
org 0x04
goto interrupcion ;direccion de interrupcion. 0x04
;//////////////////////////////////////////
;//////////////////////////////////////////
inicio
;BANCO1
bsf estado,5 ;accedemos al banco1
movlw b'10001110' ;EL BIT 7 ADFM=1, ENTONCES justificado a la derecha
movwf adcon1
clrf porta ;puerto A, C, como salida
clrf portc
movlw b'11110000' ;configuracion de entrada en puerto B
movwf portb
;BANCO0
bcf estado,5 ;banco0
;//////////////////////////////////////////
;//////////////////////////////////////////
movlw b'10001000' ;se habilitan las interrupciones para rb4-rb7
movwf intcon
clrf unidad ;unidad
clrf decena ;decena
clrf sensar_bit
clrf sensar_bit_2
clrf superior ;registro que compara limite superior de temperatura
clrf inferior ;registro que compara limite inferior de temperatura
clrf portb
clrf portc
movlw b'00000110' ;puerto que controla catodo de display 1==>> deshabilita 0==>> habilita
movwf porta
movlw b'11110001' ;BIT 0 ADON=1 ---> habilita analogico digital,
movwf adcon0 ;BITS 5,4,3=0 CH2, CH1, CH0 --> canal 3(RA3/AN3),
BSF portb,0 ;led indicador de sensor
movlw .40
movwf memoria1
movlw .41
movwf memoria2
call LECTURA ;lee la direccion de eeprom, en la cual estan contenidas los valores del
habilita_conversion ;limite superior e inferior de temperatura
bsf adcon0,2 ;PONIENDO A 1 SE INICIA CONVERSION, BIT GO/DONE
pregunta btfsc adcon0,2 ;fin de conversion??
goto pregunta
bsf estado,5
movf adresl,0
bcf estado,5
movwf unidad
;,,,,,,,,,,,,,,,,,PROCESO DE DIVISION POR 2,,,,,,,,,,,
;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
rrf unidad,1
btfss unidad,7
goto pasar
bcf unidad,7
;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
pasar clrf decena
decf unidad,1
movf unidad,0
subwf superior,0
btfsc estado,0 ;unidad es mayor a superior???
goto normal_1
bsf porta,3
goto conversion_BCD
normal_1
bcf porta,3
movf inferior,0
subwf unidad,0
btfsc estado,0 ;unidad es menor a inferior???
goto normal_2
bsf porta,5
goto conversion_BCD
normal_2
bcf porta,5
conversion_BCD
movlw .10
subwf unidad,1
btfsc estado,0
goto incrementa
movlw .10
addwf unidad,1
call muestra_en_display
goto habilita_conversion
incrementa incf decena,1
goto conversion_BCD
muestra_en_display
;muestra unidad
movlw .100
movwf alfa
load movlw .100
movwf beta
movf unidad,0
movwf portc
bcf porta,1
dec decfsz beta,1
goto dec
bsf porta,1
;muestra decena
movlw .100
movwf beta
movf decena,0
movwf portc
bcf porta,2
dec_2 decfsz beta,1
goto dec_2
bsf porta,2
decfsz alfa,1
goto load
return
;//////////////////////////////////////////////////////////////////////////////////////////
;////////////////interrupcion para programar limites inferior y superior/////////////////////////
;//////////////////////////////////////////////////////////////////////////////////////////
;//////////////////////////////////////////////////////////////////////////////////////////
interrupcion
bcf porta,1 ;el programa no permite que otros pulsadores aparte de RB4, habiliten la programacion
bcf porta,2
btfsc portb,4 ;pulsa para programar
goto falsa_alarma ;si no es por RB4, era falsa alarma y vuelve a obtener datos del sensor
espera_2
btfss portb,4
goto espera
btfsc sensar_bit,0 ;este registro permite seleccionar el ingreso a la programacion de limite
goto hacer_cero ;superior o inferior, por cada pulso de RB4, sensar_bit se modifica en 1 o en 0,
bsf sensar_bit,0 ;y decide ingresar a la programacion o salir de ella, volviendo a sensar la temperatura
goto superior_inferior
espera
bcf porta,1 ;espera a que se deje de pulsar RB4
bcf porta,2
goto espera_2
hacer_cero
bcf sensar_bit,0
falsa_alarma
bcf portb,2 ;siempre que haya terminado de modificar los limites, ingresados por el usuario,
bcf portb,3 ;se vuelve al sensor por esta misma rutina, habilitando la interrupcion y retornando
bsf portb,0 ;tambien antes de salir totalmente se guarda los limites en la memoria interna eeprom del pic
bcf portb,1 ;haciendo un call para habilitar la escritura o grabacion
call ESCRITURA
bcf intcon,0 ;habilita interrupcion y retorna
retfie
superior_inferior
bcf portb,0
bsf portb,1
btfsc portb,5 ;selector para limite superior e inferior
goto inverso
espera_4 btfss portb,5
goto espera_3
btfsc sensar_bit_2,0
goto hacer_cero_2
bsf sensar_bit_2,0
goto c_superior
espera_3
bcf porta,1 ;espera a que se deje de pulsar RB5
bcf porta,2
goto espera_4
hacer_cero_2
bcf sensar_bit_2,0
goto c_inferior
inverso
btfss sensar_bit_2,0
goto c_superior
goto c_inferior
c_superior bcf portb,3
bsf portb,2
movf superior,0
movwf unidad
call pasar_2
btfsc portb,6 ;pulsador para incrementar
goto sensar_RB7
espera_6
btfss portb,6
goto espera_5
goto incrementa_superior
espera_5 bcf porta,1
bcf porta,2
goto espera_6
sensar_RB7
btfsc portb,7 ;pulsador para decrementar
goto estado_RB4
esperar_8
btfss portb,7
goto espera_7
goto decrementa_superior
espera_7 bcf porta,1
bcf porta,2
goto esperar_8
estado_RB4
btfsc portb,4
goto superior_inferior
goto espera_2
c_inferior
bcf portb,2
bsf portb,3
movf inferior,0
movwf unidad
call pasar_2
btfsc portb,6 ;pulsador para incrementar
goto sensar_RB7_2
espera_10
btfss portb,6
goto espera_9
goto incrementa_inferior
espera_9
bcf porta,1
bcf porta,2
goto espera_10
sensar_RB7_2
btfsc portb,7 ;pulsador para decrementar
goto estado_RB4
espera_12
btfss portb,7
goto espera_11
goto decrementa_inferior
espera_11
bcf porta,1
bcf porta,2
goto espera_12
incrementa_superior
incf superior,1
goto estado_RB4
decrementa_superior
decf superior,1
goto estado_RB4
incrementa_inferior
incf inferior,1
goto estado_RB4
decrementa_inferior
decf inferior,1
goto estado_RB4
pasar_2 clrf decena
BCD_3 movlw .10
subwf unidad,1
btfsc estado,0
goto incrementa_2
movlw .10
addwf unidad,1
call muestra_en_display
return
incrementa_2
incf decena,1
goto BCD_3
return
retardo movlw .100
movwf alfa
load_1 movlw .10
movwf beta
load_2 movlw .10
movwf delta
dec_3 decfsz delta,1
goto dec_3
decfsz beta,1
goto load_2
decfsz alfa,1
goto load_1
return
;;;;;;;;;;;;;;;;;;;;;;;;LEER ESTADO SUPERIOR;;;;;;;;;;;;;;;;;;;;;;;;;;
LECTURA
;BANCO2
BSF estado,6
BCF estado,5 ; Selecciona banco 2
MOVF memoria1,0 ; Dirección a leer de
MOVWF EEADR ; la EEPROM PARTE BAJA
;BANCO3
BSF estado,5 ; Selecciona banco 3
BCF EECON1,7 ; se selecciona el acceso a la eeprom
BSF EECON1,0 ; Activar lectura RD
ESPERA_13
BTFSC EECON1,0 ; Espera final de lectura
GOTO ESPERA_13 ; a que baje la bandera
;BANCO2
BCF estado,5 ; Selecciona banco 2
MOVF EEDATA,0 ; W se carga con el valor
BCF estado,6 ; Selecciona banco 0
movwf superior ; leído en eeprom
;;;;;;;;;;;;;;;;;;;;;;;;LEER ESTADO INFERIOR;;;;;;;;;;;;;;;;;;;;;;;;;;
;BANCO2
BSF estado,6
BCF estado,5 ; Selecciona banco 2
MOVF memoria2,0 ; Dirección a leer de
MOVWF EEADR ; la EEPROM PARTE BAJA
;BANCO3
BSF estado,5 ; Selecciona banco 3
BCF EECON1,7 ; se selecciona el acceso a la eeprom
BSF EECON1,0 ; Activar lectura RD
ESPERA_14
BTFSC EECON1,0 ; Espera final de lectura
GOTO ESPERA_14 ; a que baje la bandera
;BANCO2
BCF estado,5 ; Selecciona banco 2
MOVF EEDATA,0 ; W se carga con el valor
;BANCO0
BCF estado,6 ; Selecciona banco 0
movwf inferior ; leído en eeprom
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;PROCESO DE ESCRITURA DE EEPROM;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ESCRIBIR LIMITE SUPERIOR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ESCRITURA
;BANCO2
BSF estado,6 ;pasamos al banco 2
bcf estado,5 ; Establecer EEADR y EEDATA
MOVF memoria1,0
MOVWF EEADR ; Escribe la dirección en EEADR
MOVF superior,0
MOVWF EEDATA ; Se escribe el dato en EEDATA
;BANCO3
BSF estado,5 ; Selecciona el banco 3
BCF EECON1,7 ; se selecciona el acceso a la eeprom
BSF EECON1,2 ; Permiso de escritura activado
;Comienzo de la secuencia de escritura
MOVLW 0x55
MOVWF EECON2 ; Se escribe el dato 55 h en EECON2
MOVLW 0xAA
MOVWF EECON2 ; Se escribe AA h en EECON2
BSF EECON1,1 ; Comienza la escritura
BCF EECON1,2 ; Permiso de escritura desactivado
CALL retardo
ESPERA_15
BTFSC EECON1,1 ; Espera a que termine la escritura
GOTO ESPERA_15
;;;;;;;;;;;;;;;;;;;;;;;;;;;PROCESO DE ESCRITURA DE EEPROM;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ESCRIBIR LIMITE INFERIOR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;BANCO2
bcf estado,5 ; pasamos al banco 2
MOVF memoria2,0 ;Establecer EEADR y EEDATA
MOVWF EEADR ; Escribe la dirección en EEADR
MOVF inferior,0
MOVWF EEDATA ; Se escribe el dato en EEDATA
;BANCO3
BSF estado,5 ; Selecciona el banco 3
BCF EECON1,7 ; se selecciona el acceso a la eeprom
BSF EECON1,2 ; Permiso de escritura activado
;Comienzo de la secuencia de escritura
MOVLW 0x55
MOVWF EECON2 ; Se escribe el dato 55 h en EECON2
MOVLW 0xAA
MOVWF EECON2 ; Se escribe AA h en EECON2
BSF EECON1,1 ; Comienza la escritura
BCF EECON1,2 ; Permiso de escritura desactivado
CALL retardo
ESPERA_16
BTFSC EECON1,1 ; Espera a que termine la escritura
GOTO ESPERA_16
;BANCO0
BCF estado,6 ; Selecciona el banco 0
BCF estado,5 ; Selecciona el banco 0
RETURN
END