Autor Tema: Cartel del leds problema con arrays  (Leído 2722 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado Delphus

  • PIC12
  • **
  • Mensajes: 70
Cartel del leds problema con arrays
« en: 20 de Diciembre de 2011, 19:27:48 »
Hola, estoy intentando hacer un cartel de leds y el caracter a ingresar lo estoy representando como un array 8x8, he creado una función llamada datos que toma como parámetro dicho array n0 y lo recorra de tal manera que cuando encuentre un 1 lo mande al pin A1 (al registro de desplazamiento) al igual que con el cero, esto mediante las funciones c() y u(). Pero al probar en el proteus el micro no hace nada.
Como sé solo lo básico de C, no se en qué me estoy equivocando, anteriormente haciendo esto sin arrays me había funcionado.
Aquí les dejo el código y el diseño:

Código: [Seleccionar]
#include <16f88.h>  //Invoco el microcontrolador que necesito  
#FUSES INTRC, NOWDT, NOLVP, NOCPD, NOWRT, NODEBUG, NOPROTECT, NOFCMEN, NOIESO, MCLR, NOBROWNOUT, CCPB3 //pendiente
#use delay(clock=4000000)
#byte cartel=0x06 //PuertoB va hacia la matriz de leds
#byte reg=0x05 //PuertoA va hacia el registro data y clock

unsigned int i=0,j=0,lim=0;

unsigned int salB[8]={1,2,4,8,16,32,64,128};
int1 n0[8][8]={{1,0,0,0,0,0,0,1},                       //array para dibujar un cero
               {1,0,1,1,1,1,0,1},
               {1,0,1,1,1,1,0,1},
               {1,0,1,1,1,1,0,1}
               {1,0,1,1,1,1,0,1}
               {1,0,1,1,1,1,0,1}
               {1,0,1,1,1,1,0,1}
               {1,0,0,0,0,0,0,1}};

void u()                               //funcion para mandar un pulso de reloj a clock y un 1 al data del registro
{
   bit_clear(reg,0); delay_us(1);
   bit_set(reg,1);
   bit_set(reg,0); delay_us(1);
}

void c()                         //funcion para mandar un pulso de reloj a clock y un 0 al data del registro
{
   bit_clear(reg,0); delay_us(1);
   bit_clear(reg,1);
   bit_set(reg,0); delay_us(1);
}
  
void datos(a[8][8])                            //la funcion que dibuja en el cartel
{
   for (i=0;i++;i<=7)
    {
      for (j=0;j++;j<=7)
      {
       if (a[i][j]==1)
       {
         bit_clear(reg,0); delay_us(1);
         bit_set(reg,1);
         bit_set(reg,0); delay_us(1);
       }
       if (a[i][j]==0)
       {
        bit_clear(reg,0); delay_us(1);
        bit_clear(reg,1);
        bit_set(reg,0); delay_us(1);
       }
       cartel=salB[i];
       delay_ms(1);
       cartel=0x00;
      }
    }
   }
void main(void)
{
   setup_oscillator(OSC_4MHZ|OSC_INTRC);
   set_tris_b(0x00);
   set_tris_a(0x00);
   cartel=0x00;
  while(true)
   {
     datos(n0);                           //aqui invoco la funcion datos
   }
}

lo que hace este código es dibujar un cero en la matriz de leds.
El micro manda los datos por las filas y el registro a las columnas de derecha a izquierda.
Gracias de antemano.
« Última modificación: 20 de Diciembre de 2011, 20:41:58 por Delphus »

Desconectado Delphus

  • PIC12
  • **
  • Mensajes: 70
Re: Cartel del leds problema con arrays
« Respuesta #1 en: 24 de Diciembre de 2011, 00:24:51 »
era una tontería estaba cambiando el orden en el for  :D me vine a dar cuenta despues de poner la duda  :mrgreen: ...

Desconectado Moechh

  • PIC10
  • *
  • Mensajes: 16
Re:Cartel del leds problema con arrays
« Respuesta #2 en: 19 de Abril de 2016, 18:54:57 »
Hola, estoy intentando hacer un cartel de leds y el caracter a ingresar lo estoy representando como un array 8x8, he creado una función llamada datos que toma como parámetro dicho array n0 y lo recorra de tal manera que cuando encuentre un 1 lo mande al pin A1 (al registro de desplazamiento) al igual que con el cero, esto mediante las funciones c() y u(). Pero al probar en el proteus el micro no hace nada.
Como sé solo lo básico de C, no se en qué me estoy equivocando, anteriormente haciendo esto sin arrays me había funcionado.
Aquí les dejo el código y el diseño:

Código: [Seleccionar]
#include <16f88.h>  //Invoco el microcontrolador que necesito 
#FUSES INTRC, NOWDT, NOLVP, NOCPD, NOWRT, NODEBUG, NOPROTECT, NOFCMEN, NOIESO, MCLR, NOBROWNOUT, CCPB3 //pendiente
#use delay(clock=4000000)
#byte cartel=0x06 //PuertoB va hacia la matriz de leds
#byte reg=0x05 //PuertoA va hacia el registro data y clock

unsigned int i=0,j=0,lim=0;

unsigned int salB[8]={1,2,4,8,16,32,64,128};
int1 n0[8][8]={{1,0,0,0,0,0,0,1},                       //array para dibujar un cero
               {1,0,1,1,1,1,0,1},
               {1,0,1,1,1,1,0,1},
               {1,0,1,1,1,1,0,1}
               {1,0,1,1,1,1,0,1}
               {1,0,1,1,1,1,0,1}
               {1,0,1,1,1,1,0,1}
               {1,0,0,0,0,0,0,1}};

void u()                               //funcion para mandar un pulso de reloj a clock y un 1 al data del registro
{
   bit_clear(reg,0); delay_us(1);
   bit_set(reg,1);
   bit_set(reg,0); delay_us(1);
}

void c()                         //funcion para mandar un pulso de reloj a clock y un 0 al data del registro
{
   bit_clear(reg,0); delay_us(1);
   bit_clear(reg,1);
   bit_set(reg,0); delay_us(1);
}
   
void datos(a[8][8])                            //la funcion que dibuja en el cartel
{
   for (i=0;i++;i<=7)
    {
      for (j=0;j++;j<=7)
      {
       if (a[i][j]==1)
       {
         bit_clear(reg,0); delay_us(1);
         bit_set(reg,1);
         bit_set(reg,0); delay_us(1);
       }
       if (a[i][j]==0)
       {
        bit_clear(reg,0); delay_us(1);
        bit_clear(reg,1);
        bit_set(reg,0); delay_us(1);
       }
       cartel=salB[i];
       delay_ms(1);
       cartel=0x00;
      }
    }
   }
void main(void)
{
   setup_oscillator(OSC_4MHZ|OSC_INTRC);
   set_tris_b(0x00);
   set_tris_a(0x00);
   cartel=0x00;
  while(true)
   {
     datos(n0);                           //aqui invoco la funcion datos
   }
}

lo que hace este código es dibujar un cero en la matriz de leds.
El micro manda los datos por las filas y el registro a las columnas de derecha a izquierda.
Gracias de antemano.
Ayuda tengo j. Problema con el registro tengo una programación que ocupa un bitmask pero no logro hacer que se salgan los datos del puerto b y  los datos del registro al mismo tiempo

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Cartel del leds problema con arrays
« Respuesta #3 en: 19 de Abril de 2016, 19:01:30 »
Citar
Ayuda tengo j. Problema con el registro tengo una programación que ocupa un bitmask pero no logro hacer que se salgan los datos del puerto b y  los datos del registro al mismo tiempo

Si te explicas mejor y ademas provees el codigo va a ser posible ayudarte.

Desconectado Moechh

  • PIC10
  • *
  • Mensajes: 16
Re: Cartel del leds problema con arrays
« Respuesta #4 en: 19 de Abril de 2016, 19:07:49 »
era una tontería estaba cambiando el orden en el for  :D me vine a dar cuenta despues de poner la duda  :mrgreen: ...
Podrías compartir tu codigo

Desconectado Moechh

  • PIC10
  • *
  • Mensajes: 16
Re:Cartel del leds problema con arrays
« Respuesta #5 en: 19 de Abril de 2016, 19:14:36 »

En el archivo comprimido viene la programación que hice, pero no me genera la línea que necesito
« Última modificación: 19 de Abril de 2016, 19:21:40 por Moechh »

Desconectado Moechh

  • PIC10
  • *
  • Mensajes: 16
Re:Cartel del leds problema con arrays
« Respuesta #6 en: 19 de Abril de 2016, 19:36:44 »
Citar
Ayuda tengo j. Problema con el registro tengo una programación que ocupa un bitmask pero no logro hacer que se salgan los datos del puerto b y  los datos del registro al mismo tiempo

Si te explicas mejor y ademas provees el codigo va a ser posible ayudarte.
Ya subí los archivos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Cartel del leds problema con arrays
« Respuesta #7 en: 20 de Abril de 2016, 22:07:47 »
http://www.todopic.com.ar/foros/index.php?topic=35428.msg385023#msg385023

Ahi esta resuelto lo tuyo... hace rato.

No podes sacar las 2 cosas al mismo tiempo es imposible. Tenes que sacar una y luego otra. Por si las dudas aca tenes de nuevo el programa con algunos cambios pequeños

Código: C
  1. #USE FAST_IO(B)
  2.  
  3. int lB[8] = {0b01111111,0b10111111,0b11011111,0b11101111,0b11110111,0b11111011,0b11111101,0b11111110};
  4. byte const A[8] = {0b00000001,0b00000010,0b00000100,0b00001000,0b00010000,0b00100000,0b01000000,0b10000000};
  5.  
  6. void main(void)
  7. {
  8.         set_tris_b(0);
  9.         while(TRUE)
  10.         {
  11.                 for(i=0;i<8;i++)
  12.                 {
  13.                         output_b(0);
  14.                         EnviarDatosShiftRegister(0);                            // Apago todo
  15.                         output_b(lB[i]);                                        // Valor en puerto
  16.                         EnviarDatosShiftRegister(A[i]);                         // Enciendo el correspondiente
  17.                         delay_ms(50);                                           // Espero
  18.                 }
  19.         }
  20. }
  21.      
  22. void EnviarDatoShiftRegister(unsigned int Data)
  23. {
  24.         for(o=0;o<8;o++)
  25.         {
  26.                 output_low(CLK);
  27.                 output_bit(DATO,Data & (1 << o));
  28.                 output_high(CLK);
  29.         }
  30. }

Y antes que nada.... probalo en fisico, nada de simulaciones, por que seguro que vos estas viendo lo "lento" que se ve en la simulacion, pero no te das cuenta que son milisegundos. La simulacion sinceramente es mala para cualquier multiplexacion de displays, si queres verlo en Proteus, comenta el delay_ms(50) del codigo y lo vas a ver bien de esa forma.

Es mas este programa se podria incluso mejorar mucho mas, intente hacerlo de una forma mas "generica".

Desconectado Moechh

  • PIC10
  • *
  • Mensajes: 16
Re:Cartel del leds problema con arrays
« Respuesta #8 en: 22 de Abril de 2016, 14:29:03 »
muchas gracias Killer pero ya copie esa programacion antes me la pasaron y me aparece una leyenda en la que dice que no esta identificado el comando enviardatosshiftregister

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Cartel del leds problema con arrays
« Respuesta #9 en: 22 de Abril de 2016, 14:52:09 »
pone arriba de la declaracion de los valores:

Código: C
  1. void EnviarDatoShiftRegister(unsigned int Data);

Eso es por que main() intenta usar esa funcion, pero si observas esta definido despues, quedan 2 opciones.

- La primera es mover la funcion EnviarDatosShiftRegister() arriba del main(),
- La segunda es crear un prototipo de funcion antes del main, de esa forma a partir de ese prototipo se puede usar en cualquier funcion, a pesar que lo tengas el contenido de la funcion abajo.

Por si las dudas:

Código: C
  1. #USE FAST_IO(B)
  2.  
  3. void EnviarDatoShiftRegister(unsigned int Data);
  4.  
  5. int lB[8] = {0b01111111,0b10111111,0b11011111,0b11101111,0b11110111,0b11111011,0b11111101,0b11111110};
  6. byte const A[8] = {0b00000001,0b00000010,0b00000100,0b00001000,0b00010000,0b00100000,0b01000000,0b10000000};
  7.  
  8. void main(void)
  9. {
  10.         set_tris_b(0);
  11.         while(TRUE)
  12.         {
  13.                 for(i=0;i<8;i++)
  14.                 {
  15.                         output_b(0);
  16.                         EnviarDatosShiftRegister(0);                            // Apago todo
  17.                         output_b(lB[i]);                                        // Valor en puerto
  18.                         EnviarDatosShiftRegister(A[i]);                         // Enciendo el correspondiente
  19.                         delay_ms(50);                                           // Espero
  20.                 }
  21.         }
  22. }
  23.      
  24. void EnviarDatoShiftRegister(unsigned int Data)
  25. {
  26.         for(o=0;o<8;o++)
  27.         {
  28.                 output_low(CLK);
  29.                 output_bit(DATO,Data & (1 << o));
  30.                 output_high(CLK);
  31.         }
  32. }

Desconectado Moechh

  • PIC10
  • *
  • Mensajes: 16
Re:Cartel del leds problema con arrays
« Respuesta #10 en: 22 de Abril de 2016, 15:42:17 »
Probare compilarlo y vere los resultados pero de antemano muchisimas gracias por tu tiempo espero puedas seguir ayudandome si tengo otra duda muchas gracias