Autor Tema: Display POV con control infrarojo  (Leído 2249 veces)

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

Desconectado jays0n914

  • PIC10
  • *
  • Mensajes: 3
Display POV con control infrarojo
« en: 13 de Febrero de 2015, 13:17:37 »
Hola a todos, estoy realizando un proyecto con el PIC 16F628A el cual consiste en reproducir varios mensajes en un display POV controlados por unos pulsadores que están en un control remoto, hasta ahora lo que he hecho es lo siguiente...

Código: [Seleccionar]
//RECEPTOR
#include <16F628A.h>

#fuses XT, NOWDT, NOPROTECT            //Protecciones               

#use delay(clock=4000000)              //Frecuencia del cristal oscilador 4MHz

#byte PIR1=0x0C

#byte porta=0x05
#byte portb=0x06

#byte trisb=0x86
#byte trisa=0x85

#byte TRISA = getenv("SFR:TRISA")
#byte TRISB = getenv("SFR:TRISB")

/********************** Prototipos de las funciones ***************************/

void main (void);             //función principal
void ccp1_int(void);          //captura de la señal de control
void message_default(void);
void message_1(void);
void message_2(void);
void message_3(void);
void mantenersenal(void);

/******************** Variables para captura de señal *************************/

int1 nuevopulso=0;            //Entra otro pulso para lectura
int16 TFB=0,TFS=0,TF=0;       //Tiempo flancos
float semiperiodo=0.0;        //Valor semiperiodo de la señal de control
int1 cambio=0;                //Control flanco subida o bajada del impulso leido

int pulsado, pulsado2, mensaje1, mensaje2, mensaje3, mantener_senal=0;

/******************************************************************************/
/********************* FUNCIÓN LECTURA SEÑAL DE CONTROL ***********************/
 
#int_ccp1                           //LLamada por interrupción flanco en RC2

void ccp1_int()
{
   if(cambio==0) //Si es flanco de subida...
   {                   
      TFS=CCP_1;                    //Carga  en valor flanco subida valor registro ccpr1
      setup_ccp1(CCP_CAPTURE_FE);   //Configuración modo captura en flanco de bajada
      cambio=1;                     //Próximo flanco debe ser de bajada
   }
   else //Si es flanco de bajada...
   {                           
      TFB=CCP_1;                    //Carga  en valor flanco bajada valor registro ccpr2
      setup_ccp1(CCP_CAPTURE_RE);   //Configuración modo captura en flanco de subida
      cambio=0;                     //Próximo flanco debe ser de subida
     
      if(nuevopulso==0) //¿Fin de pulso?
      {
         nuevopulso=1;              //Pulso finalizado.
      }
   }
   if(nuevopulso==1) //Finalizado el pulso leido se calcula su valor.
   {           
      TF=(TFB-TFS);              //Valor entre flanco de subida y bajada.
      semiperiodo=TF/1000;       //Valor semiperiodo leido en ms
      nuevopulso=0;              //Listo para recibir nuevo semiperiodo
 
      if (semiperiodo<3&&semiperiodo>1)  //Si semiperiodo entre 1 y 3 ms...
      {     
         mensaje1+=1; 
      }

      mantenersenal();
      if (mensaje1>6) //...se asegura con 6 ciclos y ejecuta mensaje 1
      {
         message_1();
      }     
      if (semiperiodo<6&&semiperiodo>3) //Si semiperiodo entre 3 y 6 ms...
      {
         mensaje2+=1;
      }

      mantenersenal();
      if (mensaje2>6) //...se asegura con 6 ciclos y ejecuta mensaje 2
      {
         message_2();   
      }
      if (semiperiodo<9&&semiperiodo>6) //Si semiperiodo entre 6 y 9 ms...
      {
         mensaje3+=1; 
      }
      mantenersenal();
      if (mensaje3>6) //...se asegura con 6 ciclos y ejecuta mensaje 3
      {
         message_3();         
      }
     
   }
   pulsado=pulsado+1;                  //Controla que se esta recibiendo señal
   
}
 
/******************************************************************************/
/*************************** FUNCIÓN PRINCIPAL ********************************/

