Autor Tema: Manejar Decimales en Termostato con pic16f877 + lm35 + LCD  (Leído 2845 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado saialex1989

  • PIC10
  • *
  • Mensajes: 4
Manejar Decimales en Termostato con pic16f877 + lm35 + LCD
« en: 26 de Abril de 2011, 17:50:21 »
Que tal!!!

Soy novato con esto de los pic´s y tengo un proyecto de la univerisdad que es un termostato, pero me tope con un problema, quiero mostrar la temperatura con enteros y decimales, por ejemplo: 28.7°C, pero no lo consigo, unicamente me aparecen puros enteros (028°C), intente de varias formas pero nada, espero que alguien me pueda ayudar.

Saludos!!!!

PD: Adjunto codigo

__CONFIG _WDT_OFF&_PWRTE_ON&_XT_OSC&_LVP_OFF&_CP_OFF ; Configuración para el programador

LIST p=16F877A
INCLUDE <P16F877A.INC>

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
menor1   equ   0x29      ;Temperatura de activación
mayor1   equ   0x30      ;Temperatura de desactivación
aux      equ   0x28      ;Usado como registro temporal

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

      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   ADCON1      ;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   ADCON0
   
      clrf   PORTA      ;Apaga todo
      clrf   PORTB
      clrf   PORTC
   
      movlw   d'20'      ;Configura temperatura de activación inicial standar
      movwf   menor
      movlw   d'30'      ;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   ADRESL, 0   ;Resultado de conversión -> W
      bcf      rp0         ;Pasa a página 0

      movwf   aux         ;Guarda el dato obtenido de ADRESL en el auxiliar temporal
      bcf      CARRY      ;Limpia el CARRY
      btfsc   ADRESH, 0   ;Mira el bit menos significativo de ADRESH (Bit 8)
      bsf      CARRY      ;Si está en 1 pone en uno el carry
      rrf      aux, 1      ;Hace desaparecer el bit 0 de ADRESL, mete el bit 0 de ADRESH por el 7 de ADRESL

      movf   mayor, 0   ;Punto de activación -> W
      addlw   d'1'      ;Suma 1 a W
      subwf   aux, 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
      bsf      RELE      ;Si dio negativo (si carry = 0) acciona el relé
   
      movf   menor, 0   ;Punto de desactivación -> W
      subwf   aux, 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é
      
      movf   menor, 0   ;Punto de activación -> W
      addlw   d'1'      ;Suma 1 a W
      subwf   aux, 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      RELE2      ;Si dio negativo (si carry = 0) acciona el relé
   
      movf   mayor, 0   ;Punto de desactivación -> W
      subwf   aux, 0      ;W = Temp. Actual - (Mayor)
      btfsc   CARRY      ;Si dio negativo es porque aún no alcanzó la temp. de desactivación
      bsf      RELE2      ;Si dio positivo (si carry = 1) desactiva el relé
      
      movf   aux, 0      ;Dato digitalizado -> W
      call   DECIMAL      ;Obtiene UNI, DEC y CEN con el agregado de 30h para la tabla ASCII
   
      movlw   0x87;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   ":"
      retlw   " "
      retlw   " "
      retlw   " "
      retlw   " "
      retlw   " "
      retlw   " "
      retlw   " "
      retlw   " "
      retlw   b'11011111';" "
      retlw   "C"
      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   PORTB      ;Coloca el dato o control a enviar en el bus del LCD
      movlw   d'100'
      call   DEMORA      ;Demora 1ms
      bsf      LCDE      ;Habilita el LCD
      movlw   d'10'
      call   DEMORA      ;Demora 1ms
      bcf      LCDE      ;Deshabilita el LCD
      movlw   d'10'
      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'1100'
      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

Desconectado lawren

  • PIC10
  • *
  • Mensajes: 9
Re: Manejar Decimales en Termostato con pic16f877 + lm35 + LCD
« Respuesta #1 en: 02 de Mayo de 2012, 04:53:19 »
la verdad soy novato en pic y este proyectito me esta ayudando bueno kiero adicionarle un ventilador asi cuando llega a temp maxima mande a enfriar y en temp min que se apague le ventilador


 

anything