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

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

Desconectado marvicdigital

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 311
Una manito por favor
« en: 26 de Abril de 2009, 08:17:43 »
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?

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.

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

« Última modificación: 26 de Abril de 2009, 08:30:32 por marvicdigital »

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Una manito por favor
« Respuesta #1 en: 27 de Abril de 2009, 01:53: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?

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.


"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 marvicdigital

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 311
Re: Una manito por favor
« Respuesta #2 en: 27 de Abril de 2009, 08:22:37 »
Lo primero , muchas gracias por responder y ayudarme, pero me quedaron varias dudas:


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

Por que no me recomiendas usar las 5 columnas para formar los caracteres? , cuál sería la mejor opción, ya que tu tienes más experiencia, un consejo tuyo me serviría mucho  :)
Y otra que no comprendí por que usar 5 Bytes si lo que se quiere hacer es un barrido por filas, no serían 8 bytes? perdoná, si soy algo cabeza dura, pero me perdí en ese punto de tu valiosa respuesta  :shock:



Citar
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.


Como buffer te refieres a un registro de desplazamiento como el CD4094? puedo usar este para mi cartel? o cuál me recomendarías? 
Y como te comenté arriba, me perdí con lo de los bytes por caracter; según lo que entiendo los bytes deberían salir por el puerto que controle las filas, esto seria hacer rotar un cero por todas las 80 columnas y yo entiendo esto como barrido por columnas..no se..me confundo a veces  :D

Saludos y mil gracias


Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Una manito por favor
« Respuesta #3 en: 27 de Abril de 2009, 14:10:04 »
Por que no me recomiendas usar las 5 columnas para formar los caracteres? , cuál sería la mejor opción, ya que tu tienes más experiencia, un consejo tuyo me serviría mucho  :)
No te recomiendo que hagas todos los caracteres de 5 columnas. algunos caracteres deberían ocupar más de 5 columnas, como una 'M' o una 'W' y otros menos, como una 'l' o 'i' etc. Lo que queres hacer vos es una tipografía de tipo fixed size, y la verdad que 8 leds en vertical no dan la suficiente resolución como para crear una tipografia fixed decente a mi parecer.

Y otra que no comprendí por que usar 5 Bytes si lo que se quiere hacer es un barrido por filas, no serían 8 bytes? perdoná, si soy algo cabeza dura, pero me perdí en ese punto de tu valiosa respuesta  :shock:

El caracter '0' que tomamos como ejemplo es un mal ejemplo, porque si lo miras verás que es completamente simétrico en X e Y. Voy a poner otro ejemplo, con un caracter no simétrico como el: '4'

 1 0 0 0 1
 1 0 0 0 1
 1 0 0 0 1
 0 1 1 1 1
 0 0 0 0 1
 0 0 0 0 1
 0 0 0 0 1
 0 0 0 0 1

cuyos bytes serían: 0x07, 0x08, 0x08, 0x08, 0xFF.

supongamos ahora que en la pantalla visualizo 5 '4':(y asumo una matriz de 8x30)

 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0
 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0
 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0
 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0
 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0
 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0
 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0
 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0

El refresco sería por filas, y sería así:
Primer fila:

 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0

luego la segunda:

 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0
....
y así sucesivamente las 6 restantes.

Como buffer te refieres a un registro de desplazamiento como el CD4094? puedo usar este para mi cartel? o cuál me recomendarías? 
Y como te comenté arriba, me perdí con lo de los bytes por caracter; según lo que entiendo los bytes deberían salir por el puerto que controle las filas, esto seria hacer rotar un cero por todas las 80 columnas y yo entiendo esto como barrido por columnas..no se..me confundo a veces  :D

Saludos y mil gracias



No, yo me refería aun buffer INTERNO. utilizando RAM del PIC. 80 bytes en tu caso. Los CD4094 son excelentes para esto.
Para mostrar la primer fila de leds, debes enviar a los 4094(encargados de las columnas) la secuencia:  1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0

y luego encender el ánodo de la primer fila.

Para enviar cada uno de los bytes de la trama  1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0, deberás utilizar una mascara(que será 0x80 para la fila1, 0x40 para la fila 2, 0x20 para la 3, 0x10 para la 4ta, 0x08 para la 5ta...etc) e ir haciendo una AND entre cada byte del buffer y la máscara. Si el resultado da distinto de cero, entonces envías un 1. caso contrario envías un cero(a los 4094).

