Autor Tema: Matriz led-barrido por filas, como desplazar texto(SOLUCIONADO)  (Leído 18709 veces)

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

Desconectado camhost1

  • PIC12
  • **
  • Mensajes: 51
Matriz led-barrido por filas, como desplazar texto(SOLUCIONADO)
« en: 28 de Enero de 2013, 13:13:43 »
Hola a todos los amigos del foro, pues les cuento que estoy realizando una matriz de 8x16 (con posibilidad de expandirla a 8x64 cuando entienda bien la programación), en la cual intento hacer el barrido por filas ya que la tenia por columnas, pero cuando es extensa esta matriz refrescar el dato por columnas es ineficiente, ya que el tiempo de encendido de los leds es menor para que no se note el parpadeo. Cuando intente pasar a el barrido por filas, intente mostrar la letra O y usar los 4094 para cargar el dato y poder ver la O en las dos pantallas, pero al usar proteus para comprobar si todo esta bien me muestra lo que adjunto en la imagen. Si alguien desea ayudarme con el codigo para poder ver ademas de las letras en las dos pantallas, entender la forma en que se logra desplazar el texto ya que anteriormente declaraba un for con el largo de las columnas para poder ver todo mi mensaje, y ahora como son 7 filas en todo momento no entiendo como se debe hacer la declaración para ver todo el texto que ingrese y poder moverlo ;-)... espero haber expuesto bien mis dudas y les coloco el codigo que estoy usando para poder ver la letra O
#include <16F84A.h>
#fuses XT,NOPROTECT,NOWDT,PUT
#use delay(clock=4000000)
#use fast_io(A)
#use fast_io(B)
// Definición de pines de control
#define DATA PIN_A0
#define CLOCK PIN_A1
#define STROBE PIN_A2


int t;
int a;
byte   const segmentos[7]={0b11000111,
                                        0b10111011,
                                        0b10111011,
                                        0b10111011,
                                        0b10111011,
                                        0b10111011,
                                        0b11000111};
                      

// declaración de la función escribir_4094
void escribir_4094(int caracter);

// programa principal
void  main(){
   set_tris_a(0x00);
   set_tris_b(0x00);
   output_a(0x00);
   output_b(0x00);

   a=1;
  while(true){
      for(t=0;t<7;t++){
         escribir_4094(t);           // envía los datos a las columnas para armar el caracter en la matriz
          output_B(a);              //muestra el dato habilitando la fila 1
           a*=2;                   // aumenta el valor de la fila para el proximo dato que se genere en las columnas
           if(a>64)a=1;           // si el dato termino las 7 filas vuelva a comenzar desde la primera
         delay_ms(8);
      }
   }
}

void escribir_4094(int caracter){
int contador_8;
   output_low(DATA);
   output_low(STROBE);
   output_low(CLOCK);
   for(contador_8=0;contador_8<8;contador_8++){
      output_bit(DATA,bit_test(segmentos[caracter],contador_8));
      output_high(CLOCK);
      delay_cycles(1);
      output_low(CLOCK);
   }
   output_low(CLOCK);    
   output_high(STROBE);
   delay_cycles(1);
   output_low(STROBE);
}
« Última modificación: 04 de Febrero de 2013, 15:56:34 por camhost1 »

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Matriz led-barrido por filas, datos con 4094
« Respuesta #1 en: 28 de Enero de 2013, 15:49:23 »
Hola camhost1

Mira el hilo de la libreria de BrunoF

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

Y el hilo http://www.todopic.com.ar/foros/index.php?topic=30659.0

Allí BrunoF explica:
El 74HC595 es uno de los pocos registros de desplazamiento capaz de entregar 20mA por salida. Por eso lo recomiendo altamente. Tal vez con el que estas usando no logres buen brillo...
También destaco la falta de STROBE en los integrados que estas usando. Esto puede suponer parpadeos al azar visibles durante la carga de los registros.

Saludos
Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado camhost1

  • PIC12
  • **
  • Mensajes: 51
Re: Matriz led-barrido por filas, datos con 4094
« Respuesta #2 en: 28 de Enero de 2013, 17:28:30 »
Hola jukinch, gracias por los links los estare revisando a ver si entiendo, cualquier duda la estare publicando gracias de nuevo.. :mrgreen:

