TODOPIC

Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: marvicdigital en 26 de Abril de 2009, 08:17:43

Título: Una manito por favor
Publicado por: marvicdigital 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

Título: Re: Una manito por favor
Publicado por: BrunoF 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.


Título: Re: Una manito por favor
Publicado por: marvicdigital 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

Título: Re: Una manito por favor
Publicado por: BrunoF 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.




Título: Re: Una manito por favor
Publicado por: marvicdigital 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
Título: Re: Una manito por favor
Publicado por: MLO__ 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
Título: Re: Una manito por favor
Publicado por: marvicdigital 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
Título: Re: Una manito por favor
Publicado por: MLO__ en 29 de Abril de 2009, 00:50:45
de chorro. Con difuso tambien lo he heco, pero el brillo frontal no se compara.
Título: Re: Una manito por favor
Publicado por: marvicdigital 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.
Título: Re: Una manito por favor
Publicado por: BrunoF 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:

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=25723.0;attach=9047)

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.
Título: Re: Una manito por favor
Publicado por: marvicdigital 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:

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=25723.0;attach=9047)

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
Título: Re: Una manito por favor
Publicado por: BrunoF 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
Título: Re: Una manito por favor
Publicado por: BrunoF 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.
Título: Re: Una manito por favor
Publicado por: marvicdigital 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?..
Título: Re: Una manito por favor
Publicado por: BrunoF 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.
Título: Re: Una manito por favor
Publicado por: jmcs87 en 03 de Mayo de 2009, 22:13:46
hola

solo queria comentar que yo ya e realizado lo que quiere marvic

http://micros.mforos.com/1149907/8023880-desarrollo-panel-90x8-16f877a-24lc256-ds1307-con-usb/

espero que le sirva como referencia para hacer su panel

SAludos :mrgreen:
Título: Re: Una manito por favor
Publicado por: Cryn en 03 de Mayo de 2009, 23:27:46
Hola Bruno, un pregunta...

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

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.

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.
Título: Re: Una manito por favor
Publicado por: Cryn en 03 de Mayo de 2009, 23:55:24
hola

solo queria comentar que yo ya e realizado lo que quiere marvic

http://micros.mforos.com/1149907/8023880-desarrollo-panel-90x8-16f877a-24lc256-ds1307-con-usb/

espero que le sirva como referencia para hacer su panel

SAludos :mrgreen:

te quedó un panel muy bueno jmcs87, quisiera ver un esquema completo de tu hardware, si es que se puede claro y que me cuentes más sobre el truco para que los registros queden invisibles en la parte trasera de los leds.

un saludo, y que buen trabajo hiciste :-/ :-/
Título: Re: Una manito por favor
Publicado por: BrunoF en 04 de Mayo de 2009, 00:08:50
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.

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.






Título: Re: Una manito por favor
Publicado por: marvicdigital en 04 de Mayo de 2009, 00:10:23
hola

solo queria comentar que yo ya e realizado lo que quiere marvic

http://micros.mforos.com/1149907/8023880-desarrollo-panel-90x8-16f877a-24lc256-ds1307-con-usb/

espero que le sirva como referencia para hacer su panel

SAludos :mrgreen:

Claro que ya lo había visto, y a sido parte fundamental de inspiración para aventurarme a hacerlo  :-/, llegue a tu link gracias a que primero busque información aca en los foros y encontré tu post y mira..que bonito te quedó..puro led azul..debió costar lo suyo ese panel  :-)
Mis felicitaciones, te ha quedado muy bien   :wink:

Cuando será que muestre el mío así....por ahora tengo un inconveniente que no logro entender, y resulta que si escribo valores hexadecimales a las primeras columnas para que me formen una letra, la pongo a rotar y me funciona bien, pero si cambio lo anterior por un llamado a una tabla con los mismos valores hexadecimales de tal forma que cuando se haga la rotación, el valor hexadecimal siguiente lo cargue en COL1 para mostrarlo y seguir rotando..el detalle está en que apenas llega en la tabla al 4 valor hexadecimal se me reinicia el microcontrolador y he revisado y no veo el problema, no me he pasado de la pila, siempre uso un máximo de 3 rutinas, osea Call A , dentro de la rutina A llamo Call B y asi máximo hasta C, y en mi programa no uso si no 2...de verdad que no entiendo por que se me reinicia..dejo el fragmento donde tengo la rutina para el llamado de la tabla de caracteres..a ver si encuentran mi falla y me ayudan un poco  :? y mil gracias de antemano.

Código: [Seleccionar]
INICIO
BSF STATUS,RP0
CLRF TRISC
CLRF TRISB
CLRF OPTION_REG
BCF STATUS,RP0
;BCF STATUS,IRP
LOOP_INICIO
MOVLW 0FFH
MOVWF PORTB
BCF         LOAD                 ;LOAD DE EL CD4094
MOVLW .32
MOVWF COLUMNAS
MOVLW COL1
MOVWF FSR
CEROS_COLUMNAS                    ;BORRO TODAS LAS COLUMNAS PARA EMPEZAR LIMPIA LA PANTALLA
CLRF         INDF
DECFSZ COLUMNAS
GOTO SEGUIR_BORRANDO
GOTO SIGUIENTE_FASE
SEGUIR_BORRANDO
INCF         FSR,1
GOTO CEROS_COLUMNAS

SIGUIENTE_FASE
CLRF        LETRA
MOVF LETRA,W
CALL         A                ;tabla para la letra A
MOVWF     COL1
METER_COLUMNAS
CALL        PANTALLAZO          ;MUESTRA EN PANTALLA VARIAS VECES LA MISMA COLUMNA
CALL        ROTAR_IZQUIERDA        ;ANTES DE DESPLAZARLALA Y ASI DARLE VELOCIDAD AL DESPLAZAMIENTO
INCF        LETRA
MOVF LETRA,W
CALL        A                          ;SIGUIENTE VALOR HEXADECIMAL DE LA LETRA A
MOVWF COL1                     ;CARGO COL1 CON EL NUEVO VALOR HEXADECIMAL
XORLW 000H                     ;MIRO SI YA TERMINO LOS VALORES QUE FORMAN LA LETRA
BTFSS STATUS,Z
GOTO METER_COLUMNAS     ; SI NO VOY A MOSTRAR COL1 CON EL NUEVO VALOR
CALL         ESPACIOS_BLANCO  ;SI TERMINO DE LEER LA LETRA A, ENTONCES LLENO DE ESPACIOS PARA QUE
GOTO SIGUIENTE_FASE      ;SEA VEA EFECTO DE DESPLAZAMIENTO. SOLO A MODO DE PRUEBA



A ADDWF PCL,1 ;letra A , de 8x6
RETLW B'11111110'
RETLW B'11111111'
RETLW B'00010011'
RETLW B'00010011'
RETLW B'11111111'
RETLW B'11111110'
RETLW 000H




INCLUDE CD4094.INC
INCLUDE RETARDOS.INC

END

Es una parte del código, como estoy aprendiendo, pues solo estoy haciendo pruebas para empaparme bien del asunto antes de empezar a introducir todos los caracteres, rutinas de lectura de memoria, teclado,efectos, etc..

De antemano muchas gracias por la ayuda que me puedan dar.

Saludos

Título: Re: Una manito por favor
Publicado por: jmcs87 en 04 de Mayo de 2009, 00:14:40
hola Cryn pues si esa es la idea lograr  hacerlo la mas delgadito posible , para eso la placa de los registros van directamente conectados con los pines de los leds ..ojo pero no todos los leds. En uno de los videos se ve la parte trasera del panel  y tambien hay una foto que muestra la placa de los registros .....aun falta documentar bien eso pero cuando termine al trabajito me dedicare a hacer un manual.

hola marvicdigital que bueno que mi ejemplo te haya servido

Saludos
Título: Re: Una manito por favor
Publicado por: BrunoF en 04 de Mayo de 2009, 01:09:21
marvicdigital, no tuve tiempo de analizar el código pero espero que sepas que la memoria FLASH del PIC está paginada.Se divide en partes de 256 palabras cada una. Asegurate que el PCLATH contenga el valor correcto antes de llamar a una tabla. Fijate que acá en el Almacen del Assembler hay un tutorial de Leon_pic que explica el funcionamiento del Program Counter(PCL y PCLATH).

Saludos.
Título: Re: Una manito por favor
Publicado por: marvicdigital en 04 de Mayo de 2009, 08:15:13

Código: [Seleccionar]
INICIO
BSF STATUS,RP0
CLRF TRISC
CLRF TRISB
CLRF OPTION_REG
BCF STATUS,RP0
;BCF STATUS,IRP
LOOP_INICIO
MOVLW 0FFH
MOVWF PORTB
BCF         LOAD                 ;LOAD DE EL CD4094
MOVLW .32
MOVWF COLUMNAS
MOVLW COL1
MOVWF FSR
CEROS_COLUMNAS                    ;BORRO TODAS LAS COLUMNAS PARA EMPEZAR LIMPIA LA PANTALLA
CLRF         INDF
DECFSZ COLUMNAS
GOTO SEGUIR_BORRANDO
GOTO SIGUIENTE_FASE
SEGUIR_BORRANDO
INCF         FSR,1
GOTO CEROS_COLUMNAS

SIGUIENTE_FASE
CLRF        LETRA
MOVF LETRA,W
CALL         A                ;tabla para la letra A
MOVWF     COL1
METER_COLUMNAS
CALL        PANTALLAZO          ;MUESTRA EN PANTALLA VARIAS VECES LA MISMA COLUMNA
CALL        ROTAR_IZQUIERDA        ;ANTES DE DESPLAZARLALA Y ASI DARLE VELOCIDAD AL DESPLAZAMIENTO
INCF        LETRA
MOVF LETRA,W
CALL        A                          ;SIGUIENTE VALOR HEXADECIMAL DE LA LETRA A
MOVWF COL1                     ;CARGO COL1 CON EL NUEVO VALOR HEXADECIMAL
XORLW 000H                     ;MIRO SI YA TERMINO LOS VALORES QUE FORMAN LA LETRA
BTFSS STATUS,Z
GOTO METER_COLUMNAS     ; SI NO VOY A MOSTRAR COL1 CON EL NUEVO VALOR
CALL         ESPACIOS_BLANCO  ;SI TERMINO DE LEER LA LETRA A, ENTONCES LLENO DE ESPACIOS PARA QUE
GOTO SIGUIENTE_FASE      ;SEA VEA EFECTO DE DESPLAZAMIENTO. SOLO A MODO DE PRUEBA



A ADDWF PCL,1 ;letra A , de 8x6
RETLW B'11111110'
RETLW B'11111111'
RETLW B'00010011'
RETLW B'00010011'
RETLW B'11111111'
RETLW B'11111110'
RETLW 000H




INCLUDE CD4094.INC
INCLUDE RETARDOS.INC

END




BrunoF, de nuevo gracias por el consejo, de verdad que debo mejorar mi  ingles, siempre que comienzo a trabajar con nuevos pic siempre abro el datasheet, muy obligado para esto, en la parte que explica sobre el PCLATH, me refiere al AN556, donde se amplia el tema, lo leía y en un recuadro sale que si solo usaba menos de 2K de la memoria flash pues no era necesario escribir el PCLATH, por lo menos asi lo escribe el documento:

Citar
If the program memory size is less than
2K-words, then the above precaution is
not necessary.

Pero al leer el espectacular  tutorial de ASM desde cero de LEON_PIC dice lo siguiente:

Citar
El usuario no debe preocuparse por precargar el PCLATH en dos sitaciones:
Si el uC no posee más de 2kWords de memoria Flash;
O si en el código creado por el usuario, no se utiliza la memoria FLASH más allá de la posición 2047(0x7FF).

La diferencia entre ambos es si el uC no posee más de 2k Words, y como este PIC16f877A tiene 8k pues tome las precauciones del caso y puse lo siguiente antes de cada Call  Rutina :

Código: [Seleccionar]
PAGESEL         PANTALLAZO
CALL              PANTALLAZO

Se que la rutina está en la primera página y que al ejecutar RETURN el PCLATH queda con esa página grabada, le puse el PAGESEL  antes de cada CALL por seguridad y a pesar de que no me he pasado del primer banco de la memoria Flash me seguía dando el problema y me tocó hacer lo siguiente antes de llamar la Tabla A:

Código: [Seleccionar]
PAGESELW A
MOVF LETRA,W
CALL         A             ;Tabla que forma la letra A
MOVWF COL1

Y así resolví mi problema de reinicio y ya veo los caracteres moverse de izquierda a derecha sin problema.

Ojala le sirva a todos los que puedan tener el mismo problema, y el consejo que doy es asegurar esos registros que al reiniciar sus bits puedan tomar cualquier valor asegurarlos con escribirle el valor que necesitan para su funcionamiento, y leer el una y otra vez el  espectacular tutorial de LEONPIC  :-)

Ahora a seguir..ya tengo texto corriendo, vamos lo básico, ahora me queda implementar las tablas completas para los caracteres y lo voy hacer mediante código ASCII, osea leo la memoria en donde tengo guardado el valor ASCII para cada caracter y ese valor es el que llamo para que me genere el caracter, con tanta memoria disponible  :mrgreen:

Saludos
Título: Re: Una manito por favor
Publicado por: BrunoF en 04 de Mayo de 2009, 09:25:18
Pero al leer el espectacular  tutorial de ASM desde cero de LEON_PIC dice lo siguiente:

Citar
El usuario no debe preocuparse por precargar el PCLATH en dos sitaciones:
Si el uC no posee más de 2kWords de memoria Flash;
O si en el código creado por el usuario, no se utiliza la memoria FLASH más allá de la posición 2047(0x7FF).

Si leíste bien el tutorial, podrás apreciar que quien dijo eso en su tutorial he sido precisamente yo. Toda esa parte del tutorial son palabras textuales mías ya que León me pidió ayuda con eso.

La diferencia entre ambos es si el uC no posee más de 2k Words, y como este PIC16f877A tiene 8k pues tome las precauciones del caso y puse lo siguiente antes de cada Call  Rutina :

Código: [Seleccionar]
PAGESEL         PANTALLAZO
CALL              PANTALLAZO

Se que la rutina está en la primera página y que al ejecutar RETURN el PCLATH queda con esa página grabada, le puse el PAGESEL  antes de cada CALL por seguridad y a pesar de que no me he pasado del primer banco de la memoria Flash me seguía dando el problema y me tocó hacer lo siguiente antes de llamar la Tabla A:


Código: [Seleccionar]
PAGESELW A
MOVF LETRA,W
CALL         A             ;Tabla que forma la letra A
MOVWF COL1

Y así resolví mi problema de reinicio y ya veo los caracteres moverse de izquierda a derecha sin problema.

Ojala le sirva a todos los que puedan tener el mismo problema, y el consejo que doy es asegurar esos registros que al reiniciar sus bits puedan tomar cualquier valor asegurarlos con escribirle el valor que necesitan para su funcionamiento, y leer el una y otra vez el  espectacular tutorial de LEONPIC  :-)

Ahora a seguir..ya tengo texto corriendo, vamos lo básico, ahora me queda implementar las tablas completas para los caracteres y lo voy hacer mediante código ASCII, osea leo la memoria en donde tengo guardado el valor ASCII para cada caracter y ese valor es el que llamo para que me genere el caracter, con tanta memoria disponible  :mrgreen:

Saludos

Te pedí que leyeras bien lo del PC y PCLATH por las tablas. Tus caracteres son computed GOTO y eso era lo que supuse que te fallaba y el por qué está en el tutorial de León. Precisamente en la parte en la que te envié a leer.

Saludos.
Título: Re: Una manito por favor
Publicado por: marvicdigital en 04 de Mayo de 2009, 09:56:13
Si mil gracias, BrunoF se me olvidó citar en mi anterior texto que tu habías escrito todo sobre le PCLATH y que LEONPIC te había citado  :mrgreen:.
Por ahora estoy creando las tablas de los caracteres ,claro que tengo duda si dejarlos del tamaño de 8x6 o el estandar de 7x5 o 7x6, a lo mejor creo ambas tablas para el caso de cambiar de texto en algún momento.

Quiero hacerte una pregunta, ante tanta sorpresa que me ha dado este proyecto en cuanto a texto que se puede escribir en ASM, por ejemplo para el llamado de las tablas que contienen las letras y hacer solo una rutina para generar las letras, osea  supongamos que tengo en secuencia la palabra "BABA" EN CODIGO ASCII sería 66,65,66,65 se puede poner ese valor para llamar la tabla, osea algo asi..no lo he probado por que estoy con las tablas..:

Código: [Seleccionar]
LEER_EEPROM
                      MOVF     DATO,W       ;MUEVO EL DATO DE LA EEPROM A W PRIMERA LETRA 66(B)
                      MOVWF   ASCII
                      CALL       CARACTER_ASCII  ;ES EN ESTE PUNTO DONDE TENGO LA DUDA, SE PUEDE HACER ALGO PARECIDO?

La idea es que cada tabla se llame CARACTER_65 para el caso de la A y de ahi las siguientes....es que con tanto truco que hay en ASM, pues parece una idea descabellada, ..pregunto solo si existe algo similar o toca por los tradicionales medios rudimentarios de hacer una rutina para cada caracter?

Saludos