void main()
{   
   trisb=0b00001000;             //Puerto B definición de entradas y salidas
 
   setup_ccp1(CCP_CAPTURE_RE);  //Configuración modo captura en flanco de subida
   
   enable_interrupts(INT_CCP1); //habilitación interrupción modo comparación
   enable_interrupts (GLOBAL);
   
   while (TRUE)
   {
      delay_ms(50);
      if (pulsado>pulsado2) //Detecta que se producen pulsos...
      {
         pulsado=pulsado2;   
      }
      else  //...sino enciende el mensaje por defecto
      {
         message_default();                             
         mensaje1=mensaje2=mensaje3=0;
      }
   }
}

void message_default()
{
   trisb=0x00;
   //message default
}

void message_1()
{
   trisb=0x00;
   //mensaje 1
}

void message_2()
{
   trisb=0x00;
   //mensaje 2
}

void message_3()
{
   trisb=0x00;
   //mensaje 3
}

void mantenersenal()
{
   //¿...?
}


Lo que hace es recibir una frecuencia estipulada y reproducir un mensaje cuando se esta presionando un interruptor.

Mi pregunta es, al momento de recibir la señal en el pic receptor puedo mantenerla en el para que el mensaje siga reproduciéndose indefinidamente hasta el momento de presionar otro interruptor cambiar de frecuencia y sin tener que estar apuntando y presionando  desde el emisor el pulsador, osea solamente con un clic tener el mensaje en pantalla, habia pensado en una función "mantenersenal " donde antes de reproducir el mensaje guarda la señal pero la verdad nose si funcionara o bueno nose como programarla (tengo muy pocos conocimientos en la programación de microcontroladores), ojala me puedan ayudar muchas gracias  :oops:  :oops:  :oops:




Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Display POV con control infrarojo
« Respuesta #1 en: 14 de Febrero de 2015, 02:17:03 »
No entiendo cual es el objetivo, tu programa no tiene mucho para decir mas que detectar una señal y en base al tiempo del pulso "muestre" un mensaje.
Imagino que si vos en ninguna parte haces que muestre otro mensaje ( al no tener presionado nada ) entonces el mensaje seguira siendo el mismo.

Para que guardar el mensaje ese es el tema..

Tu rutina de interrupcion podria marcar en que estado esta ( si en mensaje 1, mensaje 2, mensaje 3, mensaje 4 , etc ).
Si presiono una ves aumenta el estado a 1 ( mensaje 1 ), presiono nuevamente y el estado se incrementa a 2 (mensaje 2),  y asi hasta llegar al ultimo y comenzar de nuevo. En esto atendes la interrupcion rapidamente ( incrementas una variable nomas ) y salis. Que es el objetivo de una interrupcion, atenderla lo mas rapido posible por si se necesita atender otra.

Mientras tu programa principal hace la secuencia de mostrar el mensaje continuamente, pero dependiendo del "estado" que este debido a las interrupciones ahi mostras el mensaje que se debe. un switch case estado y cada opcion con su mensaje y el default para cuando vale 0 o algun otro valor no contemplado. De esa forma no guardas la señal de entrada sino que vas guardando en que estado ( si lo pensas como una maquina de estados ) esta tu programa. De no tocarse nada se quedaria en ese estado definido, por lo tanto el mensaje seguira siendo el mismo.

Al comienzo pones la variable estado en 0, asi comienza por el default.

Desconectado jays0n914

  • PIC10
  • *
  • Mensajes: 3
Re: Display POV con control infrarojo
« Respuesta #2 en: 19 de Febrero de 2015, 01:57:41 »
No entiendo cual es el objetivo, tu programa no tiene mucho para decir mas que detectar una señal y en base al tiempo del pulso "muestre" un mensaje.
Imagino que si vos en ninguna parte haces que muestre otro mensaje ( al no tener presionado nada ) entonces el mensaje seguira siendo el mismo.

Para que guardar el mensaje ese es el tema..

