Autor Tema: Me ayudan a reducir UNA instruccion de este codigo?  (Leído 8449 veces)

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

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Me ayudan a reducir UNA instruccion de este codigo?
« Respuesta #15 en: 14 de Abril de 2014, 13:19:12 »
Citar
Me gusta esta forma de pensar de ASM. La programacion en C y en ASM es muy diferente, y mi cerebro piensa en C, y esas cosas que dices tienen mucho sentido, pero no soy capaz de que se me ocurra algo asi a mi. jaja

Fijate que todos esos "goto" no hacen nada, en el primer bit que envias puedes decrementar "Contador" con esta instruccion "decf" sin comparar si es 0, ya que contador te cuenta bytes, da igual donde decrementes. despues en otro bit el segundo por ejemplo lo mueves a W haciendo un movf y chequeas STATUS,Z para saber si llego a 0, si STATUS,Z esta a 1 quiere decir que Contador es 0, lo apuntas en un "flag que te creas tu, para chequearlo en el ultimo bit que envias, cargar el siguiente byte a transmitir, lo haces en el ultimo bit a enviar, despues de chequear si es 1 o 0:

183   BSF PORTA, 061.   
184   BTFSS b, 062.   
185     BCF PORTA, 063.   
186   GOTO 0x18764.  ;aqui ya chequeaste el ultimo bit,   
187   GOTO 0x18865. 
 
188   BCF PORTA, 066.   
189   DECFSZ Contador, F67.   
18A   GOTO 0x152


183   BSF PORTA, 0 
184   BTFSS b, 062.   
185     BCF PORTA, 0   
186   movf   "siguiente byte"     ; en vez del goto
              movwf   b                        ;estas dos instrucciones ocupan loo mismos ciclos que "goto"
              btfsc     "FLAG"                 ;este flag lo tienes que traer mirado de antes, indicara si Contador" es 0 
              goto      "acabo transmision"   ;si viene aqui Contador=0, acaba trama de transmision

188   BCF PORTA, 066.   
18A   GOTO 0x152

Tal y como esta solo se iria un ciclo (0,125nS) en el ultimo bit del ultimo byte de la transmision.

Si me das un dia te lo hago entero, si quieres.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Me ayudan a reducir UNA instruccion de este codigo?
« Respuesta #16 en: 14 de Abril de 2014, 15:15:17 »
debes utilizar SPI por hardware no por software, por hardware nunca tendras error de tiempos puesto que es el propio CLK del procesador

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Me ayudan a reducir UNA instruccion de este codigo?
« Respuesta #17 en: 14 de Abril de 2014, 15:39:45 »
El link que ha publicado Nocturno es muy interesante. Lo he leído casi todo, y por lo que leí, no utilizan el SPI para este modelo de LEDs. Utilizan instrucciones de procesador e incluso emiten hasta 16 tramas de bits simultáneas para poder repartir las cascadas de LEDs. También se mencionan aspectos preocupantes cuando se intenta utilizar largas cascadas de LEDs. Parece que los tiempos recomendados no son los ideales cuando la cascada es muy grande.

En fin, los LEDs se ven muy interesantes.

El uso del SPI puede ahorrar algun tiempo del CPU, aunque requeriría de al menos @ 8Mbps por parte módulo SSP, y creo que se volvería especialmente útil si el módulo SSP del microcontrolador en cuestión tuviese una FIFO para poder cargar varios elementos a la vez y despreocuparnos del envío durante un tiempo. Caso contrario te la pasarás cargando el buffer de envío.

Algo interesante es que utilizaron el FT232H para sacar datos de la PC, que promete 12Mbps de transmición USB a serie, y parece que lo cumple a rajatabla, sin perder un sólo bit. A tener en cuenta para poder transmitir 1.5MBps desde la PC.

Saludos!
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: Me ayudan a reducir UNA instruccion de este codigo?
« Respuesta #18 en: 14 de Abril de 2014, 16:45:25 »
He leído el datasheet y todos los tiempos tienen un margen de +-150ns.

Uno lógico:   
    700ns alto +-150ns
    600ns bajo +-150ns

Cero lógico:
    350ns alto +-150ns
    800ns bajo +-150ns

Hay margen para meter una instrucción más o para quitar una instrucción.

Saludos.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: Me ayudan a reducir UNA instruccion de este codigo?
« Respuesta #19 en: 14 de Abril de 2014, 21:52:48 »
Lo he terminado!!!  :-/
Bueno, mejor dicho, he comenzado!
Ya tengo la base sobre la que trabajar para ir haciendo la libreria un poco mas completa.
A falta de medir tiempos con el analizador logico o el osciloscopio, el resultado es funcional:


Gracias tapi por el ofrecimiento, creo que ya esta solucionado esto.

Merlinz, si que use SPI por hardware, pero como dice Bruno, a falta de una FIFO de envio, me consumia todo el tiempo cargando valores al SPI y por eso debe ser que me daba tan malos tiempos.

Bruno, al final termine usando tu codigo pasado en gran parte a CCS, porque hay instrucciones que no las agarraba en ASM como el ADDFSR o el GOTO $+2, o el BRA 2.

Perdon Mig, me fue mas facil entender el codigo de Bruno y opte por ese. Aunque es verdad que tu codigo parece ocupar menos ROM. Deberia estudiarlo.

Picu, es verdad que los tiempos que muestra el datasheet no son exactamente como comente al principio, pero me base en una libreria para Arduino desarrollada por Adafruit. Ellos usaron estos tiempos, y su libreria la usan cientos o miles de personas sin queja. Asi que opte por imitar sus tiempos, que no se muy bien como llegaron a ellos, pero les funcionan :)

La libreria la colgue en el foro de C: http://www.todopic.com.ar/foros/index.php?topic=42622.0
El que programe en assembler y quiera probar estos leds, puede usar el codigo que propuso Bruno que es el que implemente en la libreria.

El problema que estoy teniendo es encontrar un bloque de memoria libre y consecutiva para manejar los leds.
En un PIC 12F1822 con 128 bytes de RAM solo pude manejar 10 LEDs (30 bytes) usando la funcion "malloc()" para encontrar bloques de memoria.
Tengo que investigar como "defragmentar" la memoria para tener un bloque consecutivo mas grande y aprovechar mejor la RAM.
Con Arduino pude manejar sin problemas una tira de 240 LEDs. Acaso Arduino va a ser mejor que un PIC?!!  :D

Gracias a todos por la ayuda y los consejos prestados!
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Me ayudan a reducir UNA instruccion de este codigo?
« Respuesta #20 en: 15 de Abril de 2014, 00:16:35 »
Hola Martyyn,

me alegro que el código funcione!

Un detalle: Ojo que hacer FSR0L++ no es igual a hacer ADDFSR FSR0,1

la instrucción ADDFSR incrementa el registro FSR0, considerándolo como un registro de 16 bits. Es decir que si desborda FSR0L, automáticamente incrementa FSR0H, cosa que FSR0L++ no hace.

Saludos!


"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: Me ayudan a reducir UNA instruccion de este codigo?
« Respuesta #21 en: 15 de Abril de 2014, 04:50:24 »
Gracias Bruno por el comentario. Eso ya lo tenia previsto. Pero por suerte el compilador lo traduce como ADDFSR FSR0, 1
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Me ayudan a reducir UNA instruccion de este codigo?
« Respuesta #22 en: 15 de Abril de 2014, 07:13:21 »
pasate a dspic y tendras SPI con DMA, imagina lo sencillo que te seria.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: Me ayudan a reducir UNA instruccion de este codigo?
« Respuesta #23 en: 15 de Abril de 2014, 07:17:37 »
 :D :D
Si, seguro, y ademas tendria RAM de sobra...
Pero por coste, tamaño y facilidad de uso quiero hacerlos funcionar con esto:


EDITO: me picaba la curiosidad, y encontre el PIC16F1788, que en formato QFN ocupa solo 6x6mm, y tiene 2K de ram, lo que es suficiente para manejar mas de 600 leds sin problema... :)
http://www.microchip.com/wwwproducts/Devices.aspx?product=PIC16F1788
« Última modificación: 15 de Abril de 2014, 07:36:18 por Marttyn »
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Me ayudan a reducir UNA instruccion de este codigo?
« Respuesta #24 en: 15 de Abril de 2014, 13:15:46 »
Citar
EDITO: me picaba la curiosidad, y encontre el PIC16F1788, que en formato QFN ocupa solo 6x6mm, y tiene 2K de ram, lo que es suficiente para manejar mas de 600 leds sin problema...

Vaya pepino de 16F, impresionante, 11 canales de ADC de 12bits, todavia no me llegan para algo que quiero hacer pero empieza a parecerse a lo que quiero, usando dos ya me llegaria, del resto me va sobrasidisimo de todo.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Me ayudan a reducir UNA instruccion de este codigo?
« Respuesta #25 en: 15 de Abril de 2014, 21:33:54 »
Hola Marttyn, a veces es mejor la legibilidad que la optimización. No te preocupes, un saludo!!  ;-)


 

anything