Las rotaciones deberían realizarse utilizando un buffer interno. No en los 4094...

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 marvicdigital

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 311
Re: Una manito por favor
« Respuesta #4 en: 27 de Abril de 2009, 23:24:21 »
Por que no me recomiendas usar las 5 columnas para formar los caracteres? , cuál sería la mejor opción, ya que tu tienes más experiencia, un consejo tuyo me serviría mucho  :)
No te recomiendo que hagas todos los caracteres de 5 columnas. algunos caracteres deberían ocupar más de 5 columnas, como una 'M' o una 'W' y otros menos, como una 'l' o 'i' etc. Lo que queres hacer vos es una tipografía de tipo fixed size, y la verdad que 8 leds en vertical no dan la suficiente resolución como para crear una tipografia fixed decente a mi parecer.

Y otra que no comprendí por que usar 5 Bytes si lo que se quiere hacer es un barrido por filas, no serían 8 bytes? perdoná, si soy algo cabeza dura, pero me perdí en ese punto de tu valiosa respuesta  :shock:

El caracter '0' que tomamos como ejemplo es un mal ejemplo, porque si lo miras verás que es completamente simétrico en X e Y. Voy a poner otro ejemplo, con un caracter no simétrico como el: '4'

 1 0 0 0 1
 1 0 0 0 1
 1 0 0 0 1
 0 1 1 1 1
 0 0 0 0 1
 0 0 0 0 1
 0 0 0 0 1
 0 0 0 0 1

cuyos bytes serían: 0x07, 0x08, 0x08, 0x08, 0xFF.

supongamos ahora que en la pantalla visualizo 5 '4':(y asumo una matriz de 8x30)

 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0
 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0
 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0
 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0
 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0
 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0
 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0
 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0

El refresco sería por filas, y sería así:
Primer fila:

 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0

luego la segunda:

 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0
....
y así sucesivamente las 6 restantes.

Como buffer te refieres a un registro de desplazamiento como el CD4094? puedo usar este para mi cartel? o cuál me recomendarías? 
Y como te comenté arriba, me perdí con lo de los bytes por caracter; según lo que entiendo los bytes deberían salir por el puerto que controle las filas, esto seria hacer rotar un cero por todas las 80 columnas y yo entiendo esto como barrido por columnas..no se..me confundo a veces  :D

Saludos y mil gracias



No, yo me refería aun buffer INTERNO. utilizando RAM del PIC. 80 bytes en tu caso. Los CD4094 son excelentes para esto.
Para mostrar la primer fila de leds, debes enviar a los 4094(encargados de las columnas) la secuencia:  1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0

y luego encender el ánodo de la primer fila.

Para enviar cada uno de los bytes de la trama  1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0, deberás utilizar una mascara(que será 0x80 para la fila1, 0x40 para la fila 2, 0x20 para la 3, 0x10 para la 4ta, 0x08 para la 5ta...etc) e ir haciendo una AND entre cada byte del buffer y la máscara. Si el resultado da distinto de cero, entonces envías un 1. caso contrario envías un cero(a los 4094).

Las rotaciones deberían realizarse utilizando un buffer interno. No en los 4094...

Saludos.






Que respuesta tan sublime..de verdad que muchas gracias.
Mañana comienzo mi aventura con los carteles a leds, y tu información la trataré de asimilar a medida que valla avanzando.

Mil gracias de nuevo..

Saludos

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Una manito por favor
« Respuesta #5 en: 28 de Abril de 2009, 02:28:26 »
Hola Marvic.

Tiene que ser en asm? yo he hecho de esos letreritos pero en C. Cualquier cosa me avisas.


Saludos
El papel lo aguanta todo

Desconectado marvicdigital

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 311
Re: Una manito por favor
« Respuesta #6 en: 28 de Abril de 2009, 23:16:25 »
Hola Marvic.

Tiene que ser en asm? yo he hecho de esos letreritos pero en C. Cualquier cosa me avisas.



Saludos

Muchas gracias MLO por tu voluntad de ayudarme, pero desafortunadamente de C no se  :? ..y tu publik está muy bien, te felicito, una pregunta.. que leds usaste? led difuso, o de chorro?

Saludos
« Última modificación: 29 de Abril de 2009, 05:51:36 por marvicdigital »

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Una manito por favor
« Respuesta #7 en: 29 de Abril de 2009, 00:50:45 »
de chorro. Con difuso tambien lo he heco, pero el brillo frontal no se compara.
El papel lo aguanta todo

