Autor Tema: Persistence of vision (POV) pido Orientacion  (Leído 2237 veces)

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

Desconectado Byakuya

  • PIC10
  • *
  • Mensajes: 38
Persistence of vision (POV) pido Orientacion
« en: 09 de Octubre de 2015, 10:18:49 »
Hola amigos del foro, hace ya algún tiempo elabore una versión de un "pov" este mi primer diseño cuenta con 4 registros 74hc595 conectados en serie, un microcontrolador pic18f4550, 32 leds de color azul un sensor infrarrojo receptor fijado a la placa "aun no funcionando" y este a su ves en un motor de ventilador de sala como si fuese una aspa con un diodo emisor, quien pudiese orientarme a resolver el problema que la imagen este moviéndose y no se encuentre fija debido a que aun no agrego código para detectar el cruce por cero por razones que no me encuentro totalmente seguro de como implementarlo, amigos le estaría muy agradecido si alguno de ustedes tuviese un tiempo libre para darme alguna idea algún consejo. la idea final es poder visualizar alguna imagen alojada en la memoria interna de dicho micro. expongo el código hasta ahora escrito en ccs.


#INCLUDE  <18F4550.h>
#FUSES    PLL5, CPUDIV1, USBDIV, HSPLL, NOFCMEN, NOWDT, NOPROTECT, NOIESO, PUT
#FUSES    NOBROWNOUT, VREGEN, NOWDT, NOSTVREN, NOLVP, NODEBUG, NOPROTECT, NOCPB
#FUSES    NOXINST, NOWRT, NOEBTRB, MCLR, NOLPT1OSC, NOPBADEN, STVREN, NODEBUG
#USE      DELAY(CLOCK = 48MHZ)

#DEFINE CLOCK         PIN_D1       // SHCP RELOJ PIN 11
#DEFINE STROBE        PIN_D2       // STCP STROBE PIN12
#DEFINE DS            PIN_D3       // DATOS PIN 14


#INCLUDE ".\LIBRERIAS\CORAZON.h"

//                         ENVIO POV
//*****************************************************************************Ç

TYPEDEF UNION
{
    INT32 VALOR;
    STRUCT
    {
        INT8 MB;
        INT8 UB;
        INT8 HB;
        INT8 LB;
    };
}UINT322;     

TYPEDEF UNION
{
 INT8 COLOR[4];
 STRUCT
 {
  UINT322 AZUL;
 };
}TIRA;

TIRA LEDS;

VOID SEND_DATA (VOID)
{
 INT8 I,J,BITS;
 FOR(I = 0;I < 12;I++)
 {
  BITS = 0x80;
  FOR(J = 0;J < 8;J++)
  {
   IF(LEDS.COLOR & BITS)
    OUTPUT_HIGH(DS);
   ELSE
    OUTPUT_LOW(DS);
   OUTPUT_LOW(CLOCK);
   OUTPUT_HIGH(CLOCK);
   BITS >>= 1;
  }
 }
 OUTPUT_LOW(STROBE);
 OUTPUT_HIGH(STROBE);
}

VOID MAIN (VOID)
{
FOR(;;)
{
 FOR(I = 0; I < 190; I++) {   //imagen 760 pixeles
     TEMP = 4*I;
     FOR(J = 0; J < 4; J++)   //envio información a registros
         LEDS.COLOR[J] = IMAGEN[TEMP + J];
         SEND_DATA();         //envio datos
         DELAY_US(110);       //ESTO POR QUE NO SE USA INTERRUPCION EXTERNA PERO PRONTO SE UTILIZARA LA CONFIGURACION
//EL SENSOR INFRARROJO ESTA COLOCADO EN PIN_B2 SERIA #INT_EXT2 VOID ISR_EXT2() {}
     }
  }
}

Y LA IMAGEN CORAZON.H
esta se encuentra estructurada en un arreglo de tipo

CONST UNSIGNED INT8 CORAZON[] =
{
0b00000111,0b11111111,0b11111111,0b11111111,
0b00000111,0b11111111,0b11111111,0b11111111,
0b00000111,0b11111111,0b11111111,0b11111111,
0b00000011,0b11111111,0b11111111,0b11111111,
0b00000011,0b11111111,0b11111111,0b11111111,
0b00000001,0b11111111,0b11111111,0b11111111,
0b00000001,0b11111111,0b11111111,0b11111111,
0b00000000,0b11111111,0b11111111,0b11111111,
0b00000000,0b11111111,0b11111111,0b11111111,
0b00000000,0b01111111,0b11111111,0b11111111,
0b00000000,0b01111111,0b11111111,0b11111111,
0b00000000,0b00111111,0b11111111,0b11111111,
0b00000000,0b00111111,0b11111111,0b11111111,
0b00000000,0b00011111,0b11111111,0b11111111,
0b00000000,0b00011111,0b11111111,0b11111111,
0b00000000,0b00011111,0b11111111,0b11111111,
0b00000000,0b00001111,0b11111111,0b11111111,
0b00000000,0b00001111,0b11111111,0b11111111,
0b00000000,0b00001111,0b11111111,0b11111111,
0b00000000,0b00000111,0b11111111,0b11111111,
0b00000000,0b00000111,0b11111111,0b11111111,
0b00000000,0b00000111,0b11111111,0b11111111,
0b00000000,0b00000111,0b11111111,0b11111111,
0b00000000,0b00000111,0b11111111,0b11111111,
0b00000000,0b00000011,0b11111111,0b11111111,
0b00000000,0b00000011,0b11111111,0b11111111,
0b00000000,0b00000011,0b11111111,0b11111111,
0b00000000,0b00000011,0b11111111,0b11111111,
0b00000000,0b00000011,0b11111111,0b11111111,
0b00000000,0b00000011,0b11111111,0b11111111,
0b00000000,0b00000011,0b11111111,0b11111111,
0b00000000,0b00000011,0b11111111,0b11111111,
0b00000000,0b00000011,0b11111111,0b11111111,
0b00000000,0b00000011,0b11111111,0b11111111,
0b00000000,0b00000011,0b11111111,0b11111111,
0b00000000,0b00000111,0b11111111,0b11111111,
0b00000000,0b00000111,0b11111111,0b11111111,
0b00000000,0b00000111,0b11111111,0b11111111,
0b00000000,0b00000111,0b11111111,0b11111111,
0b00000000,0b00001111,0b11111111,0b11111111,
0b00000000,0b00001111,0b11111111,0b11111111,
0b00000000,0b00001111,0b11111111,0b11111111,
0b00000000,0b00011111,0b11111111,0b11111111,}etc etc.

y bueno eso es todo. si alguno de ustedes amigos pudiese colaborar. gracias por su tiempo invertido. y estare subiendo la versión final conforme vallamos avanzando.

No puedo adjuntar imágenes. solicita url: direcciones electrónicas solo YouTube..
aquí deje el video.. http://www.todopic.com.ar/foros/index.php?topic=39656.msg371040#msg371040
 

« Última modificación: 09 de Octubre de 2015, 11:01:51 por Byakuya »

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re:Persistence of vision (POV) pido Orientacion
« Respuesta #1 en: 09 de Octubre de 2015, 12:18:52 »
Bueno, antes de nada decirte que no me he leido el código, por que ahora mismo no tengo mucho tiempo y hace mucho también que no toco CCS,
mi primer proyecto fue un POV esferico, que supongo que has visto por el foro, y estaba hecho en CCS, fue la ultima cosa que hice en CCS  :D :D


bien, por lo que he entendido, has tenido un problema de diseño (o lo que tu crees que es un problema de diseño), al no poner el sensor para el paso por cero en un pin para la interrupción externa ¿me equivoco?

pues no hay problema por eso, tu problema esta aqui:

Código: [Seleccionar]
SEND_DATA();         //envio datos
         DELAY_US(110);       //ESTO POR QUE NO SE USA INTERRUPCION EXTERNA PERO PRONTO SE UTILIZARA LA CONFIGURACION
//EL SENSOR INFRARROJO ESTA COLOCADO EN PIN_B2 SERIA #INT_EXT2 VOID ISR_EXT2() {}[/code


tienes que olvidarte de los delay, los delay en una aplicación como esta, te van a llevar por el camino de la amargura, y siempre hay que evitarlos.
para solucionar tu problema del sensor del paso por 0, debes revisar ese pin en el bucle principal while(1) (en tu caso for(;;))
el micro es lo suficientemente rápido para revisar ese pin cientos de veces en lo que el motor da una vuelta, pero no le es posible hacerlo si tiene delays, ya que mientras se ejecuta el delay, el micro no hace nada, es decir tu micro cada vez que pasa por el delay esta 110us, sin enterarse de nada, si pasa por 0 no se va a enterar.

la solución es revisar el pin en el bucle while, y no tener esperar ni funciones que retrasen el código, lo ideal seria tenerlo como interrupcion externa pero ya que no lo has hecho, yo creo que así lo puedes solucionar, aunque existen probabilidades de que se desincrónice, depende de como de libre vaya el micro, de todas formas lo suyo seria arreglar el hardwar. ¿es casero? lo has mandado a fabrica o como lo has hecho?

otro consejo, no intentes dibujar nada al principio, arregla lo del paso por 0 y haz que encienta todos los led cuando pase por 0, los dejas encendido unos us y los apagas, de esta manera dibujaras una linea de led en el paso por 0.

Esa es tu primera misión y lo primero que tienes que conseguir.

lo de dibujar viene luego, y si quieres que la imagen se mueva, sin perder sincronia, es decir, como hace mi pov esferico, que se mueve y no se queda la imagen estática:

http://www.todopic.com.ar/foros/index.php?topic=44114.0

pero lo primero es poder pintar un sitio fijo, una vez que cumplas esa tarea puedes avanzar y hacer mas cosas.

un saludo


« Última modificación: 09 de Octubre de 2015, 15:09:26 por juaperser1 »
Visita mi canal para aprender sobre electrónica y programación:

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

Desconectado Byakuya

  • PIC10
  • *
  • Mensajes: 38
Re:Persistence of vision (POV) pido Orientacion
« Respuesta #2 en: 09 de Octubre de 2015, 12:36:42 »
Gracias por el consejo amigo. no eh respondido tan rápido me estaba leyendo Qt pero ahora mismo me cambio y comienzo a revisar ese detalle. ya escribiré algo cuando todo salga ok. que de echo si ya tiene el sensor infrarrojo colocado, simplemente que no eh incrustado esa parte de código en donde se debe detectar la interrupción externa por eso es que tenia ese delay :).

Modificación para iniciar siempre en una misma posición.

UNSIGNED INT8 J;

#INT_EXT2
VOID INT2_ISR(VOID)
{
 EXT_INT_EDGE(2,H_TO_L);
 FOR(J=0;J<4;J++)
   {
    LEDS.COLOR[J] = 0xFF;
    SEND_DATA();
   }
 EXT_INT_EDGE(2,L_TO_H);
  FOR(J=0;J<4;J++)
   {
    LEDS.COLOR[J] = 0;
    SEND_DATA();
   }
}

y en main
 ENABLE_INTERRUPTS(INT_EXT2);             //HABILITAR INTERUPCION INFRARROJO
 EXT_INT_EDGE(2,L_TO_H);                 //INTERRUPCION EXTERNA
 ENABLE_INTERRUPTS(GLOBAL);             //HABILITAR TODA INTERRUPCION

« Última modificación: 09 de Octubre de 2015, 12:54:19 por Byakuya »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Persistence of vision (POV) pido Orientacion
« Respuesta #3 en: 09 de Octubre de 2015, 18:18:40 »
Las recomendaciones que te puedo dar y que haria a mi gusto:

Personalmente:
- Usar #fast_io , no me gusta nada que CCS decida agregarte instrucciones extras, esto va a ayudar con la velocidad que salen tus datos a los registros de desplazamiento.
- Yo personalmente hubiera usado un SPI por hardware y no uno por software ( si el envio de los datos lo podrias haber realizado por SPI ) Creo que es mas rapido, ya que cada ciclo de reloj interno tendrias un dato, mientras que con los for tal ves se tome mas de un ciclo.

Con esto me aseguraria que los datos se envien lo mas rapido posible. Ahora sigamos analizando el programa. A tu programa lo haria de esta manera:

Código: C++
  1. volatile int *ptrdatos = CORAZON;
  2. volatile bool mostrar_activo;
  3.  
  4.  
  5. void main(){
  6.  
  7.         //Aca configuracion de lo que sea
  8.         set_tris_x();
  9.         mostrar_activo=0;
  10.         activo_interrupciones();
  11.  
  12.         while(1){
  13.                 if(mostrar_activo){
  14.                         if(timer2_OV){
  15.                                 spi_write(*ptrdatos++);
  16.                                 while(spi_activo);
  17.                                 strobe_off();
  18.                                 strobe_on();
  19.                                 Limpio_flag_TMR2();
  20.                                 }
  21.                         }
  22.                 }
  23.                 if(ptrdatos==(CORAZON+760)) {
  24.                         disable_interrupts();
  25.                         mostrar_activo=0;
  26.                         enable_interrupts();
  27.                 }
  28.         }
  29. }
  30.  
  31.  
  32. //Interrupcion de paso por 0, Utilizo el CCP para medir el tiempo entre los pulsos (Alta prioridad asi utiliza los registros sombras/dobles como quieras llamarle)
  33. void ISR_RB0_o_CCP(){
  34.         int Valor_CCP;  // Tiempo entre pulsos
  35.         Valor_CCP = Obtener_CCP();
  36.         set_timer_2(Valor_CCP/95);      // (760/8) Aca preferiria usar un valor multiplo de 2, como 512 pixels, de esa forma queda 64 y  se pierde menos tiempo
  37.         ptr_datos=CORAZON;      //Reinicio lo que tengo que mostrar
  38.         mostrar_activo=1;
  39. }

De esa forma, en el cruce por 0 ocurre lo siguiente:
- Hago que comienze de 0 los datos,
- tomo el tiempo que tardo la ultima vuelta ( tal ves falte agregar una proteccion de la primer vuelta ),
- Procedo a cargar el timer con el valor obtenido, asi ese timer es quien me dicta en el programa principal cuando enviar los datos. Util para un cambio de velocidad!
- Hago que mi puntero a los datos apunte nuevamente al comienzo, es decir llego a 0 y comienza de 0.  (Caso que hizo la vuelta completa y por mal calculo del tiempo no llego a mostrar todo)
- Y habilito al programa principal a mostrar.

En el programa principal:

- Solo pregunto si debo comenzar a mostrar. Si no debo mostrar no hago nada ( podria apagar todo los leds )
- Si debo mostrar pregunto si el timer ya paso ( hay que arreglarlo para el primer dato ) , si paso el tiempo correcto envio datos y activo e latch, y espero nuevamente por el timer
- Si por alguna casualidad se calculo mal el tiempo, quiere decir que se va a enviar todo mas rapido, para eso esta el ultimo if, diciendo que si llego al maximo, que apague el mostrar.

No todo es bueno, hay algunas cosas que deben ocurrir para que esto funcione bien:

- Lo que esta dentro del if(timer2_OV) debe ejecutarse antes que se produzca el overflow del timer2, tambien podrias poner el manejo del latch al comienzo + el while del SPI, de esa forma el latch te queda para el primer valor, se le da mas tiempo al SPI para terminar y retrasa lo menos posible esa parte
- Deberias obtener el valor del CCP mas grande posible, con el menor preescaler disponible, de esa forma al dividirlo tenes una mayor precision, y luego colocarlo en un timer con un preescaler aun menor, vas a tener que adaptarlo aca ( sea multiplicando o no )
- Lamentablemente tu programa debe durar menos de lo que se envian los datos, si por alguna razon esto no ocurre veras una imagen distorsionada. Aunque si tu delay estaba cerca del valor en el que mostrabas cada seccion eso te deja con un muy buen tiempo, en 100us deberias ser capaz de alojar unas 1200 instrucciones. Y al SPI le tomaria creo que 0.66us enviar todo :P (si es que envia a Fosc/4)


A mi gusto, es lo que yo haria. Tiene mas "configuracion" pero intentaria utilizar los modulos hardware completos antes de hacerlo todo por software. Igual sobre gustos es decision de cada uno.
Con respecto a tu programa:

- tenes un delay y es MALO,
- por otro lado tenes un for() para los pixels y digamos que tambien es malo ya que estas obligado a pasar por todos los pixeles antes de comenzar de vuelta, esto lo intente evitar como lo programe, en cada vuelta es posible pararlo, en tu caso deberias agregar 2 condiciones (if + break;) mas para romper los 2 for.
- Tu codigo de interrupcion deberia tardar lo menos posible, no creo que sea prudente enviar datos por SPI por software, ya que lo que haces es que si tarda mucho estarias trabando otra posible interrupcion que venga, tal ves hasta perdiendo una vuelta.

Espero que de algo sirva y no me este equivocando, ahi juanperser ya tiene experiencia realizando uno, asi que el te dira si esta correcto o no lo mio, o estoy diciendo barbaridades.
« Última modificación: 09 de Octubre de 2015, 18:34:37 por KILLERJC »

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re:Persistence of vision (POV) pido Orientacion
« Respuesta #4 en: 09 de Octubre de 2015, 19:04:05 »
Hola KILLERJC creo que hay una confusión, o yo me he perdido un poco.

¿para que el SPI por hardware? el 74hc595 no funciona por SPI, o es para otra cosa de lo que estas hablando, es alguna memoria o algo?

con todo lo demás que dices estoy de acuerdo.

Solo que cuando yo lo hice, mi motor (que mas tarde descubrí que era la fuente de alimentación) variaba bastante la velocidad, no era muy constante en el giro, y tuve que calcular el tiempo de encendido de los LED mediante prueba y error, ardua tarea.... ademas ni que decir que era el primer proyecto que hacia, y encima en CCS, que por cierto las bariables bit funcionan bien siempre y cuando no las metas en una matriz,( superbug de CCS ya que se lo traga, pero no funciona, no se si lo habrán corregido a dia de hoy ). Ademas para el dibujo de la tierra cogí un mapa de la tierra y lo dividí en una matriz de 48x232, 0 agua, 1 tierra, (apagado encendido) esto da 11.136 ceros y unos que metí a mano en la memoria del PIC, estaba metido con calzador.

no se si buscar el software, que ni siquiera se si lo tengo todavía, por que es una basura  :D :D pero bueno funciona y todos empezamos haciendo chapuzas, pero creo que te liaria mas de lo que te ayudaría. pero si quieres lo busco, aunque no te prometo tenerlo.

otra cosa :

Citar
y en main
 ENABLE_INTERRUPTS(INT_EXT2);             //HABILITAR INTERUPCION INFRARROJO
 EXT_INT_EDGE(2,L_TO_H);                 //INTERRUPCION EXTERNA
 ENABLE_INTERRUPTS(GLOBAL);             //HABILITAR TODA INTERRUPCION

¿el problema no era que no tenias el sensor infrarrojo en un pin que no tenia interrupción externa?

del otro post

Citar
la interrupción externa del microcontrolador esta siendo utilizada por la memoria, en este caso los pines B0 (Pin8) y B1 (pin9) de la versión smd, grave error en el diseño

un saludo
« Última modificación: 09 de Octubre de 2015, 19:07:28 por juaperser1 »
Visita mi canal para aprender sobre electrónica y programación:

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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Persistence of vision (POV) pido Orientacion
« Respuesta #5 en: 09 de Octubre de 2015, 19:14:32 »
Citar
Hola KILLERJC creo que hay una confusión, o yo me he perdido un poco.

¿para que el SPI por hardware? el 74hc595 no funciona por SPI, o es para otra cosa de lo que estas hablando, es alguna memoria o algo?

Por que lo podes hacer por SPI, es un SPI. Fijate el codigo y mira la forma de onda de un SPI:

Código: C++
  1. BITS = 0x80;
  2.   FOR(J = 0;J < 8;J++)
  3.   {
  4.    IF(LEDS.COLOR & BITS)
  5.     OUTPUT_HIGH(DS);
  6.    ELSE
  7.     OUTPUT_LOW(DS);
  8.    OUTPUT_LOW(CLOCK);
  9.    OUTPUT_HIGH(CLOCK);
  10.    BITS >>= 1;
  11. }

Ademas que el SPI es un registro de desplazamiento :P, Lo unico feo es el problema del strobe, el cual tenes que habilitarlo luego de enviado, y es por eso que esta el while(spi)

EDIT:
Citar
Mirando el datasheet: Tal ves se podria hacer el con CS tambien para el strobe, ya que este se maneja por flancos y no nivel y al final de lo enviado solo se necesita un pulso ascendente, si el CS se pone a 0 al comienzo del dato enviado y al final se pone a 1 estarias haciendo el strobe, no importa el estado en que quede, ya que lo unico que importa es el flanco.
Y asi hacer TODO con el SPI, solo esperar que se envie todo.

Hay muchas librerias asi, que tienen implementado un SPI por software, tal ves es para que la libreria sea general para todos los PIC y no uno en cuestion. Por ejemplo cuando busque sobre el Touch de un TFT me encontre que era un SPI, ... si.. yo teniendo un SPI con una FIFO de 16 posiciones , mientras estaba haciendolo por software con demoras xD
« Última modificación: 09 de Octubre de 2015, 19:27:16 por KILLERJC »

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re:Persistence of vision (POV) pido Orientacion
« Respuesta #6 en: 09 de Octubre de 2015, 19:41:26 »
cierto, acabo de revisar el datasheet del 74hc595 y se podría hacer por SPI por hardware,

pero lo malo es esto:

Código: [Seleccionar]
#DEFINE CLOCK         PIN_D1       // SHCP RELOJ PIN 11
#DEFINE STROBE        PIN_D2       // STCP STROBE PIN12
#DEFINE DS            PIN_D3       // DATOS PIN 14

si tiene estos pines definidos supongo que ya tiene el hardware hecho y esos evita que pueda hacer el SPI por hardware, a menos que cambie el hardware y ajuste los pines, al igual que sigo esperando mi pregunta del post anterior.

Citar
la interrupción externa del microcontrolador esta siendo utilizada por la memoria, en este caso los pines B0 (Pin8) y B1 (pin9) de la versión smd, grave error en el diseño

esto lo vi en el otro post, pero ahora parece que agrega al código la interrupción externa, así que lo mismo el hardware esta en una protoboard o algo, y esta en fase de diseño, de ser así seria ideal.

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

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

Desconectado Byakuya

  • PIC10
  • *
  • Mensajes: 38
Re:Persistence of vision (POV) pido Orientacion
« Respuesta #7 en: 09 de Octubre de 2015, 20:04:53 »
Muchas gracias por darle seguimiento, ideas consejos, juaperser1 si de echo en esta sección:

#DEFINE CLOCK        PIN_D1         // SHCP RELOJ PIN 11
#DEFINE STROBE      PIN_D2        // STCP STROBE PIN12
#DEFINE DS             PIN_D3       // DATOS PIN 14

el hard ya esta instalado seria cosa de cortar unir pistas etc cosa que le veo será para la siguiente versión si algún día me planteo llevarla acabo por que lo mas seguro es k en la siguiente versión se implementen leds inteligentes y eliminar los registros para hacer mucho mas liviano y menos material, pues en un principio podría decirse que yo estaba segado de los requerimientos de un sistema como el que pretendo realizar, ahora no se si al simplificarlo y ya no ser un dispositivo RGB, sino monocromático, poder controlar un color a la vez por ejemplo yo mostraba la imagen en color verde después corría un timer1 y realizaba un retardo de 10 segundos y después cambiaba a un tono rojo y después a un azul, pudiendo pues observar solo en un solo color, la imagen o texto. el hard lo modifique cortando unas pistas :) juju que bruto. pero bueno lo creí indispensable para así poder detectar el cruce por cero del infrarrojo configurando la detección de la fuente de interrupción del micro pin_b2 si va con flanco alto -> bajo o viceversa. yo espero que el micro tenga suficiente tiempo para poder enviar y hacer las cosas por software digámoslo así, la detección de cruce no la estaría tendiendo al 100% podría hacerse alguna especie de monitorear solo cada determinado tiempo así podríamos ahorrar tiempo aunque perderíamos estabilidad. bueno son ideas no se. ustedes han trabajado mucho mas tiempo y bueno soy novatillo en ese sentido.

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re:Persistence of vision (POV) pido Orientacion
« Respuesta #8 en: 09 de Octubre de 2015, 20:38:22 »
De acuerdo, entonces tienes el paso por 0 por interrupción externa, pero para el  74hc595 no tienes los pines del SPI, eso te deja solo la posibilidad de hacerlo por software, aunque como dice killer por hardware iría mejor.

pero de todas maneras teniendo el paso por cero por software, eliminas problemas de que puedas perder algún paso por cero por hacerlo por software.

intenta pintar una sola linear, en el paso por cero, sigo pensando que eso es lo primero que debes conseguir.

un saludo

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

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

Desconectado Byakuya

  • PIC10
  • *
  • Mensajes: 38
Re:Persistence of vision (POV) pido Orientacion
« Respuesta #9 en: 09 de Octubre de 2015, 22:14:24 »
De acuerdo, si el cruce por cero esta por hardware, el envío de información 74595 vía software.
Por el momento solo hice,

//detectando flancos para pintar una sola línea siempre al pasar por el cruce

#int_ext2
void isr_ext2(void)
{
   ext_int_edge(2,h_to_l);   //detectando flanco
          leds.azul = 0xFF;   //todos unos
          send_data();        //envio info
   ext_int_edge(2,l_to_h);
         leds.azul = 0x0;   //todos cero
        send_data();        //envio info
}

void main (void)
{
 enable_interrupts(INT_EXT2);             //HABILITAR INTERUPCION INFRARROJO
 ext_int_edge(2,L_TO_H);                 //INTERRUPCION EXTERNA flanco ascendente
 enable_interrupts(GLOBAL);            //HABILITAR INTERRUPCION
 led.azul.mb  = 0;                          // Y asi para todos los registros
 while(true);
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Persistence of vision (POV) pido Orientacion
« Respuesta #10 en: 10 de Octubre de 2015, 08:29:36 »
Bueno veo que el hardware lo limita.. No pense que ya lo tenia como version final.

De todas formas las ideas que escribi, lo que busque con mi codigo es a lo que debes apuntar.
No vas a usar el SPI pero podes hacerlo por software.

Código: C++
  1. #int_ext2
  2. void isr_ext2(void)
  3. {
  4.    ext_int_edge(2,h_to_l);   //detectando flanco
  5.           leds.azul = 0xFF;   //todos unos
  6.           send_data();        //envio info
  7.    ext_int_edge(2,l_to_h);
  8.          leds.azul = 0x0;   //todos cero
  9.         send_data();        //envio info
  10. }

Creo que te estas confundiendo, la idea de obtener el cruce por  cero es por 2 cosas:
- es para saber cuando debes empezar a escribir
- Y para obtener el tiempo entre vueltas, ya que nunca es exacto, y con esto podes al menos basarte en la ultima vuelta. ( O en las ultimas 2,4,8 etc ).

No para que envies los datos por la interrupcion, ademas entras a la interrupcion y le cambias el flanco sin sentido, ya que salis con bajo_a_alto, entra, lo cambias a alto_a_bajo, escribis el resgistro, cambias, estcribis registro cambias nuevamente a bajo_alto Y salis de la interrupcion. La proxima ves que entre va a ser en el mismo flanco, siendo la puesta de Alto a bajo algo sin sentido.

Creo que si vas a hacer una linea deberias hacer el codigo pensando ya en dibujar. De nada te serviria hacer el codigo que estas haciendo para una sola linea si leugo tenes que cambiar todo el formato del codigo.
Comenza con un array de valores, pero tal ves algo mas pequeño, en ves de hacerlo de 760 pixels * 3 colores, hacelo de 20 lugares ( cambios entre vuelta y vuelta ) Incluso en ves de usar muchos datos podrias comenzar con algo simple, como poner a 1 todo la fila en una de las secciones que gira y luego apagarla. Una ves que logras que este quieto, lo animas. en ves de ponerse a 1 la muestra 10, que lo haga la 11, luego la 12 y asi..
Resumen: deberias hacer el codigo pensando ya en dibujar.

La solucion es:

Pensa en un codigo que
- divida la vuelta en "secciones"
- el tiempo de vuelta es variable
- que se divida equitativamente el tiempo de secciones.
- que sean pocas secciones (hagamosla facil y que sea potencia de 2, ej 16 o 32),
- que comienze unicamente cuando cruce por 0, nada lo limite, si llego a 0 debe comenzar nuevamente, no importa donde se quedo, el programa principal NO debe modificar este comportamiento
- Tenes prohibido usar for y while, solo 1 de cada uno necesitas. El unico while para el loop infinito y un unico for para enviar los datos por SPI. Esto te va a obligar no encerrarte en un loop.
- Por ultimo, intenta que tu codigo sea SUPER RAPIDO.

Empeza con esto :P y luego escalarlo a la cantidad que quieras va a ser SUPER simple!
« Última modificación: 10 de Octubre de 2015, 08:51:04 por KILLERJC »

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re:Persistence of vision (POV) pido Orientacion
« Respuesta #11 en: 10 de Octubre de 2015, 09:49:59 »
Citar
Creo que te estas confundiendo, la idea de obtener el cruce por  cero es por 2 cosas:
- es para saber cuando debes empezar a escribir
- Y para obtener el tiempo entre vueltas, ya que nunca es exacto, y con esto podes al menos basarte en la ultima vuelta. ( O en las ultimas 2,4,8 etc ).

exacto, el paso por cero es para saber cuando tienes que empezar a escribir, si quieres que vaya girando deberás hacer lo siguiente:

yo lo hacia asi:
paso por 0, pintas todos los vectores,
vuelta a pasar por 0, pintaba todos los vectores pero desplazados o sea el vector 0 ahora es el 1 el 1 es el 2
vuelta a pasar por 0, de nuevo se pintan todos desplazados 2 lugares etc etc.

de esta manera el dibujo no se queda estático.

Citar
Creo que si vas a hacer una linea deberias hacer el codigo pensando ya en dibujar. De nada te serviria hacer el codigo que estas haciendo para una sola linea si luego tenes que cambiar todo el formato del código.

yo aqui creo que deberia olvidarse de pintar, y centrarse solo en el paso por cero cuando pase por 0 que encienda y apague los led, esto es para probar el hardware, recuerda que esta trabajando en CCS no hay debug, mas que encender y apagar un led y cosas así, y yo me centraria en que primero funcione el paso por cero, utilizando encender un led o varios en el momento de pasar por el cero. con el simple hecho de saber que eso ya funciona,lo que viene siendo un debug chapucero, si se mete en hacer un código pensando ya en dibujar como se equivoque le va a costar encontrar el fallo, por ese motivo, es CCS.

Citar
Comenza con un array de valores, pero tal ves algo mas pequeño, en ves de hacerlo de 760 pixels * 3 colores,

creo haber entendido que la primera versión iba a ser de un solo color no?

te comento, he encontrado el código de mi pov esférico. pero es una basura enorme, recuerda que fue el primer proyecto que hice,  :D :D y me ha dado tanto asco verlo que no se si colgarlo para que lo veas, por si me echan del foro. :D :D o me rebajen de moderador a visitante  o algo por el estilo :D

sin tener casi ni idea de programación, ni de hardware, la verdad no se como acabo funcionando  :D :D

un saludo
« Última modificación: 10 de Octubre de 2015, 09:52:18 por juaperser1 »
Visita mi canal para aprender sobre electrónica y programación:

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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Persistence of vision (POV) pido Orientacion
« Respuesta #12 en: 10 de Octubre de 2015, 18:10:45 »
Citar
yo aqui creo que deberia olvidarse de pintar, y centrarse solo en el paso por cero cuando pase por 0 que encienda y apague los led, esto es para probar el hardware, recuerda que esta trabajando en CCS no hay debug, mas que encender y apagar un led y cosas así, y yo me centraria en que primero funcione el paso por cero, utilizando encender un led o varios en el momento de pasar por el cero. con el simple hecho de saber que eso ya funciona,lo que viene siendo un debug chapucero, si se mete en hacer un código pensando ya en dibujar como se equivoque le va a costar encontrar el fallo, por ese motivo, es CCS

Si pero con respecto a lo que el estaba haciendo en la interrupcion, deberia buscar mas pintar una "linea" ( me refiero a su codigo ) la cual se mantenga estatica. Por el momento estatico, luego si queres implementas un buffer circular como vos queres, pero por ahora estatico es lo mejor, de esa forma elimina su problema de que le giraba el dibujo.
Ademas casi que le di el codigo :P solo debe modificar el envio de datos y la configuracion de los timers/CCP

Citar
te comento, he encontrado el código de mi pov esférico. pero es una basura enorme, recuerda que fue el primer proyecto que hice,  :D :D y me ha dado tanto asco verlo que no se si colgarlo para que lo veas, por si me echan del foro. :D :D o me rebajen de moderador a visitante  o algo por el estilo

es normal, no te preocupes yo tambien tengo de esos codigos y si los veo prefiero pegarme un tiro en el pie y hacerlo nuevamente de 0 que verlo xD

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re:Persistence of vision (POV) pido Orientacion
« Respuesta #13 en: 10 de Octubre de 2015, 18:25:20 »
Citar
Si pero con respecto a lo que el estaba haciendo en la interrupcion, deberia buscar mas pintar una "linea" ( me refiero a su codigo ) la cual se mantenga estatica. Por el momento estatico, luego si queres implementas un buffer circular como vos queres, pero por ahora estatico es lo mejor, de esa forma elimina su problema de que le giraba el dibujo.
Ademas casi que le di el codigo :P solo debe modificar el envio de datos y la configuracion de los timers/CCP

Entonces te había entendido mal, y coincido contigo.

Citar
  es normal, no te preocupes yo tambien tengo de esos codigos y si los veo prefiero pegarme un tiro en el pie y hacerlo nuevamente de 0 que verlo xD

Bueno por lo menos lo reconocemos, y mejoramos, o por lo menos lo intentamos, por cierto, me duele el pie desde que vi el código xd
Visita mi canal para aprender sobre electrónica y programación:

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


 

anything