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

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

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Me ayudan a reducir UNA instruccion de este codigo?
« en: 12 de Abril de 2014, 20:18:22 »
Hola!
Estoy portando una libreria de Arduino a CCS, pero los tiempos son muy criticos y creo que debo utilizar assembler para no pasarme ni una instruccion.
La libreria es para controlar los famosos LEDs WS2812. Son unos LEDs RGB que unicamente necesitan un pin de datos para mostrar un color de 24bits. Se pueden conectar en serie al estilo "daisy chain" y formar tiras, permitiendo controlar mas de 600 LEDs RGB con un refresco de 50Hz, utilizando solo 1 pin del PIC.
Todo gracias a que CADA LED incluye un IC que decodifica la trama de datos recibida.
Esta trama de datos tiene unos tiempos muy especificos:
-Cada byte dura 10uS
-Cada bit dura 1.25uS
-Un bit CERO se representa con 0.25uS en high y 1uS en low
-Un bit UNO se representa con 0.875uS en high y 0.375uS en low

32Mhz de velocidad de micro es lo minimo que podemos usar para conseguir estos tiempos. Quizas algun experto se le ocurra como usar una velocidad menor, pero de momento no es necesario.
-Los 32Mhz nos dan 8MIPS que equivalen a instrucciones de 0.125uS
-Esto permite utilizar 10 ciclos de reloj para cada bit que enviamos.

El codigo assembler seria:
Código: ASM
  1. ;b -> es el byte que estamos enviando
  2. ;Contador -> cuenta cuantos bytes quedan por enviar
  3. ;bit7 ---
  4.    152  BSF PORTA, 0    ;A0 = true
  5.    153  BTFSS b, 0x7    ;salto si el bit7 de "b" es 1
  6.    154    BCF PORTA, 0  ;A0 = false
  7.    155  GOTO 0x156              ;nop nop
  8.    156  GOTO 0x157              ;nop nop
  9.    157  BCF PORTA, 0    ;A0 = false
  10.    158  GOTO 0x159              ;nop nop
  11. ;bit6 ---
  12.    159  BSF PORTA, 0
  13.    15A  BTFSS b, 0x6
  14.    15B    BCF PORTA, 0
  15.    15C  GOTO 0x15d
  16.    15D  GOTO 0x15e
  17.    15E  BCF PORTA, 0
  18.    15F  GOTO 0x160
  19. ;bit5 ---
  20.    160  BSF PORTA, 0
  21.    161  BTFSS b, 0x5
  22.    162    BCF PORTA, 0
  23.    163  GOTO 0x164
  24.    164  GOTO 0x165
  25.    165  BCF PORTA, 0
  26.    166  GOTO 0x167
  27. ;bit4 ---
  28.    167  BSF PORTA, 0
  29.    168  BTFSS b, 0x4
  30.    169    BCF PORTA, 0
  31.    16A  GOTO 0x16b
  32.    16B  GOTO 0x16c
  33.    16C  BCF PORTA, 0
  34.    16D  GOTO 0x16e
  35. ;bit3 ---
  36.    16E  BSF PORTA, 0
  37.    16F  BTFSS b, 0x3
  38.    170    BCF PORTA, 0
  39.    171  GOTO 0x172
  40.    172  GOTO 0x173
  41.    173  BCF PORTA, 0
  42.    174  GOTO 0x175
  43. ;bit2 ---
  44.    175  BSF PORTA, 0
  45.    176  BTFSS b, 0x2
  46.    177    BCF PORTA, 0
  47.    178  GOTO 0x179
  48.    179  GOTO 0x17a
  49.    17A  BCF PORTA, 0
  50.    17B  GOTO 0x17c
  51. ;bit1 ---
  52.    17C  BSF PORTA, 0
  53.    17D  BTFSS b, 0x1
  54.    17E    BCF PORTA, 0
  55.    17F  GOTO 0x180
  56.    180  GOTO 0x181
  57.    181  BCF PORTA, 0
  58.    182  GOTO 0x183
  59. ;bit0 ---
  60.    183  BSF PORTA, 0
  61.    184  BTFSS b, 0
  62.    185    BCF PORTA, 0
  63.    186  GOTO 0x187
  64.    187  GOTO 0x188
  65.    188  BCF PORTA, 0
  66.    189  DECFSZ Contador, F
  67.    18A  GOTO 0x152

El proceso de envio de bits es igual para todos, por lo que el codigo es basicamente el mismo, repetido 8 veces (una por cada bit). El problema esta en la linea 189 y 18A, al enviar el ultimo bit luego tengo que hacer un salto al inicio de la rutina para continuar enviando el siguiente byte. En ese ultimo bit que envio, utilizo 11 ciclos en vez de 10.
Algun experto podria recomendarme algun truquito para mantenerme dentro de los 10 ciclos necesarios?

Una vez haya podido solucionar esto, lo siguiente que me gustaria mejorar es que este codigo funciona siempre que "Contador" sea 1 byte, es decir, que no se envien mas de 255 bytes. Pero si Contador fueran 2 bytes/int16/long la instruccion DECFSZ no sirve directamente, sino que habria que hacer algo de magia con assembler de la que no tengo idea de como usar, y menos dentro de los tiempos estos tan apretados.

Eternamente agradecido al que me pueda echar una mano!  :mrgreen:
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 AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Me ayudan a reducir UNA instruccion de este codigo?
« Respuesta #1 en: 12 de Abril de 2014, 20:37:48 »
  ¿Probaste reemplazando el goto 187 de la línea 186 por un nop?

  De esa manera ahorras un ciclo en la línea 186 y lo utilizas en la 18A.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Me ayudan a reducir UNA instruccion de este codigo?
« Respuesta #2 en: 12 de Abril de 2014, 22:32:00 »
Hola,

con qué micro estás trabajando? Para saber qué instrucciones hay disponibles para usar. Lo que te dice AngelGris te va a servir para ahorrarte un ciclo. No veo que hayas contemplado cargar a la variable b con el próximo Byte a enviar dentro de los tiempos acotados.

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 Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Me ayudan a reducir UNA instruccion de este codigo?
« Respuesta #3 en: 13 de Abril de 2014, 02:06:21 »
Me suscribo al hilo. No conocía esos leds pero se ven la mar de interesantes.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: Me ayudan a reducir UNA instruccion de este codigo?
« Respuesta #4 en: 13 de Abril de 2014, 05:58:15 »
Gracias AngelCris, pero los momentos "clave" de cada bit, donde hay que cambiar de nivel el pin, son (contando de 0 a 9 los ciclos): el 0 que pone a high, el 2 que pone a low si el bit es 0, y el 7 que pone a low en todos los casos.
Se podria usar otra " logica", pero los momentos clave deben ser esos. Si cambiamos el goto por un nop reducimos una instruccion, pero cambiamos de lugar el cambio de nivel.

Bruno, estoy usando un enhanced mid range, que tienen las instruciones ampliadas. El 12F1840, 16F1823, etc.
Tienes razon! No inclui la carga de la variable b!!!
En CCS la realizo como b = *punt++;
Que punt es la direccion (puntero) donde tengo todos los valores "en fila" que tengo que enviar.
Y *punt es el valor contenido en dicha direccion.
HELP! Donde voy a realizar la carga de b? No hay espacio :(
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 #5 en: 13 de Abril de 2014, 12:39:33 »
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.


Por cierto, muy interesante esos leds, no sabia que existia algo asi.

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: Me ayudan a reducir UNA instruccion de este codigo?
« Respuesta #6 en: 13 de Abril de 2014, 13:58:49 »


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.


Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Me ayudan a reducir UNA instruccion de este codigo?
« Respuesta #7 en: 13 de Abril de 2014, 14:04:16 »
Entre Byte y Byte a enviar ¿cuanto tiempo disponés?

Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Me ayudan a reducir UNA instruccion de este codigo?
« Respuesta #8 en: 13 de Abril de 2014, 14:17:29 »
Citar
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.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Me ayudan a reducir UNA instruccion de este codigo?
« Respuesta #9 en: 13 de Abril de 2014, 14:35:21 »
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.

Saludos

Código: [Seleccionar]
; inicializa tus 3 bytes
movlw "dato0"
movwf byte0
movlw "dato1"
movwf byte1
movlw "dato2"
movwf byte2

; Antes de entrar, carga W con el primer byte, aquí aún no comienza el t a correr
movf byte0, w

; También antes de entrar carga una variable en 8, es el contador de cuántos bit ya mandamos por cada byte
movlw 8
movwf count0
movlw 8
movwf count1
movlw 8
movwf count2

; Aquí empieza el contador de t de 1.25us

BYTE0_Enviar:
;0 - 0ns
; Levanta el bit (siempre pasa)
bsf PORTA.0

;1 - 125ns
; Mantenlo otros 125ns
nop

;2 - 250ns
; Baja el bit si es que bit0 de W es un cero y escríbelo en PORTA.0
; Si no, se queda un 1 en PORTA.0
andwf PORTA.0, f

;3 - 375ns
; Rota el byte actual una vez a la derecha y guárdalo en byte0
rrf byte0, f

;4 - 500ns
; Mueve byte0 a W
movf byte0, w

;5 - 625ns
;
nop

;6 - 750ns
; Baja el bit PORTA.0, sin importar que haya habido en el puerto
bcf PORTA.0

;7 - 875ns
; Decrementa el contador y si ya es 0, entonces carga el siguiente byte
decfsz count0

;8 - 1000ns
; Si llega aquí, entonces seguimos en el byte actual, hay que ir al siguiente bit
goto BYTE0_Enviar

;9 - 1125ns
; Si llega aquí, es porque decfsz ya fue cero
movf byte1, w

; Rutina de byte1

...
« Última modificación: 13 de Abril de 2014, 14:40:30 por migsantiago »

Desconectado Darkman_A

  • PIC18
  • ****
  • Mensajes: 288
Re: Me ayudan a reducir UNA instruccion de este codigo?
« Respuesta #10 en: 13 de Abril de 2014, 14:55:12 »
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 )  :P 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  ...... :) :) :) :) :)
« Última modificación: 13 de Abril de 2014, 17:17:01 por Darkman_A »

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Me ayudan a reducir UNA instruccion de este codigo?
« Respuesta #11 en: 13 de Abril de 2014, 16:17:55 »
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.

Código: ASM
  1. ;Cargar valor de Contador (si Contador == 0 al ingresar, se enviarán 256 bytes!)
  2.         ;se puede hacer en Código C directamente      
  3.  
  4.         ;cargar dirección del inicio del array en registro FSR0
  5.         MOVLW   LOW     array[0]
  6.         MOVWF   FSR0L
  7.         MOVLW   HIGH array[0]
  8.         MOVWF   FSR0H
  9.        
  10.        ;envio de datos
  11. SENDDATA:
  12.         BSF             PORTA, 0        ;A0 = true
  13.         BTFSS   INDF0, 7        ;salto si el bit7 de "b" es 1
  14.         BCF             PORTA, 0        ;A0 = false
  15.         GOTO    $+1             ;nop nop
  16.         GOTO    $+1             ;nop nop
  17.         BCF             PORTA, 0        ;A0 = false
  18.         GOTO    $+1
  19.  
  20.         BSF             PORTA, 0        ;A0 = true
  21.         BTFSS   INDF0, 6        ;salto si el bit6 de "b" es 1
  22.         BCF             PORTA, 0        ;A0 = false
  23.         GOTO    $+1             ;nop nop
  24.         GOTO    $+1             ;nop nop
  25.         BCF             PORTA, 0        ;A0 = false
  26.         GOTO    $+1
  27.  
  28.         BSF             PORTA, 0        ;A0 = true
  29.         BTFSS   INDF0, 5        ;salto si el bit5 de "b" es 1
  30.         BCF             PORTA, 0        ;A0 = false
  31.         GOTO    $+1             ;nop nop
  32.         GOTO    $+1             ;nop nop
  33.         BCF             PORTA, 0        ;A0 = false
  34.         GOTO    $+1
  35.  
  36.         BSF             PORTA, 0        ;A0 = true
  37.         BTFSS   INDF0, 4        ;salto si el bit4 de "b" es 1
  38.         BCF             PORTA, 0        ;A0 = false
  39.         GOTO    $+1             ;nop nop
  40.         GOTO    $+1             ;nop nop
  41.         BCF             PORTA, 0        ;A0 = false
  42.         GOTO    $+1
  43.  
  44.         BSF             PORTA, 0        ;A0 = true
  45.         BTFSS   INDF0, 3        ;salto si el bit3 de "b" es 1
  46.         BCF             PORTA, 0        ;A0 = false
  47.         GOTO    $+1             ;nop nop
  48.         GOTO    $+1             ;nop nop
  49.         BCF             PORTA, 0        ;A0 = false
  50.         GOTO    $+1
  51.  
  52.         BSF             PORTA, 0        ;A0 = true
  53.         BTFSS   INDF0, 2        ;salto si el bit2 de "b" es 1
  54.         BCF             PORTA, 0        ;A0 = false
  55.         GOTO    $+1             ;nop nop
  56.         GOTO    $+1             ;nop nop
  57.         BCF             PORTA, 0        ;A0 = false
  58.         GOTO    $+1
  59.  
  60.         BSF             PORTA, 0        ;A0 = true
  61.         BTFSS   INDF0, 1        ;salto si el bit1 de "b" es 1
  62.         BCF             PORTA, 0        ;A0 = false
  63.         GOTO    $+1             ;nop nop
  64.         GOTO    $+1             ;nop nop
  65.         BCF             PORTA, 0        ;A0 = false
  66.         GOTO    $+1
  67.  
  68.         BSF     PORTA, 0        ;A0 = true
  69.         BTFSS   INDF0, 0        ;salto si el bit0 de "b" es 1
  70.         BCF     PORTA, 0        ;A0 = false
  71.         DECFSZ  Contador,F      ;decrementar contador de bytes enviados,si es cero, listo.
  72.         GOTO    $+2             ;nop nop
  73.         GOTO    DONE            ;todo enviado. Salir
  74.         ADDFSR  FSR0,1          ;incrementar puntero
  75.         BCF             PORTA, 0        ;A0 = false
  76.         GOTO    SENDDATA
  77.  
  78. DONE:
"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 Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Me ayudan a reducir UNA instruccion de este codigo?
« Respuesta #12 en: 14 de Abril de 2014, 01:47:44 »
Si como dice Merlinz funcionan bien por SPI, yo no le daría más vueltas.

Aquí hay alguien que también lo hace por SPI:
http://hypnocube.com/2013/12/design-and-implementation-of-serial-led-gadgets/

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: Me ayudan a reducir UNA instruccion de este codigo?
« Respuesta #13 en: 14 de Abril de 2014, 10:51:03 »
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.

Citar
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 )  :P 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  :mrgreen:
Muchas gracias a todos por los consejos!
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 planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: Me ayudan a reducir UNA instruccion de este codigo?
« Respuesta #14 en: 14 de Abril de 2014, 12:59:19 »

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!



Ojalá los hagan, de momento parece que solo están en 5050, algo grandes para calzarlos en uno de mis diseños.

Lo que si he visto, y ya lo he pedido a los chinos, además de unos cuando WS2811 y WS2812, son los LED con controlador WS2801, este va con 4 hilos, y al enviar la señal de reloj por separado, parece que son mucho más fáciles de controlar que los WS2811-WS2812, aunque el controlador no va integrado dentro del LED, pero lo venden en tiras y en placas redondas con 3, 4, 6 y 12 SMD 5050.


Suerte con el proyecto, ya he visto buscando por Google, algunos proyectos con AVR y los WS2812, y parece que terminan combinando ensamblador con C, para poder enviar los datos con la precisión que requiere ese controlador, sino no hay manera.


« Última modificación: 14 de Abril de 2014, 13:03:21 por planeta9999 »