controlador de temperatura

buscando en la wep encontre un programita que controla la temperatura,... un par de modificaiones funciona. pero quiero adicionarle mas, es decir cunado la temperatura igual al valor maximo se apague la lampara y encienda el ventilador y cunado este la temperatura en minimo valor se encienda la lampara y se pague le ventilador. en cuanto a la lampara si funciona de acuerdo a la condicion pero el ventilador solo se enciende y nunca se apaga.. haber si me apoyan amigos del foro en que estoy fallando ahi los dejo el programa avansado y el circuito.
en cuanto al circuito la lampara permanece activado cuando le simulas pero ese es un tema de simulador ya en realidad apaga y prende.


Código:
List P=16f877
__CONFIG 3f31

pcl      equ   0x02      ;Contador de programa (Parte baja)
estado   equ   0x03      ;Registro de estados
ptoa   equ   0x05      ;Puertos de E/S
ptob   equ   0x06
ptoc   equ   0x07
trisa   equ 0x85
trisb   equ 0x86
trisc   equ 0x87
intcon   equ   0x0B      ;Controlador de interrupciones
adres   equ   0x1E      ;Resultado de la conversión A/D (HIGH / LOW)
adcon   equ   0x1F      ;Configuración del conversor A/D
uni      equ   0x20      ;Usados para manejar los datos a mostrar en display
dec      equ   0x21
cen      equ   0x22
tiempo1   equ   0x23      ;Usados para temporizar
tiempo2   equ   0x24
letra   equ   0x25      ;Usado para apuntar la letra a colocar en el LCD
menor   equ   0x26      ;Temperatura de activación
mayor   equ   0x27      ;Temperatura de desactivación
buffer   equ   0x28      ;Usado como registro temporal
buffer_vertilador equ   0x19  ;Usado como registro temporal
mayor_vertilador equ   0x18 ;activacion del ventilador
menor_vertilador equ   0x17;desactivacion del ventilador

#define   CARRY   estado, 0   ;Bit de acarreo
#define   CERO   estado, 2   ;Flag indicador de resultado cero
#define   RP0      estado, 5   ;Bit 0 selector de página de memoria
#define   RP1      estado, 6   ;Bit 1 selector de página de memoria
#define   ADGO   adcon, 2   ;Bit que inicia la conversión (1) / Indica finalización (0)
#define   MINS   ptoa, 1      ;Sube el punto mínimo
#define   MINB   ptoa, 2      ;Baja el punto mínimo
#define   MAXS   ptoa, 3      ;Sube el punto máximo
#define   MAXB   ptoa, 4      ;Baja el punto máximo
#define   BUZZER   ptoc, 3      ;Salida al aviso acústico
#define   RELE   ptoc, 0     ;Relé que maneja la carga (calefactor / enfriador)
#define   LCDE   ptoc, 6      ;Habilitación del LCD
#define   LCDRS   ptoc, 7      ;Selección de modo del LCD
#define   VENTILADOR   ptoc, 1 ;seccion de enfriamiento



      bsf      RP0         ;Pasa a página 1
      bcf      RP1
      movlw   b'00011111'   ;Configura puerto A
      movwf   trisa
      clrf   trisb      ;Puerto B completo como salidas (bus del LCD)
      clrf   trisc      ;Puerto C completo como salidas
      movlw   b'10001110'   ;Configura los pines del Puerto A
      movwf   adcon      ;AN0 como única entrada análoga
      bcf      RP0         ;Pasa a página 0
      movlw   b'01000001'   ;Enciende y configura el convertidor A/D - Selecciona AN0 como entrada
      movwf   adcon
   
      clrf   ptoa      ;Apaga todo
      clrf   ptob
      clrf   ptoc
   
      movlw   d'30'      ;Configura temperatura de activación inicial standar
      movwf   menor
      movlw   d'33'      ;Configura temperatura de desactivación inicial standar
      movwf   mayor

      movlw   b'00111000'   ;Comunicación con el LCD a ocho bits - Dos líneas de texto
      call   CONTROL
      movlw   d'2'
      call   DEMORA      ;Demora 2ms
      movlw   b'00000110'   ;Mensaje estático, se desplaza el cursor hacia la derecha
      call   CONTROL
      movlw   d'2'
      call   DEMORA      ;Demora 2ms
      movlw   b'00001100'   ;Enciende el display - Oculta el cursor - Caracter fijo
      call   CONTROL
      movlw   d'2'
      call   DEMORA      ;Demora 2ms
      movlw   b'00000001'   ;Limpia la pantalla y pone cursor en posición inicial
      call   CONTROL
      movlw   d'2'
      call   DEMORA      ;Demora 2ms

      clrf   letra      ;Coloca el título en el LCD
