TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: vakjorsan en 06 de Mayo de 2008, 14:53:18

Título: Famoso PIC 16F84A
Publicado por: vakjorsan en 06 de Mayo de 2008, 14:53:18
Hola amigos del foro!!

Estoy intentando realizar un proyecto con el PIC 16F84A y a su misma vez con un LCD 2x16, mis objetivos son varios hago un pequeño resumen

Inicio(mensaje0)-->A los 10 segundos desaparece(mensaje0)-->presiono un interruptor1 (aparece otro mensaje1)
                                                                                         -->presiono un interruptor2 (aparece otro mensaje2)

Por el momento he conseguido que en el display aparezcan los mensaje.

Alguien me sabria decir como podria hacer que el mensaje0 desaparezca a los 10 segundos...........y despues apareciera los otros mensajes cuando presiono el interruptor?????

Utilizo el codigo assembler...ya sabeis extension del archivo .asm y dspues todo su proceso...

Gracias a todos!! :) 
Título: Re: Famoso PIC 16F84A
Publicado por: IAO en 06 de Mayo de 2008, 15:18:20
Holaaaa:

Bienvenido al foro SR: vakjorsan.
Hay un sitio que se llama, almacén de asembler, date una vuelta por allí, a ver si encuentras algo parecido.

Aquí en todopic (http://www.todopic.com.ar/foros/index.php?board=3.0)

Saludos...

Bye('_').
Título: Re: Famoso PIC 16F84A
Publicado por: firepic en 06 de Mayo de 2008, 15:23:43
Saludos vakjorsan, bienvenido al foro!  :mrgreen:

Bueno tendrías que primero contar los 10 segundos... lo puedes hacer usando la interrupción por timer0. Si lo configuras con pre-escala de 1:256 y usas cristal de 4MHz, entonces se desbordaría a 65.28ms... o sea, para contar 10 segundos necesitarías que eso ocurriera unas 153 veces, lo que daría 9.98 segundos (sirve como 10, no?  :mrgreen: )... luego para borrar el LCD, recuerda que hay un comando del display para eso: el 0x01... entonces mandas ese valor igual que mandas los datos, pero con el pin del LCD RS = 0 para que éste entienda que se trata de un comando y no de un dato. También puedes enviar el comando 0x02 que envia el cursor al home.

Luego debes habilitar la interrupción por cambio en puerto B (por supuesto, los interruptores deberán estar entre los pines RB4:RB7 del pic)... así, cada vez que actives el interruptor ocurrirá la interrupción... en la rutina de interrupción lees el puerto B para saber cuál interruptor fue presionado y de acuerdo con ello envias el mensaje que tú quieres...

Recuerda que el vector de interrupción es el 0x04... entonces deberás hacer un org 0x04 y allí evaluar qué interrupción ha ocurrido (si la del timer 0 o la de cambio en RB), y hacer los goto a las subrutinas correspondientes...

Y pues, no más eso... y listo! Espero haberme explicado bien...
Trata de teclear tú mismo algo de código guiándote siempre por la datasheet... y te seguimos ayudando....
Ok nos leemos!  :-)
Título: Re: Famoso PIC 16F84A
Publicado por: vakjorsan en 07 de Mayo de 2008, 18:53:33
Ante todo muchas Gracias por responder tan rapido!

La verdad es que el proyecto lo tengo que presentar en menos de un mes y esta rapidez no me la esperaba :)

En cuanto al comentario del amigo IAO, intente buscar, pero no encontre nada claro.

Y en cuanto al comentario del amigo firepic, comentarle que si, utilizo un cristal de 4 MHz, pero referente a los 9.98 segundo, pues la verdad me sobra y me basta ya que lo que intento es poner un texto "introductorio" y que despues desaparezca por completo y que no se vuelva a iniciar hasta que se vuelva a conectar de nuevo el aparato xD, pero no entendi esto "luego para borrar el LCD, recuerda que hay un comando del display para eso: el 0x01..." no seria del pic 16f84a??

