Te digo una forma mas sencilla que acabo de ver, por hardware. Usa el SPI, ponlo a 4Mhz y a volar, solo tendras que escribirlos sin utilizar el CLK.
Aquí hay alguien que también lo hace por SPI:
http://hypnocube.com/2013/12/design-and-implementation-of-serial-led-gadgets/
Gracias Merlinz y Noc, ya he probado con SPI y he obtenido los PEORES tiempos, ya que entre bit y bit transcurria una eternidad. Quizas por que lo estaba haciendo con CCS y no optimice el codigo, deberia probar nuevamente, ver como lo traduce a ASM y ver donde se puede optimizar.
Que conste que por SPI no estamos enviando los bytes, sino que cada byte enviado por SPI corresponde a un bit de datos de los 24 que debo enviar por cada led.
Muy chulos esos LED, no los conocía, me voy a pedir una tira a los chinos, para probarlos. Me planteo rediseñar algunos de mis circuitos que usan el TLC5940, con un sistema de barrido por filas-columnas, por esos led WS2812b, lástima que nos los hagan en tamaño 3528, aunque supongo que será imposible meter el controlador en un led tan pequeño.
Seguro que lo pueden hacer en 3528, el chip que tiene dentro es enano!
Entre Byte y Byte a enviar ¿cuanto tiempo disponés?
Entre byte y byte no hay tiempo, se envia todo seguido. Tampoco hay tiempo entre bit y bit. Si quieres enviar datos para 10 leds necesitas 30 bytes (3 bytes por cada led, uno para cada color). Que serian 240 bits a enviar. Todos seguidos.
Luego de haber enviado tu trama de datos tienes que esperar 50uS antes de enviar la siguiente.
HELP! Donde voy a realizar la carga de b? No hay espacio
Tienes que aprovechar todos esos "goto" para cargar "b" asi como para "decf Contador" y posiblemente apuntar en un "flag" si este llego a 0, de manera que en el ultimo bit, puedas chequear ese flag y saber con antelacion si tienes que seguir o no, incluso hacer el chequeo en el penultimo, y crear "dos ultimos envios" uno si no se acaba la transmision y otro si se acaba.
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
Hola Marttyn.
Dado que parece que estas corto de tiempo mi primera idea seria aumentaria los MIPS eliigiendo otro micro.
Es que estas muy jugado con los tiempos de las instrucciones. Como vos mismo indicas estas manejando tiemps de 2 instrucciones o 7 instrucciones. Estas muy jugasdo. Si resolves esto que consultas es probable que te "salte" otro problema en otro lado, como el que estas viendo de no darte los tiempos para cargar el valor a mostrar en los leds.
Antes de tener un ACV o un infarto es lo que yo haria ( cambiar el micro ) y si vale la pena luego, con mas tiempo, optimizaria el codigo. ¿Que opinas de un PIC 18F4550 a 48 Mhz?. (nombro este porque es el que tengo y estoy usando ........ )
Saludos.
Nota: Hoy es domingo.... vacio y "Postales del fin del mundo" Malbec- Syrah..... no me pidas que piense en assembler ......
Estoy intentando hacer una libreria, por lo que quiero intentar con 32Mhz para poder usarla con micros de la familia 12F o 16F. Luego que funcione con micros mas potentes no sera un problema
Podés utilizar un FSR para acceder a la memoria indirectamente. En este caso por los micros que me mencionaste no vale la pena pensar en que podés enviar más de 256 bytes, siendo que ninguno de los tiene siquiera más de 256 bytes de memoria RAM. Si llegás a necesitarlo, avisame y lo vemos.
Fantastico Bruno! Tengo que estudiar un poco el codigo con el datasheet en la mano para ver si lo entiendo bien
Ya he notado que solo disponemos de 256 bytes de RAM en los micros que te dije. En ellos no podre usar mas de unos 80 LEDs ya que no tendria suficiente memoria. Pero como decia antes, me gustaria hacer una libreria para poder usarla en varios PICs, por lo que seria interesante ampliarle el contador.
Qué tal Marttyn
Hice un código pequeño... hace tiempo que no tocaba asm, disculpa si se me va algo. Está hecho con base en un t de 1.25us y los tiempos on-off que mencionas.
La rutina que pongo deberás repetirla 3 veces... cambiando byte0 por byte1 y count0 por count1, sucesivamente. Esta rutina te ahorrará mas ROM que la que buscabas. No la repites bit por bit, más bien la repites byte por byte.
Por favor pruébala y me dices... yo la probé en SanSIM (jaja mi cuaderno) y parece que hace algo.
Mig, probare y estudiare tu codigo tambien. La verdad no se que funcionara mejor, si el tuyo o el de bruno. Buscare la forma mas optima para que consuma menos recursos. Me gustaria correr este codigo en micros pequeños.
Esta tarde hare pruebas con el Saleae a ver que tiempos obtengo, tanto con SPI como con el ASM de Bruno y Mig.
Seguro que todos funcionaran, lo tendre dificil para elegir
Muchas gracias a todos por los consejos!