Autor Tema: TERMOSTATO 16F877+LM35+LCD  (Leído 33690 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado tararatururu

  • PIC10
  • *
  • Mensajes: 12
TERMOSTATO 16F877+LM35+LCD
« en: 10 de Enero de 2008, 20:48:11 »
Tengo que entregar un proyecto en la universidad con los componentes indicados en el titulo del post. He aprovechado un esuqema y programa que habia por el foro para adaptarlo a mis necesidades, pero no consigo hacerlo funcionar.
Me seria de gran ayuda si le echase alguno de los maestros que hay por aqui para que me comentase los fallos.
Os envío el codigo y el esquema para la simulación que yo he hecho con proteus.

ayuda por favor que tengo que entregarlo cuanto antes y me he atascado en este punto¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡

cualquier duda preguntadme
« Última modificación: 11 de Enero de 2008, 12:32:06 por LordLafebre »

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: AYUDAAAAA URGENTEEEEEE TERMOSTATO 16F877+LM35+LCD
« Respuesta #1 en: 10 de Enero de 2008, 21:06:57 »
PASO 1:  Lo bajo del foro .... ( duracion 1 minuto ... escribir en el buscador y darle click a bajar )

PASO 2: Lo adapto .... ( duracion 10 minutos ... abrir, cambiarle el nombre al proyecto, simular si sirve, etc )

PASO 3: No le funciono ... osea se c#g& en el diseño del compañero que habia subido el proyecto al foro .. ( duracion 3 segundos .. darse cuenta de que la regó )

PASO 4: Llama a los maestros para que se lo revisen ... ( duracion 5 minutos ... escribiendo el mensaje y que se lea como si estuviera desesperado !! )

PASO 5: Sorry papillo muchos maestros nos rompemos el coco para ayudar pero no para hacerle los proyectos a otros!!!  :5] :5] :5] :5]

« Última modificación: 10 de Enero de 2008, 22:42:21 por blackcat »
Control Automático, DSP & Microcontroladores

Desconectado poseidon20

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 762
Re: AYUDAAAAA URGENTEEEEEE TERMOSTATO 16F877+LM35+LCD
« Respuesta #2 en: 10 de Enero de 2008, 21:54:48 »
Mi estimado tararatururu, como ya te lo mencionaron, lo que mencionaron los amigos JCC40 y blackcat en este foro se trata de fomentar la ayuda pero no el abuzo como es lo que tú tratas de hacer, en primer lugar si no te salio las modificaciones de un programa ajeno, deberias por lo menos ir en el que hizo el programa y preguntarle por que no te salio las modificaciones que le hicistes. Ahora yo ya hice las modificaciones necesarias para que el programa funciones, y solo era cuestion de configurar algunos parametros del isis, pero no pienso colocarlo ya que la forma de pedirlo no es la correcta, ademas se ve que no leistes el reglamento del foro, no por escribir,AYUDA, SOCORRO, HELP y etc se te va a tratar de ayudar mas rapido. Ahora si quieres que te ayude por lo menos di que errores te sale en el Proteus y asi ayudarte a que TU resuelvas TUS problemas, y si estas corto de tiempo, bueno ps no es culpa de nosotros sino solamente tuya. por que de esos se trata el foro, de ayudar pero no a hacerle la tarea o trabajo a otro.  :5] :5] :5] :5] :5] y si deceas que se te haga el trabajo, bueno entonces esto ya tiene un costo  :c)

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: AYUDAAAAA URGENTEEEEEE TERMOSTATO 16F877+LM35+LCD
« Respuesta #3 en: 10 de Enero de 2008, 23:54:14 »
No abri el archivo de Isis, pero seguramente tendras que copiar el contenido del RAR en una carpeta sola y luego una vez adentro hacer doble click sobre el PIC e indicarle la direccion correcta donde esta el archivo .hex

Si hubieras invertido en navegar el foro de ISIS verias que esto debe estar explicado unas 200 veces en varios temas...

Leete las Reglas del foro antes de postear nuevamente, asi evitaras que todos te caigan encima...

Suerte!! :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Marioguillote

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1926
    • Servisystem
Re: AYUDAAAAA URGENTEEEEEE TERMOSTATO 16F877+LM35+LCD
« Respuesta #4 en: 11 de Enero de 2008, 00:42:58 »
ayuda por favor que tengo que entregarlo cuanto antes y me he atascado en este punto¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡

 :D  :D  :D

Saludos
Mario

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: AYUDAAAAA URGENTEEEEEE TERMOSTATO 16F877+LM35+LCD
« Respuesta #5 en: 11 de Enero de 2008, 00:48:54 »
asi evitaras que todos te caigan encima...

Apuesto a que ese man no se vuelve aparecer por aqui ... jajajaja
Control Automático, DSP & Microcontroladores

Desconectado poseidon20

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 762
Re: AYUDAAAAA URGENTEEEEEE TERMOSTATO 16F877+LM35+LCD
« Respuesta #6 en: 11 de Enero de 2008, 01:14:33 »
se habre el mercado de apuestas. Quien da mas  :D :D :D :D
Apuesto 100 a 1  :mrgreen: :mrgreen: :mrgreen:

Desconectado tararatururu

  • PIC10
  • *
  • Mensajes: 12
Re: AYUDAAAAA URGENTEEEEEE TERMOSTATO 16F877+LM35+LCD
« Respuesta #7 en: 11 de Enero de 2008, 09:25:30 »
a ver, señores, un par de cositas aclaratorias:
1.- el archivo que yo he dejado es un programa al que yo he dedicado unas 15 horas despues de descargar un codigo de esta pagina, porque soy bastante torpe, y aunque a ustedes les hubiese costado menos,  a mi me ha llevado ese tiempo.(adaptar no es = 10 min como tu supones blackcat (que barato es el ataque gratuito))

.- he tenido que eliminar toda la utilizacion de la eprom porque no lo hemos estudiado y hacer que el programa grabe los datos adquiridos y modifique directamente sobre las variables ´mayor´ ´menor´ , y alguna cosilla más, he seguido paso a paso todo el programa para entender su funcionamiento, y he de reconocer que algunas cosas me ha costado bastante.

2.- también le he dedicado unas horas a aprender a utilizar proteus, del cual no conocia nada, y hacer el esquema, que aunque también se facilitaba un dibujo en el post donde tome el codigo, yo lo he pasado a proteus(tambien aqui podría haber algun error).

acordaros la primera vez que visteis isis.....pues asi estaba yo, y hasta que me entere que me hacia falta la version 7.2 para poder simular el lm35 ni te cuento, y que un error que me daba era por que tampoco podía simular una resistencia variable que habia puesto para regular la intensidad del lcd, e ir descubriendo otras muchas cosas.aun asi todavia no he conseguido que me deje ver el programa corriendo mientras se ejecuta (no me habilita la opcion source code)

(añadiria aqui la imagen del circuito que tengo en isis pero no se hacerlo, esta en el archivo)

3.- si he de pedir disculpas por saltarme alguna norma del foro por las palabras empleadas, las pido ahora mismo sin problema, pero estoy convencido de que una encuesta realista desvelaría un elevado porcentaje de foreros en mi situación(normas no leidas), y quizas alguno de vosotros caeria en ese saco.

mil disculpas por las molestias ocasionadas por el titulo de mi post, de verdad.

4.- no considero un abuso ni mucho menos el hacer una consulta sobre un programa en el que llevo invertido el tiempo que llevo (bastantes horas por mi torpeza)
y menos cuando lo que solicito, y no obligo a nadie a darme, es algun comentario o pista de donde pueden estar los fallos, o alguna orientación para resolverlos, no que devuelvan el programa corregido y funcionando ni nada parecido, asi que creo que hay se ha pasado un poco poseidon20, no creeis??, seguramente ni tan siquiera descargo el archivo para saber que es lo que preguntaba realmente.
por cierto poseidon20, quien te ha echado la culpa de que falte tiempo?

no se como se hace para que aparezcan los fragmentos de texto de otras respuestas a los que hago referencia y estoy contestando, pero todo esto es respuesta a lo que habeis dicho.por cierto poseidon, has perdido la apuesta, y espero que nadie apostase contra ti, sino te voy a caer mucho peor de lo que ya te caia, jeje.


y no me enrollo mas que vaya toston me ha quedado.

eso si, por si alguien tiene interes explico un poco mas detalladamente lo que me ocurre:(igual lo debería haber hecho asi desde el principio para evitar polemica)

   .- el isis me da 3 errores al simular  power suply (239mV) is outside especified range (3.5v -30v) 

¿porque pasa esto si tengo configurada la entrada A0 como analogica?

   .- pic16adc pc=0x0008.adc conversor clock period(5e-07)is posibly invalid for device clock period

esto no se solucionarlo, no se si podría ser por la configuracion de los bits 7-6 del adcon0 como 01

   .- (spice) delmin increased to xxxdue to lack of time precision

aparece el mensaje cada cierto tiempo y no se que quiere decir

estos son los errores que aparecen y para los que no he encontrado solucion, si alguien quiere ayudar que lo haga y sino que no lo haga, pero no me gustarian mas ataques sin razon, los justificados correctamente los acepto sin replica

por cierto, otra cosilla que no se muy bien es porque en algunos esquemas que veo por ahi aparece el cristal conectado entre las salidas osc1 y osc2, cual es su utilidad?deberia usarlo yo?

aclarar que el codigo original era para 16f870 y yo empleo 16f877, aunque no creo que haya que modificar instrucciones por eso, no?