y al pin del LCD RS = 0 referente a lectura de datos, sino no me equivoco, corriganme si eso.........aunque tambien la opcion de home la veo bien.

En cuanto a "Luego debes habilitar la interrupción por cambio en puerto B (por supuesto, los interruptores deberán estar entre los pines RB4:RB7 del pic)... así, cada vez que actives el interruptor ocurrirá la interrupción... en la rutina de interrupción lees el puerto B para saber cuál interruptor fue presionado y de acuerdo con ello envias el mensaje que tú quieres..."

Habia pensado en utilizar para uno el puerto A y para otro el puerto B

Adjunto codigo que intente modificar (con muchas funciones que se que no hacen falta) y circuito que me gustaria realizar, mejor dicho lo que tengo comprobado que me funciona hasta el momento :?

Siento el dibujo tan cutre :|

PS: La verdad es que dia a dia intento pelearme 100% para sacar el proyecto adelante, pero me encuentro con muchisimas dudas.

Gracias y saludos


Título: Re: Famoso PIC 16F84A
Publicado por: firepic en 07 de Mayo de 2008, 19:28:54
Amigo Vakjorsan, saludos!  :-)


pero no entendi esto "luego para borrar el LCD, recuerda que hay un comando del display para eso: el 0x01..." no seria del pic 16f84a??

y al pin del LCD RS = 0 referente a lectura de datos, sino no me equivoco, corriganme si eso.........aunque tambien la opcion de home la veo bien.

En cuanto a "Luego debes habilitar la interrupción por cambio en puerto B (por supuesto, los interruptores deberán estar entre los pines RB4:RB7 del pic)... así, cada vez que actives el interruptor ocurrirá la interrupción... en la rutina de interrupción lees el puerto B para saber cuál interruptor fue presionado y de acuerdo con ello envias el mensaje que tú quieres..."

Habia pensado en utilizar para uno el puerto A y para otro el puerto B


