Autor Tema: Problemas con guardar datos en PIC para Matriz  (Leído 1984 veces)

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

Desconectado MatiDeve

  • PIC10
  • *
  • Mensajes: 14
Problemas con guardar datos en PIC para Matriz
« en: 14 de Julio de 2014, 00:45:04 »
Buenas a todos:
Resulta que empece a programar mi matriz de led. Empiezo a contarles como tengo pensada hacerla antes, para que puedan entender mejor.

La programaria en PicBasic (PSI) y seria una matriz de 40 columnas y 10 filas. El mensaje tiene 140 columnas de largo (6º TECNICA 2015 96 bits y un espacio en blanco antes de pasar nuevamente el mensaje ya que se iria desplazando que serian 44 bits).

Del PIC16F877A se utilizan 10 pines uno para cada fila y otros dos pines para 5 74LS164 que controlarian las columnas (el octavo pin de salida de cada uno iria conectado a la entrada del siguiente (salvo el ultimo obviamente).

Yo tenia pensado en 10 arrays de 140 espacios (uno para cada dato de la fila) y tener cinco variables tipo bytes (40 bits) que extraerian los datos de la fila en que se este trabajando en ese momento del respectivo array y mandar la data a los 5 74LS164 (para las 40 columnas) utilizando shiftleft.

Pero obviamente no me alcanzo la memoria. Que solucion me podrian dar a esto? Como puedo saber cuanta memoria puedo usar para las variables?

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Problemas con guardar datos en PIC para Matriz
« Respuesta #1 en: 14 de Julio de 2014, 02:39:54 »
Hola,

una matriz monocromática puede ser fácilmente asociada como 1 led = 1 bit. Si la matriz es de 10x40, entonces tenemos 400 bits de memoria para la "pantalla". El tema es que si pensás dotarla de desplazamiento de derecha a izquierda, lo más sencillo sería hacer un arreglo de 16 x 40 bits, o bien uno de 8 x 80 bits, aunque la cosa se puede complicar un poco utilizando 8 x80. Te recomendaría de 16 x 40. No programé nunca PICs en BASIC, pero en C eso equivaldría a hacer un arreglo de 40 elementos de 16 bits cada uno:

unsigned int16 screenBuffer[40];

Por supuesto que hay desperdicio en este caso. Sólo se utilizarían 10 de los 16 bits de cada elemento (por ser tu matriz de 10 filas).

Allí ya tienes la memoria lista para procesar los gráficos y enviarlos periódicamente.

Para enviar los datos a las filas y columnas, se recurre a un contador de fila actual, y a una máscara asociada.

unsigned int8 filaActual = 0;
unsigned int8 filaActualMask = 1;
unsigned int8 newFrame = 0;         //util para saber cuando se ha cumplido un cuadro completo de refresco

Vas a necesitar generar una rutina de interrupción para generar el refresco de cada fila. Si todavía no compraste los 74LS164, te recomiendo que no lo hagas. Comprá 74HC595 o al menos CD4094 o simil. Son mejores.


en la subrutina de refesco:
unsigned int8 aux;

for(aux = 39; aux != 255 ; aux--)
{
    DATAS = 0;
    if(screenBuffer[aux] & filaActualMask) DATAS = 1;
    CLOCKS = 1;
    delay_cycles(2);
    CLOCKS = 0;
}

APAGAR_TODAS_LAS_FILAS();

STROBES = 1;    //grabar datos en registros de desplazamiento
delay_cycles(5);
STROBES = 0;

ENCENDER_FILA_ACTUAL(filaActual);

INCREMENTAR filaActual
SI filaActual > 9 ENTONCES filaActual = 0; filaActualMask = 1; newFrame = TRUE; SINO filaActualMask = filaActualMask * 2;


Ya con ese pseudo-código podés probar llenar la memoria con valores y probar si se visualiza correctamente. El timer que invoca la subrutina de interr. debería interrumpir cada:

1 / HertzDeseadosRefresco / cantidadFilasMatriz (s) = tiempoInterrTimerRefresco

digamos que si deseamos 100 Hertz para una matriz de 10 filas,

1 / 100 / 10 = 0.001 s = 1ms.

Primero, asegurate que eso funcione bien. Podés por ejemplo al inicio del programa imprimir un patrón en el buffer:

for(aux = 0; aux < 40; aux++)
    screenBuffer[aux] = aux;

y ver que se muestren correctamente los valores binarios en la pantalla. Luego podés proceder a pensar cómo generar el mensaje de texto y rotarlo. Pero primero lo primero, necesitás lograr este primer paso, que es asociar íntimamente cada LED a un bit de tu buffer, de esa manera, sólo te preocupás por inyectar los datos correctos al buffer, y se verá automáticamente asociado en los LEDs de la matriz.

algo más de info:

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

P.D. Tené en cuenta que con 10 filas, el tiempo de encendido máximo de cada led es de la décima parte. Esto hace que el LED brille 10 veces menos de lo normal. Lo más común es necesitar agregar ULN2803 o ULN2003 después de los registros de desplazamiento, y comandar las filas mediante otros ULN2803 o simil y luego transistores PNP. Si necesitás los esquemas te los facilito.

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 MatiDeve

  • PIC10
  • *
  • Mensajes: 14
Re: Problemas con guardar datos en PIC para Matriz
« Respuesta #2 en: 14 de Julio de 2014, 14:35:40 »
Gracias por tu respuesta. Tu propusta es parecida a una que tengo en mente como ltima opcion pero me ado a darme cuenta otra opcion al programar. Es muy larga de explicar ecribiendo por celular pero si a alguien le interesa no tengo problema en decirselas mas tarde. Alguno sabe algo sobre memoria EEPROM? Otra idea que tenia, si es posible, es guardar los datos en la memoria EEPROM e ir utilizandola de a poco en la memoria RAM

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Problemas con guardar datos en PIC para Matriz
« Respuesta #3 en: 14 de Julio de 2014, 19:43:48 »
Hola,

podés guardar y leer los datos en EEPROM. Pero te aconsejo que primero logres tener funcionando el buffer de memoria del panel asociado a la matriz.

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.