TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Delphus en 21 de Octubre de 2011, 17:36:48

Título: como dormir un pic y despertarlo mediante MCLEAR
Publicado por: Delphus en 21 de Octubre de 2011, 17:36:48
Hola a todos, segun tengo entendido se puede despertar un pic mediante la aplicacion de voltaje en el pin MCLEAR, para dormirlo lo hice así:

 if (input(pin_A7))
     sleep();
poniendo un interruptor doble entre el pin A7 y el mclear, lo que no sé es si con solo aplicar voltaje en mclear el pic se despertará o hay que hacer algo más.
Por lo menos cuando hice la simulación en el Proteus, cuando hacía el reset , el pic se quedaba paralizado.
Gracias por su atención.
Título: Re: como dormir un pic y despertarlo mediante MCLEAR
Publicado por: AngelGris en 21 de Octubre de 2011, 18:24:49
¿Y de qué PIC se trata?
Título: Re: como dormir un pic y despertarlo mediante MCLEAR
Publicado por: Delphus en 21 de Octubre de 2011, 18:30:06
Hola AngelGris, gracias por responder, es un pic 16f88 con puertos A y B , el puerto B lo tengo ocupado con un display LCD.
Título: Re: como dormir un pic y despertarlo mediante MCLEAR
Publicado por: Suky en 21 de Octubre de 2011, 18:37:16
Pero dice lo siguiente:

Citar
External MCLR Reset will cause a device RESET. All
other events are considered a continuation of program
execution and cause a “wake-up”


El MCLR te resetea el micro  :?
Título: Re: como dormir un pic y despertarlo mediante MCLEAR
Publicado por: Delphus en 21 de Octubre de 2011, 18:39:39
o sea yo quiero usar el reset solo para despertar el micro una vez ya esté en modo sleep, segun sé esto se puede hacer pero no he encontrado ejemplos de esto en la red.
Título: Re: como dormir un pic y despertarlo mediante MCLEAR
Publicado por: Suky en 21 de Octubre de 2011, 18:46:33
Digamos que se despierta, pero se resetea  :mrgreen: Los demás eventos si permiten continuar la ejecución: WDT, INT, RB4-RB7...


Saludos!
Título: Re: como dormir un pic y despertarlo mediante MCLEAR
Publicado por: Delphus en 21 de Octubre de 2011, 19:01:42
es que por ejemplo en la simulacion de proteus, cuando dejaba el mclear conectado el pic seguia funcionando hasta que lo soltaba.
De todas formas tu propones ponerle en el mclear un boton mejor, eso es lo que entiendo.
Título: Re: como dormir un pic y despertarlo mediante MCLEAR
Publicado por: Delphus en 21 de Octubre de 2011, 19:40:22
Aca les dejo el diseño,por ejemplo cuando arranco la simulacion, el lcd se pone en blanco, cuando presiono Reset, el lcd muestra el mensaje inicial de programa como si fuese a funcionar pero luego se queda ahi pausado y no funciona nada.
Título: Re: como dormir un pic y despertarlo mediante MCLEAR
Publicado por: tannke en 21 de Octubre de 2011, 19:52:01
Piensa que el reset es negado, es decir, mientras está a masa el pic está en reset, para arrancar tiene que estar a vcc.
 Por lo que en tú circuito tienes que tener el pulsador todo el rato presionado para que ande.


Un saludo
Título: Re: como dormir un pic y despertarlo mediante MCLEAR
Publicado por: Delphus en 21 de Octubre de 2011, 20:28:28
hola tannke, gracias por responder, en un comienzo asi lo tenía, un interruptor doble de tal manera que cuando abria el sleep, activaba el mclear, pero ahi era donde se quedaba paralizado, segun lo que me recomendaron que no dejara el mclear activado porque el pic siempre iba a estar en reset por eso le puse el boton.

Ahora siguiendo tu consejo le puse un interruptor al mclear y efectivamente el pic funciona, pero para dormir al pic, se me vino la idea de hacer dormir el pic al inicio del programa como he visto por ahi, ejemplo:

main()

while(true)
   sleep();
de tal forma que cuando se suelte el reset el pic se duerma y cuando se presione este salga del sleep

hice la prueba y cuando suelto el reset, el lcd no se borra pero el programa parece que se detiene, pero cuando vuelvo a activar el reset, los valores de las variables no se mantienen.
que podría ser?
Aqui les muestro

Gracias.
Título: Re: como dormir un pic y despertarlo mediante MCLEAR
Publicado por: Delphus en 21 de Octubre de 2011, 21:29:18
o será que el problema es del Proteus pues segun he leido a veces no simula bien el comportamiento del sleep, no sé , habrá que hacer las pruebas en la protoboard.
A alguien le ha pasado lo mismo?
Título: Re: como dormir un pic y despertarlo mediante MCLEAR
Publicado por: MerLiNz en 21 de Octubre de 2011, 21:41:20
segun el datasheet de ese pic he visto que el MCLR no sirve para despertar el pic, al ponerlo a LOW haces que el pic se resetee pero nada mas, cierto que sale del sleep, pero para ser reseteado.

Para que tu pic siga funcionando en modo sleep debes mantener el MCLR a HIGH, si lo pones a LOW se resetea.

Tienes otras opciones para salir del sleep:
2. Watchdog Timer wake-up (if WDT was enabled).
3. Interrupt from INT pin, RB port change or a
peripheral interrupt.

Aqui es donde pone que el MCLR solo se usa para reset en modo sleep:
External MCLR Reset will cause a device Reset. All
other events are considered a continuation of program
execution and cause a “wake-up”.

puedes verlo aqui en el datasheet:
15.13.1 WAKE-UP FROM SLEEP
Título: Re: como dormir un pic y despertarlo mediante MCLEAR
Publicado por: Delphus en 21 de Octubre de 2011, 21:53:48
Hola MerLinz, gracias por la aclaración, todavía no me muevo muy bien con los datasheets  :(  , como puedes ver tengo el pin RB0 ocupado con el LCD y no puedo activar la interrupción ahí, te pregunto rapidamente ,  será que puedo usar el puerto A para el LCD  , algo como
 
Código: [Seleccionar]
#define use_portA_lcd TRUEpues no he visto eso y si se puede cómo serían las conexiones.
Gracias
Título: Re: como dormir un pic y despertarlo mediante MCLEAR
Publicado por: MerLiNz en 21 de Octubre de 2011, 22:03:43
puedes hacer lo siguiente, el RESET de RB7 pasarlo a MCLR (es lo mas logico xD) aunque no se que tipo de reset es, si es de codigo o algo asi... y usar el RB7 como PORTB on change int.

Si tu reset es algo de software que sea necesario, pon el pin del MCLR como digital desactivando el MCLR por hardware (MCLRE bit) y lo usas para lo que quieres si es posible.

Lo de cambiar de puerto al lcd es otra opcion, pero eso ya lo tienes que mirar en la libreria que uses ya que yo no se cual es, ni que codigo usa.
Título: Re: como dormir un pic y despertarlo mediante MCLEAR
Publicado por: Delphus en 21 de Octubre de 2011, 22:35:52
Hola Merlinz no entendí varias cosas  :shock:
Citar
puedes hacer lo siguiente, el RESET de RB7


no entiendo lo del reset de RB7 o quisiste decir RB0

Citar
pasarlo a MCLR (es lo mas logico xD) aunque no se que tipo de reset es, si es de codigo o algo asi... y usar el RB7 como PORTB on change int.
Cómo puedo hacer ese cambio?


Citar
Si tu reset es algo de software que sea necesario, pon el pin del MCLR como digital desactivando el MCLR por hardware (MCLRE bit) y lo usas para lo que quieres si es posible.
Tampoco sabría como, si me pudieran facilitar un tuto, yo me lo leo  :)
Citar
Lo de cambiar de puerto al lcd es otra opcion, pero eso ya lo tienes que mirar en la libreria que uses ya que yo no se cual es, ni que codigo usa.

hice la prueba con
Código: [Seleccionar]
#define use_portA_lcd TRUE pero el compilador no me acepta esa directiva
Título: Re: como dormir un pic y despertarlo mediante MCLEAR
Publicado por: Delphus en 22 de Octubre de 2011, 01:37:20
Hola, investigando encontré la forma de liberar RB0 del lcd, estoy usando el codigo de este articulo
http://www.ucontrol.com.ar/wiki/index.php?title=CCS_-_LCD#Modificando_LCD.C
Funciona todo bien pero a la hora de salir un mensaje, la linea de arriba no muestra el primer caracter ni responde al lcd_gotoxy, si a alguien le pasó lo mismo le afradezco su ayuda, aca les dejo las conexiones y el mensaje:
Título: Re: como dormir un pic y despertarlo mediante MCLEAR
Publicado por: Delphus en 22 de Octubre de 2011, 02:22:08
Bueno, buscando en el foro encontré http://www.todopic.com.ar/foros/index.php?topic=29970.0
le puse el lcd_putc("\f") dentro de un ciclo infinito pero es molesto pues el lcd parpadea mucho, entonces les pregunto 1. si hay manera de quitar ese parpadeo en el proteus y
2.si en el montaje real se ve ese parpadeo o no
Título: Re: como dormir un pic y despertarlo mediante MCLEAR
Publicado por: MerLiNz en 22 de Octubre de 2011, 04:18:23
vale, es que vi que cambiaste 2 veces el circuito, lo que te decia es que cualquier puerto B puedes configurarlo para una interrupcion al cambiar high->low o low->high si tienes alguno libre puedes usarlo en vez de kitar el B0 o lo que sea...
Título: Re: como dormir un pic y despertarlo mediante MCLEAR
Publicado por: Delphus en 22 de Octubre de 2011, 09:55:06
ya comprendo MerLinz, y lo del parpadeo saben si se ve en el montaje real o no, es que no tengo el lcd aun pero dentro de poco me llega :-/
Saludos
Título: Re: como dormir un pic y despertarlo mediante MCLEAR
Publicado por: Suky en 22 de Octubre de 2011, 10:08:35
segun el datasheet de ese pic he visto que el MCLR no sirve para despertar el pic, al ponerlo a LOW haces que el pic se resetee pero nada mas, cierto que sale del sleep, pero para ser reseteado.

Para que tu pic siga funcionando en modo sleep debes mantener el MCLR a HIGH, si lo pones a LOW se resetea.

Tienes otras opciones para salir del sleep:
2. Watchdog Timer wake-up (if WDT was enabled).
3. Interrupt from INT pin, RB port change or a
peripheral interrupt.

Aqui es donde pone que el MCLR solo se usa para reset en modo sleep:
External MCLR Reset will cause a device Reset. All
other events are considered a continuation of program
execution and cause a “wake-up”.

puedes verlo aqui en el datasheet:
15.13.1 WAKE-UP FROM SLEEP

Exacto! Es lo que puse al principio.

Digamos que se despierta, pero se resetea  :mrgreen: Los demás eventos si permiten continuar la ejecución: WDT, INT, RB4-RB7...

Pero vi que no quería aceptarlo  :D :D
Título: Re: como dormir un pic y despertarlo mediante MCLEAR
Publicado por: Delphus en 22 de Octubre de 2011, 10:14:50
Hola Suky, Pero la forma que elegí despejando RB0 es correcta o no, y todavía tengo la duda del parpadeo...
Título: Re: como dormir un pic y despertarlo mediante MCLEAR
Publicado por: Suky en 22 de Octubre de 2011, 10:19:32
Hola Suky, Pero la forma que elegí despejando RB0 es correcta o no, y todavía tengo la duda del parpadeo...

Si, con WDT, INT0 y RB4-RB7 trabaja de la forma que deseas. El tema del LCD, podes buscar flex_lcd y ese te permite seleccionar cualquier pin de forma fácil.


Saludos!
Título: Re: como dormir un pic y despertarlo mediante MCLEAR
Publicado por: Delphus en 22 de Octubre de 2011, 10:55:10
Hola suky, usé el lcd_flex y efectivamente ya no tengo que usar el borrado  :P , pero hay otro problema, pues la segunda linea no me aparece, qué podría ser?
la libreria que uso la adjunto

y asi comienza mi programa:

#include <16F88.h>
#FUSES INTRC, NOWDT, NOLVP, NOCPD, NOWRT, NODEBUG, NOPROTECT, NOFCMEN, NOIESO, MCLR, NOBROWNOUT, CCPB3
#use delay(clock=4000000)
#include <flex_lcd.c>
//#use fast_io(B)
#use fast_io(a)
Título: Re: como dormir un pic y despertarlo mediante MCLEAR
Publicado por: Delphus en 23 de Octubre de 2011, 15:01:27
Hola, de todas maneras solo necesito usar la primera linea del lcd  :mrgreen: pero hubiera sido bueno saber la razón.
Gracias a todos por su ayuda.  :P
Título: Re: como dormir un pic y despertarlo mediante MCLEAR
Publicado por: AngelGris en 23 de Octubre de 2011, 18:42:43
  Lo ideal sería ver tu programa entero para tratar de entender el porque no aparece la segunda línea del LCD
Título: Re: como dormir un pic y despertarlo mediante MCLEAR
Publicado por: Delphus en 23 de Octubre de 2011, 20:45:06
Hola AngelGris, les dejo algunas partes del programa donde uso el lcd pues este es más o menos largo:

Código: [Seleccionar]
lcd_init();  lcd_gotoxy(1,1); lcd_putc("Presiona menu "); lcd_gotoxy(2,2); lcd_putc("Bienvenido ");
Código: [Seleccionar]
printf(lcd_putc,"%i%i",dm,um);
Código: [Seleccionar]
printf(lcd_putc,"minutos  %i",posic);
o sea, no he cambiado nada, antes de cambiar la libreria la segunda linea funcionaba sin problemas pero al cambiarla por el lcd_flex, no la muestra.
Saludos

Título: Re: como dormir un pic y despertarlo mediante MCLEAR
Publicado por: MerLiNz en 23 de Octubre de 2011, 21:49:23
creo que esa libreria no es compatible con el printf, lo que tienes en el printf es lo que no te funciona?? Si es asi, es por eso.
Título: Re: como dormir un pic y despertarlo mediante MCLEAR
Publicado por: AngelGris en 23 de Octubre de 2011, 21:50:16
  ¿Probaste modificando la línea que define el tipo de LCD? ¿Usar el tipo 2, ya que indicaría que se utiliza un LCD de 2 lineas?
Título: Re: como dormir un pic y despertarlo mediante MCLEAR
Publicado por: Delphus en 24 de Octubre de 2011, 08:28:21
Tienes razón AngelGris, parece que debo modificar la linea 10

Código: [Seleccionar]
#define lcd_type 0 // 0=5x7, 1=5x10, 2=2 lines
ponerle tipo 2, más tarde pruebo pues estoy fuera de casa.
La función printf tampoco la veo en esta librería solo veo la putc ,pero aun así printf funciona y me permite darle formato a las cadenas.
Título: Re: como dormir un pic y despertarlo mediante MCLEAR
Publicado por: Suky en 24 de Octubre de 2011, 09:22:49
La función printf tampoco la veo en esta librería solo veo la putc ,pero aun así printf funciona y me permite darle formato a las cadenas.

Printf utiliza la función lcd_putc para "sacar" el texto formateado. Y hay que colocar 2 en la linea que indicas para tener 2 lineas.


Saludos.
Título: Re: como dormir un pic y despertarlo mediante MCLEAR
Publicado por: Delphus en 24 de Octubre de 2011, 18:47:54
Ya probé modificando esa linea y efectivamente ya puedo ver la segunda linea del lcd, gracias por su ayuda  :P
Título: Re: como dormir un pic y despertarlo mediante MCLEAR
Publicado por: Suky en 24 de Octubre de 2011, 19:16:59
(http://smilies-gifs.com/aplaudir/4aplaudir.gif)