Hay ciertos comandos que son comunes para cualquier LCD, y que sirven para configurarlo y otras cosas más, como por ejemplo borrarlo, cursor a home, etc...
Puedes ver una lista de los comandos Aqui (http://www.caveo.com.ar/LCD_comandos_hard.htm)

Como podrás observar, RS=0 para todos los comandos, mientras que RS=1 para lectura y escritura de datos, tanto en la DDRAM (memoria del display que contiene lo que se imprimirá) como en la CGRAM (memoria del display para crear caracteres personalizados)...

Para lectura de datos, debes hacer RW=1... por eso es que generalmente se conecta este pin a tierra (RW=0), pues lo que hacemos casi siempre es escribir en el lcd, no leer.

Lo que te decía de colocar los interruptores entre RB4 y RB7 es porque así puedes usar la herramienta de interrupción por cambio en PORTB, así es más fácil y más eficiente detectar si se ha presionado o no un interruptor...

Ahora bien, en tu dibujo tienes los 8 pines del LCD D0-D7 conectados al pic... no sé si sabes que eso no es necesario, pues el LCD puede configurarse a 4 bits, así sólo usarías los pines D4-D7 que conectarías por ejemplo a los pines RB0-RB3, luego te queda E y RS que los puedes conectar en el puerto A y te quedan libres RB4 - RB7 para los pulsadores... que por cierto, no los ví contemplados en tu dibujo...

Una observación más es sobre el potenciómetro que va conectado a Vo, es de tres pines, los pines de los laterales van conectados a GND y Vcc y el del medio va a Vo, para ajustar el contraste del display (bueno me imagino que ya lo sabías pero no lo contemplaste en el dibujo)...

Ok luego leo el código con más calma a ver en qué te ayudo...
Bueno es todo por ahora, nos leemos pues!  :mrgreen:
Título: Re: Famoso PIC 16F84A
Publicado por: vakjorsan en 11 de Mayo de 2008, 12:57:31
Hola Hola!!!!!

Estamos aqui de nuevo, cada dia intentando entender mas a mi dolor de cabeza "PIC 16F84A" ejejejeje :lol:

Estube navegando bastante para encontrar un pequeño tutorial que me ayudara a entender mas las instrucciones,
para realizar yo mismo los programitas, el que encontre es este:

http://perso.wanadoo.es/chyryes/tutoriales/pic0.htm


Aun asi despues de havermelo leeido, entendido y intentado asimilar para realizar un pequeño programa no me dio
resultados. No se si alguien sabria decirme donde encontrar algo asi mas relacionado con lo que intento realizar.

Tambien comentar que buscando buscando encontre este codigo, que no se si sera correcto, para el retardo de los
aproximadamente 10 segundos que me gustaria, lo dejo aqui para que me comenten algo

#DEFINE  Salida                     PORTB,1         
#DEFINE  Entrada                   PORTA,4

   ORG    0
Inicio
   bsf      STATUS,RP0            ; Hacia al banco 1.
   bsf      Entrada                 
   bcf      Salida         
   bcf      STATUS,RP0            ; Banco 0.
   bcf      Salida                     ; Salida desactivada.
Principal
   btfss   Entrada                   ; ¿La Entrada es igual a 1?
   goto   DesactivaSalida        ; No, Entrada activada. DEsactiva la Salida.
ActivaSalida
;   call   Retardo_10s             ; Esperar 10 segundos.
   btfss   LDR                         ; ¿Entrada=1?
   goto   Fin                           ; No, sale fuera.
   bsf      Salida                     ; Sí, se activa la Salida.
   goto   Fin   
DesactivaSalida
;   call   Retardo_10s           
    btfsc   LDR                       ; ¿Entrada=0?, ¿Entrada  activa?
    goto   Fin                         ; No.
    bcf      Lampara               ; Sí, desactiva la Salida.
Fin
   goto   Principal
   
   END

Sigo dia a dia aqui comentando cosas que me pasen

Muchas Gracias
Título: Re: Famoso PIC 16F84A
Publicado por: RALF2 en 11 de Mayo de 2008, 13:38:15
Que tal amigo!
Mira yo te voy a recomendar un libro para que aprendas full con ese micro y los demas lo puedes ver aqui (http://www.pic16f84a.com/)

Con ejemplos y demas!

Saludos
Título: Re: Famoso PIC 16F84A
Publicado por: vakjorsan en 11 de Mayo de 2008, 14:57:42
ola RALF2, sisisi lo se a full

pero no dispongo de plata.............y e ido a diferentes bibliotecas cercanas y o no lo tenian o estaba alquilado ya se sabe al final de curso
no se encuentran las cosas
Título: Re: Famoso PIC 16F84A
Publicado por: vakjorsan en 12 de Mayo de 2008, 17:37:21
Olaaaa???

Alguien por hay para hablar de mi tema???
Título: Re: Famoso PIC 16F84A
Publicado por: firepic en 12 de Mayo de 2008, 18:29:25
Saludos vakjorsan!

Tambien comentar que buscando buscando encontre este codigo, que no se si sera correcto, para el retardo de los
aproximadamente 10 segundos que me gustaria, lo dejo aqui para que me comenten algo

#DEFINE  Salida                     PORTB,1         
#DEFINE  Entrada                   PORTA,4

   ORG    0
Inicio
   bsf      STATUS,RP0            ; Hacia al banco 1.
   bsf      Entrada                 
   bcf      Salida         
   bcf      STATUS,RP0            ; Banco 0.
   bcf      Salida                     ; Salida desactivada.
Principal
   btfss   Entrada                   ; ¿La Entrada es igual a 1?
   goto   DesactivaSalida        ; No, Entrada activada. DEsactiva la Salida.
ActivaSalida
;   call   Retardo_10s             ; Esperar 10 segundos.
   btfss   LDR                         ; ¿Entrada=1?
   goto   Fin                           ; No, sale fuera.
   bsf      Salida                     ; Sí, se activa la Salida.
   goto   Fin   
DesactivaSalida
;   call   Retardo_10s           
    btfsc   LDR                       ; ¿Entrada=0?, ¿Entrada  activa?
    goto   Fin                         ; No.
    bcf      Lampara               ; Sí, desactiva la Salida.
Fin
   goto   Principal
   
   END

Bueno en ese trozo de código hay un "call retardo_10s"... pero en ninguna parte está esa rutina... de hecho esa parte de  código la han puesto comentada... el que hizo eso tuvo la intención de insertar el retardo, pero luego lo dejó así  :D
Así que tendrás que trabajar todavía en generar tu retardo... eso lo puedes hacer de dos formas:
1- La forma rudimentaria: asignándole un valor apropiado a una variable y decrementándola hasta que pase el tiempo deseado (como son 10segundos tendrás que volver a cargar el valor varias veces, o usar otra variable).
2- La forma elegante: usar el timer del pic.

En cuanto a lo de los pulsadores, como te mencioné antes me parece que deberías cambiar la interfaz del LCD a 4 bits para que tengas libres los pines RB4-RB7 del lcd... o por lo menos dos de ellos, para usar interrupciones y facilitar la parte el código que te permita enviar el mensaje correspondiente al pulsador activado.
Creo que deberías trabajar en eso por ahora... pues como dices ya esa rutina está funcionando, no creo que te sea difícil cambiar la configuración a cuatro bits... lo único que tienes que hacer es dividir los 8 bits en dos partes, y enviar una primero y otra después (primero los más significativos y después los menos significativos)...
En este archivo (http://www.solopic.com.ve/SharedFiles/LCD_2.pdf) conseguirás una buena explicación de cómo hacerlo.

Bueno vete adelantando eso y en lo que tenga un chance te ayudo con los otros puntos faltantes...
Nos leemos!
Título: Re: Famoso PIC 16F84A
Publicado por: vakjorsan en 13 de Mayo de 2008, 05:34:18
Ola de nuevo referente al temporizador me gustaria realizarlo como comenta el sr. firepic, de forma elegante, jejeje, vamos con el TMR.

Estuve documentandome, para conocer mas esta instruccion y encontre un archivo bastante bueno y a mas referenciado como me comento el amigo RALF2.

Pase el codigo a MPASMWIN y no me dio ningun problema, como lo podria implementar a mi mensaje inicial???

PS:ya se que el programa no me da los 10 segundos necesarios, me da unos 0,005s mu poquita cosa, jejeje, ya que para los los 10 segundos que quiero necesitaria 10000000µs.

Gracias por tanta colaboracion :)
Título: Re: Famoso PIC 16F84A
Publicado por: firepic en 13 de Mayo de 2008, 16:14:26
Saludos vakjorsan!
Pues te felicito! Anímate y sigue buscando, por allí deben haber otros programas para generar retardos más largos...
Ok nos leemos!  :mrgreen:
Título: Re: Famoso PIC 16F84A
Publicado por: vakjorsan en 13 de Mayo de 2008, 17:19:22
Citar
Pues te felicito! Anímate y sigue buscando, por allí deben haber otros programas para generar retardos más largos...

Yaaaaaaaaa!! Pero alguna manera de implementarlo?? con los dos codigos que es lo que interesa??? ya que una vez vea que sale el mensaje
inicial y a los 500 desaparece me pelearia como un loco para que me diera los 10s.

Saludos!!
Título: Re: Famoso PIC 16F84A
Publicado por: firepic en 13 de Mayo de 2008, 18:19:45
Ok, no te desesperes...

Hoy tampoco he podido ver bien tu código, pero la cosa es que debe haber una parte en el código que llama una subrutina para enviar al lcd el primer mensaje...
Si la consiguieras, entonces luego de esa llamada colocarías el código que acabas de encontrar para hacer la pausa...
Y luego, inserta otra vez la subrutina para enviar caracteres al lcd pero poniendo RS=0 (es decir, si por ejemplo está conectado RS del lcd a el RA0, tendrías que colocar: "bcf porta,0")... y en vez de mandar un valor ascii correspondiente a una letra, vas a enviar el comando que te dije antes: 0x01... y luego 0x02...
En el último archivo que te coloqué explica cómo hacer para enviar comandos al display...

Cuando tenga un chancecito trato de ayudarte un poco más....
Nos leemos!  :mrgreen:
Título: Re: Famoso PIC 16F84A
Publicado por: vakjorsan en 19 de Mayo de 2008, 06:52:51
Buenas!!

Me parece que ya tengo el codigo para que me aparezca el mensaje inicial, este iria de la siguiente manera conectado el PIC16F48A a 5V y el display LCD tambien a 5V y entonces apareciria el mesaje y a los 10 segundos desapareceria, pero como lo conexiono para que me aparezca los otros? ya que iria con un doble conmutador! se recomiendo alguna patilla? y despues otros mensajes, adjunto jpeg para que se vea mejor si no me e explicado bien.


Saludossssssssssssssssss!!
Título: Re: Famoso PIC 16F84A
Publicado por: firepic en 19 de Mayo de 2008, 19:29:20
Saludos!

Vakjorsan, creo que no has tomado en cuenta esta observación que te he hecho varias veces:  :?

Ahora bien, en tu dibujo tienes los 8 pines del LCD D0-D7 conectados al pic... no sé si sabes que eso no es necesario, pues el LCD puede configurarse a 4 bits, así sólo usarías los pines D4-D7 que conectarías por ejemplo a los pines RB0-RB3, luego te queda E y RS que los puedes conectar en el puerto A y te quedan libres RB4 - RB7 para los pulsadores... que por cierto, no los ví contemplados en tu dibujo...

En cuanto a lo de los pulsadores, como te mencioné antes me parece que deberías cambiar la interfaz del LCD a 4 bits para que tengas libres los pines RB4-RB7 del lcd... o por lo menos dos de ellos, para usar interrupciones y facilitar la parte el código que te permita enviar el mensaje correspondiente al pulsador activado.
Creo que deberías trabajar en eso por ahora... pues como dices ya esa rutina está funcionando, no creo que te sea difícil cambiar la configuración a cuatro bits... lo único que tienes que hacer es dividir los 8 bits en dos partes, y enviar una primero y otra después (primero los más significativos y después los menos significativos)...
En este archivo (http://www.solopic.com.ve/SharedFiles/LCD_2.pdf) conseguirás una buena explicación de cómo hacerlo.

Eso tienes que tomarlo en cuenta para que puedas hacer lo de los pulsadores de una manera más eficiente.
Ok nos leemos!  :mrgreen:

Título: Re: Famoso PIC 16F84A
Publicado por: vakjorsan en 20 de Mayo de 2008, 14:37:40
Buenassssssss!!!

Ciertamente, se me olvido comentar que referente a la primera cita que me has puesto amigo firepic, sobre:
Citar
Ahora bien, en tu dibujo tienes los 8 pines del LCD D0-D7 conectados al pic... no sé si sabes que eso no es necesario, pues el LCD puede configurarse a 4 bits, así sólo usarías los pines D4-D7 que conectarías por ejemplo a los pines RB0-RB3, luego te queda E y RS que los puedes conectar en el puerto A y te quedan libres RB4 - RB7 para los pulsadores... que por cierto, no los ví contemplados en tu dibujo...

pues bien, es verdad hay pines que no hace falta conectar ya que solamente teniendo conectados el RB4 al RB7 me funciona tambien el texto, pero claro solamente con el principal es decir que de RB0 a RB3 pueden quedar libres.

tambien aclarar q no seran pulsadores, sino un doble conmutador la primera vez que conmuta apareceria el mensaje 2 y la segunda vez que conmuta saldria el mensaje 3 y despues claramente mediante un interruptor a 0 saldria el mensaje 4 y puesto a 1 saldria el mensaje 5 :P

Pienso que el pic16f84a es super interesane, pero es que me parece que ............... pufffffff ....... no llego a ver que pueda salida y trabajo a conrareloj, pero yo dia a dia intento mil y dos mil cosas para que salga.

Gracias!
Título: Re: Famoso PIC 16F84A
Publicado por: firepic en 20 de Mayo de 2008, 14:55:43
Saludos!

Ciertamente, se me olvido comentar que referente a la primera cita que me has puesto amigo firepic, sobre:
Citar
Ahora bien, en tu dibujo tienes los 8 pines del LCD D0-D7 conectados al pic... no sé si sabes que eso no es necesario, pues el LCD puede configurarse a 4 bits, así sólo usarías los pines D4-D7 que conectarías por ejemplo a los pines RB0-RB3, luego te queda E y RS que los puedes conectar en el puerto A y te quedan libres RB4 - RB7 para los pulsadores... que por cierto, no los ví contemplados en tu dibujo...

pues bien, es verdad hay pines que no hace falta conectar ya que solamente teniendo conectados el RB4 al RB7 me funciona tambien el texto, pero claro solamente con el principal es decir que de RB0 a RB3 pueden quedar libres.

Bueno Vakjorsan la idea es al contrario, conectar el bus de datos del LCD en RB0:RB3 para que te queden RB4:RB7 libres  y usar las interrupciones que te mencioné.

Por otro lado, sería bueno que colocaras un esquema con los conmutadores que mencionas.

Nos leemos!  :mrgreen:
Título: Re: Famoso PIC 16F84A
Publicado por: vakjorsan en 24 de Mayo de 2008, 14:08:02
Holaaaaaaaaaa!!! despues de haber estado leyendo mucho y examinando muchos documentos, no veo la posibilidad que me comentas amigo firepic de no usar los pines RB4-RB7 y usas los RB0 a RB3, nuse haber si me puedes ofrecer algo de informacion sobre lo que comentaste, por que ya te digo que todo lo que hay es como lo tenia yo desde un principio.

El esquema ya lo pase, pero lo vuelvo a poner no hay problema

Haber si podemos mirar lo de los conmutadores y tal....porque el tiempo ya me escasea y de aqui a dos semanas he de presentarlo, es lo unico que me queda!

Gracias de antemano
Título: Re: Famoso PIC 16F84A
Publicado por: firepic en 30 de Mayo de 2008, 20:36:08
Vakjorsan, sería bueno que colocaras el código que llevas al momento para enviar el mensaje al lcd a 4bits dejando libre los pines RB4:RB7.
En cuanto a lo de los conmutadores... deberás colocarlos en algunos de esos pines, RB4 y RB7.
No tengo mucho tiempo ahora, así que te voy a dar orientación para que tú mismo trates de buscar la información: en la datasheet del pic, encontrarás una sección que dice "características especiales del cpu" (claro, escrito en inglés)... entonces busca allí las interrupciones. Busca la interrupción por cambio en Portb. Allí te explica los pasos que debes seguir para activar esta interrupción.
Anda mirándote eso y cuando tenga un tiempo te ayudo un poco más. Si mal no recuerdo tú no estás usando ninguna otra interrupción, así que lo que tienes que hacer es colocar al inicio del programa:

Código: [Seleccionar]
ORG 0x00
goto inicio
ORG 0x04
goto interrupccion

donde interrupción es una subrutina en la que harás lo siguiente:
1- Deshabilitas las interrupciones globales (aclaras bit GIE)
2- Aclaras la bandera de interrupción (creo que el bit se llama RBIF, busca en la datasheet del pic).
3- Lees el puerto B (así ves cuál conmutador fue activado).
4- De acuerdo al conmutador que haya sido activado llamas a la subrutina para enviar el mensaje correspondiente.
5- Vuelves a habilitar las interrupciones (set a bit GIE).

Bueno como te dije esto es muy a groso modo pero allí tienes una guía para que vayas trabajando...
Luego trataré de ayudarte mejor.

Nos leemos!  :mrgreen: