Autor Tema: Una manito por favor  (Leído 49114 veces)

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

Desconectado gallo961

  • PIC10
  • *
  • Mensajes: 14
Re: Una manito por favor
« Respuesta #120 en: 09 de Junio de 2012, 15:27:50 »
Hola a todos.
Quiero hacerme un pasamensajes , y quiero hacerlo de 8x80, pero claro, como es la primera vez que toco este tema, me puse a investigar, leer PDFs, buscar en los foros, pero me he hecho un lío y quiero estar seguro si entendí la teoría sobre como hacer esto.
Lo primero, es que existen 2 formas básicas de hacerlo, la una es mediante barrido por columnas y la otra barrido por filas; la primera tiene la desventaja de que entre más largo sea el letrero más tiempo lleva el refresco, y para evitar parapadeos se debe aumentar la velocidad del escaneo, y esto se traduce en una disminución de la intensidad del led...por favor si estoy equivocado me corrigen.. :mrgreen:; la otra y que veo que es la mas utilizada es el barrido por Filas, al ser menos cantidad, en mi caso solo 8; se pueden dejar más tiempo encendidos los leds, esto supone un aumento en el brillo de los mismos, pero al mismo tiempo un aumento de consumo de corriente ya que si estuviera encendido todo el cartel tendríamos el consumo de los 80 leds(para mi caso), claro esto es solucionable. Hasta acá voy bien?

se ve que esta el lo mismo que yooooo,,
muy bien fantastico yo tengo uno de 5 filas por55 colmnas asi esta bien¡¡¡¡¡ lo tengo en codewarrior
                         {0b10111101,                                 
                          0b10111101,
                          0b10111101,  //1
                          0b10000001,
                          0b11111111,
                         
                          0b10000001,                                 
                          0b11101111,
                          0b11101111,  //2
                          0b11101111,
                          0b11111111,
                                                                                   
                          0b10000001,                                 
                          0b10111111,
                          0b10000001,  //3
                          0b11111101,
                          0b10000001,
                         
                          0b10000001,                                 
                          0b11001111,
                          0b11001111,  //4
                          0b11001111,
                          0b10111111,
                         
                          0b11111111,                                 
                          0b10000001,
                          0b10111101,  //5
                          0b10000001,
                          0b11111111,
                         
                          0b10000011,                                 
                          0b10111111,
                          0b10000011,  //6
                          0b11111101,
                          0b10000011,
                         
                          0b10000001,                                 
                          0b10111111,
                          0b10000001,  //7
                          0b10111111,
                          0b10000001};
                         
                       

Si.

Ahora la parte que me tiene más inseguro de si la entendí o no, la parte del software, como uso solo ASM, pues me olvido de ejemplos que he visto en C, que por el camino que voy, me tocará aprenderlo si o si. Algunos ejemplos que he visto de ASM, pues para ser franco, hay momentos donde me pierdo, debe ser por eso que todos los códigos y rutinas que he hecho las hago desde cero, y hasta ahora no he hecho un copy, paste  8).
Bueno a lo básico generar un Cero en la matriz para comenzar, a ver si entendí:

- Lo primero, debo saber como quiero que me muestre el cero la matriz, pues para mi gusto sin los leds de las esquinas, para que se vea algo redondo y no cuadrado.

- Ahora la matriz la tengo asi: cátodos como columnas y los ánodos como filas; un caracter se forma por 8 filas por 5 columnas

- Con la configuración anterior entonces he de suponer que pongo a rotar un 1 por las filas, esta rotación debe ir sincronizada con los datos en las columnas, para el caso del cero sería asi:

De abajo hacia arriba el escaneo de las filas, osea formar el dígito en la matriz desde la fila de abajo

Fila 8  <0>
Fila 7  <0>
Fila 6  <0>
Fila 5  <0>
Fila 4  <0>
Fila 3  <0>
Fila 2  <0>
Fila 1  <1>
 5 Columnas <10001> ; sería la parte baja del cero

Siguiente escaneo, rotar el 1 en las filas, eso si, dejo el anterior dato con un tiempo suficiente como para que se vean bien los leds y que no halla parpadeo en el panel.

Fila 8  <0>
Fila 7  <0>
Fila 6  <0>
Fila 5  <0>
Fila 4  <0>
Fila 3  <0>
Fila 2  <1>
Fila 1  <0>
 5 Columnas <01110> ;

Y los mismos 5 bits para la columna hasta llegar a la fila 8, donde sería igual a la fila 1...si me he hecho entender?..perdonenme si hay mucha chachara, pero quiero estar seguro si entendí bien o no la teoría.

Ahora, he leido algunas tablas, con los bits que formas cada caracter, pero estas tablas bien organizadas las he visto en C, y yo quiero preguntar si es posible hacer una tabla como la que escribo a continuación para el ejemplo anterior, osea el cero:

Código: [Seleccionar]
TABLA    ADDWF     CP  ; CONTADOR DE PROGRAMA
RETLW   0E,11,11,11,11,11,11,0E     ; EL CERO EN DONDE EL PRIMER HEXADECIMAL ES LA FILA DE ABAJO

He visto algo similar, pero en C, no se si en ASM se pueda hacer lo mismo, por que me gustaría más asi, que escribir linea por linea hasta formar el cero(en mi ejemplo) y también por llevar un orden y hacer modificaciones más fácil.

Un cero estaría conformado así:
    0 1 1 1 0
    1 0 0 0 1
    1 0 0 0 1
    1 0 0 0 1
    1 0 0 0 1
    1 0 0 0 1
    1 0 0 0 1
    0 1 1 1 0

Te conviene declarar al cero de manera vertical. Suponiendo que la fila de más abajo es la fila 1 y le asignamos el bit de menor peso, el cero estaría formado por 5 bytes(al igual que el resto de los símbolos si decides usar 5 columnas de ancho para todos(aunque no lo recomiendo)). Estos bytes serían:

0b01111110
0b10000001
0b10000001
0b10000001
0b01111110

O lo que es lo mísmo, en tabla y en hexadecimal:

Código: ASM
  1. TABLA    ADDWF     PCL, F
  2.      RETLW   0x7E,0x81,0x81,0x81,0x7E


Eso era todo, cuando comience a hacerlo iré pidiendo más ayuda, como por ejemplo el desplazamiento, agregarle algunos efectos y cositas de esas que uno llega hacer cuando se entiende muy bien esto  :-)

Por favor me disculpan todo este texto aburridor, pero quiero que me guíen bien y me corrijan para poder empezar  :-)

Saludos


He diseñado  más de 5 modelos de diversas características, y la forma más eficaz es utilizar un buffer para almacenar los datos. En tu caso de 8x80 sería un buffer de 80 bytes. Cada byte representa una columna del cartel. Esto simplifica mucho las operaciones, y optimiza la velocidad de procesado. También te recomiendo que utilices una variable para definir cuál es el primer byte a mostrar de los 80 de manera que si cambias el valor de esa variable, puedas rotar internamente el buffer de manera simple, y lograr efectos de rotaciones de manera sencilla y rápida.

Con respecto al refresco, debería ser por filas. Si bien el consumo en 80 leds asciende a 1.6A, creo que es más que justificable. Una fuente de 12V@2A no es cara.

Cualquier cosa preguntas.

Un saludo.




Desconectado gallo961

  • PIC10
  • *
  • Mensajes: 14
Re: Una manito por favor
« Respuesta #121 en: 20 de Junio de 2012, 21:10:44 »
Hola Bruno, un pregunta...

el buffer de 80bits de este ejemplo se modifica según los datos de cada fila, cierto?

Hola! El buffer es de 80 bytes. Un byte por columna, un bit por LED. No entendí lo de modificar los datos según cada fila.

si se desea hacer algunos efectos, por ejemplo solo desplazar un texto, si ya tengo un mensaje cargado para desplazar una columna se debe rotar el buffer en cada fila, si voy en el décimo desplazamiento debo rotar 10 veces el buffer cada vez que lleguen los datos de una fila.

maestro bruno ya tengo una letra perfecta pero no se como dividirlas en cada matriz.tengo 7 matrices  de 5x8 puntos es decir el cartel es de 56 columnas y 5 filas aca tengo el codi
go
Ah! Creo que logré entender algo...Bien. Tu has utilizado otro método. Mi propuesta "destruye" los datos a medida que van siendo reemplazados por otros. En mi algoritmo, cuando roto, voy destruyendo columna por columna, aunque debería ser ocupada por nuevos datos. Si entendí bien, lo que hacés es almacenar los datos originales, sin transformaciones, y luego realizar las transformaciones necesarias para generar el resultado que deberá ser mostrado en pantalla. No está mal. Técnicamente funciona. Lo que pasa es que deberías asegurarte en ese caso que todos los efectos que hagas se puedan realizar en tiempos breves, y no sean acumulativos de manera tal que cada vez demanden mayor tiempo de procesado.