Desconectado camhost1

  • PIC12
  • **
  • Mensajes: 51
Re: Matriz led-barrido por filas, datos con 4094
« Respuesta #3 en: 28 de Enero de 2013, 19:36:57 »
Hola a todos estuve mirando los links, y pues la verdad no soy pro en la utilizacion del ccs, en estos hay codigos avanzados(para mi :?) que realmente no entendi, espero me ayuden para lograr entender como logro mostrar algo en 2 o mas pantallas, siendo que al activar la primera fila para ver el dato, simultaneamente se va a activar la fila de la otra pantalla, y como el dato aun no ha llegado ya que hasta ahora se va a mostrar en la primera, al llegar a la segunda pantalla se estara activando la segunda fila y por ende se mostrara lo que debe salir en la primera fila pero en la segunda. Luego de entender esto, como mover el texto he leido que para que salga de un extremo al otro(una letra) toca realizar algo como esto:
00000000001111101110
0000000001111101110
000000001111101110
00000001111101110
0000001111101110
000001111101110
00001111101110
0001111101110
001111101110
01111101110
1111101110
Pero si son varias me parece que la memoria del micro se iria toda en tan solo crear estas tablas que contengan el mensaje, debe haber otra forma mas facil.... :lol:, de nuevo gracias por leer y ayudarme :P


Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado camhost1

  • PIC12
  • **
  • Mensajes: 51
Re: Matriz led-barrido por filas, datos con 4094
« Respuesta #5 en: 29 de Enero de 2013, 09:41:15 »
Hola  jukinch, como va todo espero que bien, mire tus enlaces y me decidí por el de ucontrol, yo creía que en ese articulo el barrido era por colunas :shock: :shock:(que equivocado estaba), pero bueno ya entendí la parte de de colocar las letras en las pantallas, a ver si no estoy mal, lo que tocaba era cargar en los dos registros de desplazamiento, los datos que correspondían a la fila 1(adjunto la imagen de mis avances), publico el código que estoy usando para que lo revisen me ayuden ahora con el desplazamiento de las letras :mrgreen: :mrgreen:

// Usando el CD4094 para manejar 2 matrices led 8x8

#include <16F84A.h>
#fuses XT,NOPROTECT,NOWDT,PUT
#use delay(clock=4000000)
#use fast_io(A)
#use fast_io(B)
// Definición de pines de control
#define DATA PIN_A0
#define CLOCK PIN_A1
#define STROBE PIN_A2


int t;
int a,b;    //a sirve para llevar el conteo de las filas, b habilita la fila cuando ya se cargo el valor en las dos pantallas
byte   const segmentos[14]={0b11000011,0b10000011,0b10111101,0b10111101,0b10111101,0b10111101,0b10111101,
                                          0b10000011,0b10111101,0b10111111,0b10111101,0b10111111,0b11000011,0b10111111};
                      

// declaración de la función escribir_4094
void escribir_4094(int caracter);

// programa principal
void  main(){
   set_tris_a(0x00);
   set_tris_b(0x00);
   output_a(0x00);
   output_b(0x00);

   a=1;
   b=0;
  while(true){
      for(t=0;t<14;t++){
         escribir_4094(t);           // envía los datos a las columnas para armar la letra o el caracter en la matriz
         if(b==2){                  //**si ya cargo los valores en las dos matrices habilite la fila para mostrarlo
          output_B(a);              //muestra el dato habilitando la fila que corresponda a
           a*=2;                   // aumenta el valor de la fila para el próximo dato que se genere en las columnas
           if(a>64)a=1;           // si el dato termino las 7 filas vuelva a comenzar desde la primera
            delay_ms(7);
            output_B(0);
            b=0;                  
         }
      }
   }
}

void escribir_4094(int caracter){
int contador_8;
   output_low(DATA);
   output_low(STROBE);
   output_low(CLOCK);
   for(contador_8=0;contador_8<8;contador_8++){
      output_bit(DATA,bit_test(segmentos[caracter],contador_8));
      output_high(CLOCK);
      delay_cycles(1);
      output_low(CLOCK);
   }
   output_low(CLOCK);    
   output_high(STROBE);
   delay_cycles(1);
   output_low(STROBE);
   b++;

}
« Última modificación: 29 de Enero de 2013, 09:44:15 por camhost1 »

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Matriz led-barrido por filas, datos con 4094
« Respuesta #6 en: 29 de Enero de 2013, 10:10:23 »
Camhost1:
            si puedes subí el archivo dsn de proteus así más usuarios podrán ayudarte.
            También te recomiendo postear tu código completo usando geSHi (eso que se ve arriba a la derecha al postear. Elegí código en lenguaje c y en medio de los corchetes entre code y barra code poné tu código.
te va a salir esto: (sin espacios )
[ code=c]  [ /code ]

y entre medio ponés tu código.  Así queda más prolijo y fácil de leer.  ;-)

[ ....]
tu codigo
[...]

           Saludos.
               Jukinch

"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado camhost1

  • PIC12
  • **
  • Mensajes: 51
Re: Matriz led-barrido por filas, datos con 4094
« Respuesta #7 en: 29 de Enero de 2013, 10:44:06 »
Hola la verdad  no sabia lo postear asi jejejeej, adjunto la simulacion de proteus(7.8 sp2) con el hex para poder verlo
Código: C
  1. // Usando el CD4094 para manejar 2 matrices led 8x8
  2.  
  3. #include <16F84A.h>
  4. #fuses XT,NOPROTECT,NOWDT,PUT
  5. #use delay(clock=4000000)
  6. #use fast_io(A)
  7. #use fast_io(B)
  8. // Definición de pines de control
  9. #define DATA PIN_A0
  10. #define CLOCK PIN_A1
  11. #define STROBE PIN_A2
  12.  
  13.  
  14. int t;
  15. int a,b;    //a sirve para llevar el conteo de las filas, b habilita la fila cuando ya se cargo el valor en las dos pantallas
  16. byte   const segmentos[14]={0b11000011,0b10000011,0b10111101,0b10111101,0b10111101,0b10111101,0b10111101,
  17.                                           0b10000011,0b10111101,0b10111111,0b10111101,0b10111111,0b11000011,0b10111111};
  18.                        
  19.  
  20. // declaración de la función escribir_4094
  21. void escribir_4094(int caracter);
  22.  
  23. // programa principal
  24. void  main(){
  25.    set_tris_a(0x00);
  26.    set_tris_b(0x00);
  27.    output_a(0x00);
  28.    output_b(0x00);
  29.  
  30.    a=1;
  31.    b=0;
  32.   while(true){
  33.       for(t=0;t<14;t++){
  34.          escribir_4094(t);           // envía los datos a las columnas para armar la letra o el caracter en la matriz
  35.          if(b==2){                  //**si ya cargo los valores en las dos matrices habilite la fila para mostrarlo
  36.           output_B(a);              //muestra el dato habilitando la fila que corresponda a
  37.            a*=2;                   // aumenta el valor de la fila para el próximo dato que se genere en las columnas
  38.            if(a>64)a=1;           // si el dato termino las 7 filas vuelva a comenzar desde la primera
  39.             delay_ms(7);
  40.             output_B(0);
  41.             b=0;                  
  42.          }
  43.       }
  44.    }
  45. }
  46.  
  47. void escribir_4094(int caracter){
  48. int contador_8;
  49.    output_low(DATA);
  50.    output_low(STROBE);
  51.    output_low(CLOCK);
  52.    for(contador_8=0;contador_8<8;contador_8++){
  53.       output_bit(DATA,bit_test(segmentos[caracter],contador_8));
  54.       output_high(CLOCK);
  55.       delay_cycles(1);
  56.       output_low(CLOCK);
  57.    }
  58.    output_low(CLOCK);    
  59.    output_high(STROBE);
  60.    delay_cycles(1);
  61.    output_low(STROBE);
  62.    b++;
  63.  
  64. }

Desconectado camhost1

  • PIC12
  • **
  • Mensajes: 51
Re: Matriz led-barrido por filas, datos con 4094
« Respuesta #8 en: 29 de Enero de 2013, 23:53:59 »
Mirando lo del desplazamiento dicen que se deben colocar ceros (o 1 dependiendo de que apague la matriz), igual a la cantidad de columnas he irles reduciendo, por ej: 16 columnas todas apagando la matriz, luego 15-14-13, la pregunta es si tengo en ccs un vector ej: vec1[]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}; y lo recorro con un for, con la idea que corra los 16 datos, luego 15-14, y asi sucesivamente para poder agregar los uno q apagan mi matriz, como en que momento voy mostrando el dato? para que quede en la ultima posición de esta forma:
fila1-----> 1111111111111111 luego de hacer esto en las 7 siguientes filas repita el ciclo pero asi
.
.
.
fila1----->1111111111111111 dato que forma mi letra

Gracias por leer, si estoy equivocado respecto a la lógica que pienso emplear para mostrar el texto moviéndose, hagan-me saber en donde estaría el error.. Saludos
« Última modificación: 29 de Enero de 2013, 23:58:51 por camhost1 »

Desconectado camhost1

  • PIC12
  • **
  • Mensajes: 51
Re: Matriz led-barrido por filas, como desplazar texto???
« Respuesta #9 en: 02 de Febrero de 2013, 09:38:43 »
Bueno llegue a un punto que no he podido dar solución espero me ayuden, para desplazar el texto lo que realizo es:
1- Colocar el dato en los registros de desplazamiento.
2- Agregar '0' para desplazar el texto fuera de la matriz.
3- Voy disminuyendo la cantidad de ceros para que el texto empiece a aparecer por la derecha y termine en la izquierda.
Pero surge un problema, cuando ya no hay ceros que agregar, el texto queda en el centro de la pantalla, como cuando uno lo quiere dejarlo estático. Y ahora ¿como termino de desplazar el resto de texto para sacarlo por la izquierda???, no se pueden agregar ceros antes del mensaje, ya que al hacerlo así, el mensaje desplazaría los ceros fuera de la pantalla.
La verdad no se si se puede realizar el desplazamiento completo, ya estoy por creer que no!
ademas debe haber una forma para aplicarle ese algoritmo a cualquier cantidad de letras, ya que si se personaliza para solo un mensaje pues es ineficiente..
Bueno eso es todo si leyeron hasta este lugar gracias :mrgreen: :mrgreen:, quisiera saber si me pueden colaborar, si alguien ya desplazo diferentes cantidades de texto realizando el barrido por filas.... GRACIAS 

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Matriz led-barrido por filas, como desplazar texto???
« Respuesta #10 en: 02 de Febrero de 2013, 10:13:37 »
Hola Camhost1:
             Podrías separar en dos partes tu programa.
             Una parte que haga el efecto de mover el texto en una matriz de datos y otra que haga la actualización de los leds de tu pantalla mostrando toda la matriz cada un tiempo X. (mediante una interrupción).-
             Para ello podrías creas un buffer (mediante una matriz) en donde almacenás el estado de un cuadro completo de tu display. Y en otro vector cargas la información de las letras.
             Luego vas procesando ese buffer con el vector de las letras y/o el efecto que tu quieras, refrescando siempre cada cierto tiempo x la pantalla y así podrías lograr el desplazamiento.-
             No desesperes, ya va a salir funcionando!
                  Saludos.
                        Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado camhost1

  • PIC12
  • **
  • Mensajes: 51
Re: Matriz led-barrido por filas, como desplazar texto???
« Respuesta #11 en: 02 de Febrero de 2013, 10:47:04 »
Hola de nuevo :lol:, disculpa si me quedan dudas pero estoy como bloqueado con este temita :5] jajaja:
- Lo que no te entiendo es lo de la creacion del buffer mediante una matriz, la verdad me perdi aca, me dices el estado de un cuadro completo de la pantalla, es decir todos los datos que deben estar antes de habilitar la fila???
- Lo de crear un vector el cual tenga las letras a mostrar por fila(este seria el que tengo declarado como byte segmentos)
Código: C
  1. vector[x]=segmentos[x]
es esto a lo que te refieres?

La verdad disculpa mis molestias espero no abusar de tu ayuda gracias.

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Matriz led-barrido por filas, como desplazar texto???
« Respuesta #12 en: 02 de Febrero de 2013, 11:37:40 »
Tienes razón  camhost1 debí decir vector en vez de matriz.
Esta es toda tu pantalla de 8*16:

7              x   x   x    x   x   x    x    x    x    x     x     x     x     x     x     x
6              x   x   x    x   x   x    x    x    x    x     x     x     x     x     x     x
5              x   x   x    x   x   x    x    x    x    x     x     x     x     x     x     x
4              x   x   x    x   x   x    x    x    x    x     x     x     x     x     x     x
3              x   x   x    x   x   x    x    x    x    x     x     x     x     x     x     x
2              x   x   x    x   x   x    x    x    x    x     x     x     x     x     x     x
1              x   x   x    x   x   x    x    x    x    x     x     x     x     x     x     x
0              x   x   x    x   x   x    x    x    x    x     x     x     x     x     x     x

               0    1   2   3   4   5    6   7    8    9    10   11   12   13   14   15

Como bien decís se puede almacenar en un vector de bytes, en vez de una matriz.
Almacenando cada columna en un byte (8 leds por byte).

Lo que debes hacer es cargar la información de todo el vector antes de mandar a imprimir tu pantalla.
Es decir, siempre antes de mandar a imprimir debés actualizar un cuadro completo de la pantalla.
   Pero tenés que tener dos vectores uno para hacer el refresco de toda la pantalla y otro que tenga los caracteres.
En tu caso es segmentos[14]. (no he chequeado que caracteres has almacenado).-
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado camhost1

  • PIC12
  • **
  • Mensajes: 51
Re: Matriz led-barrido por filas, como desplazar texto???
« Respuesta #13 en: 02 de Febrero de 2013, 13:36:37 »
Hola jukinch como vas, a ver si ahora si te comprendi  :D
Como bien dices tengo estas dos letras que estoy imprimiendo por pantalla:
0      1 1 0 0 0 0 1 1 1 0 0 0 0 0 1 1
1      1 0 1 1 1 1 0 1 1 0 1 1 1 1 0 1
2      1 0 1 1 1 1 0 1 1 0 1 1 1 1 0 1
3      1 0 1 1 1 1 0 1 1 0 0 0 0 0 1 1
4      1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1
5      1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1
6      1 1 0 0 0 0 1 1 1 0 1 1 1 1 1 1

        0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
En este orden ya que el primer dato es el ultimo (P O).

Citar
Lo que debes hacer es cargar la información de todo el vector antes de mandar a imprimir tu pantalla.
(es decir que cree un vector el cual llevara lo que tenga la columna '0','1'......'15')

0         1
1         1
2         1
3         1
4         1
5         1
6         1
 
           0

Citar
Es decir, siempre antes de mandar a imprimir debés actualizar un cuadro completo de la pantalla.
osea la columna en cuestión.
Citar
Pero tenés que tener dos vectores uno para hacer el refresco de toda la pantalla y otro que tenga los caracteres.
, esto para decir en la posicion 0 de vector de las columnas ponga el dato que contiene la letra(esto te entendi).

Hey muhas gracias por la colaboracion que me estas brindando, saludos....


Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Matriz led-barrido por filas, como desplazar texto???
« Respuesta #14 en: 03 de Febrero de 2013, 10:00:48 »
camhost1:
           Lo que tenés que hacer primero es concentrarte en una función que haga el refresco de toda tu pantalla de leds. (la cual podrá estar almacenada en un vector, una matriz o lo que fuere, en donde puedas almacenar la información de la matriz de leds de 8*16, podrías llamarla miArregloDeLeds). Y que no sólo imprima una columna del arreglo, sino toda la pantalla. (A esa impresión le llaman un frame).-
Concentrate en eso primero.


actualizarPantalla(miArregloDeLeds);



Luego viene la segunda parte del problema:
imprimir texto fijo con los datos de tu arreglo de caracteres.
Para ello debes crear una función que cargue (copie) los caracteres al arreglo que guarda el estado de los leds miArregloDeLeds.
podrías cargar previamente tus dos letras en miArregloDeLeds para hacer la prueba y llamar a la función:

actualizarPantalla(miArregloDeLeds);

y una tercera parte:

hacer los efectos que tu quieras sobre el arreglo en donde esté guardada la información del estado de los leds.

        Para ello vas a tener que implementar una función que haga el efecto de scroll sobre los datos almacenados en miArregloDeLeds.-

hacerScrollSobreArreglo(miArregloDeLeds);

Y siempre con la idea en mente de que cada un tiempo x será llamada la función actualizarPantalla(miArregloDeLeds);


"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes