Autor Tema: De matriz de leds, a letrero electronico  (Leído 295030 veces)

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

Desconectado fgaretto

  • PIC10
  • *
  • Mensajes: 33
    • Automatización y sistemas de control - Desarrollos con microcontroladores
Re: De matriz de leds, a letrero electronico
« Respuesta #315 en: 28 de Julio de 2010, 15:21:46 »
Este es el soft:
#include <16f876a.h>
#fuses XT,NOWDT
#use delay(clock=4000000)
#use fast_io(a)
#use fast_io(b)
#define  DATA    pin_a0
#define  CLOCK   pin_a1
#define  STROBE  pin_a2   

#DEFINE COLUMNAS 40       //Defino cantidad de columnas a usar
int8  Mensaje[COLUMNAS]={126   32   16   32   126   0   62   72   72   72   62
0   64   64   126   64   64   0   126   88   84   114   0   66   126   66   0 
70   74   82   98   66   0
};
 //Almacena los datos a mostrar en el cartel
int8 Mascara[8]={0b10000000,0b01000000,0b00100000,0b00010000,0b00001000,0b00000100,0b00000010,0b00000001};
int8 FILAX[8]={0b11111110,0b11111101,0b11111011,0b11110111,0b11101111,0b11011111,0b10111111,0b01111111};
int8 i,Inicio;
int1 Vsync;
int8 Fila;
int8 Inhibit;
void ShowFila();
void rotar_izq();
#int_TIMER0
void TIMER0_isr(void){
   ShowFila();
   Fila++;
   if(Fila==8){
      Fila=0;
      Vsync=1;
      if(Inhibit!=0) Inhibit-- ; else rotar_izq();
   }
   else
      Vsync=0;
}     
void main(){
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32);
   enable_interrupts(INT_TIMER0);
   clear_interrupt(INT_TIMER0);
   enable_interrupts(GLOBAL);
   set_tris_a(0);
   set_tris_b(0);
//Apago cartel
   output_b(0xFF);
//Aseguro inicialmente clock en bajo
   output_low(CLOCK);
   output_low(STROBE);
   Fila=0;
   Inhibit=10;
   Vsync=1;
   Inicio=0;
   while(true){}
}
void ShowFila(){
         for(i=Inicio-1;i!=255;i--){
            if((Mensaje & Mascara[Fila])==0) output_low(DATA); else output_high(DATA);
               output_high(CLOCK);
               delay_cycles(1);
               output_low(CLOCK);
         }
         for(i=COLUMNAS-1;i!=Inicio-1;i--){
            if((Mensaje[i-1] & Mascara[Fila])==0) output_low(DATA); else output_high(DATA);
               output_high(CLOCK);
               delay_cycles(1);
               output_low(CLOCK);
         }
         output_b(0xff);
         //output_b(FILAX[Fila]);
         output_high(STROBE);
         delay_cycles(1);   
         output_low(STROBE);
         output_b(FILAX[Fila]);
         
   
}
void rotar_izq(){
   Inicio++;
   if(Inicio==COLUMNAS){
      Inicio=0;
   }
}

Desconectado fgaretto

  • PIC10
  • *
  • Mensajes: 33
    • Automatización y sistemas de control - Desarrollos con microcontroladores
Re: De matriz de leds, a letrero electronico
« Respuesta #316 en: 28 de Julio de 2010, 15:30:26 »
Adjunto el .C y el de Proteus.

Desconectado fgaretto

  • PIC10
  • *
  • Mensajes: 33
    • Automatización y sistemas de control - Desarrollos con microcontroladores
Re: De matriz de leds, a letrero electronico
« Respuesta #317 en: 02 de Agosto de 2010, 08:44:35 »
GENTE, BUENAS....
Alguien me podría explicar el primer FOR del cógigo siguiente?  Desde ya muchas gracias y saludos
 
for(i=Inicio-1;i!=255;i--){
            if((Mensaje & Mascara[Fila])==0) output_low(DATA); else output_high(DATA);
               output_high(CLOCK);
               delay_cycles(1);
               output_low(CLOCK);
}

for(i=COLUMNAS-1;i!=Inicio-1;i--){
            if((Mensaje[i-1] & Mascara[Fila])==0) output_low(DATA); else output_high(DATA);
               output_high(CLOCK);
               delay_cycles(1);
               output_low(CLOCK);

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: De matriz de leds, a letrero electronico
« Respuesta #318 en: 02 de Agosto de 2010, 12:53:30 »
Me parece que ese 1er FOR es el que está enviando los datos a través de un registro de desplazamiento. En función a la fila correspondiente del dato Mensaje, a Mensaje no le hace falta algún índice?

saludos
.

Desconectado fgaretto

  • PIC10
  • *
  • Mensajes: 33
    • Automatización y sistemas de control - Desarrollos con microcontroladores
Re: De matriz de leds, a letrero electronico
« Respuesta #319 en: 02 de Agosto de 2010, 15:25:41 »
Cryn, gracias. Si a Mensaje le falta el indice. Lo que no entiendo es que serían indices negativos, empieza en -1 y termina en -255. Otra cosa, al cambiar el número 255 por otro me da error en el Proteus. La verdad que estoy un poco desorientado.
Saludos.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: De matriz de leds, a letrero electronico
« Respuesta #320 en: 02 de Agosto de 2010, 18:47:49 »
Raro que se tenga indice negativo, no lo había visto antes...

Pero si funciona seguramente es por el tema de los desbordes.

No te olvides que un número negativo simplemente es un complemento a 2 de su positivo.

¿Cómo está definido Inicio como int? int16? con signo? sin signo?
.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: De matriz de leds, a letrero electronico
« Respuesta #321 en: 02 de Agosto de 2010, 19:10:09 »
Hola.

Como se usa una variable(Inicio) para facilitar las rotaciones, y siendo que el primer bit que envíes de una tanda de refresco a los registros de desplazamiento va a ser el que termine probablemente en la última columna, entonces:

1) Se envía desde el la que sería la última fila hasta la 1era;
2) Al desplazarse el Inicio y quedando transformado en un buffer cíclico, la rutina de refresco puede plantearse como 2 bucles for separados.

Para verlo mejor, qué mejor que un ejemplo?

Supongamos que en un punto X, la variable Inicio = 3;

Entonces, mirando al cartel, la información que debería mostrar el cartel debería estar ordenada así:

Mensaje[3]        Mensaje[4]            Mensaje[5]            Mensaje[...] Mensaje[COLUMNAS-2] Mensaje[COLUMNAS - 1] Mensaje[0] Mensaje[1] Mensaje[2]

Ahora, aplicando 1) en el algorítmo, hay que enviar en orden inverso, quedando:

Mensaje[2] Mensaje[1] Mensaje[0] Mensaje[COLUMNAS-1] Mensaje[COLUMNAS-2] Mensaje[...] Mensaje[Inicio+2] Mensaje[Inicio+1] Mensaje[Inicio]

De esta manera, la primer columna enviada, es en realidad, la última. Esto se debe a que los registros de desplazamiento van desplazando bit a bit la información enviada. El primer bit enviado será el que más lejos llegue en la cascada de registros, debido a que será el que más veces ha sido desplazado por ellos.

Si ahora reemplazo los valores con los del Inicio, verás que queda:

//Mensaje[2] Mensaje[1] Mensaje[0] Mensaje[COLUMNAS-1] Mensaje[COLUMNAS-2] Mensaje[...] Mensaje[Inicio+2] Mensaje[Inicio+1] Mensaje[Inicio]
  Mensaje[Inicio-1] Mensaje[Inicio-2] Mensaje[Inicio-3] Mensaje[COLUMNAS-1] Mensaje[COLUMNAS-2] Mensaje[...] Mensaje[Inicio+2] Mensaje[Inicio+1] Mensaje[Inicio]
  
Y como podrás observar, ocurre un salto del valor del índice brusco(excepto uses 256 COLUMNAS...). El salto aparece, en este caso, del elemento Mensaje[Inicio-3]. Aqui el índice sería 0, y en el próximo elemento(Mensaje[COLUMNAS-1]) el índice será mucho mayor a cero probablemente(sería 79 para 80 COLUMAS).
Ese salto, hace que algunos opten por dividir a la rutina en 2 partes. El 255 de la condición del primer bucle es por el desbordamiento(underflow) de la variable i al querer restarle 1 más cuando ya vale 0.  Si mirás el valor inicial de la variable i en el segundo for, verás que comienza precisament, valiendo COLUMNAS - 1.

Te muestro la rutina de refresco que hice para la Librería Matríz de LEDs Universal[compilador CCS]

Código: C
  1. //ENVIO DE COLUMNAS A ENCENDER
  2.    if(!BufferInicio) j = COLUMNAS - 1; else j = BufferInicio - 1;
  3.    for(i =0; i < COLUMNAS; i++)
  4.    {
  5.          if(buffer[j] & mascara) output_high(SHIFT_DATA); else output_low(SHIFT_DATA); //enviar cada columna en alto o bajo segun corresponda con logica invertida
  6.       output_high(SHIFT_CLK);
  7.       output_low(SHIFT_CLK);
  8.      
  9.       if(!j) j = COLUMNAS - 1; else j--;    //j==0?
  10.    }
en la que los dos bucles están combinados en uno solo.

Suerte.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado fgaretto

  • PIC10
  • *
  • Mensajes: 33
    • Automatización y sistemas de control - Desarrollos con microcontroladores
Re: De matriz de leds, a letrero electronico
« Respuesta #322 en: 04 de Agosto de 2010, 17:16:21 »
Bruno, muchas gracias. Lo voy a analizar. Saludos.

Desconectado fgaretto

  • PIC10
  • *
  • Mensajes: 33
    • Automatización y sistemas de control - Desarrollos con microcontroladores
Re: De matriz de leds, a letrero electronico
« Respuesta #323 en: 04 de Agosto de 2010, 17:25:37 »
Raro que se tenga indice negativo, no lo había visto antes...

Pero si funciona seguramente es por el tema de los desbordes.

No te olvides que un número negativo simplemente es un complemento a 2 de su positivo.

¿Cómo está definido Inicio como int? int16? con signo? sin signo?
Inicio está definido como INT8. Bruno dio una explicación. La voy a estudiar, seguramente ahí está la respuesta. Te comento que funcionó la matriz de 8x24, no se quemó nada. Primero probé con un texto fijo y luego con desplazamiento vertical, todo OK.
No me funciona bien con el desplazamiento horizontal, pero seguramente es problema de mi soft.
Por lo tanto voy a trabajar sobre ello.
Tuve que colocar un cristal de 4 MHz ya que con el 20 Mhz no me funciona. Lo probé en un protoboard para prender y apagar un led y tampoco, saben a que se puede deber esto?
Saludos.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: De matriz de leds, a letrero electronico
« Respuesta #324 en: 04 de Agosto de 2010, 18:16:52 »
Para 20MHz es un problema de alimentación, asegúrate que la tensión esté en 5V y no te olvides utilizar condensadores de desacoplo de 100nf entre Vcc y Gnd, cada integrado debería tener su condensador de desacoplo y cerca del integrado.

saludos
.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: De matriz de leds, a letrero electronico
« Respuesta #325 en: 04 de Agosto de 2010, 18:21:30 »
Raro que se tenga indice negativo, no lo había visto antes...

Pero si funciona seguramente es por el tema de los desbordes.

No te olvides que un número negativo simplemente es un complemento a 2 de su positivo.

¿Cómo está definido Inicio como int? int16? con signo? sin signo?
Inicio está definido como INT8. Bruno dio una explicación. La voy a estudiar, seguramente ahí está la respuesta. Te comento que funcionó la matriz de 8x24, no se quemó nada. Primero probé con un texto fijo y luego con desplazamiento vertical, todo OK.
No me funciona bien con el desplazamiento horizontal, pero seguramente es problema de mi soft.
Por lo tanto voy a trabajar sobre ello.
Tuve que colocar un cristal de 4 MHz ya que con el 20 Mhz no me funciona. Lo probé en un protoboard para prender y apagar un led y tampoco, saben a que se puede deber esto?
Saludos.


No se que PIC estás usando, pero si es un 16F o familia más baja, para cristales de más de 4Mhz tenes que usar el FUSE HS. Con un cristal de 4MHz usá XT.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado fgaretto

  • PIC10
  • *
  • Mensajes: 33
    • Automatización y sistemas de control - Desarrollos con microcontroladores
Re: De matriz de leds, a letrero electronico
« Respuesta #326 en: 04 de Agosto de 2010, 18:53:12 »
Bruno, OK, y con respecto a los otros FUSES ?
Estoy utilizando un 16F876A, mi configuración es:
Fuses XT,NOWDT,NOBROWNOUT,NOPROTECT ( con respecto a PUT, debe ir PUT o NOPUT?)
Muchas gracias
Saludos
Fernando

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: De matriz de leds, a letrero electronico
« Respuesta #327 en: 04 de Agosto de 2010, 19:43:17 »
Yo casi siempre uso PUT
.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: De matriz de leds, a letrero electronico
« Respuesta #328 en: 04 de Agosto de 2010, 21:09:28 »
Bruno, OK, y con respecto a los otros FUSES ?
Estoy utilizando un 16F876A, mi configuración es:
Fuses XT,NOWDT,NOBROWNOUT,NOPROTECT ( con respecto a PUT, debe ir PUT o NOPUT?)
Muchas gracias
Saludos
Fernando

Como te dice Cryn, mejor PUT excepto requieras un encendido extremadamente rápido del dispositivo. Es mejor poner PUT(Power Up Timer) para asegurar que las tensiones y el cristal estén completamente estabilizados antes de que el uC empiece a ejecutar su firmware.

La configuración está bien, pero recordá que XT es para cristales de hasta 4Mhz. Más que eso usá HS, sino no funciona.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado OSS

  • PIC10
  • *
  • Mensajes: 9
Re: De matriz de leds, a letrero electronico
« Respuesta #329 en: 12 de Octubre de 2010, 19:55:45 »
Saludos Amigos de todo pic, yo tambien he estado algo sumergido en lo de los carteles he armado una matriz de 7x64 no soy un experto en programacion pero quiero suministrar el codgo(psi) y el archivo de simulacion en proteus utilizo el psi porque me facilita la programacion espero migrar al C en un futuro, espero que el codigo los pueda ayudar en algo y si alguien lo puede mejorar(reducir lineas) se los agradeceria esto forma parte de un proyecto que vengo desarrollando poco a poco ire informando de mis avances ya que todavia me falta mucho por hacer y la verdad no tengo muchos conocimientos en programacion hago lo mejor posible   ;-)