GRACIAS DE ANTEMANO A TODOS LOS QUE OS HABEIS MOLESTADO EN LEER EL POST, Y EN ESPECIAL A AQUELLOS QUE APORTEN AUNQUE SOLO SEA UNA PEQUEÑA AYUDA
UN SALUDO, Y SEGUID CON ESTA IMPAGABLE LABOR

Desconectado tararatururu

  • PIC10
  • *
  • Mensajes: 12
Re: AYUDAAAAA URGENTEEEEEE TERMOSTATO 16F877+LM35+LCD
« Respuesta #8 en: 11 de Enero de 2008, 09:27:04 »
por cierto, decir que me aparece la información en el lcd, pero no consigo que me modifique nada la activacion de los pulsadores ni del lm35, eso es realmente lo que no me hace bien.

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: AYUDAAAAA URGENTEEEEEE TERMOSTATO 16F877+LM35+LCD
« Respuesta #9 en: 11 de Enero de 2008, 09:38:58 »
Para ayudarte mejor, te aconsejo lo siguiente:
Dividamos el problema en dos partes.
  • Pon el programa original donde empezaste a modificar para lograr el tuyo, eso servira para ayudarte a encontrar si hiciste algo mal (a veces saltas un Call o algo asi y te da dolores de cabeza, aún en los programas bien comentados).
  • El esquema puedes exportarlo como jpg o bmp directo desde el ISIS, no estaria mal que lo hicieras y luego lo pegaras aqui usando el archivo subido en Rapidshare por ejemplo

Para ser sincero sospecho que tu software es donde reside el problema, igual hay que revisar el esquema... :mrgreen: :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Marioguillote

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1926
    • Servisystem
Re: AYUDAAAAA URGENTEEEEEE TERMOSTATO 16F877+LM35+LCD
« Respuesta #10 en: 11 de Enero de 2008, 10:53:22 »
y no obligo a nadie a darme, es algun comentario o pista de donde pueden estar los fallos, o alguna orientación para resolverlos, no que devuelvan el programa corregido y funcionando ni nada parecido, asi que creo que hay se ha pasado un poco poseidon20, no creeis??

No amiguito, .... poseidon20 no se ha pasado, ni blackcat te ha atacado gratuitamente.

Sucede que éste foro, al que le cuesta mucho mantenerse en orden, está plagado de estudiantes mediocres que caen a los gritos buscando soluciones mágicas, rápidas y efectivas, pidiendo ayuda a los maestros del foro.

Me seria de gran ayuda si le echase alguno de los maestros que hay por aqui para que me comentase los fallos.

Ésos mismos aprendices de soberbios

a ver, señores, un par de cositas aclaratorias:


que cuando obtienen su inútil título, se creen seres superiores; y de el foro que les tendió una mano y de aquellos que lo ayudaron, se olvidan a los dos días.

Sé un poquito más humilde, deja la altanería de lado y logrararás la ayuda que necesitas.
Aquí hay un orden que todos mantenemos y tratamos de que ningún

....... porque soy bastante torpe, y aunque a ustedes les hubiese costado menos,  a mi me ha llevado ese tiempo.......

torpe cómo tú, venga a alterarlo a los gritos y con prepotencia.

Manejáte con calma en la vida, futuro ingenierito atropelladito. Si lo logras, todo te será más fácil y serás bien recibido en cualquier lugar.

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
Re: TERMOSTATO 16F877+LM35+LCD
« Respuesta #11 en: 11 de Enero de 2008, 12:39:16 »
Hola:

Bueno, ya se ha dicho todo, yo solo he editado el título porque me desespera más a mí.

Desconectado flacoclau

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1692
    • El Micro Reactor
Re: TERMOSTATO 16F877+LM35+LCD
« Respuesta #12 en: 11 de Enero de 2008, 14:19:53 »
Hola tararatururu:
Espero que puedas aprender cosas nuevas en este foro y seas uno más del grupo.
 :)
saludos
 
 
Las personas con buena ortografía me atraen textualmente.

El Micro Reactor

Córdoba capital - Argentina.

Desconectado tararatururu

  • PIC10
  • *
  • Mensajes: 12
Re: TERMOSTATO 16F877+LM35+LCD
« Respuesta #13 en: 11 de Enero de 2008, 14:55:15 »
CODIGO DE PARTIDA

; 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é
   
   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é

   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'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
   
   org   0x2100      ;Guarda los parámetros por default en la EEPROM
   data   0x28      ;Punto de activación: 40 grados
   data   0x32      ;Punto de desactivación: 50 grados

   end


Desconectado tararatururu

  • PIC10
  • *
  • Mensajes: 12
Re: TERMOSTATO 16F877+LM35+LCD
« Respuesta #14 en: 11 de Enero de 2008, 14:56:52 »
CODIGO MODIFICADO


; 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
; Micro: PIC16F877 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
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

#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, 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   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'20'      ;Configura temperatura de activación inicial standar
      movwf   menor
      movlw   d'22'      ;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 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é
   
      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é

      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