OTRA   movf   letra, 0   ;Letra actual -> W
      call   LINEA1      ;Obtiene el caracter a colocar desde la tabla
      call   DATO      ;Envía el caracter al LCD
      incf   letra, 1

      movf   letra, 0   ;Comprueba si ya envió los 16 caracteres del título
      sublw   d'16'
      btfss   CERO
      goto   OTRA      ;Si no llego a la letra 16 sigue enviando

      movlw   0xC0      ;Posiciona el cursor en la 2da. linea
      call   CONTROL
      movlw   d'1'
      call   DEMORA      ;Demora 1ms

      clrf   letra      ;Coloca el título en el LCD
OTRA2   movf   letra, 0   ;Letra actual -> W
      call   LINEA2      ;Obtiene el caracter a colocar desde la tabla
      call   DATO      ;Envía el caracter al LCD
      incf   letra, 1

      movf   letra, 0   ;Comprueba si ya envió los 16 caracteres del título
      sublw   d'16'
      btfss   CERO
      goto   OTRA2      ;Si no llego a la letra 16 sigue enviando

      call   VERINF      ;Coloca en el LCD la temp. inferior (de activación)
      call   VERSUP      ;Coloca en el LCD la temp. superior (de desactivación)

CICLO   bsf      ADGO      ;Inicia la conversión A/D
      btfsc   ADGO      ;Espera que termine de convertir
      goto   $ -1
   
      bsf      RP0         ;Pasa a página 1 (para acceder a los ocho bits bajos del resultado)
      movf   adres, 0   ;Resultado de conversión -> W
      bcf      RP0         ;Pasa a página 0

      movwf   buffer      ;Guarda el dato obtenido de ADRESL en el buffer temporal
      bcf      CARRY      ;Limpia el CARRY
      btfsc   adres, 0   ;Mira el bit menos significativo de ADRESH (Bit 
      bsf      CARRY      ;Si está en 1 pone en uno el carry
      rrf      buffer, 1   ;Hace desaparecer el bit 0 de ADRESL, mete el bit 0 de ADRESH por el 7 de ADRESL
      movf   menor, 0   ;Punto de activación -> W
     addlw   d'1'      ;Suma 1 a W
      subwf   buffer, 0   ;W = Temp. Actual - (Menor + 1)
      btfss   CARRY      ;Si dio negativo es porque la temp. medida es igual o menor al punto de activación
      bcf   VENTILADOR ; como la temperatura es menor apaga el ventilador
      bsf      RELE      ;Si dio negativo (si carry = 0) acciona el relé
     
     movf   mayor, 0   ;Punto de desactivación -> W
      subwf   buffer, 0   ;W = Temp. Actual - (Mayor)
      
      btfsc   CARRY      ;Si dio negativo es porque aún no alcanzó la temp. de desactivación
      
      bcf      RELE      ;Si dio positivo (si carry = 1) desactiva el relé
      bsf    VENTILADOR ;como ta temperatura es maxima apaga el ventilador
     
    

      movf   buffer, 0   ;Dato digitalizado -> W
   

      call   DECIMAL      ;Obtiene UNI, DEC y CEN con el agregado de 30h para la tabla ASCII
   
      movlw   0x8D      ;Coloca el cursor en la posición 0Dh de la pantalla.
      call   CONTROL

      movf   cen, 0      ;Coloca en el LCD las centenas
      call   DATO
      movf   dec, 0      ;Coloca las decenas
      call   DATO
      movf   uni, 0      ;Coloca las unidades
      call   DATO

      btfss   MINS      ;Mira el pulsador de incremento en temp. de activación
      call   SUBEMIN
      btfss   MINB      ;Mira el pulsador de decremento en temp. de activación
      call   BAJAMIN
      btfss   MAXS      ;Mira el pulsador de incremento en temp. de desactivación
      call   SUBEMAX
      btfss   MAXB      ;Mira el pulsador de decremento en temp. de desactivación
      call   BAJAMAX
   
      goto   CICLO      ;Vuelve a medir y mostrar

LINEA1   addwf   pcl, 1      ;Suma el contenido de W al contador de programa (para explorar la tabla)
      retlw   "T"
      retlw   "E"
      retlw   "M"
      retlw   "P"
      retlw   "E"
      retlw   "R"
      retlw   "A"
      retlw   "T"
      retlw   "U"
      retlw   "R"
      retlw   "A"
      retlw   ":"
      retlw   " "
      retlw   " "
      retlw   " "
      retlw   " "

LINEA2   addwf   pcl, 1      ;Suma el contenido de W al contador de programa (para explorar la tabla)
      retlw   " "
      retlw   " "
      retlw   " "
      retlw   " "
      retlw   " "
      retlw   " "
      retlw   b'01111111'   ;Flecha izquierda
      retlw   "-"
      retlw   "-"
      retlw   b'01111110'   ;Flecha derecha
      retlw   " "
      retlw   " "
      retlw   " "
      retlw   " "
      retlw   " "
      retlw   " "

SUBEMIN   incf   menor, 1   ;Suma 1 a la temp. de activación
      call   VERINF      ;Actualiza la información en el LCD
      btfss   MINS      ;Espera que suelte el pulsador
      goto   $ -1
      goto   SAVEMIN      ;Una vez que suelta la tecla va a guardar el parámetro
   
BAJAMIN   decf   menor, 1   ;Resta 1 a la temp. de activación
      call   VERINF      ;Actualiza la información en el LCD
      btfss   MINB      ;Espera que suelte el pulsador
      goto   $ -1
   
SAVEMIN   movf   menor, 1
      goto   TIC         ;Va a hacer el TIC de teclado

SUBEMAX   incf   mayor, 1   ;Suma 1 a la temp. de desactivación
      call   VERSUP      ;Actualiza la información en el LCD
      btfss   MAXS      ;Espera que suelte el pulsador
      goto   $ -1
      goto   SAVEMAX      ;Una vez que suelta la tecla va a guardar el parámetro
   
BAJAMAX   decf   mayor, 1   ;Resta 1 a la temp. de desactivación
      call   VERSUP      ;Actualiza la información en el LCD
      btfss   MAXB      ;Espera que suelte el pulsador
      goto   $ -1
   
SAVEMAX   movf   mayor, 1
      goto   TIC         ;Va a hacer el TIC de teclado

TIC      bsf      BUZZER      ;Acciona el buzzer
      movlw   d'100'
      call   DEMORA      ;Deja sonar el buzzer durante 100ms
      bcf      BUZZER
      return
   
CONTROL   bcf      LCDRS      ;Pone en bajo la línea de modo del LCD (Control)
      goto   ENVIAR      ;Se saltea la sig. línea
DATO   bsf      LCDRS      ;Pone en alto la línea de modo del LCD (Dato)
ENVIAR   movwf   ptob      ;Coloca el dato o control a enviar en el bus del LCD
      movlw   d'1'
      call   DEMORA      ;Demora 1ms
      bsf      LCDE      ;Habilita el LCD
      movlw   d'1'
      call   DEMORA      ;Demora 1ms
      bcf      LCDE      ;Deshabilita el LCD
      movlw   d'1'
      call   DEMORA      ;Demora 1ms
      return

DECIMAL   movwf   uni         ;Convierte el dato presente en W en UNI, DEC y CEN
      clrf   dec
      clrf   cen
      movlw   d'100'      ;Determina la cant. de centenas
CENTENA   subwf   uni, 1
      btfss   CARRY
      goto   CIEN
      incf   cen, 1
      goto   CENTENA
CIEN   addwf   uni, 1
      movlw   d'10'      ;Determina la cant. de decenas
DECENA   subwf   uni, 1
      btfss   CARRY
      goto   DIEZ
      incf   dec, 1
      goto   DECENA
DIEZ   addwf   uni, 1      ;Uni queda con la cant. de unidades (sin decenas ni centenas)

      movlw   0x30      ;Le suma 30h a los valores de UNI, DEC y CEN para que queden en ASCII
      addwf   uni, 1
      addwf   dec, 1
      addwf   cen, 1
      return
   
DEMORA   movwf   tiempo2      ;Demora tantos milisegundos como valor en w
TOP2   movlw   d'110'
      movwf   tiempo1
TOP1   nop
      nop
      nop
      nop
      nop
      nop
      decfsz   tiempo1, 1
      goto   TOP1
      decfsz   tiempo2, 1
      goto   TOP2
      return

VERINF   movf   menor, 0   ;Temperatura de activación -> W
      call   DECIMAL      ;Obtiene UNI, DEC y CEN en formato ASCII
      movlw   0xC2      ;Posiciona el cursor en el tercer caracter de la 2da. línea
      call   CONTROL      ;para escribir el punto de activación
      movlw   d'1'
      call   DEMORA      ;Demora 1ms
      movf   cen, 0      ;Coloca en el LCD las centenas
      call   DATO
      movf   dec, 0      ;Coloca las decenas
      call   DATO
      movf   uni, 0      ;Coloca las unidades
      call   DATO
      return

VERSUP   movf   mayor, 0   ;Temperatura de desactivación -> W
      call   DECIMAL      ;Obtiene UNI, DEC y CEN en formato ASCII
      movlw   0xCB      ;Posiciona el cursor en el caracter 12 de la 2da. línea
      call   CONTROL      ;para escribir el punto de desactivación
      movlw   d'1'
      call   DEMORA      ;Demora 1ms
      movf   cen, 0      ;Coloca en el LCD las centenas
      call   DATO
      movf   dec, 0      ;Coloca las decenas
      call   DATO
      movf   uni, 0      ;Coloca las unidades
      call   DATO
      return
   
      end
 

Adjuntos

  • circuit.GIF
    circuit.GIF
    169.7 KB · Visitas: 26
Última edición por un moderador:
Atrás
Arriba