Desconectado marvicdigital

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 311
Re: Una manito por favor
« Respuesta #8 en: 02 de Mayo de 2009, 09:04:11 »
Me acabo de perder, estoy más confundido que un corcho en un remolino, en este punto:


El caracter '0' que tomamos como ejemplo es un mal ejemplo, porque si lo miras verás que es completamente simétrico en X e Y. Voy a poner otro ejemplo, con un caracter no simétrico como el: '4'

 1 0 0 0 1
 1 0 0 0 1
 1 0 0 0 1
 0 1 1 1 1
 0 0 0 0 1
 0 0 0 0 1
 0 0 0 0 1
 0 0 0 0 1

cuyos bytes serían: 0x07, 0x08, 0x08, 0x08, 0xFF.

Según tu explicación y lo poco que entendí o que no he podido asimilar bien es que cada columna tiene su valor para que al rotar las filas formen esa columna de la letra; tu usas a cambio de rotar un 1;RLF o RRF (en mi caso las filas encienden con un "0") haces la operación AND entre cada bit que conforma el byte de la columna y el valor que halla en las filas o mascara, por ejemplo lo de 80H,40H y asi que es lo mismo que rotar el 1 de izquierda a derecha, al fin de cuentas hacer el barrido de las filas de abajo hacia arriba, (cosa que mejor cambie por cuestiones practicas de arriba hacia abajo)..espero  estar explicándome bien hasta acá.

Yo lo que hice fue para formar la letra "A", que por cierto la puedo visualizar en el panel provisional para pruebas de 8x32:

Código: [Seleccionar]
FORMAR_LETRA ;letra A , de 8x6
ADDWF PCL,1
RETLW B'011110'
RETLW B'111111'
RETLW B'110011'
RETLW B'110011'
RETLW B'111111'
RETLW B'110011'
RETLW B'110011'
RETLW B'110011'

Como puedes ver, para mi forma de ver el funcionamiento de una matriz es hacer las letras con 8 bytes que son las filas, cada byte para este ejemplo de la letra "A"  lo tengo con solo 6 bits, esos 6 bits los roto en el registro de desplazamiento hasta las últimas 6 columnas(si quiero ver la letra a la derecha), luego enciendo la fila correspondiente haciendo una rotación de derecha a izquierda osea RRF  PORTB (que es en donde tengo conectada las filas, primer bit fila de arriba), luego apago y asi con los restantes 7 bytes. Pero veo que tu usas esos bytes en forma vertical(columnas), por asi decirlo..este punto es el que no he podido asimilar muy bien y me pierdo, por eso no he podido entender  lo de los 80 registros para las 80 columnas, ...como hago para enviar cada bit de cada columna  y todas las columnas al registro de desplazamiento?....osea para mi caso de la letra "A" los bytes serían asi, según la forma que me explicaste y que asimile(eso creo):

Código: [Seleccionar]
FORMAR_LETRA ;letra A , de 8x6
ADDWF PCL,1
RETLW B'11111110'
RETLW B'11111111'
RETLW B'00010011'
RETLW B'00010011'
RETLW B'11111111'
RETLW B'11111110'


A caso se haría rotando hacia la derecha el byte de la columna y hacer un Bit Test al primer bit y de ahi el resto?..o con la AND y la máscara? es que esta última no la logro coger  :?, me confunde el hecho de tener que hacer esta operación 80 veces....

mejor dicho maestro ilumíname .. :(

Saludos

Y MLO gracias por tu consejo, acabo de armar el panel hasta ahora de 8x32, con la posibilidad de agregarle más paneles hasta llegar a las 80 columnas, y use los leds de chorro y valla que si no hay problemas conn el brillo , eso si uso barrido de 2ms con resistencia a 68ohms y se ve de lujo, por ahora la letra A  :( , claro puedo hacer cualquier letra, iluminar toda la pantalla con el mismo barrido; pero quiero entender lo de las columnas para empezar hacer el resto.


************* Creo que estoy empezando a entender lo de las columnas..es que si no me despejo me encoco, me encierro y me enfrasco..en fin me tapo  :mrgreen: ..claro por eso lo de la mascara, solo es hacer la operación AND entre el byte de la columna y la mascara esto nos define el bit a enviar pro el registro, solo que hay que hecerlo mas o menos asi:

leer primera columna -
hacer AND con máscara para la primera fila, según tu ejemplo 80H
Dependiendo del resultado se envía el primer bit al registro de desplazamiento
luego leer segunda columna
hacer AND con máscara para la primera fila y el resultado nos dará el segundo bit que se va para el registro de desplazamiento(CD4094). Hacemos lo mismo para el resto de las columnas, de ahi la importancia de tener los 80 registros(col1, col2 ...col80) y el registrto que guarde nuestra mascara
Luego cambiamos de mascara que sería la segunda fila y el resto igual que arriba, eso antes de este paso se muestra la fila 1 en los leds..

Es asi maestro ?  :g) me disculpas si te llamo maestro pero en mi país toda persona que comparte sus sabios conocimientos y nos enseña algo mas le llamamos asi como una forma de aprecio, reconocimiento y de que está por encima de nosotros en cultura..en este caso en como hacer los publik  :-).

Saludos de nuevo 


Una última cosa, la otra vez tuve un programa en donde podía crear los caracteres para las matrices de 8x8 o cualquier otro tamaño, y te daba el resultado en hexadecimal por columnas o filas para formar dicho caracter, el problema es que no recuerdo el nombre el programa y mucho menos en donde ubicarlo..si alguien sabe de esto, pues le agradecería mucho su valiosa información.
« Última modificación: 02 de Mayo de 2009, 09:58:54 por marvicdigital »

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Una manito por favor
« Respuesta #9 en: 02 de Mayo de 2009, 15:19:39 »
Es asi maestro ?  :g) me disculpas si te llamo maestro pero en mi país toda persona que comparte sus sabios conocimientos y nos enseña algo mas le llamamos asi como una forma de aprecio, reconocimiento y de que está por encima de nosotros en cultura..en este caso en como hacer los publik  :-).

Claro! Es así. La AND enmascara los bits para ver si tienes que inyectar un 1 o un 0 a los 4094. Por eso si tienes 80 columnas esto se hace 80 veces. También se podría hacer horizontal como tu hacías al principio, pero  fijate que desperdicias 2bits por cada fila, quiere decir que en esa laetra ya has desperdiciado 2 bytes. Imaginate en más letras...

Los 80 registros son exactamente los 8x80 leds. Los almacenas como bits. Un bit = 1 led. Entonces tu solo mandas a los 4094 lo que haya en estos 80 bytes(registros).  Esto es un BUFFER, porque almacenas los datos temporalmente allí. Hacerlo con un buffer te permite que te despreocupes por la parte de salida a pantalla. Cuando tu modifiques un bit del buffer, como la salida lee el buffer, lo mostrará a la hora de refrescarse en pantalla.
Si lo quieres hacer realmente bien, en mis programas yo uso lo que se llama "double buffering" y esto sería agregar otro buffer más(80 registros).
Entonces, vas alternando de buffer. Usas uno(es decir, lo muestras en los 4094) y mientras trabajas(modificas los valores de los leds(bits)) en el otro para el próximo cuadro. Una vez que terminaste de modificarlo, indicas que usarás el otro buffer, y comienzas a trabajar en el otro nuevamente para luego volver a intercalarlos.

Entonces, por un lado tienes que hacer una rutina con un tiempo base(usando un timer seria lo mejor). Cuando ocurra la interrupcion del timer, refrescas la próxima fila.

Un double buffer no se justifica si todas las operaciones que piensas hacer, como rotaciones horizontales, verticales o cualquier otra no llevan más tiempo que el del timer. Esto quiere decir que un buffer doble no es estrictamente necesario si tu algoritmo siempre logra modificar el buffer entre dos refrescos de filas del programa.

Otra cosa más: Si usás un sólo buffer y tus modificaciones se hacen entre el refresco de dos filas, asegurate que sea inmediatamente luego de refrescar la última(fila) y antes de comenzar la primera(fila) nuevamente.

Si usas double buffer, alterná los buffer después de refrescar la ultima fila.

Esto se hace para no mezclar los cuadros. Si no lo hacés y:
*Sin usar doble buffer, tu rutina de modificacion necesita mas tiempo que el tiempo entre refrescos de fila;
*O si bien lográs hacer las modifcaciones entre refrescos de filas pero no lo hacés después de refrescar la última fila y antes de refrescar la primera;
*O bien usando doble buffer intercalás buffer en un momento distinto al de después de refrescar la última fila y antes de la primera;

vas a obtener una visualización distorcionada, como el siguiente ejemplo que te pongo sería ante una rotación a la izquierda:



Así que a tener cuidado con esas cosas.


Una última cosa, la otra vez tuve un programa en donde podía crear los caracteres para las matrices de 8x8 o cualquier otro tamaño, y te daba el resultado en hexadecimal por columnas o filas para formar dicho caracter, el problema es que no recuerdo el nombre el programa y mucho menos en donde ubicarlo..si alguien sabe de esto, pues le agradecería mucho su valiosa información.

Realmente desconozco ese programa. Tal vez en el foro hayan hecho algo de eso.
"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 marvicdigital

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 311
Re: Una manito por favor
« Respuesta #10 en: 03 de Mayo de 2009, 11:32:52 »

Claro! Es así. La AND enmascara los bits para ver si tienes que inyectar un 1 o un 0 a los 4094. Por eso si tienes 80 columnas esto se hace 80 veces. También se podría hacer horizontal como tu hacías al principio, pero  fijate que desperdicias 2bits por cada fila, quiere decir que en esa laetra ya has desperdiciado 2 bytes. Imaginate en más letras...

Los 80 registros son exactamente los 8x80 leds. Los almacenas como bits. Un bit = 1 led. Entonces tu solo mandas a los 4094 lo que haya en estos 80 bytes(registros).  Esto es un BUFFER, porque almacenas los datos temporalmente allí. Hacerlo con un buffer te permite que te despreocupes por la parte de salida a pantalla. Cuando tu modifiques un bit del buffer, como la salida lee el buffer, lo mostrará a la hora de refrescarse en pantalla.
Si lo quieres hacer realmente bien, en mis programas yo uso lo que se llama "double buffering" y esto sería agregar otro buffer más(80 registros).
Entonces, vas alternando de buffer. Usas uno(es decir, lo muestras en los 4094) y mientras trabajas(modificas los valores de los leds(bits)) en el otro para el próximo cuadro. Una vez que terminaste de modificarlo, indicas que usarás el otro buffer, y comienzas a trabajar en el otro nuevamente para luego volver a intercalarlos.

Entonces, por un lado tienes que hacer una rutina con un tiempo base(usando un timer seria lo mejor). Cuando ocurra la interrupcion del timer, refrescas la próxima fila.

Un double buffer no se justifica si todas las operaciones que piensas hacer, como rotaciones horizontales, verticales o cualquier otra no llevan más tiempo que el del timer. Esto quiere decir que un buffer doble no es estrictamente necesario si tu algoritmo siempre logra modificar el buffer entre dos refrescos de filas del programa.

Otra cosa más: Si usás un sólo buffer y tus modificaciones se hacen entre el refresco de dos filas, asegurate que sea inmediatamente luego de refrescar la última(fila) y antes de comenzar la primera(fila) nuevamente.

Si usas double buffer, alterná los buffer después de refrescar la ultima fila.

Esto se hace para no mezclar los cuadros. Si no lo hacés y:
*Sin usar doble buffer, tu rutina de modificacion necesita mas tiempo que el tiempo entre refrescos de fila;
*O si bien lográs hacer las modifcaciones entre refrescos de filas pero no lo hacés después de refrescar la última fila y antes de refrescar la primera;
*O bien usando doble buffer intercalás buffer en un momento distinto al de después de refrescar la última fila y antes de la primera;

vas a obtener una visualización distorcionada, como el siguiente ejemplo que te pongo sería ante una rotación a la izquierda:



Así que a tener cuidado con esas cosas.


Muchas gracias por tu explicación, quedé bien claro, ya puedo formar los caracteres que quiera sin problema alguno, pensé que sería la parte más complicada y resulta que ahora estoy medio confundido con el desplazamiento del texto de izquierda a derecha; según estuve leyendo solo es cuestión de llenar todas las columnas de ceros, luego  ir poniendo un cero menos por pantallazo que muestre, pero lo que veo complicado es el algoritmo para pasar el byte de la última columna a la penultima, esta a la anterior y asi hasta la primera, he tratado de hacerlo con los Registros FSR y INDF pero no me resulta, me da un montón de lineas que ami modo de ver se haría muy grande para algo tan simple(aparentemente), a no ser que sea de ese modo y no halla alternativa, pero me parece que debe existir la forma más adecuada..me gustaría que me guiaras un poco más en este aspecto, espero no ser tan abusivo, pero quiero saber esos truquitos para aplicarlos por lo menos al desplazamiento de izquierda a derecha.

De nuevo mil gracias por compartir tus conocimientos.

Saludos

Edición 1:

Bueno, por ahora lo estoy haciendo de la forma más rudimentaria, el efecto de desplazamiento hacia la izquierda, hice una rutina y es más o menos así:

Código: [Seleccionar]
ROTAR_IZQUIERDA
MOVF COL31,W
MOVWF COL32
MOVF COL30,W
MOVWF COL31
MOVF COL29,W
MOVWF COL30
MOVF COL28,W
MOVWF COL29
MOVF COL27,W
MOVWF COL28
MOVF COL26,W
MOVWF COL27
Y asi hasta la primera columna.

No se si esta sea la mejor forma de hacer los efectos, o sea la única, pero se me hace extraño tanta linea y memoria consumida, no se, debe ser que me he vuelto muy ahorrativo o quiero inventar lo que ya está inventado  :D...

Otra anotación es que a cada letra le estoy poniendo al final de los hexadecimales que la forman el 000H y asi poder avisar cuando se debe cargar el próximo caracter y  sy a eso le sumamos que nos queda con una columna de espacio, no se si esa sea una buena forma ya que al ver letras como la M o la W que se llevan más columnas o la I pues es una buena forma de ahorrar columnas...o se puede hacer de otra forma mucho más técnica?..



Saludos
« Última modificación: 03 de Mayo de 2009, 15:54:10 por marvicdigital »

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Una manito por favor
« Respuesta #11 en: 03 de Mayo de 2009, 15:53:56 »
Bueno, hoy al principio del hilo creo que te dije que deberías reservar 80 bytes de memoria consecutivos. Resultaría de importancia saber qué pic estás usando, ya que depende mucho del pic utilizado la distribución de memoria RAM del buffer.

Yo te lo voy a explicar como para un 16F877A y utilizando el banco1 del pic para el buffer, por lo que el buffer abarcaría desde la posición 0xA0 a la 0xEF inclusive(intervalo [0xA0;0xEF]).

El registro FSR permite direccionar indirectamente 256 posiciones RAM del PIC.Como estos PICs tienen más de 256 posiciones de memoria, el registro FSR tiene un noveno bit, que selecciona entre los bancos 0-1 o 2-3 de la memoria. Para verlo mas facil, la direccion a la que apunta el registro está conformada por:

                        bit8          bit7    bit6    bit5    bit4    bit3    bit2    bit1    bit0
                  STATUS,IRP  FSR,7 FSR,6 FSR,5 FSR,4 FSR,3 FSR,2 FSR,1 FSR,0

 Esto significa que, para acceder a los banco 0-1 debemos asegurar el bit STATUS,IRP a 0. Luego accederemos a los registros de dichos bancos usando solo el FSR.

El programa no es dificil.  Para rotar de izq a der usando direccionamiento indirecto deberías hacer:
 
Código: ASM
  1. #define inicio_buffer 0xA0
  2. #define tamanio_buffer .80

Y la función:

Código: ASM
  1. if tamanio_buffer<2 error "El buffer es demasiado pequeño!!!!"
  2.              movlw     inicio_buffer + tamanio_buffer -  2 ;en mi caso sería 0xA0 + .80 - 2 = 0x7E
  3.              movwf     FSR
  4.            
  5. otra_rot_der
  6.              movf       INDF,W
  7.              incf         FSR,F
  8.              movwf    INDF
  9.              
  10.              decf        FSR,F
  11.              decf        FSR,F
  12.              movlw     inicio_buffer-1
  13.              xorwf      FSR,W
  14.              btfss       STATUS,Z
  15.              goto       otra_rot_der
  16.  
  17.              incf         FSR,F            
  18.              clrf         INDF
  19.              ;listo

Para rotar a la izquierda, el algoritmo es un poco mas sencillo y similar al anterior, solo que recorres de izquierda a derecha el buffer.

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 BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Una manito por favor
« Respuesta #12 en: 03 de Mayo de 2009, 15:56:26 »
P.D. por defecto, el STATUS,IRP se setea a cero. Por eso no lo modifico.

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 marvicdigital

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 311
Re: Una manito por favor
« Respuesta #13 en: 03 de Mayo de 2009, 20:15:57 »
Bueno, hoy al principio del hilo creo que te dije que deberías reservar 80 bytes de memoria consecutivos. Resultaría de importancia saber qué pic estás usando, ya que depende mucho del pic utilizado la distribución de memoria RAM del buffer.

Yo te lo voy a explicar como para un 16F877A y utilizando el banco1 del pic para el buffer, por lo que el buffer abarcaría desde la posición 0xA0 a la 0xEF inclusive(intervalo [0xA0;0xEF]).

El registro FSR permite direccionar indirectamente 256 posiciones RAM del PIC.Como estos PICs tienen más de 256 posiciones de memoria, el registro FSR tiene un noveno bit, que selecciona entre los bancos 0-1 o 2-3 de la memoria. Para verlo mas facil, la direccion a la que apunta el registro está conformada por:

                        bit8          bit7    bit6    bit5    bit4    bit3    bit2    bit1    bit0
                  STATUS,IRP  FSR,7 FSR,6 FSR,5 FSR,4 FSR,3 FSR,2 FSR,1 FSR,0

 Esto significa que, para acceder a los banco 0-1 debemos asegurar el bit STATUS,IRP a 0. Luego accederemos a los registros de dichos bancos usando solo el FSR.

El programa no es dificil.  Para rotar de izq a der usando direccionamiento indirecto deberías hacer:
 
Código: ASM
  1. #define inicio_buffer 0xA0
  2. #define tamanio_buffer .80

Y la función:

Código: ASM
  1. if tamanio_buffer<2 error "El buffer es demasiado pequeño!!!!"
  2.              movlw     inicio_buffer + tamanio_buffer -  2 ;en mi caso sería 0xA0 + .80 - 2 = 0x7E
  3.              movwf     FSR
  4.            
  5. otra_rot_der
  6.              movf       INDF,W
  7.              incf         FSR,F
  8.              movwf    INDF
  9.              
  10.              decf        FSR,F
  11.              decf        FSR,F
  12.              movlw     inicio_buffer-1
  13.              xorwf      FSR,W
  14.              btfss       STATUS,Z
  15.              goto       otra_rot_der
  16.  
  17.              incf         FSR,F            
  18.              clrf         INDF
  19.              ;listo

Para rotar a la izquierda, el algoritmo es un poco mas sencillo y similar al anterior, solo que recorres de izquierda a derecha el buffer.

Saludos

Santo Dios!..en serio este texto tuyo enseñándome a usar el FSR e INDF  más allá de lo que uno encuentra en los datasheets es sublime..de verdad que estoy muy agradecido contigo, ojala estuviera en tu país y te invitaba a un buen Whisky, ese montón de lineas que describía arriba quedaron resumidas en esto:

Código: [Seleccionar]
ROTAR_IZQUIERDA
            MOVLW      COL31
            MOVWF      FSR
OTRA_ROT_IZQ
            MOVF        INDF,W
            INCF         FSR,F
            MOVWF    INDF
            DECF        FSR,F
        DECF          FSR,F
            MOVLW COL1-1
            XORWF       FSR,W
        BTFSS       STATUS,Z
        GOTO        OTRA_ROT_IZQ
         RETURN


Pasar de 160 lineas de código a solo 12, es que aún no me la creo..de verdad que muchas gracias, y ahora aprendí algo más usar  MOVLW  COL-1   es que para mi eso es nuevo, en los tutoriales sobre ASM, para PIC no he visto hacer eso, por eso me limito mucho a la hora de hacer un código; si me puedes decir algún libro o web que tenga todos esos truquitos, o información bien completa sobre ASM te lo agradecería ..claro si me sigues perdonando el ser tan abusivo  :mrgreen:...de verdad muchas gracias...y no use el <if tamaño_del_buffer <2 error.... por que para ser franco tampoco sabía que se podía hacer eso..de verdad estoy muy contento de aprender esto hoy, más allá de que ahora tenga el cartel corriendo de derecha a izquierda me tiene más contento lo primero  :-) :-) :-) :-) :-) :mrgreen:

Saludos 

Ahh quiero aclarar que por ahora uso solo 32 columnas, mientras aprendo, pero esta semana le sumo las  otras columnas, y estoy usando el PIC16F877A..que adivinaste, se que puede ser muy grande pero como quiero implementar teclado de PC, RS232, RTC, memoria 24LC256 y que tenga varios efectos pues la memoria fue la que me llamó la atención  :g).

Otra anotación es que a cada letra le estoy poniendo al final de los hexadecimales que la forman el 000H y asi poder avisar cuando se debe cargar el próximo caracter y   a eso le sumamos que nos queda con una columna de espacio entre caracteres, no se si esa sea una buena forma ya que al ver letras como la M o la W que se llevan más columnas o la I pues es una buena forma de ahorrar columnas...o se puede hacer de otra forma mucho más técnica?..
« Última modificación: 03 de Mayo de 2009, 20:22:25 por marvicdigital »

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Una manito por favor
« Respuesta #14 en: 03 de Mayo de 2009, 21:58:02 »
Santo Dios!..en serio este texto tuyo enseñándome a usar el FSR e INDF  más allá de lo que uno encuentra en los datasheets es sublime..de verdad que estoy muy agradecido contigo, ojala estuviera en tu país y te invitaba a un buen Whisky, ese montón de lineas que describía arriba quedaron resumidas en esto:

Código: [Seleccionar]
ROTAR_IZQUIERDA
            MOVLW      COL31
            MOVWF      FSR
OTRA_ROT_IZQ
            MOVF        INDF,W
            INCF         FSR,F
            MOVWF    INDF
            DECF        FSR,F
        DECF          FSR,F
            MOVLW COL1-1
            XORWF       FSR,W
        BTFSS       STATUS,Z
        GOTO        OTRA_ROT_IZQ
         RETURN


Pasar de 160 lineas de código a solo 12, es que aún no me la creo..de verdad que muchas gracias, y ahora aprendí algo más usar  MOVLW  COL-1   es que para mi eso es nuevo, en los tutoriales sobre ASM, para PIC no he visto hacer eso, por eso me limito mucho a la hora de hacer un código;

Desconozco si en los tutoriales se menciona, pero es perfectamente posible hacerlo. Obviamente lo que sucede en este caso, es que la instrucción(MOVLW) espera un LITERAL como argumento, y al pasarle el valor "COL1" lo que hará será reemplazarlo por la posición de memoria en la cual la habías declarado. Es decir que si habías usado, por ejemplo: COL1 EQU 0xA0 entonces el MPASM lo reemplazará por el valor 0xA0. Luego si haces COL1-1 restará 1 al valor, obteniendo finalmente 0x9F. Por lo que MOVLW COL1-1 termina siendo MOVLW 0x9F. Destaco que este valor(0x9F) se genera a la hora de ensamblar el código. Luego cuando el programa esté corriendo en tiempo de ejecución(en el PIC) no se modificará de ninguna manera, excepto reescribiendo la FLASH. Sirve para generar codigo legible a la hora de ensamblarlo, pero una vez ensamblado su valor es estático.

si me puedes decir algún libro o web que tenga todos esos truquitos, o información bien completa sobre ASM te lo agradecería ..claro si me sigues perdonando el ser tan abusivo  :mrgreen:...de verdad muchas gracias...y no use el <if tamaño_del_buffer <2 error.... por que para ser franco tampoco sabía que se podía hacer eso..de verdad estoy muy contento de aprender esto hoy, más allá de que ahora tenga el cartel corriendo de derecha a izquierda me tiene más contento lo primero  :-) :-) :-) :-) :-) :mrgreen:

No conozco libros realmente...aquí en el foro tenés muchos consejos, yo he escrito un par de tips en el "almacen del assembler" en un hilo que he creado, podrias buscarlo y agregar los que quieras.

Ahh quiero aclarar que por ahora uso solo 32 columnas, mientras aprendo, pero esta semana le sumo las  otras columnas, y estoy usando el PIC16F877A..que adivinaste, se que puede ser muy grande pero como quiero implementar teclado de PC, RS232, RTC, memoria 24LC256 y que tenga varios efectos pues la memoria fue la que me llamó la atención  :g).

El tamaño del PIC es, a mi parecer, el correcto. Optimizando recursos podrías hacerlo con un 16F874A que es el hermano menor del 16F877A o bien con un 16F873A.

Otra anotación es que a cada letra le estoy poniendo al final de los hexadecimales que la forman el 000H y asi poder avisar cuando se debe cargar el próximo caracter y   a eso le sumamos que nos queda con una columna de espacio entre caracteres, no se si esa sea una buena forma ya que al ver letras como la M o la W que se llevan más columnas o la I pues es una buena forma de ahorrar columnas...o se puede hacer de otra forma mucho más técnica?..

Si, es una buena idea. El resto de las técnicas no mejorarían prácticamente nada. Usá ese método.

Ahora, no se si te has dado cuenta, pero al plantear el buffer mediante 80 bytes, representando cada byte una columna de LEDs. podrás apreciar que los efectos de subir o bajar el texto mostrado son muy fáciles de hacer usando, obviamente el direccionamiento indirecto y usando rotaciones RLF y RRF para subir o bajar el texto. Si decidis hacerlo, lee bien sobre las instrucciones RLF y RRF ya que incorporan el CARRY al rotar y puede generarte valores indeseados en los registros rotados, lo que conllevará a que al rotar se meta "mugre" en la visualización.

Saludos.
« Última modificación: 03 de Mayo de 2009, 22:00:07 por BrunoF »
"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.


 

anything