PD: Sobre este tema, estoy leyendo la teoría de tablas, y hay una idea sobre usar el offset, algo asi como darle un ancho único a cada caracter y para mi ejemplo no es muy funcional a la hora de mostrar la "I"  por ejemplo, ya que solo usaré 3 columnas y no 6 de una letra como la "M"..bueno seguiré leyendo más, para ver que pruebo, a lo mejor el 000h que le agrego a cada caracter me sirva para esa tarea.

Título: Re: Una manito por favor
Publicado por: BrunoF en 04 de Mayo de 2009, 12:47:55
Hola. No, lo que pretendés hacer no es posible ni en ASM ni en ningún lenguaje de programación con los que he trabajado. No podés variar en tiempo de ejecución el nombre de la etiqueta a llamar de la manera que exponés.

Podés hacer una tabla que conduzca a otra tabla.

Como no vi esto en el foro y por ahí le sirve a muchos, he posteado la solución aquí: Ejemplos en Assembler - PIC16F876  (http://www.todopic.com.ar/foros/index.php?topic=12918.msg211575#msg211575) porque puede servirle a otros.

El algoritmo puede resultar dificil, pero no puedo simplificarlo mucho mas que eso sin tener que despilfarrar más ROM.

Un saludo.
Título: Re: Una manito por favor
Publicado por: marvicdigital en 04 de Mayo de 2009, 22:26:04
Hola. No, lo que pretendés hacer no es posible ni en ASM ni en ningún lenguaje de programación con los que he trabajado. No podés variar en tiempo de ejecución el nombre de la etiqueta a llamar de la manera que exponés.

Podés hacer una tabla que conduzca a otra tabla.

Como no vi esto en el foro y por ahí le sirve a muchos, he posteado la solución aquí: Ejemplos en Assembler - PIC16F876  (http://www.todopic.com.ar/foros/index.php?topic=12918.msg211575#msg211575) porque puede servirle a otros.

El algoritmo puede resultar dificil, pero no puedo simplificarlo mucho mas que eso sin tener que despilfarrar más ROM.

Un saludo.

Una última pregunta, es obligatorio aprender C para los uC más actuales? o se puede seguir usando el ASM?

Muchas gracias BrunoF, apenas me ponga en contacto directo con lo que escribiste en el otro hilo, pondré resultados de mi aventura con este pasamensajes.

Saludos
Título: Re: Una manito por favor
Publicado por: BrunoF en 04 de Mayo de 2009, 23:00:00
No obligatoriamente, aunque lo recomiendo arduamente. En las familias superiores el assembler se torna cada vez más complejo y difícil. Especialmente cuando tienes que utilizar módulos avanzados, como USB, CAN, DMA, etc...

Te recomiendo que migres a CCS o C18 para empezar. Probablemente CCS te resulte un poco más sencillo.

Un saludo.

Título: Re: Una manito por favor
Publicado por: marvicdigital en 12 de Mayo de 2009, 01:05:31
Bueno BrunoF, ya he avanzado un poco, después de 5 días de no dedicarle tiempo, hoy puedo mostrar algo de lo que tu me has explicado, la calidad del video no s la mejor, es con el celular, pero algo se deja leer...
Falta agregarle las 48 columnas restantes, el teclado PS2, la memoria I2C, y el RTC, sobre este punto, puedo poner la 24LC256 y el RTC en el mismo Bus?.

Para leer los caracteres uso el código ASCII, claro los mensajes por ahora están en la Flash del PIC, pero pronto los agregaré a la memoria, en este punto quisiera preguntarte, cuál es la mejor forma de grabar los datos en la memoria, y leer hexdecimal por hexadecimal y mostrar ese valor  cada vez? o hacer otra cosa..es que con tanto algoritmo que te sabes, no vendría mal un buen concejo tuyo  :)


La velocidad se ve alterada por la calidad de la cámara del celular, pero normalmente funciona bien sin parones o relantizaciones.

Saludos
Título: Re: Una manito por favor
Publicado por: MLO__ en 12 de Mayo de 2009, 01:44:59
Muy chulo Marvic.

Que LEDs usaste? chorro o normal? La fuente de los LEDs es por aparte o dejaste los mismos 5v?
Título: Re: Una manito por favor
Publicado por: marvicdigital en 12 de Mayo de 2009, 01:56:45
Muy chulo Marvic.

Que LEDs usaste? chorro o normal? La fuente de los LEDs es por aparte o dejaste los mismos 5v?

Gracias MLO, use de chorro, por ahora la fuente está toda a 5V, pero voy a usar la de un Playstation 2 que tiene 8.5V a 4.2A, y bien económicas que son $20.000  :-/....
Me falta implementar la memoria, el RTC y el teclado PS2, creo que me voy a llevar más tiempo, pero bueno..es un reto que quiero cumplir.

Saludos
Título: Re: Una manito por favor
Publicado por: MLO__ en 12 de Mayo de 2009, 01:58:40
20k!!!!

Que tamaño tienen?
Título: Re: Una manito por favor
Publicado por: marvicdigital en 12 de Mayo de 2009, 02:05:16
20k!!!!

Que tamaño tienen?


12cms X 5,5cms X 2,5cms (largo x ancho x alto) y es de 8,5Vdc a 4,5A..la puedes conseguir en los Sanadresitos, el precio está entre los 20K y 25K (unos US$10) y para este propósito apenas es  :mrgreen:

Saludos
Título: Re: Una manito por favor
Publicado por: BrunoF en 12 de Mayo de 2009, 05:05:55
La verdad que te ha quedado "belisísima"!!!
Te felicito muchísimo. Y la verdad que ha sido un honor explicarte, porque has aprendido rápido y te has preocupado por entenderlo  y dedicarle tiempo..

Con respecto a la memoria, si estás usando codigo ASCII para almacenar los datos, sí, podés ir guardando caracter x caracter y luego ir leyendolos. Yo personalmente prefiero hacer un buffer más, para ir leyendo la memoria e ir volcando al buffer en el PIC, como para siempre tener datos rapido sin peligros de tener que esperar al I2C o algo.

Mi primer cartel tenía 2 buffers para visualizar, y un tercer buffer para ir leyendo y tomando los datos de la I2C.

He hecho un ejemplo para la 24LC256 acá en el foro. Buscalo en el almacen del assembler, o bien entrando a mi perfil y buscando los temas creados por mi(esta mal, dice mostrar los ultimos IR o algo asi)

Un saludo y felicitaciones!
Título: Re: Una manito por favor
Publicado por: marvicdigital en 12 de Mayo de 2009, 13:59:22
La verdad que te ha quedado "belisísima"!!!
Te felicito muchísimo. Y la verdad que ha sido un honor explicarte, porque has aprendido rápido y te has preocupado por entenderlo  y dedicarle tiempo..

Con respecto a la memoria, si estás usando codigo ASCII para almacenar los datos, sí, podés ir guardando caracter x caracter y luego ir leyendolos. Yo personalmente prefiero hacer un buffer más, para ir leyendo la memoria e ir volcando al buffer en el PIC, como para siempre tener datos rapido sin peligros de tener que esperar al I2C o algo.

Mi primer cartel tenía 2 buffers para visualizar, y un tercer buffer para ir leyendo y tomando los datos de la I2C.

He hecho un ejemplo para la 24LC256 acá en el foro. Buscalo en el almacen del assembler, o bien entrando a mi perfil y buscando los temas creados por mi(esta mal, dice mostrar los ultimos IR o algo asi)

Un saludo y felicitaciones!

Gracias BrunoF por tus palabras, me motivan más a seguir subiendo en conocimientos.
Y si, ya había leído el post donde está el ejemplo del I2C...ahora mi pregunta es , si en el mismo bus puedo poner el RTC y la memoria 24LC256, es que recuerdo haber leído qeu solo se podía poner una de estas en un bus, pero no se si se podrá conectar adicional con un DS1307...y de nuevo mil gracias por tus ejemplos y compartirlos con todos..

Y hablando de compartir, hice una tabla en excel  para crear  caracteres y otras cositas más en una matrix de 8x8, cuando seleccionas los puntos que formaran el caracter o el gráfico y le pones 1 para indicar que encienden y el solo te genera la cadena de hex para que se agregue a los RETLW o DT

por ejemplo:
 una copa de cocktail(se escribe así? )

(http://img.photobucket.com/albums/v672/marvicdigital/PStwo/imagen2.jpg)

(http://img.photobucket.com/albums/v672/marvicdigital/PStwo/imagen1.jpg)

Los hex que genera son de las columnas y la primera fila es el bit más bajo, si a alguien le interesa lo subo y si quieren que le agregue algo más me pueden decir y cuando tenga un tiempito lo hago y lo subo.

Saludos
Título: Re: Una manito por favor
Publicado por: BrunoF en 12 de Mayo de 2009, 14:28:41
Y si, ya había leído el post donde está el ejemplo del I2C...ahora mi pregunta es , si en el mismo bus puedo poner el RTC y la memoria 24LC256, es que recuerdo haber leído qeu solo se podía poner una de estas en un bus, pero no se si se podrá conectar adicional con un DS1307...y de nuevo mil gracias por tus ejemplos y compartirlos con todos..

Hace rato que no toco el I2C, pero según recuerdo no hay problemas en usar lo que comentás. Cada uno de los que mencionaste debe tener un ID único seguramente. Aún así podés conectar hasta 8 dispositivos con el mísmo ID utilizando el mismo bus I2C.

Y hablando de compartir, hice una tabla en excel  para crear  caracteres y otras cositas más en una matrix de 8x8, cuando seleccionas los puntos que formaran el caracter o el gráfico y le pones 1 para indicar que encienden y el solo te genera la cadena de hex para que se agregue a los RETLW o DT
...
Los hex que genera son de las columnas y la primera fila es el bit más bajo, si a alguien le interesa lo subo y si quieren que le agregue algo más me pueden decir y cuando tenga un tiempito lo hago y lo subo.

Siempre viene bien una herramienta más de edicion. Gracias.
Título: Re: Una manito por favor
Publicado por: jmcs87 en 12 de Mayo de 2009, 14:37:19
marvicdigital  felicidades ....muy bueno el letrero esperamos verlo completo muy pronto jejejeje :mrgreen:

te cuento que yo utilice la eeprom 24lc256 y el ds1307 en el mismo bus sin ningun problema

Saludos
Título: Re: Una manito por favor
Publicado por: Suky en 12 de Mayo de 2009, 15:26:53
 :-/ Muy buen trabajo el que estas desarrollando marvicdigital, y también felicitaciones al profe BrunoF  :mrgreen:

Con el bus I2C puedes conectar varios dispositivos, el formato de comunicación envia un primer byte indicando la dirección y si se desea escribir o leer el dispositivo esclavo. Aquí (http://www.mediafire.com/?obix2ljnddo) un tutorial sobre dicho bus...
Título: Re: Una manito por favor
Publicado por: marvicdigital en 12 de Mayo de 2009, 17:46:45
Impresionante, este foro es de lo mejor que existe hoy en día en este mundo de los microcontroladores,   :-) Suky, muchas gracias por ese PDF que me viene muy bien, y también he leído mucho tus explicaciones sobre ASM ..mil gracias.. y a jmcs87, gracias por compartir su experiencia con este par de juguetes  :mrgreen:  y bueno al profe, BrunoF, que siempre está al pie del cañón para cualquier ayuda, el archivo de excel lo quiero mejorar un poco, dando también los Hex de las filas, ya que he leído varios post donde usan las filas...espero poderlo subir esta semana y si no pues subo el que hay por ahora...

Saludos y de nuevo mil gracias  :-/
Título: Re: Una manito por favor
Publicado por: marvicdigital en 14 de Mayo de 2009, 01:20:11
Hola de nuevo.
Bueno después de un día completo de leer la teoría de I2C, el datasheet de la 24LC256, y el código ejemplo de BrunoF, me lancé hacer el código para implementarlo en este pasamensajes, inicialmente programe con código ascii  los primeros bytes, con el PIckitV2 el programa, luego implementé la rutina para que fueran leídos aleatoriamente por el uC tal y como muestra la sigueinte imagen del datasheet de la 24LC256:

(http://img.photobucket.com/albums/v672/marvicdigital/PStwo/leer.jpg)

Entonces hice lo siguiente:

1.  llamo la rutina del Bit Start
2.  cargo el registro I2C_data con la configuración, en mi caso sería "10100000"  como el acceso es aleatorio el último bit debe ser 0

3.  Envío el dato por el puerto I2C
4.  Luego el ACK
5.  Envío la Dirección alta de la memoria, en mi caso  hice un CLRF  Haddeeprom
6.  Luego de enviar hago un ACK con SENDACK
7.  Repito pasos 5 y 6 para la direccion baja de la memoria osea hago un CLRF  Laddeeprom y envío
7.  Vuelvo y envío el BIT DE START
8.  Envió el byte de control pero el primer bit está en 1  osea "10100001"
9.  Envío ese byte por  el puerto serial
10.  Luego ACK
11. Recibo el dato
12. Y doy el bit de stop.
13. El byte leído lo grabo en un registro buffer y lo llevo a la pantalla

me guié por la imagen que está en el datasheet.

(http://img.photobucket.com/albums/v672/marvicdigital/PStwo/leer.jpg)

Se supone que debería mostrarme el caracter del hexadecimal que está en la eeprom, pero se me queda bloqueado el PIC, si lo reinicio me muestra otra cosa, o pasan cosas raras en los leds, como el programa no esta depurado pues ya voy por encima de las 2K de memoria por eso he usado PAGESELW  para evitar porblemas con el PClath, pero no se si debo hacerlo asi o de otra forma..o si el problema está en el modo de usar el I2C por que si pongo el buffer con un valor constante y me salto  los pasos para la lectura de la memoria I2C me muestra el caracter bien...

Este es el bloque donde hago los pasos para leer aleatoriamente los datos de la memoria 24LC256

Código: [Seleccionar]
LEER_EEPROM
      CLRF             HADDEEPROM
      CLRF              LADDEEPROM
LOOP_EE
         CLRF         IC2DATA                                ;BUFFER 1
CLRF         PALABRA                         ;BUFFER 2 QUE ES EL LEE LA RUTINA DE PANTALLA                                   
PAGESELW CONFIG_TRANSMISION_I2C
CALL         CONFIG_TRANSMISION_I2C
PAGESELW BIT_START_I2C
CALL         BIT_START_I2C
MOVLW          B'10100000'                   ;BYTE CONTROL
PAGESELW TRANSMITIR_DATO_I2C
CALL         TRANSMITIR_DATO_I2C
PAGESELW         I2C_SENDACK
CALL         I2C_SENDACK
MOVF          HADDEEPROM,W             ;DIRECCION ALTA
PAGESELW TRANSMITIR_DATO_I2C
CALL         TRANSMITIR_DATO_I2C
PAGESELW I2C_SENDACK
CALL         I2C_SENDACK
MOVF         LADDEEPROM,W
PAGESELW TRANSMITIR_DATO_I2C
CALL         TRANSMITIR_DATO_I2C
PAGESELW I2C_SENDACK
CALL         I2C_SENDACK
PAGESELW RESTART_I2C
CALL         RESTART_I2C
PAGESELW BIT_START_I2C
CALL         BIT_START_I2C
  MOVLW         B'10100001'                    ;ENVÍO EL CONTROL BYTE PERO CON 1
PAGESELW TRANSMITIR_DATO_I2C
CALL         TRANSMITIR_DATO_I2C
PAGESELW I2C_SENDACK
CALL         I2C_SENDACK
PAGESELW RECIBIR_DATO_I2C
  CALL         RECIBIR_DATO_I2C
PAGESELW BIT_STOP_I2C
CALL         BIT_STOP_I2C
MOVF        IC2DATA,W
;MOVLW         .65                              ;para hacer pruebas retiro el ";" y funciona bien
MOVWF         PALABRA                              ;con el valor constante .65
MOVLW          .32                             ;esta resta es para la tabla con los hex en ascii
SUBWF          PALABRA,F
NOP
PAGESELW SIGUIENTE_FASE
CALL                 SIGUIENTE_FASE                  ;siguiente fase es el bloque donde muestro PALABRA en pantalla
PAGESELW ESPACIOS_BLANCO
CALL         ESPACIOS_BLANCO              ;luego de mostrar la letra A le sumo espacios en blanco a la derecha
  GOTO         LEER_EEPROM

  INCLUDE  I2C.INC

Y este es el I2C.INC

Código: [Seleccionar]
CONFIG_TRANSMISION_I2C
      BSF        STATUS,RP0 ; SELECIONO LA PAGINA 1 DE LA MEMORIA
      BSF        TRISC,4
      BSF        TRISC,3
      MOVLW .2
      MOVWF SSPADD ; CARGAS 02H EN EL REGISTRO SSPADD LA VELOCIDAD DE
      CLRF         SSPSTAT ;TRANSMISION SERA DE 333 KHZ con 4MHZ en el X-tal
      BCF         STATUS,RP0 ; SELECIONO LA PAGINA 0 DE LA MEMORIA
      MOVLW      B'00101000'
      MOVWF SSPCON ; PERMITES LA CONFIGURACION SERIE DE LOS PINES SDA Y SCL.
      CLRF PIR1
      PAGESELW I2C_IDLE
      CALL         I2C_IDLE
      RETURN

BIT_START_I2C
      PAGESELW I2C_IDLE
      CALL         I2C_IDLE
      BSF         STATUS,RP0 ; SELECIONO LA PAGINA 1 DE LA MEMORIA
      BSF         SSPCON2,SEN
      BTFSC         SSPCON2,SEN
      GOTO          $-1 ; LANZAMOS EL BIT DE START.
       BCF         STATUS,RP0 ; SELECIONO LA PAGINA 0 DE LA MEMORIA
       BTFSS PIR1,SSPIF
       GOTO $-1
       BCF         PIR1,SSPIF
       RETURN
TRANSMITIR_DATO_I2C
      MOVWF IC2DATA
       BCF         FLAGEE,0
;PAGESELW I2C_IDLE
       CALL         I2C_IDLE
        MOVF IC2DATA,W
        MOVWF SSPBUF ; TRANSMITIMOS EL DATO AL ESCLAVO
         BSF      STATUS,RP0      ;BANCO 1
        BTFSC        SSPSTAT,R_W      ;ESPERAR A QUE TERMINE EL ENVIO
        GOTO       $-1
        BTFSS      SSPCON2,ACKSTAT    ;CHECKEAR ACK
        GOTO      OKACK
        BSF        SSPCON2,PEN      ;ERROR ACK. ENVIAR STOP
        BCF      STATUS,RP0      ;BANCO 0
       RETURN                ;VOLVER CON FLAG= 0 ERROR

OKACK   
        BCF      STATUS,RP0      ;BANCO 0
BTFSS      PIR1,SSPIF      ;ESPERAR FINALIZACION DEL NOVENO CLOCK
GOTO      $-1
BCF      PIR1,SSPIF
BSF      FLAGEE,0         
RETURN
RECIBIR_DATO_I2C
PAGESELW I2C_IDLE
CALL I2C_IDLE
  BCF PIR1,SSPIF
  BSF STATUS,RP0 ; SELECIONO LA PAGINA 1 DE LA MEMORIA
  BSF SSPCON2,RCEN
BTFSC SSPCON2,RCEN
GOTO $-1
BTFSS SSPSTAT,BF ;PERMITO LA RECEPCION DE DATOS
GOTO $-1
BCF         STATUS,RP0 ; SELECIONO LA PAGINA 0 DE LA MEMORIA
MOVF SSPBUF,W
MOVWF IC2DATA
RETURN
BIT_STOP_I2C

  BSF STATUS,RP0 ; SELECIONO LA PAGINA 1 DE LA MEMORIA
  BSF SSPCON2,PEN
  BCF STATUS,RP0 ; SELECIONO LA PAGINA 0 DE LA MEMORIA
  RETURN
RESTART_I2C

  BSF STATUS,RP0
  BSF SSPCON2,RSEN
  BTFSC SSPCON2,RSEN
  GOTO $-1
  BCF STATUS,RP0
VOLVER
          RETURN

I2C_IDLE

   BSF      STATUS,RP0      ;BANCO 1
   BTFSC        SSPSTAT,R_W
   GOTO        $-1

   MOVF        SSPCON2,W
   ANDLW        0X1F
   BTFSS        STATUS,Z
   GOTO        $-3

   BCF      STATUS,RP0      ;BANCO 0
   RETURN
I2C_SENDACK
BSF      STATUS,RP0      ;BANCO 1
  BCF        SSPCON2,ACKDT
    BSF        SSPCON2,ACKEN
    BCF      STATUS,RP0      ;BANCO 0
    RETURN

I2C_SENDNACK
BSF      STATUS,RP0      ;BANCO 1
    BSF       SSPCON2,ACKDT
    BSF       SSPCON2,ACKEN
    BCF      STATUS,RP0      ;BANCO 0
  RETURN

La verdad es que ahora estoy muy agotado, y mi cabeza no quiere analizar muy bien en donde tengo el error, por eso recurro a los más expertos y me den una pista de ver que hago mal....una última cosita, estas lineas están por encima de las 2k de memoria, por si sirve de ayuda  :?

Bueno muchas gracias y saludos.




Título: Re: Una manito por favor
Publicado por: BrunoF en 14 de Mayo de 2009, 01:39:01
Hola.

No entré en detalle en el código, pero si mal no recuerdo y por lo que estoy mirando(nuevamente) en el gráfico que posteas, los ACK y NACK son enviados por la memoria, no por el uC. Si estás mandandolos vos, estás pegandole una linda mareada al bus IC2.

Saludos.
Título: Re: Una manito por favor
Publicado por: Suky en 14 de Mayo de 2009, 04:18:45
Hola.

No entré en detalle en el código, pero si mal no recuerdo y por lo que estoy mirando(nuevamente) en el gráfico que posteas, los ACK y NACK son enviados por la memoria, no por el uC. Si estás mandandolos vos, estás pegandole una linda mareada al bus IC2.

Saludos.

Exacto, tu le envias el dato a la memoria, y si esta todo correcto te devuelve el ack.
Título: Re: Una manito por favor
Publicado por: marvicdigital en 14 de Mayo de 2009, 09:24:37
Gracias por la aclaración, víctima del cansancio  :mrgreen:
Gracias Suky por el archivo  :-)
Ya rectifiqué y sigo con el mismo problema, no puedo leer el primer byte en la dirección 0 , estuve leyendo otros post incluyendo el que creo BrunoF y modifiqué mi rutina con la información de groundman ; rutina (http://www.todopic.com.ar/foros/index.php?topic=5979.msg170973#msg170973); que fue la que le funcionó y sigo sin poder leer bien el primer byte. Dejo el código para ver si me hechan una manito, que estoy ya algo aburrido de ver que no me funciona y que se que no veo el error  :x :? :(

Código: [Seleccionar]
LEER_EEPROM
PAGESELW CONFIG_TRANSMISION_I2C
CALL         CONFIG_TRANSMISION_I2C
CLRF         HADDEEPROM                             ;DIRECCIÓN Y LECTURA DE LA MEMORIA EEPROM
CLRF         LADDEEPROM
LOOP_EE
        CLRF                 IC2DATA
CLRF                 PALABRA
PAGESELW         BIT_START_I2C
CALL                 BIT_START_I2C
MOVLW         B'10100000'
PAGESELW         TRANSMITIR_DATO_I2C
CALL                 TRANSMITIR_DATO_I2C
MOVF         HADDEEPROM,W
PAGESELW         TRANSMITIR_DATO_I2C
CALL                 TRANSMITIR_DATO_I2C
MOVF         LADDEEPROM,W
PAGESELW         TRANSMITIR_DATO_I2C
CALL                 TRANSMITIR_DATO_I2C
PAGESEL         RESTART_I2C
CALL                 RESTART_I2C
MOVLW         B'10100001'
PAGESELW         TRANSMITIR_DATO_I2C
CALL                 TRANSMITIR_DATO_I2C
PAGESELW         RECIBIR_DATO_I2C
CALL                 RECIBIR_DATO_I2C
CALL              I2C_SENDNACK
    CALL              BIT_STOP_I2C
MOVF         IC2DATA,W              ;EL IC2DATA NO RETORNA CON EL VALOR DE LA PRIMERA MEMORIA
;MOVLW         .65                           ;SI HABILITO ESTA LINEA ME MUESTRA EL CARACTER A LA PANTALLA
MOVWF         PALABRA                           ;UNA Y OTRA VEZ, CADA VEZ QUE PASA POR ACÁ
MOVLW         .32
SUBWF         PALABRA,F
NOP
PAGESELW         SIGUIENTE_FASE
CALL                 SIGUIENTE_FASE       ;RUTINA DE MUESTRA DE PANTALLA
PAGESELW         ESPACIOS_BLANCO
CALL                 ESPACIOS_BLANCO   ;ROTA EL CARACTER HASTA DESAPARECER DE LA PANTALLA
GOTO         LOOP_EE                   ;VUELVO A MOSTRAR   


Y este es el I2C.inc  modificado con la información de groundman:

Código: [Seleccionar]
CONFIG_TRANSMISION_I2C
MOVLW      B'00101000'
MOVWF         SSPCON
BSF                 STATUS,RP0 ; SELECIONO LA PAGINA 1 DE LA MEMORIA
BSF                 TRISC,4
BSF                 TRISC,3
MOVLW         .9
MOVWF        SSPADD ; CARGAS 02H EN EL REGISTRO SSPADD LA VELOCIDAD DE
CLRF                SSPSTAT ;TRANSMISION SERA DE 333 KHZ
BCF                STATUS,RP0 ; SELECIONO LA PAGINA 0 DE LA MEMORIA
CLRF                PIR1
PAGESEL        I2C_IDLE
CALL                I2C_IDLE
RETURN                   ; PERMITES LA CONFIGURACION SERIE DE LOS PINES SDA Y SCL.

BIT_START_I2C
PAGESEL        I2C_IDLE
CALL             I2C_IDLE
    BSF             STATUS,RP0      ;BANCO 1
  BSF               SSPCON2,SEN
    BTFSC             SSPCON2,SEN
    GOTO               $-1
    BCF             STATUS,RP0      ;BANCO 0
    BTFSS             PIR1,SSPIF
  GOTO             $-1
    BCF             PIR1,SSPIF
    RETURN

TRANSMITIR_DATO_I2C

BCF             FLAGEE,0
PAGESEL        I2C_IDLE        ;INICIALIZAR FLAG COMO "ERROR"
    CALL             I2C_IDLE
    MOVF             IC2DATA,W          ;MOVER DATO A W
    MOVWF            SSPBUF          ;CARGAR DATO EN BUFFER I2C
    BSF             STATUS,RP0      ;BANCO 1
    BTFSC        SSPSTAT,R_W      ;ESPERAR A QUE TERMINE EL ENVIO
    GOTO               $-1
    BTFSS             SSPCON2,ACKSTAT    ;CHECKEAR ACK
    GOTO             OKACK
    BSF               SSPCON2,PEN      ;ERROR ACK. ENVIAR STOP
    BCF             STATUS,RP0      ;BANCO 0
    RETURN                ;VOLVER CON FLAG= 0 ERROR
OKACK   
        BCF             STATUS,RP0      ;BANCO 0
    BTFSS             PIR1,SSPIF      ;ESPERAR FINALIZACION DEL NOVENO CLOCK
    GOTO             $-1
    BCF             PIR1,SSPIF
    BSF             FLAGEE,0          ;VOLVER CON FLAG = 1 OK!
    RETURN ;VOLVER CON FLAG= 0 ERROR


RECIBIR_DATO_I2C
PAGESEL        I2C_IDLE
CALL             I2C_IDLE   
    BSF             STATUS,RP0      ;BANCO 1   
    BSF               SSPCON2,RCEN      ;ACTIVAR MODO LECTURA
    BTFSC        SSPCON2,RCEN      ;TERMINO LA RECEPCION?
    GOTO               $-1          ;NO, ESPERAR
    BTFSS             SSPSTAT,BF      ;DATO DISPONIBLE EN SSPBUF PARA SER LEIDOS?
    GOTO             $-1          ;NO, ESPERAR
    BCF             STATUS,RP0      ;BANCO 0
    MOVF             SSPBUF,W
    MOVWF      IC2DATA
    RETURN

BIT_STOP_I2C

BSF                 STATUS,RP0 ; SELECIONO LA PAGINA 1 DE LA MEMORIA
BSF                 SSPCON2,PEN
BCF                 STATUS,RP0
RETURN ; SELECIONO LA PAGINA 0 DE LA MEMORIA

RESTART_I2C

BSF                 STATUS,RP0
BSF                SSPCON2,RSEN
BTFSC        SSPCON2,RSEN
GOTO         $-1
BCF                STATUS,RP0

VOLVER RETURN

I2C_IDLE

    BSF              STATUS,RP0      ;BANCO 1
    BTFSC        SSPSTAT,R_W
    GOTO                $-1
    MOVF                SSPCON2,W
    ANDLW        0X1F
  BTFSS        STATUS,Z
    GOTO                $-3
    BCF              STATUS,RP0      ;BANCO 0
    RETURN

I2C_SENDACK

    BSF               STATUS,RP0      ;BANCO 1
    BCF                 SSPCON2,ACKDT
    BSF                 SSPCON2,ACKEN
    BCF               STATUS,RP0      ;BANCO 0
    RETURN

I2C_SENDNACK

    BSF               STATUS,RP0      ;BANCO 1
    BSF                  SSPCON2,ACKDT
    BSF                 SSPCON2,ACKEN
    BCF               STATUS,RP0      ;BANCO 0
    RETURN

Aclaro varias cosas, las resistencias Pull-up son de 4.7K, según el datasheet de la memoria para velocidades superiores a 300k se ponen de 2K, por eso decidí setiar la velocidad a 100khz. La memoria la grabé aparte escribiendo varios hex en las primeras direcciones de la memoria, que corresponden al valor ASCII de las letras A ,B , C ,D, P etc....
Si le pongo un valor fijo a PALABRA este valor me lo muestra en la matrix, que sería la A..eso quiere decir de que la rutina I2C no presenta problema alguno(aparentemente) lo que pasa es que no carga el valor de la memoria en el registro SSPBUF, o si lo carga es un valor diferente..en fin ya me está dando dolor de cabeza..ahh Dios quien me mandó  :( :shock:

Saludos
Título: Re: Una manito por favor
Publicado por: BrunoF en 14 de Mayo de 2009, 13:40:03
Hola. Los PAGESELW son MACROs que utilizan el registro de trabajo(W). Te está ensuciando los datos. Cambiá los PAGESELW por PAGESEL en tu rutina.

Saludos.
Título: Re: Una manito por favor
Publicado por: marvicdigital en 14 de Mayo de 2009, 14:29:14
Hola. Los PAGESELW son MACROs que utilizan el registro de trabajo(W). Te está ensuciando los datos. Cambiá los PAGESELW por PAGESEL en tu rutina.

Saludos.

Nada, ya hice el cambio y sigo igual, creo que me voy a hacer la rutina de la forma más rudimentaria, a punta de BSF portc,sd  call 10_MS etc...por que no le veo el problema, la memoria  ya la cambié y nada, le puse otra de menor tamaño y elimine las lineas de la dirección alta y nada, revise conexiones, resistencias voltajes y nada....pregunto tendrá algo que ver los casi 30cms de cable del bus que van desde el entrenador al protoboard donde tengo la memoria?..solo me falta descartar eso...

BrunoF muchas gracias por ayudarme..

Saludos
Título: Re: Una manito por favor
Publicado por: BrunoF en 14 de Mayo de 2009, 16:18:24
Bueno, me hiciste acordar de algo.

Mis rutinas eran para una 24LC08, no se si micro usaba esa o una 24LC256. Te comento porque yo enmascaro los bits que la 08 no usaba! Ojo con eso!

Cuando tenga un tiempo la miro mas en detalle.

Saludos.
Título: Re: Una manito por favor
Publicado por: BrunoF en 14 de Mayo de 2009, 16:20:18
P.D. Desde el comienzo siempre he dicho que no conozco a NADIE que programando en ASM se haya llevado gratis el I2C. Siempre se reniega...:D
Título: Re: Una manito por favor
Publicado por: BrunoF en 14 de Mayo de 2009, 16:43:22
Ah! Y otra cosita...Pasame la declaración de las variables RAM de tu programa.
Título: Re: Una manito por favor
Publicado por: marvicdigital en 14 de Mayo de 2009, 16:54:36
P.D. Desde el comienzo siempre he dicho que no conozco a NADIE que programando en ASM se haya llevado gratis el I2C. Siempre se reniega...:D

 :D :D :D  me hiciste reír...el asunto era que yo quería ser el primero en llevármelo gratis ,pero ni modo en otra vida será  :D :mrgreen:

Las variables:

Código: [Seleccionar]
CBLOCK 020H
COL0
COL1 ;BYTE PARA  COLUMNAS
COL2
COL3
COL4
COL5
COL6
COL7
COL8
COL9
COL10
COL11
COL12
COL13
COL14
COL15
COL16
COL17
COL18
COL19
COL20
COL21
COL22
COL23
COL24
COL25
COL26
COL27
COL28
COL29
COL30
COL31
COL32
; CUANDO SE SUMEN LAS RESTANTES COLUMNAS DEBEMOS LLEGAR HASTA COL80
ESPACIO
FORMAR
VECES
DATOS
TEMPORAL
AUXILIAR
FILAS
LETRA
COLUMNAS
PALABRA
IC2DATA
ELEMENTO
SUBELEMENTO
TMPL
TMPH
TMPSUB
DIRL
DIRH
DEMOELEMENTO
DEMOSUBELEMENTO
DEMOTMPL
DEMOTMPH
DEMOTMPSUB
DEMODIRL
DEMODIRH
MENSAJE
ORACION
HADDEEPROM
LADDEEPROM
FLAGEE
ENDC

Una pregunta con respecto a este punto, cuando llegue a la memoria 07fh o sea ,ocupe la RAM para los 96 registros generales de la primera página como es la instrucción para pasar a la dirección 0A0H, ya que hice el intento de ponerle CBLOCK  0A0H -- registros ..endc  y al compilar me dio error, quedé de investigar ese punto apenas llegue a requerirlo, pero ahora que estamos puestos..no me vendría mal una explicación.  :)

Saludos y gracias BrunoF


Título: Re: Una manito por favor
Publicado por: BrunoF en 14 de Mayo de 2009, 17:12:32
P.D. Desde el comienzo siempre he dicho que no conozco a NADIE que programando en ASM se haya llevado gratis el I2C. Siempre se reniega...:D

 :D :D :D  me hiciste reír...el asunto era que yo quería ser el primero en llevármelo gratis ,pero ni modo en otra vida será  :D :mrgreen:

:D :D es que es así. es el precio q hay que pagar por programar en ASM y poder controlarlo todo...:D :D

Las variables:

Código: [Seleccionar]
CBLOCK 020H
COL0
COL1 ;BYTE PARA  COLUMNAS
COL2
COL3
COL4
COL5
COL6
COL7
COL8
COL9
COL10
COL11
COL12
COL13
COL14
COL15
COL16
COL17
COL18
COL19
COL20
COL21
COL22
COL23
COL24
COL25
COL26
COL27
COL28
COL29
COL30
COL31
COL32
; CUANDO SE SUMEN LAS RESTANTES COLUMNAS DEBEMOS LLEGAR HASTA COL80
ESPACIO
FORMAR
VECES
DATOS
TEMPORAL
AUXILIAR
FILAS
LETRA
COLUMNAS
PALABRA
IC2DATA
ELEMENTO
SUBELEMENTO
TMPL
TMPH
TMPSUB
DIRL
DIRH
DEMOELEMENTO
DEMOSUBELEMENTO
DEMOTMPL
DEMOTMPH
DEMOTMPSUB
DEMODIRL
DEMODIRH
MENSAJE
ORACION
HADDEEPROM
LADDEEPROM
FLAGEE
ENDC

Una pregunta con respecto a este punto, cuando llegue a la memoria 07fh o sea ,ocupe la RAM para los 96 registros generales de la primera página como es la instrucción para pasar a la dirección 0A0H, ya que hice el intento de ponerle CBLOCK  0A0H -- registros ..endc  y al compilar me dio error, quedé de investigar ese punto apenas llegue a requerirlo, pero ahora que estamos puestos..no me vendría mal una explicación.  :)

Saludos y gracias BrunoF

CBLOCK es para declararlas y deberías poder declarar mas allá de la 0x7F.
Para acceder a variables RAM de otros bancos, se usa la MACRO: BANKSEL nombre_variable
Ejemplo:

tolon equ 0x40
tilin   equ 0x80

;......
;en programa:
     banksel tilin
     movf tilin,w
     banksel tolon
     movwf tolon



el MPASM reemplaza las etiquetas pasadas por su posición ram declarada:
     banksel 0x80
     movf tilin,w
     banksel 0x40
     movwf tolon

luego reemplaza las MACROs BANKSEL por dos instrucciones bcf/bsf STATUS,RP0 y bcf/bsf STATUS,RP1 segun el valor de memoria argumentado:

    bsf       STATUS,RP0                       ;banksel 0x80
    bcf       STATUS,RP0                       
    movf tilin,w
    bcf       STATUS,RP0                       ;banksel 0x40
    bcf       STATUS,RP0                       
    movwf tolon

P.D. Las posiciones RAM [0x70;0x7F] se comparten entre todos los bancos(los 4), Esto quiere decir que no hace falta cambiar de banco para acceder a ellas.Entonces: tip: aprovecha bien esas 16 posiciones y usalas para variables que uses masivamente a lo largo del programa. Te vas a ahorrar muchas BANKSEL(mucha FLASH y legibilidad).

Capiche?

Saludos.
Título: Re: Una manito por favor
Publicado por: Cryn en 14 de Mayo de 2009, 17:37:02
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.

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.

Saludos, disculpa por responder después de tanto tiempo, y si usé la matriz [6][8] de bytes, me equivoque, no es de 40 la matriz; ésta representa en el programa del micro a la matriz física. Aclarar que la matriz de leds física está formada de matrices pequeñas de 8x8 en total solo tengo 5 matrices de 8x8, la 6ta posición de la matriz en soft lo uso como temporal. Ya que comencé por desplazar el mensaje de derecha a izquierda, y coloque esta 6 posición para que la 1ra letra aparezca primeramente en esta virtual, y exista un espacio entre el fin e inicio del mensaje cuando este termine de pasar.

Les menciono los pasos y muestro algunas imágenes de lo que hago, y al menos lo que ví en otros mensajes, quizá en idea general vaya por buen camino, pero en el uso de la matriz en soft quizá no sea lo mejor, y todavía no logro entenderlo sin usar la matriz y usar solamente unos cuantos buffers y lograr todos los efectos que uno puede ver en estos letreritos tan vistosos.

1. Tengo mi mensaje guardado en ASCII
2. Leo la primera letra del mensaje y la decodifico en sus 8 bytes que tiene, los 8 bytes resultantes los almaceno en la última posición de la matriz (uso caracteres de 8x8).
3. muestro el contenido de la matriz[6][8] que inicialmente esta cargada solamente con la 1ra letra del mensaje (sus 8 bytes), por tanto como tengo físicamente 5 matrices de leds no se verá nada.
4. muestro varias veces el contenido de la matriz[6][8], para que el mensaje no pase demasiado rápido.
lo muestro fila por fila: 1ro cargo los registros con los datos
5. roto todos los bytes de la matriz[6][8] a la izquierda.
6. vuelvo a mostrar el contenido de la matriz de la misma manera, pero ahora ya aparecerá la primera columna de la primera letra en la matriz física, los leds correspondientes estarán encendidos
y así sucesivamente hasta mostrar todas las letras del mensaje.

Les muestro unas cuantas imágenes de lo que creo ya todos lo conocemos.

primera fila:
(http://img407.imageshack.us/img407/6339/fila1.jpg)

segunda:
(http://img61.imageshack.us/img61/2049/fila2.jpg)

tercera:
(http://img2.imageshack.us/img2/2844/fila3.jpg)

cuarta:
(http://img2.imageshack.us/img2/9141/fila4.jpg)

quinta:
(http://img61.imageshack.us/img61/4503/fila5.jpg)

sexta:
(http://img10.imageshack.us/img10/5302/fila6.jpg)

septima:
(http://img526.imageshack.us/img526/7482/fila7.jpg)

octava
(http://img516.imageshack.us/img516/539/fila8.jpg)

mensaje que se obtiene visualmente:
(http://img507.imageshack.us/img507/3894/cartel.jpg)

Esa es la idea que plasme en código, pero fue esencialmente pensando en solo desplazar el mensaje de der a izq, pero ahora hay tantos efectos que hay como que el mensaje se desplace hacia arriba o abajo o que desaparezca columna por columna desde la izq o der o desde el medio hacia ambos lados y bueno nose, supongo que con bastante código (algoritmos) se podrá lograr estos efectos usando la matriz[6][8] que tengo en RAM, pero seguramente es lo menos efectivo como mencionó Bruno.

Todavía no logro entender muy bien donde van los punteros y como sabes que letra apunta el puntero si esta almacenado en ascii y debes decodificar primeramente...

como lo haces tu? o como debería ser?

un saludo y muchas gracias por la ayuda, y disculpas que me entrometa en el hilo, pero quizá esto también pueda ayudar a alguien que tenga un problema parecido al mío.

pd. Felicidades marvicdigital por el cartel, te ha quedado muy bien, se ve bien en el video
Título: Re: Una manito por favor
Publicado por: marvicdigital en 14 de Mayo de 2009, 18:04:17
Gracias BrunoF, tus explicaciones son monumentales..y ahora como vez el código del I2C?..ya tengo hasta dolor de cabeza..voy a repazar algunos PDF sobre los 16F87X a ver si encuentro el detallito  :D  no creo que sea máscara por que no le he hecho ninguna AND ..bueno..seguire mirando..por que ya hice una prueba y me graba datos, lo que no logro hacer es que me los lea  :?

En fín..el módulo MSSP debe estar burlandose de mí.. :D

(http://glenclous.files.wordpress.com/2008/12/nelson-simpsons.jpg)


Saludos.
Título: Re: Una manito por favor
Publicado por: BrunoF en 14 de Mayo de 2009, 18:37:43
Hola Cryn!

Creo que entiendo tu método. El problema de usar arreglos bidimensionales es que tenés dos dimensiones que recorrer contra una sola. Es mucho más sencillo con una sola dimension. Más rápido el código, los punteros y los efectos luego.

Entonces, si vos tenés 40 columnas de cartel efectivos, y 8 bytes más para buffer temporal, podrías usar una matriz de 48 bytes.

//(esto es en C marvic)

//Ej:
#DEFINE    COLUMNAS 40
#DEFINE    TMPBUFF      8
char BufferA[COLUMNAS+TMPBUFF];

A ver, creo que acá está el problema. La idea es transformar los caracteres en gráfico. Vos tendrás almacenado el código ASCII de cada caracter a mostrar, junto con la tabla de cada uno que contendrá los valores(8 bytes) de los LEDs correspondientes.

Cuando tenés que ir llenando el buffer, andá volcando(copiando) todos los valores(8 bytes) de cada caracter en el mísmo(en el buffer) y descartá el caracter original. Te olvidás por completo porque ya está volcado en el buffer. Ahora el caracter es en realidad 8 columnas de LEDs. Un mero gráfico.

La rutina para mostrar los LEDs sólo refresca lo que va encontrando en las primeras 40 columnas de tu buffer. Ahora, podés usar un "puntero" para agilizar las rotaciones.El puntero es el encargado de indicarle a la rutina de refresco cuál es la primera columna del buffer a refrescar.

Acá te pego mi rutina de refresco para un cartel que estoy programando precisamente en estos días.Te declaro y explíco antes las variables involucradas:
 
int1 BuffActual;   //0 o 1. Indica el buffer actual que se deberá mostrar. En el otro se trabajará. INICIALIZADO A 0.
int8 Inicio;         // Es mi "puntero" que aunque no es un puntero REAL, sirve para recorrer la matriz e indicar cuál es la primer columna a refrescar. INICIALIZADO A 0.
//DATA,CLOCK y STROBE están asociados a 3 pines que son los que comandan los 74HC4094.
int8 FilaActual    //Contiene el valor del puerto(PORTD en mi caso) que controla las filas para indicar cuál es la fila actual a refrescar.(son 7 filas en total).INICIALIZADO A 1.

Código: C
  1. void display_refrescar(void){
  2.    char i;
  3.    if(!BuffActual){
  4.       for(i=Inicio-1;i!=255;i--){
  5.         output_low(DATA);
  6.         if(Buffer1[i] & FilaActual) output_high(DATA);
  7.         output_high(CLOCK);
  8.         output_low(CLOCK);
  9.       }
  10.       for(i=COLUMNAS-1;i!=Inicio-1;i--){
  11.         output_low(DATA);
  12.         if(Buffer1[i] & FilaActual) output_high(DATA);
  13.         output_high(CLOCK);
  14.         output_low(CLOCK);
  15.       }
  16.    }else{
  17.       for(i=Inicio-1;i!=255;i--){
  18.         output_low(DATA);
  19.         if(Buffer2[i] & FilaActual) output_high(DATA);
  20.         output_high(CLOCK);  
  21.         output_low(CLOCK);
  22.       }
  23.       for(i=COLUMNAS-1;i!=Inicio-1;i--){
  24.         output_low(DATA);
  25.         if(Buffer2[i] & FilaActual) output_high(DATA);
  26.         output_high(CLOCK);
  27.         output_low(CLOCK);
  28.       }
  29.    }
  30.  
  31.    PORTD=255;     //apagar todo
  32.    output_high(STROBE);    //efectivizar datos
  33.    output_low(STROBE);
  34.    PORTD=FilaActual^255; //en la simulación necesito invertir la lógica porque no uso los ULN porque as+i ahorro procesado del micro de la PC al simular.
  35.    rotate_left(&FilaActual,1); //roto para indicar próxima fila
  36.    if(FilaActual==128){        //me fijo si ya excedí la 7ma fila.
  37.       FilaActual=1;               //Si, entonces indicar que la próxima a refrescar será la primera
  38.       NewFrame=1;             //e indicar que es un buen momento para producir un cambio visible en el programa(porque es justo cuando he terminado de refrescar todas las filas)
  39.    }else{
  40.       NewFrame=0;            //si no excedí la 7ma fila, indicar que no es buen momento para cambiar algo visible(como intercambiar buffers...)
  41.    }
  42. }

Ahora, usando esta forma, rotar lo que se muestra en el display es sumamente sencillo. Por ejemplo, para rotar lo que muestro a la izquierda en una posición(columna), sólo hago:

Código: C
  1. void rotar_izq(){
  2.     Inicio++;                      //incremento el "puntero" que le indica a la subrutina de refresco cuál es la primer columna a refrescar
  3.     if(Inicio==COLUMNAS){  //me aseguro de que Inicio no se me "escape" de las dimensiones del Buffer. Hacer un buffer ciclico. Reacomodar si es necesario.
  4.         Inicio=0;                  //Se fue de los límites del Buffer, y como es cíclico,vuelvo al principio del buffer.
  5.     }
  6. }

Y el buffer rotará su contenido sobre si mísmo.

Como no tengo programa para capturar video con la PC, te dejo la simulación con el .hex. Necesitás una versión nueva del Proteus, porque mi cartel va por USB(aunque actualmente envía y recibe datos, no participa del soft realmente).

Un saludo.
Título: Re: Una manito por favor
Publicado por: BrunoF en 14 de Mayo de 2009, 18:40:12
Gracias BrunoF, tus explicaciones son monumentales..y ahora como vez el código del I2C?..ya tengo hasta dolor de cabeza..voy a repazar algunos PDF sobre los 16F87X a ver si encuentro el detallito  :D  no creo que sea máscara por que no le he hecho ninguna AND ..bueno..seguire mirando..por que ya hice una prueba y me graba datos, lo que no logro hacer es que me los lea  :?

En fín..el módulo MSSP debe estar burlandose de mí.. :D

(http://glenclous.files.wordpress.com/2008/12/nelson-simpsons.jpg)


Saludos.


Buena imagen! :D :D

Quiero decir que YO hacía una máscara e inyectaba bits en mi rutina de la 24LC08 usando AND e IOR. Por ahi estás arrastrando eso a la 24LC256...

Saludos.
Título: Re: Una manito por favor
Publicado por: marvicdigital en 14 de Mayo de 2009, 22:16:01
Bueno creo que encontré mi falla, no la he probado por que estoy analizando primero, pero para empezar estas lineas:


Código: [Seleccionar]
MOVLW         B'10100000'
PAGESELW         TRANSMITIR_DATO_I2C
CALL                 TRANSMITIR_DATO_I2C
MOVF         HADDEEPROM,W                           ;[color=red]CARGO W CON EL REGISTRO HADDEEPROM[/color]
PAGESELW         TRANSMITIR_DATO_I2C
CALL                 TRANSMITIR_DATO_I2C
MOVF         LADDEEPROM,W
PAGESELW         TRANSMITIR_DATO_I2C
CALL                 TRANSMITIR_DATO_I2C

Y en el .INC tengo la rutina de transmitir_dato_I2C asi:

Código: [Seleccionar]
TRANSMITIR_DATO_I2C

BCF             FLAGEE,0
PAGESEL        I2C_IDLE        ;INICIALIZAR FLAG COMO "ERROR"
    CALL             I2C_IDLE
    MOVF             IC2DATA,W          ;MOVER DATO A W           ;[color=red]Aca se pierde el valor que traía W[/color]
    MOVWF            SSPBUF          ;CARGAR DATO EN BUFFER I2C
    BSF             STATUS,RP0      ;BANCO 1

Ahora si creo que debe funcionar la cosa..voy a probar y ya cuento..a lo mejor encuentro más errores monumentales  :D

Saludos

Edit 1:  Listo problema resuelto, ese era todo el stop que tenía, también aclaro una cosa que pueda servir para muchos, voy a dar un ejemplo y explico:

Código: [Seleccionar]
LOOP_EE
       
   PAGESEL CONFIG_TRANSMISION_I2C ;DIRECCIÓN Y LECTURA DE LA MEMORIA EEPROM
   CALL         CONFIG_TRANSMISION_I2C
   CLRF          IC2DATA
   CLRF         PALABRA
   PAGESEL BIT_START_I2C
   CALL         BIT_START_I2C
            ...
            ....
            ...
            GOTO            LOOP_EE

Si escribo estas lineas asi, el programa no ejecuta la instrucción siguiente al GOTO, osea la de CALL Config_transmision_I2C, por alguna razón que desconozco  el PCLTAH toma otro valor y el PC simplemente se pierde, la verdad no se por qué, eso también fue la causa de mis problemas a la hora de leer la memoria, para que este fallo no se presente se le debe agregar un par de NOP quedando asi:


Código: [Seleccionar]
LOOP_EE
           NOP
           NOP
   PAGESEL CONFIG_TRANSMISION_I2C ;DIRECCIÓN Y LECTURA DE LA MEMORIA EEPROM
   CALL         CONFIG_TRANSMISION_I2C
   CLRF          IC2DATA
   CLRF         PALABRA
   PAGESEL BIT_START_I2C
   CALL         BIT_START_I2C
            ...
            ....
            ...
            GOTO            LOOP_EE

Veo que a pesar de tener configurado el bus a una velocidad superior a 330KHZ al acceder a la memoria aleatoriamente en pantalla veo como el movimiento de las letras se ve alterado, mostrándome como un frenado hasta que termine de leer las direcciones que configure en mi rutina y luego ya es normal, pero es por que ya no hay lectura de la memoria EEprom....supongo que puede ser que hay parte del código que hay que depurar para evitar esto...pero por ahora decidí acceder a la memoria secuencialmente y hago una rutinita donde me detecte un carcater especifico que de por terminada la lectura de la memoria, y según el datasheet de la 24LC256, la dirección queda guardad internamente en un buffer, para cuando accedamos de nuevo seguir en la dirección + 1 y asi hasta la dirección 7FFF que es cuando retorna a la dirección 0000h, para que volviera al inicio decido hacer la rutina de lectura aleatoria de la memoria pero apuntando inicialmente a la dirección 7FFFH y luego leo , y vuelvo a la lectura secuencial, ..Esta es una forma correcta de hacerlo, o pueden existir varias alternativas?

Saludos



Título: Re: Una manito por favor
Publicado por: BrunoF en 15 de Mayo de 2009, 01:52:02
Hola marvic. Me alegro que funcione.

Leerla secuencialmente es una de las mejores maneras. Podrías leer de a varias posiciones x vez también(no recuerdo como se llamaba este modo de acceso).
Con respecto a los NOP que tuviste que agregar...No. Si trabajas más allá de los 2k Words de flash, cuando hagas un call o un goto tenés que tener cuidado con los bits que determinan la pagina a la que queres ir.

Usá PAGESEL también antes de hacer un goto. Ejemplo: PAGESEL LOOP_EE y luego el GOTO LOOP_EE.

Los NOPs se me ocurren que pueden estar funcionando porque justo agregadolos estás evitando que se cruce alguna página del uC.
Habria que ver donde ubica en la memoria flash cada linea(desde el MPLAB esto se hace en el menu View->Disassembly listing una vez que se ha creado con exito el archivo .hex).

Un saludo.
Título: Re: Una manito por favor
Publicado por: marvicdigital en 15 de Mayo de 2009, 08:27:43
Hola marvic. Me alegro que funcione.

Leerla secuencialmente es una de las mejores maneras. Podrías leer de a varias posiciones x vez también(no recuerdo como se llamaba este modo de acceso).
Con respecto a los NOP que tuviste que agregar...No. Si trabajas más allá de los 2k Words de flash, cuando hagas un call o un goto tenés que tener cuidado con los bits que determinan la pagina a la que queres ir.

Usá PAGESEL también antes de hacer un goto. Ejemplo: PAGESEL LOOP_EE y luego el GOTO LOOP_EE.

Los NOPs se me ocurren que pueden estar funcionando porque justo agregadolos estás evitando que se cruce alguna página del uC.
Habria que ver donde ubica en la memoria flash cada linea(desde el MPLAB esto se hace en el menu View->Disassembly listing una vez que se ha creado con exito el archivo .hex).

Un saludo.


Gracias , BrunoF, sin tus apreciadas explicaciones y ayudas no hubiera sido posible haberlo hecho tan pronto  :-/ y con respecto a lo de PAGESEL antes de un goto , entonces como se haría en este caso?

Código: [Seleccionar]
           BTFSS        PREGUNTA,1
           GOTO         FALSO
           GOTO         VERDADERO

Porque según lo que entiendo el MPASM hace una selección de página con PAGESEL ...no se si me estoy haciendo un lío... :lol:

Saludos

Edit: Bueno hice la prueba agregando los NOP y sin problema alguno, pero al hacer esto:

Código: [Seleccionar]
BTFSS        PREGUNTA,1
          PAGESEL    FALSO
          GOTO         FALSO
           GOTO         VERDADERO

Simplemente no funciona, es es obvio por eso la conveniencia de agregar un NOP antes de empezar la rutina que estamos llamando con GOTO..aclaro que la memoria en donde está escrito mi ejemplo es en la 2067  :D si..es que debo borrar un montón de pruebas que estoy haciendo para los efectos..vamos basurita, ripio, limaduras o bueno eso que sobra cuando se está armando tiestos  :mrgreen:  (Depurar)

Saludos
Título: Re: Una manito por favor
Publicado por: BrunoF en 15 de Mayo de 2009, 14:25:59
Código: [Seleccionar]
           BTFSS        PREGUNTA,1
           GOTO         FALSO
           GOTO         VERDADERO

Porque según lo que entiendo el MPASM hace una selección de página con PAGESEL ...no se si me estoy haciendo un lío... :lol:

Saludos

No podes en ese caso hacerlo tan sencillo. En un uC como el que estás usando,  hay 4 páginas en la FLASH:
desde la posición 0x0000 hasta la 0x07FF página 0
desde la posición 0x0800 hasta la 0x0FFF página 1
desde la posición 0x1000 hasta la 0x17FF página 2
desde la posición 0x1800 hasta la 0x1FFF página 3

Cuando vos empezás a usar más allá de la página 1, tenés que tener cuidado con la paginación.Esto NO significa que es extremadamente necesario tener que estar constantemente haciendo PAGESEL antes de un CALL o un GOTO. Sólo deberías usarlo cuando sabés que hay un cambio de página. Es decir, por ejemplo, si estás actualmente en la página 1 y querés ir a una subrutina o etiqueta de la página 2. Si la subrutina o etiqueta a la que querés ir se encuentra en la mísma página no hace falta hacer el PAGESEL.

Entonces, lo que se hace para ahorrarse dolores de cabeza y problemas paginando sin sentido o teniendo problemas de cruce de páginas es ésto: se usa la directiva ORG para indicarle al compilador desde dónde comenzarán a ubicarse en la FLASH las líneas de código debajo de ésta(la directiva ORG).

Resumidamente te lo explíco:

          ORG 0x0000     ;indico que ahora empiezo desde pagina 0
Reset
         .......
Interr
         .......
Inicio
         .......

         ORG  0x0800     ;indico que ahora empiezo desde pagina 1
Rutinas_I2C
         .......
         .......
         .......
Otras_Rutinas
         .......
         .......
         .......

         ORG  0x1000     ;indico que ahora empiezo desde pagina 2
Algoritmos_Efectos_Cartel
         .......
         .......
         .......
         .......
         .......
       
         ORG  0x1800     ;indico que ahora empiezo desde pagina 3
Tablas
         .......
         ....... 
         .......
         .......

De esta manera, por ejemplo, puedo asegurarme que, por ejemplo, las "Rutinas_I2C" no necesiten realizar un PAGESEL cuando se llaman entre ellas, ya que están dentro de la mísma página.
Esta es la ventaja de "moduralizar" los grupos importantes de rutinas para evitar problemas y lineas de codigo sin sentido.


Edit: Bueno hice la prueba agregando los NOP y sin problema alguno, pero al hacer esto:

Código: [Seleccionar]
          BTFSS        PREGUNTA,1
          PAGESEL    FALSO
          GOTO         FALSO
           GOTO         VERDADERO

Simplemente no funciona, es es obvio por eso la conveniencia de agregar un NOP antes de empezar la rutina que estamos llamando con GOTO..aclaro que la memoria en donde está escrito mi ejemplo es en la 2067  :D si..es que debo borrar un montón de pruebas que estoy haciendo para los efectos..vamos basurita, ripio, limaduras o bueno eso que sobra cuando se está armando tiestos  :mrgreen:  (Depurar)

Saludos


Hacer:

Código: [Seleccionar]
          BTFSS        PREGUNTA,1
          PAGESEL    FALSO
          GOTO         FALSO
           GOTO         VERDADERO

 termina siendo:
Código: [Seleccionar]
          BTFSS        PREGUNTA,1
          BCF/BSF     PCLATH,3
          BCF/BSF     PCLATH,4
          GOTO         FALSO
           GOTO         VERDADERO

Por lo que en realidad el salto no hace obviamente lo que querés. Ahora, si respetás lo que acabo de explicar arriba de modularizar un poco, podrías directamente no necesitar hacer el PAGESEL si FALSO y VERDADERO se encuentran en la mísma página en la que estás actualmente al querer ir.
Si aún así, si no te encuentras en la mísma página que FALSO y VERDADERO, pero FALSO y VERDADERO se encuentran entre sí ubicadas en la mísma página, podés hacer directamente ésto:


Código: [Seleccionar]
          PAGESEL    FALSO  ;BANKSEL VERDADERO también funcionaría porque sería exáctamente lo mísmo por estar en la mísma página
          BTFSS        PREGUNTA,1
          GOTO         FALSO
           GOTO         VERDADERO
Título: Re: Una manito por favor
Publicado por: BrunoF en 15 de Mayo de 2009, 14:29:44
P.D: Fijate que me hablás de posición 2067. En las posiciones 2047 a 2048 se produce un cambio de página. Probablemente ahí puede que haya problemas. Intentá modularizando como dije.
Título: Re: Una manito por favor
Publicado por: MLO__ en 15 de Mayo de 2009, 16:07:11
Hola.

Que pena entrometerme, pero, segun las imagenes que puso Cryn, veo que por matriz de led hay una letra ..... en el codigo que yo hice, dejo un espacio solo de una columna entre letra y letra, pero al maximo que he llegado es a 32 columnas, esto debido a que no hay mas variables mas grandes que int32 ....

Lo que yo hago es cargar las letras una a una segun el mensaje en un arreglo de int32, en mi caso como son 7 filas, sera un arreglo de 7 int32. Luego en otro arreglo de int32 auxiliar voy cargando cada una de las filas y las despliego con el shift_left();.

No he tenido tiempo de arreglar mi matriz a mas leds, queria hacerla -o quiero hacerla de 7x64 al menos- pero ando liado con el espacio!!!!

Que sugerencia me das Bruno?

Saludos
Título: Re: Una manito por favor
Publicado por: Cryn en 15 de Mayo de 2009, 16:25:29
si, así lo hacía yo, colocando una letra por matriz.

Pero con la pequeña charla que me dio Bruno manejaré de otra manera los datos, para hacerlo con punteros, pues me ha convencido que es la mejor manera para poder lograr varios efectos y hacerlos de la manera más sencilla posible.

podrías usar entonces dos int32 y tu cartel llegará a 64 columnas :mrgreen: y al rotar el carrie excesivo pasa a la cola del otro byte y el carrie de ese byte al primero, pero Bruno te dirá que mejor guardes los datos por columnas uses un buffer y en estos ordenes de una manera diferente los datos recibidos, pues todos los últimos bits de los bytes de tu buffer serán la primera fila, del cartel, todos los bits6 serán la segunda y así sucesivamente hasta la 7ma u 8va fila. Todos los bits 7 los vas mandando de ocho en ocho a los registros y tienes los datos para cada fila. Los punteros te ayudarán a tener un desplazamineto y otros efectos más eficientemente según las experiencias de Bruno.

Ahora solo queda hacer algo de código, que personalmente estoy en eso, solo que dejo unos pequeños pendientes y me pongo a full a trabajar con esto.

Un saludo.
Título: Re: Una manito por favor
Publicado por: BrunoF en 15 de Mayo de 2009, 19:17:46
Hola.

Que pena entrometerme, pero, segun las imagenes que puso Cryn, veo que por matriz de led hay una letra ..... en el codigo que yo hice, dejo un espacio solo de una columna entre letra y letra, pero al maximo que he llegado es a 32 columnas, esto debido a que no hay mas variables mas grandes que int32 ....

Lo que yo hago es cargar las letras una a una segun el mensaje en un arreglo de int32, en mi caso como son 7 filas, sera un arreglo de 7 int32. Luego en otro arreglo de int32 auxiliar voy cargando cada una de las filas y las despliego con el shift_left();.

No he tenido tiempo de arreglar mi matriz a mas leds, queria hacerla -o quiero hacerla de 7x64 al menos- pero ando liado con el espacio!!!!

Que sugerencia me das Bruno?

Saludos

Hola! Ahí Rodrigo te ha indicado el método que simplifica la cosa. En unos días si termino mi archivito, lo archivo para que podamos tener una librería standard entre todos. :)

Un saludo.
Título: Re: Una manito por favor
Publicado por: MLO__ en 15 de Mayo de 2009, 21:50:44
Ok!!!

Gracias amigos
Título: Re: Una manito por favor
Publicado por: marvicdigital en 16 de Mayo de 2009, 13:37:11
 :(  Valla que si me a tocado leer a raudales, hasta el punto de dormirme al frente de este monitor con un PDF abierto  :D..llevo más de 5 horas analizando el código y no encuentro explicación alguna, dentro de lo que conozco a mi problema.
Seguí tu consejo BrunoF, de poner el programa por bloques en la memoria flash, por ejemplo las siguientes rutinas:

Código: ASM
  1. ;****************leer memoria 24LC256 ******
  2.           ORG   0X1400
  3. LEER_EEPROM
  4.        
  5.          CLRF   HADDEEPROM
  6.          CLRF   LADDEEPROM
  7. LOOP_EE                
  8.          CALL   CONFIG_TRANSMISION_I2C
  9.          CLRF   IC2DATA
  10.          CLRF   PALABRA
  11.          CALL   BIT_START_I2C
  12.         MOVLW   B'10100001'
  13.          CALL   TRANSMITIR_DATO_I2C
  14.          CALL   RECIBIR_DATO_I2C
  15.         CALL            BIT_STOP_I2C
  16.         MOVF    IC2DATA,W
  17.         MOVWF   PALABRA
  18.         XORLW   0FFH
  19.         BTFSC   STATUS,Z
  20.         GOTO    BLANQUIAR_PANTALLA
  21.         MOVLW   .32
  22.         SUBWF   PALABRA,F
  23.          PAGESEL        SIGUIENTE_FASE
  24.          CALL   SIGUIENTE_FASE
  25.         MOVF    PALABRA,W
  26.         XORLW   .32
  27.         BTFSS   STATUS,Z
  28.         GOTO    LOOP_EE
  29.         CALL            BIT_STOP_I2C
  30.          PAGESEL        ESPACIOS_BLANCO
  31.          CALL   ESPACIOS_BLANCO
  32.         GOTO    LEER_EEPROM
  33.        
  34. BLANQUIAR_PANTALLA
  35.          PAGESEL        ESPACIOS_BLANCO
  36.          CALL   ESPACIOS_BLANCO
  37.         GOTO    LEER_EEPROM
  38.  
  39. INCLUDE <I2C.INC>
  40. ;**********************************************
  41. ;EFECTOS  EN BANCO 03
  42. ;***********************************************
  43. ;DESPLAZAR HACIA LA IZQUIERDA
  44. ;**********************************************
  45.           ORG   0X1800
  46. ROTAR_IZQUIERDA
  47.                 MOVLW           COL31
  48.                 MOVWF           FSR
  49. OTRA_ROT_IZQ
  50.                 MOVF            INDF,W
  51.                 INCF            FSR,F
  52.                 MOVWF           INDF
  53.                 DECF            FSR,F
  54.         DECF    FSR,F
  55.                 MOVLW   COL1-1
  56.                 XORWF           FSR,W
  57.         BTFSS           STATUS,Z
  58.         GOTO            OTRA_ROT_IZQ
  59.         CLRF    INDF
  60.         RETURN
  61. ;****************************************

El problema es que de esta forma no me funciona, pero si pongo estas 2 rutinas en el banco en donde están las lineas que hacen el llamado,me fuciona bien sin problemas..y no es por que le falte el PAGESEL, por que lo tengo bien:

Código: ASM
  1. INICIO 
  2.          CLRF   FLAGEE
  3.          CLRF   PORTA
  4.          CLRF   PORTB
  5.          CLRF   PORTC
  6.          BANCO1
  7.          MOVLW  018H
  8.          MOVWF  TRISC
  9.          CLRF   TRISB
  10.          CLRF   OPTION_REG
  11.          MOVLW  006H
  12.          MOVWF  ADCON1
  13.          MOVLW  0C0H
  14.          MOVWF  TRISA
  15.          BANCO0
  16.        
  17. LOOP_INICIO
  18.          MOVLW  0FFH
  19.          MOVWF  PORTB
  20.          BCF    LOAD
  21.          MOVLW  .32
  22.          MOVWF  COLUMNAS
  23.          MOVLW  COL1
  24.          MOVWF  FSR
  25. CERO S_COLUMNAS                 ;BORRAR TODAS LAS COLUMNAS
  26.          CLRF   INDF            ;PARA LIMPIAR AL INICICAR
  27.          DECFSZ COLUMNAS
  28.          GOTO   SEGUIR_BORRANDO
  29.         ;GOTO   DEMO_FASE
  30.          PAGESEL        LEER_EEPROM
  31.          GOTO   LEER_EEPROM     ;ME VOY A EMPEZAR A LEER LA EEPROM
  32. SEGUIR_BORRANDO
  33.          INCF   FSR,1
  34.          GOTO   CEROS_COLUMNAS

En esta parte no hay problema alguno, este inicio está junto con el llamado de generar caracteres, mostrar la pantalla y todos las tareas que hacen posible ver un caracter en la matrix.

En la única parte en la que tengo duda es en el llamado de una tabla de una tabla; siguiendo tu ejemplo para poder seleccionar el valor hexadecimal correcto para cada columna  dependiendo del caracter; en él usas mucho el PAGESEL por que el ejemplo expone también que se puede hacer el llamado de una tabla sin importar en donde esté, y como mis tablas  las tengo en el banco 0 pues le quité el PAGESEL, claro después de ver que no me funcionaba bien el código y por probar si era esto.
Mi duda es que la rutina modifica varias veces el PCLATH, pero supuestamente esto no tendría nada que ver ya que la dirección completa de donde se hace el CALL queda grabada en el Stack, y revisando no paso de usar 5 como máximo, cosa que queda comprobada al unir las rutinas en le primer banco de memoria y asi funcionar bien todo.
He revisado PDFs de Microchip, incluyendo el que trata sobre el MPASM y no veo mi error...si sirve de algo estoy usando el MPLAB 8.30.

Que me he tragado? en que parte metí la pata?

Gracias por la ayuda que me puedan dar....

Saludos

Edit: En el foro encontré este post (http://www.todopic.com.ar/foros/index.php?topic=18662.msg130350#msg130350) de Maunix, en donde explica que al volver de un CALL en otra página y si vulevs hacer otro llamado asi sea dentro de la misma página debes agregar el pagesel ya que este seguirá cargado con la página anterior.

Voy a probar  a ver si es esto...No se, pero este pasamensajes ha sido la mejor experiencia hasta la fecha, nunca imagine encontrarme con tantos obstáculos que me enseñaran y me hicieran ver cosas que nunca imagine que existieran  :-)
Título: Re: Una manito por favor
Publicado por: BrunoF en 16 de Mayo de 2009, 14:47:08
Es altamente probable que sea lo que Mauricio dice en ese post.

Tendrias que tenerlo en cuenta en mi rutina de tablas de tablas, porque esa salta páginas seguramente.

Saludos.
Título: Re: Una manito por favor
Publicado por: marvicdigital en 16 de Mayo de 2009, 16:03:20
SIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII

Siiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii   :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :D :D :mrgreen: :mrgreen: :mrgreen: :lol: :-) :-) :mrgreen: :mrgreen: :D :D :-/ :-/

(http://img266.imageshack.us/img266/4773/loloy6.gif)

 y cuando vi que me funcionó ..me fui..

(http://i82.photobucket.com/albums/j259/Porculio/caida_pc.gif)

Por seguridad, cuando se esté trabajando con micros que tiene varias páginas de memoria, ponerle un PAGESEL  después de una etiqueta, si esta forma parte de una rutina, y si dentro de esta hay una llamada a otra que nos lleve a otra página, al volver inmediatamente poner el PAGESEL para recuperar el valor real del PCLATH de esa rutina...no se si me quedó bien explicado  :D ..es que me estoy partiendo de la risa al ver este gif:

(http://i27.photobucket.com/albums/c151/cmonpo/120811748979.gif)

....Luego vuelvo a explicar con un ejemplo mi experiencia.

Gracias BrunoF y sigo pensando que este foro es el mejor dle mundo mundial  :mrgreen:

Saludos
Título: Re: Una manito por favor
Publicado por: Suky en 16 de Mayo de 2009, 16:12:26
 :D  :D  :D  :D  (Por los gif)
Título: Re: Una manito por favor
Publicado por: marvicdigital en 17 de Mayo de 2009, 00:08:10
Bueno, ahora si explicaré como se debe hacer en rutinas de CALL y GOTO cuando nos enfrentamos a uC que tiene más de una página de memoria y cuando nos pasamos más allá de la primera página en nuestro código...No soy muy bueno haciendo esto, si tengo errores por favor me lo hacen saber y ojala pueda explicar bien.
Lo primero, cuando nuestro código supera la barrera de memoria correspondiente al primer banco, o mejor dicho cuando ya pasamos a ocupar más de un banco de memoria debemos tener mucho cuidado en las rutinas que invoquemos tanto con CALL como con GOTO, ya que se puede presentar que si estamos en una linea de nuestro código y esta está en el primer banco, tengamos que hacer un llamado a una rutina que se encuentre en otro banco de memoria, para evitar que nuestro programa se pierda y no sepa a donde ir, debemos usar el PCLATH, que no es más que la dirección alta del PCL, y es el encargado de direccionar el paginado de la memoria flash de nuestro uC.

Para los que usamos el Assambler  podemos usar la siguiente instrucción para direccionar correctamente el PCLATH:

Código: ASM
  1. org         0x05h      comienza en la posición  005h de la memoria flash
  2.          goto        inicio
  3.          .....
  4.          ........
  5.          ..
  6.           .
  7. INICIO
  8.           pagesel   retardo
  9.           call         retardo
  10.           PAGESEL   INICIO
  11.           BTFSS    registro,4
  12.           goto       inicio
  13.           pagesel  banco3
  14.           call        banco3
  15.  
  16. ...
  17. ..
  18. ..
  19. ..
  20.            org      0x0100
  21.  
  22. retardo
  23.            pagesel    retardo
  24. retardo_loop
  25.            decfsz......
  26. .....
  27. .........  
  28.             return

Como vemos, debemos poner una linea de código que nos cargue correctamente el PCLATH para ir exactamente a la dirección que indica la instrucción CALL o sea la posición de la rutina retardo en la flash.
Cuando esta rutina hace su trabajo y retorna a la posición de memoria siguiente a la que hizo el llamado, el PCLATH queda cargado con el último valor, osea el PAGESEL  RETARDO, como de donde hicimos el llamado está en otra página debemos indicar al PCLATH que las lineas siguientes son del banco 0 o del banco en donde estén dichas lineas y no del banco en donde está retardo
Para que quede bien, al retorno inmediatamente debemos agregar otro PAGESEL con el valor del PCLATH de las lineas siguientes.

Creo que con el ejemplo es más que suficiente, me perdonan el texto, no soy mur bueno explicando.

Saludos
Título: Re: Una manito por favor
Publicado por: BrunoF en 17 de Mayo de 2009, 01:54:00
Código: ASM
  1. org         0x05h      comienza en la posición  005h de la memoria flash
  2.          goto        inicio
  3.          .....
  4.          ........
  5.          ..
  6.           .
  7. INICIO
  8.           pagesel   retardo
  9.           call         retardo
  10.           PAGESEL   INICIO
  11.           BTFSS    registro,4
  12.           goto       inicio
  13.           pagesel  banco3
  14.           call        banco3
  15.  
  16. ...
  17. ..
  18. ..
  19. ..
  20.            org      0x0100
  21.  
  22. retardo
  23.            pagesel    retardo
  24. retardo_loop
  25.            decfsz......
  26. .....
  27. .........  
  28.             return

Hola! Me parece que quisiste poner algo así:

Código: ASM
  1. org         0x05h      comienza en la posición  005h de la memoria flash
  2.          goto        INICIO
  3.          .....
  4.          ........
  5.          ..
  6.           .
  7. INICIO
  8.           pagesel     retardo
  9.           call           retardo
  10.           PAGESEL   INICIO
  11.           BTFSS      registro,4
  12.           goto         INICIO
  13.           pagesel    banco3
  14.           call          banco3
  15.  
  16. ...
  17. ..
  18. ..
  19. ..
  20.            org      0x1000                ;0x0100 está en la misma página que el resto sino...
  21.  
  22. retardo
  23.            ;pagesel    retardo        carece de sentido. PCLATH ya contiene los valores adecuados porque acaba de ser llenado con los valores de este banco
  24.             nop
  25. retardo_loop
  26.            decfsz......
  27. .....
  28. .........  
  29.             return

Por ahi me equivoco pero creo que esta es tu idea.

Saludo.
Título: Re: Una manito por favor
Publicado por: marvicdigital en 17 de Mayo de 2009, 07:58:00
Si brunoF muchas gracias por tu corrección, aunque como en mi caso, a veces uso hasta 4 niveles de Stack, entonces es muy conveniente poner al inicio de una rutina el PAGESEL , claro si dentro de esa rutina hay otro llamado a una tabla, por ejemplo:

Código: ASM
  1. INICIO                                                        ;INICIO UBICADO EN EL BANCO 0
  2.                   ...
  3.                   ...
  4.                   PAGESEL   RUTINA_LLAMADA    
  5.                   CALL         RUTINA_LLAMADA
  6.                   PAGESEL   INICIO                     ;AL RETORNAR DEBEMOS INMEDIATAMENTE REDIRECCIONAR EL PCLATH          
  7.                   ....
  8.                   ....
  9.  
  10.  
  11.                   END
  12.  
  13.  
  14.  
  15. ;***************************************************************
  16. RUTINA_LLAMADA                                       ;ESTA RUTINA UBICADA EN EL BANCO 1
  17.                   PAGESEL   RUTINA_LLAMADA
  18.                   INCF          CARACTER
  19.                   CLRF          PORTB
  20. LOOP_CARACTER
  21.                   MOVF        CARACTER,W
  22.                   PAGESEL    TABLAS_CARACTERES
  23.                   CALL          TABLAS_CARACTERES                ;TABLA UBICADA EN EL BANCO 3
  24.                   MOVWF       CARACTER
  25.                   PAGESEL     RUTINA_LLAMADA
  26.                   MOVF          CARACTER,F
  27.                   BTFSC         STATUS,Z
  28.                   RETURN                                                      ;RETORNA AL PROGRAMA PRINCIPAL BANCO 0
  29.                   MOVLW        0FFH
  30.                   XORWF       CARACTER,F                              ;PUEDE PASAR QUE EN ESTE PUNTO SE HAGA OTRA OPERACION
  31.                   GOTO          LOOP_CARACTER                      ; O UN LLAMADO A OTRA TABLA Y QUE HAGA QUE VOLVAMOS
  32.                                                                                     ;AL NICIO DE ESTA RUTINA DE AHI SE EXPLICA DE
  33.                                                                                     ;LA CONVENIENCIA DE PONER UN PAGESEL AL INICIO DE RUTINA
   

Ojala me halla hecho entender bien, sobre lo bueno que es poner un PAGESEL al inicio de una rutina, para evitar dolores de cabeza.

Saludos y mil gracias BrunoF y a todo el foro   lo que he aprendido en estos días no lo había hecho en años                                     
Título: Re: Una manito por favor
Publicado por: BrunoF en 17 de Mayo de 2009, 13:37:35
Claro, pero fijate que en este caso también, la directiva PAGESEL RUTINA_LLAMADA no es estrictamente necesaria. Te lo puse en mi post anterior donde te comenté la linea PAGESEL retardo.

Un saludo!
Título: Re: Una manito por favor
Publicado por: marvicdigital en 27 de Mayo de 2009, 02:14:19
Bueno luego de varios días sin poder postear y de estar un poco ocupado, quiero compartir una rutina de I2C que estoy usando con este pasamensajes para leer la memoria 24LC256 y el DS1307 ambos en el mismo bus..gracias a todos por confirmar que funciona muy bien.
La rutina tiene varios llamados para hacer, están:

Configurar el I2C
Bit Start
Transmitir dato I2C
Recibir dato I2C y se guarda en I2Cdata
Bit Stop

Esta rutina es para el PIC16F877A, supongo que funciona para el resto de esa familia 873-874 y 876.  Espero les sea de mucha ayuda, parte de ese código lo tomé de muestra de otro que postearon en el foro, no recuerdo de donde lo tome por eso no pongo el enlace..de todas formas tiene algunas modificaciones propias.

Código: ASM
  1. CONFIG_TRANSMISION_I2C
  2.  
  3.         BSF              STATUS,RP0             ; SELECIONO LA PAGINA 1 DE LA MEMORIA
  4.         BSF              TRISC,4
  5.         BSF              TRISC,3
  6.         MOVLW    .2
  7.         MOVWF    SSPADD
  8.         BCF              STATUS,RP0             ;TRANSMISION SERA DE 333 KHZ
  9.          BCF             PIR1,SSPIF             ; SELECIONO LA PAGINA 0 DE LA MEMORIA
  10.         MOVLW     B'00101000'
  11.         MOVWF    SSPCON
  12.         RETURN                                  ; PERMITE LA CONFIGURACION SERIE DE LOS PINES SDA Y SCL.
  13.                
  14. BIT_START_I2C
  15.  
  16.         BSF             STATUS,RP0                      ;BANCO 1
  17.          BSF            SSPCON2,SEN
  18.         BCF             STATUS,RP0                      ;BANCO 0
  19. NO_START        BTFSS           PIR1,SSPIF
  20.         GOTO            NO_START
  21.         BCF             PIR1,SSPIF
  22.         RETURN
  23.  
  24. TRANSMITIR_DATO_I2C
  25.        
  26.         MOVWF    SSPBUF                                 ;CARGAR DATO EN BUFFER I2C
  27.         BSF             STATUS,RP0                      ;BANCO 1
  28.         BTFSS           SSPCON2,ACKSTAT         ;CHECKEAR ACK
  29.         GOTO            OKACK
  30.         BSF             SSPCON2,PEN                     ;ERROR ACK. ENVIAR STOP
  31.         BCF             STATUS,RP0                      ;BANCO 0
  32.         RETURN                                          ;VOLVER
  33. OKACK          
  34.         BCF             STATUS,RP0                      ;BANCO 0
  35. OKACK1          
  36.         BTFSS           PIR1,SSPIF                      ;ESPERAR FINALIZACION DEL NOVENO CLOCK
  37.         GOTO            OKACK1
  38.         BCF             PIR1,SSPIF
  39.         BSF             FLAGEE,0                        ;VOLVER CON FLAG = 1 OK!
  40.         RETURN                                  ;VOLVER CON FLAG= 0 ERROR
  41.        
  42.  
  43. RECIBIR_DATO_I2C
  44.  
  45.         CALL            I2C_IDLE  
  46.         BSF             STATUS,RP0                      ;BANCO 1  
  47.         BSF             SSPCON2,RCEN                    ;ACTIVAR MODO LECTURA
  48. RECI2C 
  49.         BTFSC      SSPCON2,RCEN                  ;TERMINO LA RECEPCION?
  50.         GOTO       RECI2C                                ;NO, ESPERAR
  51. RECI2C2        
  52.         BTFSS           SSPSTAT,BF                      ;DATO DISPONIBLE EN SSPBUF PARA SER LEIDOS?
  53.         GOTO            RECI2C2                                 ;NO, ESPERAR
  54.         BCF             STATUS,RP0                      ;BANCO 0
  55.         MOVF            SSPBUF,W
  56.         MOVWF    IC2DATA
  57.         RETURN
  58.  
  59. BIT_STOP_I2C
  60.         BSF             STATUS,RP0                      ; SELECIONO LA PAGINA 1 DE LA MEMORIA
  61.         BSF             SSPCON2,PEN
  62.         BCF             STATUS,RP0                     ; SELECIONO LA PAGINA 0 DE LA MEMORIA
  63.         RETURN                                         
  64. STOPI2C
  65.         BTFSS   PIR1,SSPIF
  66.         GOTO    STOPI2C
  67.         BCF             PIR1,SSPIF
  68. RESTART_I2C
  69.         BSF             STATUS,RP0
  70.         BSF             SSPCON2,RSEN
  71. RESTI2C
  72.         BTFSC   SSPCON2,RSEN
  73.         GOTO    RESTI2C
  74.         BCF             STATUS,RP0
  75.        
  76.  
  77.  
  78. I2C_IDLE
  79.         BSF                     STATUS,RP0                      ;BANCO 1
  80. IDLEI2C        
  81.         BTFSC           SSPSTAT,R_W
  82.         GOTO            IDLEI2C
  83. IDLE2  
  84.         MOVF            SSPCON2,W
  85.         ANDLW           0X1F
  86.         BTFSS           STATUS,Z
  87.         GOTO            IDLE2
  88.         BCF                     STATUS,RP0                      ;BANCO 0
  89.         RETURN

El orden para hacer el llamado de uno del dispositivo que tengamos en el bus sería asi:

Código: ASM
  1. CALL       CONFIG_TRANSMISION_I2C
  2. CALL       BIT_START_I2C
  3. MOVLW   DIRECCION_DISPOSITIVO             ;SI SE VA A ESCRIBIR O SE VA A LEER
  4. CALL       TRANSMITIR_DATO_I2C
  5. MOVLW   DIRECCION_INICIAL                    ;A DIRECCIÓN A LA QUE QUEREMOS ACCEDER
  6. CALL       TRANSMITIR_DATO_I2C
  7. CALL       BIT_STOP_I2C                              ;SI DECIDIMOS ACCEDER ALEATORIAMENTE A LA LECTURA
  8. CALL       BIT_START_I2C
  9. MOVLW   DIRECCION_DISPOSITIVO            ;MODO LECTURA
  10. CALL       TRANSMITIR_DATO_I2C
  11. CALL       RECIBIR_DATO_I2C
  12. MOVF      IC2DATA,W                                   ; EL DATO RECUPERADO QUEDA GRABADO EN  IC2DATA
  13.                                                                     ; Y EN W

Recuerden consultar el datasheet del dispositivo que quieran controlar por este puerto para saber su dirección, registros o memoria.

Saludos
Título: Re: Una manito por favor
Publicado por: Cryn en 27 de Mayo de 2009, 10:32:49
hola marvicdigital, que buenas rutinas, gracias

aprovechando que usas dos dispositivos I2C, cuando quieres leer la hora que dirección mandas? y para la memoria?

en la memoria se puede cambiar la dirección con los pines de A0 A1 A2??

saludos
Título: Re: Una manito por favor
Publicado por: marvicdigital en 27 de Mayo de 2009, 17:59:52
hola marvicdigital, que buenas rutinas, gracias

aprovechando que usas dos dispositivos I2C, cuando quieres leer la hora que dirección mandas? y para la memoria?

en la memoria se puede cambiar la dirección con los pines de A0 A1 A2??

saludos

Para la hora uso el DS1307 la dirección de este dispositivo es 0D0h para escritura y 0D1h para lectura..la memoria puse los tres pines a tierra por comodidad  :mrgreen:, ya el datasheet te dice con esa configuración que dirección le corresponde.

Saludos
Título: Re: Una manito por favor
Publicado por: Cryn en 27 de Mayo de 2009, 18:27:22
ok, muchas gracias tenía algunas dudas :mrgreen:
Título: Re: Una manito por favor
Publicado por: BrunoF en 27 de Mayo de 2009, 19:14:46
El protocolo I2C tiene asignados 7 bits para determinar la dirección con la que se quiere comunicar. El bit restante(el de menor peso) se utiliza para determinar si la petición es de escritura/lectura.

Muchos dispositivos comerciales, traen cierta parte de la dirección ya predeterminada, es decir, no configurable por el usuario.

Ejemplo:

Las memorias EEPROM 24LCXXX vienen con los 4 bits(más significativos) de su dirección ya definidos: '1010' y permite que selecciones mediante ciertos pines(A2,A1,A0) los 3 bits restantes de menor peso. Esto implica(y limita) que el máximo de 24LCXXX que podrías utilizar en un mísmo I2C es de 8.
El DS1307 probablemente, como corresponde a otro tipo de dispositivo distinto a las EEPROM utilice otro sub-grupo de direcciones(por lo que menciona marvic, utiliza el subgrupo 0xD contra el 0xA de las EEPROM). De esta manera(utilizando sub-grupos de dirección pre asignados) se reduce la cantidad de pines necesarios para determinar la dirección del dispositivo a la vez que se asignan distintos "subgrupos" según el tipo de dispositivo porque se cree que de esta manera se asegura que tu diseño permita compartir en un mísmo bus I2C diversos "tipos" de dispositivos sin tener que tener colisiones en la dirección de éstos.

Un saludo.
Un saludo




Título: Re: Una manito por favor
Publicado por: Cryn en 27 de Mayo de 2009, 20:29:59
gracias por la info Bruno.

y alguna vez habrá alguna casualidad que tengamos 2 dispositivos I2C con la misma dirección sin que podamos hacer nada??

en caso de necesitar más de 8 eeproms 24LC tendríamos que usar de otra familia más, supongo que si, no?

saludos
Título: Re: Una manito por favor
Publicado por: BrunoF en 27 de Mayo de 2009, 21:37:33
Claro que puede suceder. Por ejemplo, la dirección: 1101000X es la que usa el DS1307 y no hay forma de cambiarla(al menos que yo sepa). Esto implica que no podría haber más de un DS1307 en un mísmo bus I2C.

Creo que todas las EEPROM comparten el 0xA que las identifica...asi que lo veo poco probable, pero si hubiese otro tipo de memoria que te sirviese y tuviese otro ID podrías usarlas sin problema ;).

Fijate que las EEPROM dejan los 3 ultimos bits de su dirección libres para que el usuario pueda configurarlos y poder de este modo usar hasta 8 en un mísmo bus, pero el DS1307 no da ningun bit de libertad. Esto es como comente anteriormente, porque "por lógica" es probable que tu circuito use más de una EEPROM pero poco probable que más de un DS1307(RTC).

Salu2

Título: Re: Una manito por favor
Publicado por: Cryn en 28 de Mayo de 2009, 09:35:03
ok entendido Bruno, gracias nuevamente

ahora una consulta más, nose si busque mal por el hilo pero no encontré un rutina para el 4094 en ASM, si se puede me la mostrarían?

muchas gracias, un saludo
Título: Re: Una manito por favor
Publicado por: BrunoF en 28 de Mayo de 2009, 15:12:58
Ehh...No se si está en el hilo..

Pero, la programo en real time:

Código: ASM
  1. ;Envio de un byte. LSB a MSB. Recibe byte a enviar
  2. SEND_BYTE_4094_LSB_FIRST
  3.         mowf    TEMP
  4.         movlw   .8
  5.         movwf   CONT
  6.                        
  7. LOOP_LSB
  8.         rrf     TEMP,F
  9.         bcf     DATA
  10.         btfsc   STATUS,C
  11.         bsf     DATA
  12.  
  13.         bsf     CLOCK
  14.         bcf     CLOCK
  15.  
  16.         decfsz  CONT,F
  17.         goto    LOOP_LSB
  18.  
  19.         ;falta pulso strobe si queres efectivizar cambios
  20.  
  21.         return
  22.  
  23. ;Envio de un byte. MSB a LSB. Recibe byte a enviar
  24. SEND_BYTE_4094_MSB_FIRST
  25.         mowf    TEMP
  26.         movlw   .8
  27.         movwf   CONT
  28.                        
  29. LOOP_MSB
  30.         rlf     TEMP,F
  31.         bcf     DATA
  32.         btfsc   STATUS,C
  33.         bsf     DATA
  34.  
  35.         bsf     CLOCK
  36.         bcf     CLOCK
  37.  
  38.         decfsz  CONT,F
  39.         goto    LOOP_MSB
  40.  
  41.         ;falta pulso strobe si queres efectivizar cambios
  42.  
  43.         return
  44.  
  45.  
  46. ;Envio de un bit por columna.
  47. ;Recorre indirectamente el buffer de columnas
  48. ;Recibe mascara a aplicar(fila actual)
  49. ;Ej. 0x01 para fila 1, 0x02 para fila 2, 0x04 para fila 3...
  50.  
  51. SEND_BIT_PER_COL
  52.         movwf   MASC
  53.  
  54.         movlw   COL1
  55.         movwf   FSR
  56.  
  57. LOOP_BPC
  58.         bcf     DATA
  59.         movf    INDF,
  60.         andwf   MASC,W
  61.         btfss   STATUS,Z       
  62.         bsf     DATA
  63.  
  64.         bsf     CLOCK
  65.         bcf     CLOCK
  66.  
  67.         incf    FSR,F
  68.         movf    FSR,W
  69.         xorlw   COL80+1 ;o la direccion RAM de la ultima columna
  70.                         ;(cuidado si dir COL80==0xFF)
  71.         btfss   STATUS,Z
  72.         goto    LOOP_BCP
  73.        
  74.         bsf     STROBE
  75.         bcf     STROBE
  76.         return
Título: Re: Una manito por favor
Publicado por: Cryn en 29 de Mayo de 2009, 13:30:10
listo Bruno, como anillo al dedo, muchas gracias :-/ :-/
Título: Re: Una manito por favor
Publicado por: marvicdigital en 29 de Mayo de 2009, 13:35:35
Ehh...No se si está en el hilo..

Pero, la programo en real time:

Código: ASM
  1. ;Envio de un byte. LSB a MSB. Recibe byte a enviar
  2. SEND_BYTE_4094_LSB_FIRST
  3.         mowf    TEMP
  4.         movlw   .8
  5.         movwf   CONT
  6.                        
  7. LOOP_LSB
  8.         rrf     TEMP,F
  9.         bcf     DATA
  10.         btfsc   STATUS,C
  11.         bsf     DATA
  12.  
  13.         bsf     CLOCK
  14.         bcf     CLOCK
  15.  
  16.         decfsz  CONT,F
  17.         goto    LOOP_LSB
  18.  
  19.         ;falta pulso strobe si queres efectivizar cambios
  20.  
  21.         return
  22.  
  23. ;Envio de un byte. MSB a LSB. Recibe byte a enviar
  24. SEND_BYTE_4094_MSB_FIRST
  25.         movwf   TEMP  ;estaba como mowf..
  26.         movlw   .8
  27.         movwf   CONT
  28.                        
  29. LOOP_MSB
  30.         rlf     TEMP,F
  31.         bcf     DATA
  32.         btfsc   STATUS,C
  33.         bsf     DATA
  34.  
  35.         bsf     CLOCK
  36.         bcf     CLOCK
  37.  
  38.         decfsz  CONT,F
  39.         goto    LOOP_MSB
  40.  
  41.         ;falta pulso strobe si queres efectivizar cambios
  42.  
  43.         return
  44.  
  45.  
  46. ;Envio de un bit por columna.
  47. ;Recorre indirectamente el buffer de columnas
  48. ;Recibe mascara a aplicar(fila actual)
  49. ;Ej. 0x01 para fila 1, 0x02 para fila 2, 0x04 para fila 3...
  50.  
  51. SEND_BIT_PER_COL
  52.         movwf   MASC
  53.  
  54.         movlw   COL1
  55.         movwf   FSR
  56.  
  57. LOOP_BPC
  58.         bcf     DATA
  59.         movf    INDF,
  60.         andwf   MASC,W
  61.         btfss   STATUS,Z       
  62.         bsf     DATA
  63.  
  64.         bsf     CLOCK
  65.         bcf     CLOCK
  66.  
  67.         incf    FSR,F
  68.         movf    FSR,W
  69.         xorlw   COL80+1 ;o la direccion RAM de la ultima columna
  70.                         ;(cuidado si dir COL80==0xFF)
  71.         btfss   STATUS,Z
  72.         goto    LOOP_BCP
  73.        
  74.         bsf     STROBE
  75.         bcf     STROBE
  76.         return

Había un pequeño error de tipografía....faltaba la v .. :mrgreen: Gracias BrunoF....ahora estoy un poco ocupado y no he podido terminar mi pasa mensajes con todas las de la ley ...apenas la termine y halla el tiempito para eso lo estaré mostrando por acá.

Saludos

Santo Dios,  había escrito Había con "v" ...ahhhhhhh perdón por el horror
Título: Re: Una manito por favor
Publicado por: Cryn en 29 de Mayo de 2009, 13:47:14
que v?
Título: Re: Una manito por favor
Publicado por: BrunoF en 29 de Mayo de 2009, 13:52:44
No sería raro que fallase alguna V. Ha comenzado a fallar la tecla física de mi teclado hace un mes y puede que me falte alguna...

Saludos.
Título: Re: Una manito por favor
Publicado por: Cryn en 29 de Mayo de 2009, 21:18:12
ok, ya vi que v :mrgreen:

en la línea de código 3.
Título: Re: Una manito por favor
Publicado por: MLO__ en 07 de Junio de 2009, 14:13:28
si, así lo hacía yo, colocando una letra por matriz.

Pero con la pequeña charla que me dio Bruno manejaré de otra manera los datos, para hacerlo con punteros, pues me ha convencido que es la mejor manera para poder lograr varios efectos y hacerlos de la manera más sencilla posible.

podrías usar entonces dos int32 y tu cartel llegará a 64 columnas :mrgreen: y al rotar el carrie excesivo pasa a la cola del otro byte y el carrie de ese byte al primero, pero Bruno te dirá que mejor guardes los datos por columnas uses un buffer y en estos ordenes de una manera diferente los datos recibidos, pues todos los últimos bits de los bytes de tu buffer serán la primera fila, del cartel, todos los bits6 serán la segunda y así sucesivamente hasta la 7ma u 8va fila. Todos los bits 7 los vas mandando de ocho en ocho a los registros y tienes los datos para cada fila. Los punteros te ayudarán a tener un desplazamineto y otros efectos más eficientemente según las experiencias de Bruno.

Ahora solo queda hacer algo de código, que personalmente estoy en eso, solo que dejo unos pequeños pendientes y me pongo a full a trabajar con esto.

Un saludo.

Hola.

Pues mejor he colocado un array para las filas ... ocupa menos espacio en RAM que definir los int32 y he seguido el consejo de Cryn para rotar el carry de un byte a otro.


Le puse otras chuladas con el reloj ... y va bien.

Gracias y saludos
Título: Re: Una manito por favor
Publicado por: Cryn en 07 de Junio de 2009, 20:02:17
se ve bien MLO__, que bueno que te haya servido mi tip :mrgreen:

pero coincido con Bruno, que la mejor manera es la que te describí previamente, si existe una descompensación en RAM creo que se compensa con las facilidades que te da manejarlo en cuanto a efectos se refiere.

Corrijo lo que dije anteriormente:
Citar
los vas mandando de ocho en ocho a los registros y tienes los datos para cada fila
a: Lo envías directamente del arreglo buffer y aprovechas el uso de una variable extra para encender las filas, en realidad haces una AND con 0b00000001 para la primera fila por ejemplo y ese mismo se usa para encender el transistor, no hace falta tener los datos de 8 en 8 bits, se lo envía directamente.

Un saludo
Título: Re: Una manito por favor
Publicado por: Suky en 14 de Junio de 2009, 18:48:19
Bueno, viendo los trabajos que han realizado Cryn, MLO_, marvidigital entre otros me dedique a diseñar un publik  :mrgreen: . Para el mensaje cree un buffer que contiene en cada elemento las columnas del mensaje (Siguiendo el consejo de BrunoF en este post) y un buffer que contiene la sección del mensaje a visualizar en el cartel de leds. Para manejar la visualización se utiliza una variable que funcionaria como puntero, que indica la posición de la primer columna ha visualizar. También le agregue la animación de un caballo galopando, esta fue la principal motivación de realizar el publik, aquí hay un video que encontré en youtube: Caballo Galopando (http://www.youtube.com/watch?v=_nNMDVDU4kE)
La animación se coloco después del mensaje, y con el uso de 3 buffer adicionales que tienen precargados  los frames se crea la escena de animación. Estos buffer se copian en el buffer del mensaje cada cierto tiempo para crear el efecto de animación.
Les muestro un video de la simulación:

Quiero seguir agregándoles cosas y hacerlo realidad  :roll:
Saludos!


Pd: Gracias MLO_ por la data del software para realizar el video!
Título: Re: Una manito por favor
Publicado por: Cryn en 14 de Junio de 2009, 19:02:56
Buen trabajo suky, te ha quedado muy bueno el caballo, y el tuyo si corre, no esta patinando :D

como hiciste el caballo? lo dibujaste tu a mano desde cero??
Título: Re: Una manito por favor
Publicado por: Suky en 14 de Junio de 2009, 19:06:42
Buen trabajo suky, te ha quedado muy bueno el caballo, y el tuyo si corre, no esta patinando :D

como hiciste el caballo? lo dibujaste tu a mano desde cero??
Jajajaja! Corre hasta por ahí nomas, en suelo de aceite!  :D
El caballo lo fui creando mirando el video detenidamente y mirando algunos gif de caballos animados.
Título: Re: Una manito por favor
Publicado por: Cryn en 14 de Junio de 2009, 19:28:33
ahora un peatoncito caminando jeje, hagamos semáforos peatonales :mrgreen:

te quedó muy bueno el caballo, cuantos datos usa?
Título: Re: Una manito por favor
Publicado por: Suky en 14 de Junio de 2009, 19:33:41
ahora un peatoncito caminando jeje, hagamos semáforos peatonales :mrgreen:

te quedó muy bueno el caballo, cuantos datos usa?
:D

Usa 3 buffer de 17 elementos, que los va reemplazando en el buffer del mensaje cada cierto tiempo.

Código: C
  1. char BufferA1[LargoBufferAnim]={0x04,0x06,0x37,0x5F,0x3E,0x5E,0x1C,0x1C,0x1C,0xBC,0x7C,0x78,0x38,0x08,0x10,0x20,0x00};  
  2. char BufferA2[LargoBufferAnim]={0x0C,0x86,0x47,0x2F,0x5E,0x1C,0x1C,0x1C,0x1C,0x9C,0x5C,0x3C,0x3C,0x3C,0xC4,0x08,0x10};
  3. char BufferA3[LargoBufferAnim]={0x0C,0x06,0x07,0x8F,0x5E,0x3C,0xFC,0x3C,0x1C,0x1C,0x1C,0xBC,0x7C,0x3C,0x64,0x44,0x88};
Título: Re: Una manito por favor
Publicado por: Cryn en 14 de Junio de 2009, 19:46:38
51 bytes el caballito, que comelón que es :D
Título: Re: Una manito por favor
Publicado por: MLO__ en 16 de Junio de 2009, 22:02:33
Muy chulo suky ... muy buena la animacion ...

La carga del texto es dinamica? o la tienes guardada en los bufers tambien?

Saludos
Título: Re: Una manito por favor
Publicado por: Suky en 16 de Junio de 2009, 23:04:08
Muy chulo suky ... muy buena la animacion ...

La carga del texto es dinamica? o la tienes guardada en los bufers tambien?

Saludos
No el mensaje es estático en un buffer, para lograr el efecto de desplazamiento solo utilizo una variable que actúa como puntero. Siguiendo los concejos de BrunoF  :mrgreen:
Título: Re: Una manito por favor
Publicado por: marvicdigital en 21 de Junio de 2009, 11:13:13
Valla trabajo el que te curraste Suky mis felicitaciones  :-/

Yo he dejado a un lado el proyecto, por culpa del poco tiempo   y que ahora estoy con lo de aprender los Freescale y el lenguaje C  :(..pero ya apenas aprenda bien C creo que reeditaré el codigo..
Tal y como tengo el proyecto está lo básico, osea la memoria 24LC256  un DS1307 y listo, sin efectos solo rotar hacia la izquierda... ni siquiera poder programar la memoria 24LC256 desde el PC por RS232 que es como tengo el circuito hecho, pero mi escaso tiempo me impide hacerme con el Visual Basic que es el que tengo instalado, de hecho tengo el VB6 y el VB2008..por eso quisiera pedirles a modo de descaro si tienen algún programita en VB de ejemplo que me permita grabar los códigos ascci en la Eeprom a través del RS232 del PC, algo como una ventana en donde pueda escribir el texto que deseo grabar en la 24LC256, y que cada caracter se valla por el RS232 al circuito y espere a que este le responda con un código por ejemplo un FFh y BAH para que envíe el siguiente caracter y así sucesivamente ..

De verdad espero me disculpen este atrevimiento, pero por el escaso tiempo y sobre todo por que eso de estar sacando la memoria del circuito, llevarla a un grabador entrar a un programa que me permita editar el hex y grabar, se me vuelve muy engorroso y paso de estar haciéndolo cada vez que quiero ver mensajes diferentes  :mrgreen:

Gracias de antemano

Saludos
Título: Re: Una manito por favor
Publicado por: MLO__ en 21 de Junio de 2009, 13:41:16
Hola marvic.

Yo hago eso por el hyperterminal ... conecto el publik y comienzo a cargar los mensajes directamente. No creo que alguien teclee a mas de 5mS pod letra no? jeje Para probar la grabacion de la memoria podrias hacerlo por ahi.

Saludos
Título: Re: Una manito por favor
Publicado por: jmcs87 en 21 de Junio de 2009, 20:24:59
Bueno, viendo los trabajos que han realizado Cryn, MLO_, marvidigital entre otros me dedique a diseñar un publik  :mrgreen: . Para el mensaje cree un buffer que contiene en cada elemento las columnas del mensaje (Siguiendo el consejo de BrunoF en este post) y un buffer que contiene la sección del mensaje a visualizar en el cartel de leds. Para manejar la visualización se utiliza una variable que funcionaria como puntero, que indica la posición de la primer columna ha visualizar. También le agregue la animación de un caballo galopando, esta fue la principal motivación de realizar el publik, aquí hay un video que encontré en youtube: Caballo Galopando (http://www.youtube.com/watch?v=_nNMDVDU4kE)
La animación se coloco después del mensaje, y con el uso de 3 buffer adicionales que tienen precargados  los frames se crea la escena de animación. Estos buffer se copian en el buffer del mensaje cada cierto tiempo para crear el efecto de animación.
Les muestro un video de la simulación:

Quiero seguir agregándoles cosas y hacerlo realidad  :roll:
Saludos!


Pd: Gracias MLO_ por la data del software para realizar el video!

que bueno que ya corra el caballito  :mrgreen: ....lo que pasa con el mio es que lo tengo atado para que no escape :D :D.

que bueno que mi trabajo haya servido para animar a otros a mejorarlo, aunque creo que el tuyo esta en C sin duda muy bueno.

Saludos
Título: Re: Una manito por favor
Publicado por: BrunoF en 24 de Junio de 2009, 22:16:30
Re coqueto el caballito...Yo voy a ver si logro hacer un video de la simulación del modelo que estoy haciendo ahora, pero no me da a basto la PC para simular y grabar a la vez...

Saludos.
Título: Re: Una manito por favor
Publicado por: Hormiga en 20 de Octubre de 2009, 02:48:29
Hola bruno necesito ayuda para realizar una matriz con movimiento o cualquiera del foro
gracias
Título: Re: Una manito por favor
Publicado por: Suky en 20 de Octubre de 2009, 11:16:08
Por favor Hormiga, lee el hilo, estudia el tema, saca tus conclusiones, realiza algo de código y te ayudaremos en lo que podamos.

Saludos!
Título: Re: Una manito por favor
Publicado por: Hormiga en 21 de Octubre de 2009, 03:27:51
Hola Suky ya me empape con lecturas del foro , pero ante todo quiero un consejo dime con q pic trabajo...... lo digo porq mi proyecto lo ejecutare con asm y creo q saldra un programa extenso  , hablo de memoria porq como quiero instalarle un teclado para digitar lo q quiero desplegar entonces me imagino q tendre q almacenar la mayoria de carateres del teclado en la memoria del pic para despues inyectarlo al bufer.

En alguno foros hablan del 16f648a ya q tienes harta memoria , bueno lo principal es  q por favor me guíes con lo de trabajar con teclado conectado directo al pic .

será q me alcanzara los pines del 16f84a y la memoria , gracias parce y disculpe la molestía.

Mavc
Título: Re: Una manito por favor
Publicado por: Suky en 21 de Octubre de 2009, 11:12:09
No con el 16F84A vas a quedar corto en requerimientos, creo que un 16F648A va a estar bien, sino tienes los 16F873 o 16F883 con más pines. Aquí (http://www.todopic.com.ar/foros/index.php?topic=24517.0) puedes leer algo respecto a comunicación con teclado AT en asm.


Saludos!
Título: Re: Una manito por favor
Publicado por: MLO__ en 21 de Octubre de 2009, 14:59:49
Bueno, si la vaina es de memoria, psss nada, seria mejor un 18F no? son baratos tambien, por ejemplo el 18F2550 no cuesta tanto y tiene muy buena memoria.

Saludos
Título: Re: Una manito por favor
Publicado por: Hormiga en 22 de Octubre de 2009, 02:43:33
Hola para todos estuve leyendo y quiero desarrollar una matriz de 7x80 , estuve mirando y llegue a la conclusión de refrescar las filas por el corto tiempo de barrido  , q  referencia de convertidores serie paralelo me recomienda para  colocar  la columna , por favor ayudanme?. Para el diseño de la etapa de potencia de la matriz colocare tip 120 (darlington) en la filas y creo q no es necesario de colcoarle uln 2003 a las columnas ya q enciendes de un leds .

en la parte de la programación  , entiendo muy bien q debo almacenar en la EEprom los valores hexagecimales a cargar en los conversores serie/ paralelo y depues rotar las filas y sacar datos  y  también sacar datos columnas para desplegar la letra en la matriz , lo otro como no he defenido el convertidor serie paralelo entonces no se cual es el manejo con el software .

Discupa por errores de ortografía o sintesis pero es q llegue cansado bueno mas tarde me conecto y estoy en espera de opiniones
 
Título: Re: Una manito por favor
Publicado por: MLO__ en 22 de Octubre de 2009, 03:08:47
Hola.

Pues puedes usar los 74HC164. Una pregunta: de donde eres (de que parte de colombia)?
Título: Re: Una manito por favor
Publicado por: mauriciocartagena en 29 de Noviembre de 2009, 01:48:10
Hola a todos, queria pedirles a todos un favor grande, yo tambien quiero hacerme un pasa mensajes mi idea es hacer uno de 8x32 para un inicio (y para luego hacer con memorias y con una pc y todas esas cosas pero primero lo primero jejeje) he estado leyendo en varias paginas algo de informacion y algunos criterios y la verdad todavia no me queda claro como comenzar y me gustaria que me puedan guiar de la misma manera que como lo hicieron con marvicdigital, y perdirle a marvicdigital si me puede facilitar sus PDFs (si no es mucho pedir no? jejeje) de los que habla en el foro para poder estudiarlos haber si logro tener un criteri para comenzar.

bueno de antemano les agradezco la ayuda y espero sus respuestas.
ah me olvidaba, claro que estoy siguiendo la teoria publicada en el foro sobr el tema pero la verdad hay cosa que no entiendo :( :( :( :(.

saludos a todos!!!!!!!!
Título: Re: Una manito por favor
Publicado por: mauriciocartagena en 29 de Noviembre de 2009, 02:55:21
El prototipo de la matriz ya lo tengo montado ahi les adjunto la imagen del circuito (las filas son los cátodos y las columnas ánodos ), en la parte de control primera mente pese hacerlo con un PIC16F628A pero si no es suficiente tengo disponibles a la mano otros modelos (como el PIC16F876A y el PIC16F877A) bueno creo que eso no es problema esa parte lo tengo armado en una placa de prueba y se cambia, para que los leds no tengan muchos problemas con las corrientes les coloque un transistor de tipo PNP a cada fila (2N3906 si este no es suficiente no es problema lo cambio) y para el control de las columnas estoy utilizando registro de desplazamiento (en micaso el 74HC164 eso por que segun la informacion que cosegui es el que mas usan) ahora nose si en las columnas secesito algun buffer si es asi no es problema  eso se aumenta creo que eso solo afecta en el brillo de los leds como el prototipo de la matriz ya lo tengo montado lo importate es el disenar el firmware y por ahi comiensan mis problemas.

Bueno en la parte de firmware (lo estoy trabajando en ASM) ya tengo definido el metodo (el barrido es por filas por que en mi caso las filas son 8 ) en cuanto a las letras a mostra las quiero hacer en un tamano de 8x8 eso por lo que esto por que vi que se pueden hacer una variedad de tipos de letra en esas dimenciones (bueno eso segun lo que entendi, si existe algunas sugerencias mucho mejor estoy sugeto a recivirlas, la idea es hacer las cosas bien en todo sentido), bueno hasta aqui creo yo que voy bien si no es así porfavor me corrijen ok? ;-).

Bueno continuando, como estoy usando los registros 74HC164 (siendo un registro de entrada serie y salida paralela) ya tengo una rutina de transmision serie con su respectivo clock pero es para datos de 8 bits y en micaso nesecito una de 32 bits por ese lado estoy trabajando en esa parte modificando la rutina para que trabaje con datos de 32 bist.

Hasta el momento he podido dibujar las letras en el prototipo de la mtriz pero en un segmento 8x8 es por eso que la rutina de transmision maneja datos de 8 bits (eso lo logre con todo el abcdario), pero solo es una  a la vez  para cambiar de letra tengo que modificar la tabla y es estatico y en esa parte estoy estancado, lo que no me sale es introducir varias letras y dar le un efecto de desplazamiento.

Hasta aca creo que ya es mucho blablabla..... pienso yo que voy bien bueno eso creo si estoy mal en algo lespido me corrijan.

Espero su ayuda Gracias!!!!!
Título: Re: Una manito por favor
Publicado por: Suky en 29 de Noviembre de 2009, 10:18:58
Vas muy bien! Fíjate por aquí (http://www.ucontrol.com.ar/forosmf/programacion-en-asm/mis-primeros-programas-pic16f84a-y-pic16f628a/msg17048/#msg17048), es un ejemplo en asm que puede darte ideas de como realizar tus rutinas de envío y desplazamiento.


Saludos!
Título: Re: Una manito por favor
Publicado por: mauriciocartagena en 30 de Noviembre de 2009, 14:42:02
Hola Suky, musimas gracias por la informacion he estado analizando el codigo (todavia no termino) pero antes me dio la curiosidad de ver como funciona dicho codigo asi que me puse a realizar la simulacion y resulta que existe una distorcion en el mensage y supuse que es mi simulacion en el proteus que me imagino esta algo mal ya lo revise muchas veces pero no encuentro el error, seguramente es una tontera que no me doy cuenta, como tube que suponer muchas cosas al armar como por ejemplo la frecuencia 20Mhz por la declaracion _HS_OSC  en la palabra de configuracion asi mismo otras mas, te pido por favor que le des una checada a la simulacion para ver donde esta mi error por que no creo que sea el codigo  :mrgreen: .


adjunto la simulacion y el .hex

saludos!!! y espero tu respuesta.
Título: Re: Una manito por favor
Publicado por: Suky en 30 de Noviembre de 2009, 14:46:48
En la simulación es complicado verlo, mejor hacer el cartel en la realidad para ver eso con exactitud. Porque puede ser necesario reducir los tiempos de refresco para obtener mejor resultados. La distorsión ocurre por ejemplo si modificas el mensaje o la posición a actualizar sin antes terminado el cuadro, osea haber refrescado las 8 filas.


Saludos!
Título: Re: Una manito por favor
Publicado por: mauriciocartagena en 30 de Noviembre de 2009, 14:53:38
Muchas gracias, mi curiosidad tendar que esperar un poco jejejej pero antes terminare el analisis del codigo asi para poder hacerlo con un poco mas de criterio.
cual quier cosa te lo comunico por el foro ok?.

y nuevamente gracias.
Título: Re: Una manito por favor
Publicado por: mauriciocartagena en 14 de Diciembre de 2009, 22:50:18
Hola a todos, siento mucho haberme perdido por tanto tiempo lo que pasa es que comense a dar examenes asi que tenia responsabilidades que cumplir jejej, pero ya estoy de vuelta en el foro y pronto les comento como me fue ok? disculpenme si habia personas esperando respuestas mias ya pronto la tendan jejej.
Título: Re: Una manito por favor
Publicado por: AKENAFAB en 19 de Diciembre de 2009, 06:05:14
La verdad que te ha quedado "belisísima"!!!
Te felicito muchísimo. Y la verdad que ha sido un honor explicarte, porque has aprendido rápido y te has preocupado por entenderlo  y dedicarle tiempo..

Con respecto a la memoria, si estás usando codigo ASCII para almacenar los datos, sí, podés ir guardando caracter x caracter y luego ir leyendolos. Yo personalmente prefiero hacer un buffer más, para ir leyendo la memoria e ir volcando al buffer en el PIC, como para siempre tener datos rapido sin peligros de tener que esperar al I2C o algo.

Mi primer cartel tenía 2 buffers para visualizar, y un tercer buffer para ir leyendo y tomando los datos de la I2C.

He hecho un ejemplo para la 24LC256 acá en el foro. Buscalo en el almacen del assembler, o bien entrando a mi perfil y buscando los temas creados por mi(esta mal, dice mostrar los ultimos IR o algo asi)

Un saludo y felicitaciones!

Gracias BrunoF por tus palabras, me motivan más a seguir subiendo en conocimientos.
Y si, ya había leído el post donde está el ejemplo del I2C...ahora mi pregunta es , si en el mismo bus puedo poner el RTC y la memoria 24LC256, es que recuerdo haber leído qeu solo se podía poner una de estas en un bus, pero no se si se podrá conectar adicional con un DS1307...y de nuevo mil gracias por tus ejemplos y compartirlos con todos..

Y hablando de compartir, hice una tabla en excel  para crear  caracteres y otras cositas más en una matrix de 8x8, cuando seleccionas los puntos que formaran el caracter o el gráfico y le pones 1 para indicar que encienden y el solo te genera la cadena de hex para que se agregue a los RETLW o DT

por ejemplo:
 una copa de cocktail(se escribe así? )

(http://img.photobucket.com/albums/v672/marvicdigital/PStwo/imagen2.jpg)

(http://img.photobucket.com/albums/v672/marvicdigital/PStwo/imagen1.jpg)

Los hex que genera son de las columnas y la primera fila es el bit más bajo, si a alguien le interesa lo subo y si quieren que le agregue algo más me pueden decir y cuando tenga un tiempito lo hago y lo subo.

Saludos

Hola marvicdigital!

podrias compartir tu herramienta porfavor?

>_< esta muy pesado andar creando cada font  :oops:

Feliz navidad :x)!
Título: Re: Una manito por favor
Publicado por: MLO__ en 19 de Diciembre de 2009, 11:36:42
Hola.

Has probado el LCDFontMaker o el BitFontCreator? Normalmente los soft para creación de fuentes de GLCDs sirven también.

Saludos
Título: Re: Una manito por favor
Publicado por: AKENAFAB en 19 de Diciembre de 2009, 15:29:51


Gecias MLO!

NO he probado ninguno , los buscare!

gracias nuevamente!

saludos!
Título: Re: Una manito por favor
Publicado por: MLO__ en 19 de Diciembre de 2009, 23:57:08
Ok.

Cualquier cosa, me comentas  ;-)

Saludos
Título: Re: Una manito por favor
Publicado por: NEUROTRONICO en 23 de Diciembre de 2009, 01:10:28
que tal amigos del foro la verdad ustedes ya estan muy adelantados respecto al tema de las matrices yo apenas empeze a aprender a programar pero quisiera saber si me podrian ayudar con el algoritmo para leer datos del teclado..yo hize mi matriz de 8x8 y lo hize en asm con un atmega8 la verdad avr son los primeros micros que aprendi a programar (131 instrucciones) luego cuando me quize pasar al pic me costo y preferi quedarme con los atmegas
 

agradecere sus respues :mrgreen: :mrgreen: :mrgreen:
Título: Re: Una manito por favor
Publicado por: Suky en 23 de Diciembre de 2009, 04:33:46
Que tipo de teclado? De un PS/2 en asm revisa por aquí. (http://www.infopic.comlu.com) Te recomiendo que uses el buscador  ;-)



Saludos!
Título: Re: Una manito por favor
Publicado por: Hormiga en 21 de Julio de 2010, 19:50:30

Volvi después de un largo viaje, jejejiji, iniciar de nuevo desde el principio, para MLo soy de un Municipio de la casa del Vallenato, jejei y ud?

Quiero trabajar con matrices 5 filas x 7 columnas la refencia es CLM-1057BS por casualidad alguien tiene el circuito para conectarlo al pic,  lo otro estoy incorsionando en visul basic y trabajo con el compilador picbasic pro pero tengo es el DEMO y me limita a trabajar con 32 lineas de programa, por casualidad alguién sabe donde puedo descargar alguna versión donde no me limite las lineas  programación.

NOTA. Para el que quiera aprender a programar Visualbasic encontre un Libro interesante explica detalladamente y lo envío por correo

Gracias
Título: Re: Una manito por favor
Publicado por: gallo961 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.



Título: Re: Una manito por favor
Publicado por: gallo961 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.







Título: Re: Una manito por favor
Publicado por: Suky 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!
Título: Re: Una manito por favor
Publicado por: BrunoF 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.
Título: Re: Una manito por favor
Publicado por: hercules 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.