Yo no llegué a explicarle a marvicdigital que hay una optimización más a la hora de rotar el buffer, sea hacia arriba, abajo, derecha o izquierda, y se basa en usar punteros. Un puntero que indique la primer columna del buffer, y otro que indique la primer fila del mísmo.

Lo explayo un poco(caso de rotaciones hacia la izq y der):

Cuando comienza el programa, el puntero de columnas apuntará a la posición donde se encuentre COL1. El algoritmo de refresco "mostrará" fila x fila los valores, comenzando desde lo que el puntero le indique, es decir, desde COL1 hasta COL32 en el programa de marvicdigital. Ahora, si yo quisiera rotar un lugar a la derecha el buffer, usando punteros, puedo sencillamente sólo cambiar el puntero, haciendo que ahora apunte a la posición donde está COL2. El algoritmo de refresco comenzará a refrescar las filas comenzando desde COL2 hasta COL1, que será la última. Fijemonos que usando punteros, el tiempo que se requiere para procesar los datos se minimiza. Sólo cambiamos el valor del puntero, para que luego la rutina de refresco se adapte a ello.
En tu caso, esto resolvería las 10 rotaciones. Sólo deberías incrementar o decrementar el puntero en 10 unidades. SIEMPRE TENIENDO EN CUENTA QUE EL BUFFER ES CICLICO. CUANDO TERMINA, HAY QUE VOLVER A RECORRERLO DESDE EL PRINCIPIO Y VICEVERSA.

Lo que yo hice fue usar excesiva RAM :(, creándome en CCS un arreglo bidimensional o matriz que emula a mi matriz de leds, si tengo por ejemplo 40 columnas tendré una matriz[40][8] y ahí cargo los datos los roto, los animo y hago quizá todo, lo más complicado creo que serán algunos algoritmos para efectos llamativos, y muestro los datos fila por fila de mi matriz[40][8] cargando a los registros byte por byte.

Crees que es un desperdicio de ram? o como se hace solo con uno o dos buffers?

un saludo.

no me especificaste si la matriz de [40][8] son bits o bytes. Si son bits, no hay desperdicio. Si son bytes y no estás usando tonalidades de color(es decir, sólo enciendes o apagas el LED(biestado))  entonces sí habría desperdicio ya que de 8 bits por LED solo usas 1. Ten en cuenta que si puedes hacer lo mísmo con una matriz de una sóla dimension, todos los accesos y operaciones son más rápidas que con matrices de más dimensiones.

Podés usar un solo buffer sin problemas si se cumple con lo que dije más arriba. Un doble buffer da 100% de seguridad, porque te permite modificar a gusto sin tener que preocuparte por si los datos se están refrescando o no mientras estás todavía realizando modificaciones al buffer. Si tenés la posibilidad de crear dos buffers, te recomiendo que lo hagas, especialmente si deseas agregarle efectos que puedan requerir de mucho tiempo para procesarlos.

Como ya mencioné, el peligro de hacer sólo un buffer es que como dependemos de nuestro buffer interno para poder ir refrescando las filas en el cartel, puede suceder que se visualicen en los LEDs los cambios que vamos realizando en el buffer. Y no es posible esperar a que termine de procesarlos para visualizarlos, porque sino mientras no podríamos refrescar las filas. Un solo buffer significa que compartimos el buffer para visualizarlo y para modificarlo.

Un saludo.








Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Una manito por favor
« Respuesta #122 en: 20 de Junio de 2012, 21:44:06 »
gallo961, tendrías que editar el mensaje para sacar tu pregunta fuera de la cita, sino no se entiende nada  ;-)


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Una manito por favor
« Respuesta #123 en: 21 de Junio de 2012, 11:58:45 »
gallo961, tendrías que editar el mensaje para sacar tu pregunta fuera de la cita, sino no se entiende nada  ;-)


Saludos!

Me sumo al pedido.
"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 hercules

  • PIC10
  • *
  • Mensajes: 5
Re: Una manito por favor
« Respuesta #124 en: 26 de Octubre de 2012, 19:46:33 »
Excelente aporte de este foro buena explicación aunque llegue tarde. Solamente al amigo  marvicdigital  , BrunoF  u otro forero pido que suba su ASM de su inicio de trabajo con el cual se a dado inicio al tema .seria de mucha ayuda para simular, (practicar) así entender mejor, para las personas que poco conocen y así entender mejor la participación de los foreros.