Autor Tema: Modificar codigo de Termostato para que lea decimas.  (Leído 2223 veces)

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

Desconectado guillote_arg

  • PIC10
  • *
  • Mensajes: 1
Modificar codigo de Termostato para que lea decimas.
« en: 04 de Noviembre de 2008, 20:22:19 »
Hola amigos, les cuento que ya he probado de todo pero no logro hacer que este programa pueda medir decimas, les agradecería que me ayuden a modificarlo. Tengo experiencia en electrónica pero no en microcontroladores.
lo voy a utilizar en un acuario para controlar temepratura.
Gracias.


control de temperatura con LM35 y pantalla de LCD
; Una salida se activa ante una temp. baja y se desactiva ante una alta ambas seteables
; Guarda los parámetros en la EEPROM
; Micro: PIC16F870 a 4MHz XT

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
intcon   equ   0x0B      ;Controlador de interrupciones
eedata   equ   0x0C      ;Registro de datos de la EEPROM
eeaddr   equ   0x0D      ;Registro de direccion de la EEPROM
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

#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   EEREAD   eedata, 0   ;Bit que inicia la lectura de la EEPROM
#define   EEWRITE   eedata, 1   ;Bit que inicia la escritura de la EEPROM - Indica finalización
#define   EEWREN   eedata, 2   ;Bit que habilita la escritura en la EEPROM
#define   EEAREA   eedata, 7   ;Bit que selecciona el área de EEPROM a utilizar (0=AREA DE DATOS)
#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, 4      ;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

   bsf   RP0      ;Pasa a página 1
   bcf   RP1
   movlw   b'00011111'   ;Configura puerto A
   movwf   ptoa
   clrf   ptob      ;Puerto B completo como salidas (bus del LCD)
   clrf   ptoc      ;Puerto B completo como salidas
   movlw   b'10001110'   ;Configura los pines del Puerto A
   movwf   adcon      ;AN0 como única entrada análoga
   bsf   RP1      ;Pasa a página 3
   bcf   EEAREA      ;Selecciona el banco de EEPROM de datos
   bcf   RP1      ;Pasa a página 0
   bcf   RP0
   movlw   b'01000001'   ;Enciende y configura el convertidor A/D - Selecciona AN0 como entrada
   movwf   adcon
   
   clrf   ptoa      ;Apaga todo
   clrf   ptob
   clrf   ptoc
   
   bsf   RP1      ;Pasa a la página 2 de memoria
   clrf   eeaddr      ;Direcciona la primera posición de la EEPROM
   bsf   RP0      ;Pasa a la página 3 de memoria
   bsf   EEREAD      ;Inicia la lectura de la EEPROM
   bcf   RP0      ;Vuelve a la página 3 de memoria
   movf   eedata, 0   ;Dato Leído de la EEPROM -> W
   movwf   menor      ;Guarda el dato leído de la EEPROM en MENOR (punto de activación del relé)
   incf   eeaddr      ;Direcciona a la segunda posición de la EEPROM
   bsf   RP0      ;Pasa a la página 3 de memoria
   bsf   EEREAD      ;Inicia la lectura de la EEPROM
   bcf   RP0      ;Vuelve a la página 3 de memoria
   movf   eedata, 0   ;Dato Leído de la EEPROM -> W
   movwf   mayor      ;Guarda el dato leído de la EEPROM en MAYOR (punto de desactivación del relé)
   bcf   RP1      ;Pasa a la página 0 de memoria

   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 1

   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 8)
   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
     bsf   RELE      ;Si dio negativo (si carry = 0) acciona el relé
   movlw   d'3000'         ;
   call   DEMORA          ;demora la accion del rele 3 seg

   
   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é
   movlw   d'3000'         ;
   call   DEMORA          ;demora la accion del rele 3 seg
   

   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   bsf   RP1      ;Pasa a página 2
   clrf   eeaddr      ;Direcciona el primer byte de la EEPROM
   movf   menor, 0
   movwf   eedata      ;Temp. Activación -> EEPROM
   call   EESAVE      ;Ejecuta la rutina de grabación
   bcf   RP1      ;Pasa a página 0
   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   bsf   RP1      ;Pasa a página 2
   movlw   d'1'
   movwf   eeaddr      ;Direcciona el 2do. byte de la EEPROM
   movf   mayor, 0
   movwf   eedata      ;Temp. Activación -> EEPROM
   call   EESAVE      ;Ejecuta la rutina de grabación
   bcf   RP1      ;Pasa a página 0
   goto   TIC      ;Va a hacer el TIC de teclado
   
EESAVE   bsf   RP0      ;Pasa a página 3
   bsf   EEWREN      ;Habilita la escritura en la EEPROM
   movlw   0x55      ;Secuencia de seguridad
   movwf   eeaddr
   movlw   0xAA
   movwf   eeaddr
   bsf   EEWRITE      ;Inicia la grabación
   bcf   EEWREN      ;Deshabilita la escritura
   btfsc   EEWRITE      ;Espera que termine de grabar
   goto   $ -1
   bcf   RP0      ;Pasa a página 2
   return

TIC   bsf   BUZZER      ;Acciona el buzzer
   movlw   d'600'
   call   DEMORA      ;Deja sonar el buzzer durante 600ms
   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
   
   org   0x2100      ;Guarda los parámetros por default en la EEPROM
   data   0x19      ;Punto de activación: 25 grados
   data   0x1B      ;Punto de desactivación: 27 grados

   end

Desconectado chups_22

  • PIC10
  • *
  • Mensajes: 1
Re: Modificar codigo de Termostato para que lea decimas.
« Respuesta #1 en: 27 de Mayo de 2010, 16:41:56 »
pues no soy muy bueno en esto veré si puedo ayudarte, nada mas una pregunta tienes el diagrama de como va conectado el circuito para checarlo.


 

anything