Tu rutina de interrupcion podria marcar en que estado esta ( si en mensaje 1, mensaje 2, mensaje 3, mensaje 4 , etc ).
Si presiono una ves aumenta el estado a 1 ( mensaje 1 ), presiono nuevamente y el estado se incrementa a 2 (mensaje 2),  y asi hasta llegar al ultimo y comenzar de nuevo. En esto atendes la interrupcion rapidamente ( incrementas una variable nomas ) y salis. Que es el objetivo de una interrupcion, atenderla lo mas rapido posible por si se necesita atender otra.

Mientras tu programa principal hace la secuencia de mostrar el mensaje continuamente, pero dependiendo del "estado" que este debido a las interrupciones ahi mostras el mensaje que se debe. un switch case estado y cada opcion con su mensaje y el default para cuando vale 0 o algun otro valor no contemplado. De esa forma no guardas la señal de entrada sino que vas guardando en que estado ( si lo pensas como una maquina de estados ) esta tu programa. De no tocarse nada se quedaria en ese estado definido, por lo tanto el mensaje seguira siendo el mismo.

Al comienzo pones la variable estado en 0, asi comienza por el default.


Hola KILLERJC gracias por tu ayuda, igual hay algunas cosas que no entiendo porque en un 90 % no hice el codigo, este fue creado con el fin de encender 3 leds por infrarojo y yo lo tome, transformandolo a mi conveniencia, pero en estos dias trabajandole tengo un 95% el codigo listo pero me surje otro problema, nose si me fallara la logica o no se me ocurre mas, pero no logro hacer mucho, haciendo la simulacion en proteus arroja una infinidad de errores donde nose si sera problema del codigo o algun problema adicional, si me pudieras echar una manito te lo agradeceria mucho, ahi agrego los codigos y la simulacion, cualquier sugeriencia sera bienvenida  :) :) :)

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re: Display POV con control infrarojo
« Respuesta #3 en: 19 de Febrero de 2015, 03:33:21 »
yo intentaría fabricarme cuanto antes el hardware, ya que simularlo en proteus en un caso como el de un pov te va a servir de poco, ya cuando lo montes y este girando el comportamiento mecánico condicionara tu programación. Por cierto creo que estas programando en CCS, yo cuando realice mi POV (uno de los primeros proyectos que hice) lo realice en CCS, fue el ultimo proyecto que hice en CCS, acabe tan asqueado... ten en cuenta que vas a necesitar una herramienta para debuguear tu código, si utilizas bien el debuguer no te hace falta probar tu programa en proteus.

es una opinión personal, si le preguntas a otro quizá te diga que hagas lo que hagas lo pases por proteus en mi caso no lo utilizo nunca y no me va nada mal.

he aqui mi pov: http://www.todopic.com.ar/foros/index.php?topic=44114.0

un saludo
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Display POV con control infrarojo
« Respuesta #4 en: 19 de Febrero de 2015, 10:01:48 »
me gusto mucho tu POV juaperser, yo realmente nunca hice uno, pero si tuviera que hacerlo creo que necesitaria una velocidad constante al girarlo y un detector cuando da una vuelta. asi de esa forma enviarlo en el momento y la imagen queda estatica.

Sin ese detector tendria el efecto de rotar al errarle a la velocidad. Pero lo de jays0n esta realmente en una etapa muy temprana.

Lo digo por que su aplicacion de infrarojo es parece mas algo realizado para un boton que realmente un infrarojo, donde normalmente mandas un codigo y no estas pendiente del ancho de pulso, ademas es mandarlo 1 ves o mientras se presiona el boton para enviarlo, y no contienuamente. Ahi veo un fallo en lo que es la aplicacion del infrarojo , ya que si el POV esta girando puede cortar la señal y recibir cualquier cosa.

Eso le influye en el receptor en el cual esta midiendo el ancho de pulso, y mostrando luego un "mensaje" , salida fijo.

Le falta todo el hardware como bien decis que es parte del programa luego.

jays0n:
Considero que es un proyecto demasiado ambicioso para alguien que no tiene planificado el hardware / ni tampoco que programar para realizarlo o el uso fluido del CCS ( ya que me dijiste que el 90% del codigo es sacado de otro lado ).
No es para desilucionarte siplemente hubiera encarado los puntos por otro lado.
Primero realizar todo el hardware ( o tenerlo en mente del POV )
Luego hacer cosas simples como prender leds sin necesidad de botones externos. O con botones conectados directamente al PIC
Una ves que la imagen queda perfecta, recien ahi incorporar el control que quieras y aumentas la complejidad de imagenes a realizar.

En fin siempre de menos a mas de esa forma te aseguras que lo que tenes hecho anda y no cuando escribis todo de golpe no anda nada y no sabes que pasa.
« Última modificación: 19 de Febrero de 2015, 10:11:37 por KILLERJC »

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re: Display POV con control infrarojo
« Respuesta #5 en: 19 de Febrero de 2015, 12:42:57 »
Gracias me alegro que te guste, si tiene un detector de proximidad, el tipico integrado con un led y un optotransistor, y así como tu muy bien dices si escribes el mensaje cada vez que pasa el mensaje queda quieto, si no le pones el detector, no es que vaya girando es que acaba volviendose erratico y falla la imagen, yo para que se moviera, lo pintaba por columnas, cuando pasaba por 0 pintaba la primera columna de los 48 LED, a la siguiente vuelta desplazaba esa columna dibujandola de nuevo pero desplazada un lugar y pintaba también la columna 2, a la 3ª vuelta desplazas esas 2 y pintas la 3º y así va girando la imagen hasta que se pintaban las 232 columnas, que son las que se necesitaban para cerrar la esfera con esa velocidad de motor y vuelta a empezar. Como lo lleve a una feria del estudiante, para que no estuviera todo el rato funcionando, le puse un conmutador de mercurio para que se apagara cuando estaba parado y cada minuto el motor se ponia a girar y se encendía automaticamente con la fuerza centripeta, estaba un rato encendido y luego se paraba. y así podía estar yo a mi bola por la feria xd, pero tuve que ponerle un protector de metacrilato por que la gente metia hasta la cabeza -.-

jays0n914 los pasos que te ha puesto KILLERJC también creo que son los correctos, de esta manera avanzaras resolviendolo todo poco a poco de otra manera te puedes encontrar con problemas muy curiosos.

un saludo
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Display POV con control infrarojo
« Respuesta #6 en: 19 de Febrero de 2015, 13:36:40 »
Perdon juan, es que yo pense que mostrabas todas las columnas en una sola vuelta por eso asumi que si empezabas en otro lado y no en el mismo punto la imagen solo lograria un efecto de movimiento. Si tuvieras una velocidad constante en el giro y estuviera programado para esa velocidad imagino que eberia andar y no producir ningun error de imagen. Lo que aumenta la complejidad al querer una velocidad constante.

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re: Display POV con control infrarojo
« Respuesta #7 en: 19 de Febrero de 2015, 14:34:24 »
si el problema es que el motor lo saque de una impresora y no era muy bueno y dependiendo de la tensión, el motor giraba mas rapido o mas lento y como la esfera esta cerrada, si iva mas lento se quedaba un hueco en la esfera y si iva mas rapido se solapaba y parpadeaba, por eso le puse el paso por 0 para calcular la velocidad que tenia en cada momento, pero si , si tienes una velocidad constante es cierto lo que dices se dibujaria sin parpadeos ni problemas, o deberia
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado jays0n914

  • PIC10
  • *
  • Mensajes: 3
Re: Display POV con control infrarojo
« Respuesta #8 en: 19 de Febrero de 2015, 16:36:22 »
Muchas gracias, están en lo cierto lo diseñare tan sencillo que lo pueda hacer funcionar, luego ya le agregare los detalles complejos. Una ultima duda para despedirme, veo que los diseños de este display lleva un sensor de vuelta para iniciar a dibujar que lo que he mirado puedo ser un sensor hall o un fototransistor, pero no tengo idea como puedo llevarlo acabo en la parte de programación, nose si alguna persona me puede dar alguna idea, muchas gracias  :oops:

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Display POV con control infrarojo
« Respuesta #9 en: 19 de Febrero de 2015, 16:46:53 »
cualqueira te va a dar un pulso en un pin, simplemente detecta el flanco positivo para saber que paso por ahi y listo.
No recuerdo el 16f628 si en todos los RB poseen deteccion de flanco pero estoy mas que seguro que en RB0 si lo tiene.


 

anything