TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Marttyn en 14 de Abril de 2014, 21:29:51

Título: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Marttyn en 14 de Abril de 2014, 21:29:51
Hola!
Os presento al WS2812, un LED RGB con driver integrado. Y al WS2811 un driver para LEDs RGB.
Datasheet: http://www.mikrocontroller.net/attachment/180459/WS2812B_preliminary.pdf
He tenido el placer de probar una tira de LEDs y jugar un poco usando Arduino. Realmente sencillo, pero no puedo evitar quererlo tambien para PICs, por lo que basandome en una libreria de Arduino desarrollada por Adafruit he decidido portarla a CCS.
Libreria de Adafruit: https://learn.adafruit.com/adafruit-neopixel-uberguide

Me referire siempre como "LED" que es lo que utilizare para pruebas, pero en realidad son lo mismo, ya que el WS2812 es un encapsulado de LED 5050 con el chip WS2811 integrado dentro del propio LED. Y el WS2811 es solo el IC, pero sin el LED.

Los LEDs se controlan con una señal de pulsos y no necesita señal de reloj.
Cada LED tiene un pin de entrada de datos, y otro de salida de datos. Los leds se conectan en cascada, es decir, la salida de uno con la entrada del siguiente. El primer LED utiliza el primer dato de la trama de datos, lo quita de la trama y reenvia los restantes, el siguiente led hace lo mismo, pilla el primer dato, lo quita y reenvia el resto. Asi no hace falta "direccionar" cada led, ya que es el propio led el que toma el dato que le corresponde.
Un unico pin del PIC puede controlar unos 1000 LEDs a 30Hz.

La forma de enviar los datos es la siguiente:
-Cada LED utiliza 3 bytes, cada byte nos dara 255 niveles de brillo para cada color, que combinados nos ofrecen colores de 24bits, es decir casi 17 millones de colores diferentes.
-Cada byte tiene 8 bits, por supuesto.
-Cada bit se envia como una combinacion de nivel alto + nivel bajo del pin que en total dura 1.25uS:
 * CERO = 0.4uS High + 0.85uS Low
 * UNO = 0.8uS High + 0.45uS Low
-El tiempo para enviar cada byte es de (1.25uS * 8) 10uS
-El tiempo para enviar el valor RGB completo por cada led es (10uS * 3) 30uS
-Entre bit y bit, o entre byte y byte NO HAY DEMORA. Luego de enviar el valor del primero se envia inmediatamente el siguiente.
-Cuando se ha enviado los datos de todos los LEDs hay que hacer una pausa de al menos 50uS para volver a enviar.

Cada LED es capaz de mantener el color que se le asigne, por lo que no hace falta estar constantemente enviando datos.

Dado los tiempos tan apretados la velocidad minima para controlar estos leds es un PIC a 32Mhz e instrucciones optimizadas y medidas en assembler. Gracias a la ayuda de muchos compañeros en el foro de assembler he podido terminar una libreria basica para controlar estos leds.

la libreria es esta: (ANTIGUO, descargar codigo para ultima version)
Código: C
  1. // ---- COMPROBACIONES DE COMPATIBILIDAD ----
  2. #IF getenv("VERSION")<5.019
  3.         //test realizado con compilador CCS v5.019
  4.         //para versiones anteriores comprobar que el codigo
  5.         //generado se adecua a los tiempos requeridos
  6.    #ERROR Compilador antiguo
  7. #ENDIF
  8.  
  9. #IF getenv("CLOCK") != 32000000
  10.         //necesitamos que el PIC corra a 32MHZ al menos
  11.         #ERROR Velocidad del PIC muy baja
  12. #ENDIF
  13.  
  14. #IFNDEF NUM_LEDS
  15.         #ERROR "NUM_LEDS" no definido
  16. #ELSE
  17.         #IF NUM_LEDS > 85
  18.                 //solo podemos usar un maximo de 85 leds.
  19.                 //Cada led usa 3 bytes, y nuestro contador de envio es un int
  20.                 #ERROR "NUM_LEDS" tiene que ser menor a 85
  21.         #ELIF NUM_LEDS*3 > getenv("RAM")
  22.                 #ERROR Tu PIC no tiene suficiente RAM para tantos LEDs
  23.         #ENDIF
  24. #ENDIF
  25. // ------------------------------------------
  26.  
  27. #include <stdlibm.h>
  28.  
  29. #byte INDF0 = getenv("SFR:INDF0")
  30. #byte FSR0L = getenv("SFR:FSR0L")
  31. #byte FSR0H = getenv("SFR:FSR0H")
  32.  
  33. #bit GIE = getenv("BIT:GIE")
  34.  
  35. int *pixels;            //puntero al la primera direccion donde se guardan los valores
  36. int brightness = 0;     //permite ajustar el brillo sin modificar el color
  37. int numLEDs = 0;        //cantidad de leds en la tira
  38. int numBytes = 0;       //numero de bytes usados
  39.  
  40. void ConfigPixels(int n){
  41. //n = numero de leds en la tira
  42.        
  43.         numLeds = n;                    //establece la cantidad de leds a usar
  44.         numBytes = n * 3;               //cantidad de bytes necesarios para manejar a todos los leds
  45.        
  46.         pixels = malloc(numBytes);      //crea espacio en memoria para los leds que vamos a usar
  47.        
  48.         if(pixels){
  49.                 memset(pixels, 0, numBytes);
  50.         }
  51. }
  52.  
  53. int NumPixels(void){
  54.         return numLeds;
  55. }
  56.  
  57. void SetPixelColor(int n, int r, int g, int b){
  58. //Set pixel color from separate R,G,B components:
  59.         if(n < numLEDs) {
  60.                 if(brightness) { // See notes in setBrightness()
  61.                         r = (r * brightness) >> 8;
  62.                         g = (g * brightness) >> 8;
  63.                         b = (b * brightness) >> 8;
  64.                 }
  65.                
  66.                 int * p = &pixels[n * 3];
  67.                
  68.                 *p++ = r;
  69.                 *p++ = g;
  70.                 *p = b;
  71.         }
  72. }
  73.  
  74. void SetPixelColor(int n, int32 c){
  75. //Set pixel color from 'packed' 32-bit RGB color:
  76.         if(n < numLEDs) {
  77.                 int r = (int)(c >> 16);
  78.                 int g = (int)(c >>  8);
  79.                 int b = (int)c;
  80.                
  81.                 if(brightness) { // See notes in setBrightness()
  82.                         r = (r * brightness) >> 8;
  83.                         g = (g * brightness) >> 8;
  84.                         b = (b * brightness) >> 8;
  85.                 }
  86.                
  87.                 int * p = &pixels[n * 3];
  88.                
  89.                 *p++ = r;
  90.                 *p++ = g;
  91.                 *p = b;
  92.         }
  93. }
  94.  
  95. int32 Color32(int r, int g, int b){
  96. //Convierte los colores separados R,G,B en un paquete de 32 bits con el color
  97.         return ((int32)r << 16) | ((int32)g <<  8) | b;
  98. }
  99.  
  100. int32 GetPixelColor(int n){
  101. //devuelve el color de un pixel que hayamos "coloreado" antes
  102. //en formato de 32bits y en order RGB
  103.         if(n < numLEDs) {
  104.                 long ofs = n * 3;
  105.                 return (int32)((pixels[ofs] << 16) | (pixels[ofs + 1] <<  8) | pixels[ofs + 2]);
  106.         }
  107.  
  108.   return 0; // Pixel # is out of bounds
  109. }
  110.  
  111. void SetBrightness(int b) {
  112. // Adjust output brightness; 0=darkest (off), 255=brightest.  This does
  113. // NOT immediately affect what's currently displayed on the LEDs.  The
  114. // next call to show() will refresh the LEDs at this level.  However,
  115. // this process is potentially "lossy," especially when increasing
  116. // brightness.  The tight timing in the WS2811/WS2812 code means there
  117. // aren't enough free cycles to perform this scaling on the fly as data
  118. // is issued.  So we make a pass through the existing color data in RAM
  119. // and scale it (subsequent graphics commands also work at this
  120. // brightness level).  If there's a significant step up in brightness,
  121. // the limited number of steps (quantization) in the old data will be
  122. // quite visible in the re-scaled version.  For a non-destructive
  123. // change, you'll need to re-render the full strip data.  C'est la vie.
  124.  
  125. // Stored brightness value is different than what's passed.
  126. // This simplifies the actual scaling math later, allowing a fast
  127. // 8x8-bit multiply and taking the MSB.  'brightness' is a uint8_t,
  128. // adding 1 here may (intentionally) roll over...so 0 = max brightness
  129. // (color values are interpreted literally; no scaling), 1 = min
  130. // brightness (off), 255 = just below max brightness.
  131.  
  132.         int newBrightness = b + 1;
  133.        
  134.         if(newBrightness != brightness) { // Compare against prior value
  135.                 // Brightness has changed -- re-scale existing data in RAM
  136.                 int c;
  137.                 int *ptr = pixels;
  138.                 int oldBrightness = brightness - 1; // De-wrap old brightness value
  139.                 long scale;
  140.                
  141.                 if(oldBrightness == 0)
  142.                         scale = 0; // Avoid /0
  143.                 else if
  144.                         (b == 255) scale = 65535 / oldBrightness;
  145.                 else
  146.                         scale = (((long)newBrightness << 8) - 1) / oldBrightness;
  147.                
  148.                 for(int i=0; i<numBytes; i++) {
  149.                         c      = *ptr;
  150.                         *ptr++ = (c * scale) >> 8;
  151.                 }
  152.                
  153.                 brightness = newBrightness;
  154.         }
  155. }
  156.  
  157. void ShowPixels(void){
  158. short GIEval;
  159. int i;          //loop
  160.  
  161.         GIEVal = GIE;   //guardo valor de global interrupt enable
  162.         GIE = 0;                //deshabilito interrupciones
  163.        
  164.         i = numBytes;   //numero de bytes a enviar
  165.  
  166.         //apunto FSR0 al inicio de mis bytes
  167.         FSR0L = pixels;
  168.         FSR0H = pixels >> 8;
  169.  
  170. //10 instrucciones por cada bit: HHxxxxxLLL
  171. //OUT instructions:              ^ ^    ^   (T=0,2,7)
  172.  
  173. SendByte:                                       //Clk   Instr
  174.         //bit7 ---
  175.         DAT = TRUE;                             //0             1
  176.         if(!bit_test(INDF0, 7)) //1             1
  177.                 DAT = FALSE;            //2             1
  178.         delay_cycles(4);                //3-6   4
  179.         DAT = FALSE;                    //7             1
  180.         delay_cycles(2);                //8-9   2
  181.        
  182.         //bit6 ---
  183.         DAT = TRUE;                             //0             1
  184.         if(!bit_test(INDF0, 6)) //1             1
  185.                 DAT = FALSE;            //2             1
  186.         delay_cycles(4);                //3-6   4
  187.         DAT = FALSE;                    //7             1
  188.         delay_cycles(2);                //8-9   2
  189.        
  190.         //bit5 ---
  191.         DAT = TRUE;                             //0             1
  192.         if(!bit_test(INDF0, 5)) //1             1
  193.                 DAT = FALSE;            //2             1
  194.         delay_cycles(4);                //3-6   4
  195.         DAT = FALSE;                    //7             1
  196.         delay_cycles(2);                //8-9   2
  197.        
  198.         //bit4 ---
  199.         DAT = TRUE;                             //0             1
  200.         if(!bit_test(INDF0, 4)) //1             1
  201.                 DAT = FALSE;            //2             1
  202.         delay_cycles(4);                //3-6   4
  203.         DAT = FALSE;                    //7             1
  204.         delay_cycles(2);                //8-9   2
  205.        
  206.         //bit3 ---
  207.         DAT = TRUE;                             //0             1
  208.         if(!bit_test(INDF0, 3)) //1             1
  209.                 DAT = FALSE;            //2             1
  210.         delay_cycles(4);                //3-6   4
  211.         DAT = FALSE;                    //7             1
  212.         delay_cycles(2);                //8-9   2
  213.        
  214.         //bit2 ---
  215.         DAT = TRUE;                             //0             1
  216.         if(!bit_test(INDF0, 2)) //1             1
  217.                 DAT = FALSE;            //2             1
  218.         delay_cycles(4);                //3-6   4
  219.         DAT = FALSE;                    //7             1
  220.         delay_cycles(2);                //8-9   2
  221.        
  222.         //bit1 ---
  223.         DAT = TRUE;                             //0             1
  224.         if(!bit_test(INDF0, 1)) //1             1
  225.                 DAT = FALSE;            //2             1
  226.         delay_cycles(4);                //3-6   4
  227.         DAT = FALSE;                    //7             1
  228.         delay_cycles(2);                //8-9   2
  229.        
  230.         //bit0 ---
  231.         DAT = TRUE;                             //0             1
  232.         if(!bit_test(INDF0, 0)) //1             1
  233.                 DAT = FALSE;            //2             1
  234. #asm
  235.         DECFSZ  i, F                    //3             1       decrementar contador de bytes enviados, si es cero salta 1 -> listo.
  236.         GOTO    Salto                   //4             1       salta 1 instruccion (no me deja usar GOTO $+2 ni BRA 2 ¿?)
  237.         GOTO    Listo                   //5             1       todo enviado. Salir
  238. #endasm
  239. Salto:
  240.         FSR0L++;                                //6             1       incremento puntero
  241.         DAT = FALSE;                    //7             1       PIN = LOW
  242.         goto SendByte;                  //8             2       vuelve al principio
  243.  
  244. Listo: 
  245.         DAT = FALSE;
  246.         delay_cycles(2);
  247.         // fin de transmision
  248.        
  249.         delay_us(50);           //espero 50uS para volver a enviar
  250.         GIE = GIEval;           //restauro valor de GIE
  251. }

Y un codigo de ejemplo es este (Ejemplo.c):
Código: C
  1. //------------------------------------------------------------------------------
  2. //                    TITULO PROYECTO
  3. //
  4. // Descripcion:
  5. //
  6. // PIC: 12F1822
  7. //
  8. //------------------------------------------------------------------------------
  9.  
  10. #include <12F1822.h>
  11. #device adc=8
  12.  
  13. #FUSES NOFCMEN          //NO fail safe clock monitor
  14. #FUSES NOIESO           //NO internal external switchover
  15. #FUSES NOBROWNOUT       //NO brownout reset
  16. #FUSES NOCPD            //NO eeprom protegido de lecturas
  17. #FUSES NOPROTECT        //NO codigo protegido de lecturas
  18. #FUSES NOMCLR           //NO mclr
  19. #FUSES PUT                      //power up timer
  20. #FUSES NOWDT            //NO watch dog timer
  21. #FUSES INTRC_IO         //oscilador interno, pines CLK como I/O
  22. #FUSES CLKOUT
  23.  
  24. #use delay(clock=32000000)
  25. #use fast_io(a)               //se accede al puerto a como memoria
  26.  
  27. //--- Constantes ---
  28. #byte PORTA     = getenv("SFR:PORTA")
  29.  
  30. #define TRIS_A  0b00111011      //define cuales son entradas y cuales salidas
  31. #bit DAT        = PORTA.2
  32.  
  33. #define NUM_LEDS        10
  34. //------------------
  35.  
  36. //--- Variables ---
  37.  
  38. //-----------------
  39.  
  40. //#use rs232(baud=9600, xmit=TX,rcv=RX)
  41.  
  42. #include "LED_Pixels.c"
  43.  
  44. void Rainbow(int wait);
  45. int32 Wheel(int WheelPos);
  46. // ---------------
  47.  
  48. void main(void) {
  49.        
  50.         setup_wdt(WDT_OFF);                                             //configuracion wdt
  51.         setup_timer_0(T0_INTERNAL|RTCC_DIV_1);  //configuracion timer0
  52.         setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); //configuracion timer1
  53.         setup_timer_2(T2_DISABLED,255,1);               //configuracion timer2
  54.         setup_dac(DAC_OFF);                                             //configura DAC
  55.         setup_adc(ADC_OFF);                                             //configura ADC
  56.         setup_ccp1(CCP_OFF);                                    //configura CCP
  57.         setup_spi(SPI_DISABLED);
  58.         //setup_uart(FALSE);                                    //configura UART
  59.         setup_comparator(NC_NC);                                //comparador apagado
  60.         setup_vref(VREF_OFF);                                   //no se usa voltaje de referencia
  61.        
  62.         setup_oscillator(OSC_8MHZ|OSC_PLL_ON);  //configura oscilador interno
  63.        
  64.         set_tris_a(TRIS_A);                                     //
  65.         ConfigPixels(NUM_LEDS);
  66.        
  67.         int i = 0;
  68.         int32 ColorTest = 0;
  69.        
  70.         do{
  71.           //Rainbow(50);
  72.  
  73.           for(i = 0; i<NUM_LEDS; i++){
  74.                   ColorTest = Wheel(i * (255 / NUM_LEDS));
  75.                   SetPixelColor(i, ColorTest);
  76.           }
  77.           ShowPixels();
  78.           delay_ms(50);
  79.         }while(true);
  80. }
  81. void Rainbow(int wait){
  82.         long i, j;
  83.  
  84.         for(j=0; j<256; j++){
  85.                 for(i=0; i<numPixels(); i++){
  86.                         SetPixelColor(i, Wheel((i+j) & 255));
  87.                 }
  88.                
  89.                 ShowPixels();
  90.                 delay_ms(wait);
  91.         }
  92. }
  93.  
  94. int32 Wheel(int WheelPos) {
  95. // Input a value 0 to 255 to get a color value.
  96. // The colours are a transition r - g - b - back to r.
  97.  
  98.         if(WheelPos < 85){
  99.                 return Color32(WheelPos * 3, 255 - WheelPos * 3, 0);
  100.         }else if(WheelPos < 170){
  101.         WheelPos -= 85;
  102.                 return Color32(255 - WheelPos * 3, 0, WheelPos * 3);
  103.         }else{
  104.         WheelPos -= 170;
  105.                 return Color32(0, WheelPos * 3, 255 - WheelPos * 3);
  106.         }
  107. }

Basicamente, lo que hay que hacer es cargar cada led con el color que queramos con la funcion SetPixelColor(NumLed, ColorFormato32bits).
Tambien podemos usar la funcion SetPixelColor(NumLed, Rojo, Verde, Azul).
Podemos cargar los colores con un bucle como se hace en el ejemplo.
Una vez cargados los colores hay que usar la funcion ShowPixels() para que se envien los datos. Mientras no se use esta funcion, solo estamos manipulando valores de memoria, pero no enviamos nada.
La libreria tiene mas funciones que copie de la libreria de Adafruit, pero que aun no he probado como SetBrightness(int Valor) que permite ajustar el brillo de todos nuestros leds, sin modificar el color.

El resultado es este:
(http://i299.photobucket.com/albums/mm317/Marttyn/Electronica/E0B4C55C-FA69-4C5E-BC7A-FF29BB81CC0E.jpg)

Aun quedan bastantes cosas por mejorar:
-Si bien parece funcionar correctamente, el mayor problema es la cantidad de LEDs que podemos manejar. Necesitamos 3 bytes de ram por cada led, y el total de bytes necesarios para todos los leds deber estar alojados consecutivamente en nuestra ram para poder acceder a ellos.
Para ello usamos la funcion malloc() que busca un bloque consecutivo de memoria ram del tamaño que necesitamos. Pero la memoria debe estar muy fragmentada, porque no consigo hacer funcionar mas de 10 leds. Eso quiere decir que no hay mas de 30 bytes libres y consecutivos en mi ram.
-En caso de que nuestro PIC tenga suficiente memoria ram, no podremos manejar mas de 85 leds (255 bytes de ram) porque nuestro contador de envio de bytes es de tipo INT y solo podra enviar hasta 256 antes de desbordarse.
-Solo funciona con un oscilador de 32Mhz. Las instrucciones estan contadas solo para este velocidad.

Las mejoras que vaya consiguiendo las ire publicando. Si alguien quiere ayudar a completar la libreria se agradece.
Reitero mi agradecimiento a los amigos del subforo de assembler, que sin ellos no habria podido enviar los datos en los tiempos requeridos.

EDITO:
Actualizacion de libreria a v0.2: Mejor manejo de la memoria, posibilidad de enviar datos a 800 o 400Khz, comprobada y bien comentada.
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: stk500 en 15 de Abril de 2014, 05:08:07
Bravo Mago!!  ((:-))
Marttyn te es posible poner un video funcionando?
si no es muchos pedirte.
Saludos
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Marttyn en 15 de Abril de 2014, 06:00:14
No problem, intentare solucionar lo del malloc() para que se vea con mas leds.
A ver si esta tarde subo algo.
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: MGLSOFT en 15 de Abril de 2014, 08:17:51
Excelente trabajo, Martiin !!
Felicitaciones !! ((:-)) ((:-)) ((:-))
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: rivale en 15 de Abril de 2014, 12:05:59
Bravo Mago!!  ((:-))
Marttyn te es posible poner un video funcionando?
si no es muchos pedirte.
Saludos

++;
 :mrgreen:

Felicidades Martiin, una muy buena opción para controlar varios leds con un pic de gama media mejorada.


Gracias por el aporte
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Marttyn en 15 de Abril de 2014, 20:24:03
Click en la imagen para ver un mini video:
(http://i299.photobucket.com/albums/mm317/Marttyn/Electronica/th_Viacutedeo15-04-14175548.jpg) (http://i299.photobucket.com/albums/mm317/Marttyn/Electronica/Viacutedeo15-04-14175548.mp4)

Ya he solucionado el problema de la memoria. Ahora he conseguido controlar hasta 28 leds (84 bytes) con un PIC 12F1822, que solo dispone de 128 bytes de RAM.
Con un 12F1840 consigo controlar unos 72 LEDs (216 bytes) con una RAM de 256 bytes.

Al principio la libreria funcionaba con punteros, y creaba en tiempo de ejecucion el espacio de memoria para los LEDs con "malloc()". Pero al tener la RAM fragmentada nunca encontraba un hueco suficientemente grande.
Ahora pase la libreria para que funcione con arrays. Que realmente es lo mismo que un puntero, pero el espacio de memoria se crea al compilar, por lo que el compilador se preocupa de ordenar la RAM para que quepa nuestro array.
Ademas, me libro de la libreria stdlibm.h necesaria para el malloc(). Dejando mas ROM y RAM libre.

He hecho pruebas con el analizador logico y los tiempos van bien.
Mañana subo la v0.2 de la libreria para que quede a disposicion del que la necesite.

Un abrazo!
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: rivale en 16 de Abril de 2014, 10:12:41
creo que lo que mas me gustó de esos leds es que no tienes que direccionar a que led enviar la señal y así controlas todo con solo una linea de transmisión de datos además es muy bonito el efecto que se logra con estos leds.

una pregunta :oops:, en cuanto sale una tira de leds como esa o donde puedo pedir una?
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: rivale en 16 de Abril de 2014, 12:49:17
ya los encontré, creo que el precio no aumenta mucho comparado con los rgb normales

http://www.seeedstudio.com/depot/WS2812-RGB-LED-with-Integrated-Driver-Chip-10-PCs-pack-p-1611.html (http://www.seeedstudio.com/depot/WS2812-RGB-LED-with-Integrated-Driver-Chip-10-PCs-pack-p-1611.html)

http://www.adafruit.com/products/1506 (http://www.adafruit.com/products/1506)
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Nocturno en 17 de Abril de 2014, 02:47:43
Está genial, Marttyn
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: AKENAFAB en 17 de Abril de 2014, 03:19:25
Te ha quedado muy bien MArttyn  ((:-)) ((:-))  :-/ :-/

Yo uso el ws2801 para LEDs mas grandes y va muy bien. Estan muy prácticos estos chips para encadenar n LEDs.

Saludos!
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Marttyn en 18 de Abril de 2014, 06:45:22
Estoy de vacas de semana santa, como me vea mi novia escribiendo con el movil me casca!
Las tiras de leds WS2812 cuestan unos 12USD por Aliexpress. Seguramente tambien haya en eBay.
Los leds sueltos no cuestan mas de 0.10 o 0.20USD por lo que resulta muy economico incluirlos en cualquier diseño.
Hay que tener cuidado porque se funden facilmente. Yo ya revente unos 10. Cuando deja de funcionar hay que reemplazar el primer led, o incluso el segundo tambien. La manera mas facil de joder un les en metiendo el analizador logico u osciloscopio a la señal de datos. Lo mejor es analizar los datos directamente del pic, con la tira de leds desconectada.

El lunes subo la libreria mejorada.
Salu2!
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: stk500 en 18 de Abril de 2014, 07:45:47
Sigue reventando mago  :D :D
broma aparte!!!!
pero me imagino que lo reventaste por culpa de mas Voltage permitido?
yo hace poco instale en casa de un amigo 500 Led blancos en Serie de grupos y sin resistencia limitadora, calcule´sus voltage claro ante y me hice una fuente Regulable de 50 Voltios 5Amp y hasta ahora va, eso si la fuente se calienta muchos y el consumos no llega a 4,8Amp . estamos pnsando de ponerle ventilador con resistencia termica para que no este el ventilador haciendo ruido todos el ratos.

Saludos y Felices Fiestas.
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Marttyn en 21 de Abril de 2014, 05:16:58
De vuelta por aqui.
Ya tengo la libreria "lista". Bien comentada y explicada para el que la necesite.
De momento SOLO funciona con micros a 32Mhz. Pero puede enviar datos a 800Khz o a 400Khz segun queramos.
En teoria podria funcionar para micros a 16Mhz y a 400Khz, pero hay que escribir el codigo. De ahi para arriba puede funcionar con cualquier micro. Pero hay que adaptar el codigo para ajustarse a los tiempos.

El codigo esta disponible para descargar en el primer post.
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Nocturno en 11 de Septiembre de 2014, 12:59:08
Complemento el hilo con una librería para controlar estos leds con DMA y SPI

http://hackaday.com/2014/09/10/driving-ws2812b-pixels-with-dma-based-spi/
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: jeremylf en 13 de Septiembre de 2014, 02:54:24
Genial! Ya había visto estos LEDs y estoy muy tentando de usarlos. Se agradece =)
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: migsantiago en 22 de Octubre de 2014, 17:15:38
Click en la imagen para ver un mini video:
(http://i299.photobucket.com/albums/mm317/Marttyn/Electronica/th_Viacutedeo15-04-14175548.jpg) (http://i299.photobucket.com/albums/mm317/Marttyn/Electronica/Viacutedeo15-04-14175548.mp4)

Marttyn, quedó muy bien el demo.

Por encargo del amigo Akenafab tengo que usar estos LEDs también. Usaré SPI como primera aproximación para tener al micro libre de esperas.

Una duda:

Hay que tener cuidado porque se funden facilmente. Yo ya revente unos 10. Cuando deja de funcionar hay que reemplazar el primer led, o incluso el segundo tambien. La manera mas facil de joder un les en metiendo el analizador logico u osciloscopio a la señal de datos. Lo mejor es analizar los datos directamente del pic, con la tira de leds desconectada.

¿Por qué se dañaron los LEDs? El conectar el osciloscopio debería ser casi limpio. El osciloscopio tiene 1M de impedancia y no debe afectar a la línea de datos de los LEDs.

Por favor comparte el por qué. Quisiera no tener problemas en el diseño.

Gracias.
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Marttyn en 11 de Noviembre de 2014, 16:31:36
Perdon! Tenia el email desactivado y no habia visto la respuesta.
No tengo idea de por que se quemaban los LEDs, pero era automatico: la tira funcionaba > le conectaba analizador logico/osciloscopio > la tira dejaba de funcionar....
Reemplazando el primer led vuelve a funcionar.
Es posible que la entrada de datos del LED sea muy sensible a cualquier variacion, pero desconozco...
Te recomiendo que busques la manera de tener uno o dos leds faciles de quitar y poner, como si fueran fusibles. En caso de dañarlos no tendras que andar soldando y dessoldando, sino simplemente quitando y poniendo uno nuevo.
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: migsantiago en 11 de Noviembre de 2014, 18:51:21
Hola Marttyn! No te preocupes... hemos estado cuidando nuestro diseño del circuito para asuntos como éste. Se me hace que tu osciloscopio tenía invertida la fase y el neutro o algo similar. Cuando medías pues dañaba al circuito, que seguramente es muy sensible como mencionas.

Es muy extraño. Ya colocamos una R en serie a la salida de nuestras señales. Apenas el amigo Akenafab está terminando de diseñar el layout de la PCB.

A ver si no quemo mis LEDs con mi osciloscopio jejej.

En mi primer propuesta se me había ido la onda y no me fijé en que los LEDs operan a 5V y pues nuestro PIC32 es 3V3. Fabrizio ya le puso un buffer para convertir los voltajes... seguro eso lo protegerá más.

Gracias por responder  :-/
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: migsantiago en 07 de Diciembre de 2014, 22:20:01
Hola, hoy estrené la matriz de LEDs 32x8 que consiguió el amigo Akenafab. Debo decir que en un ratito se murió un LED a media matriz y otros LEDs empezaban a prender y apagar solos. Están mal construidos ya que los presiono... y se ajusta el color que deben llevar.

La construcción de los WS2812B es algo barata, hay unos que tienen burbujas en su encapsulado, algunos de ellos son los que me han fallado. Si alguien piensa usar estos LEDs, que tenga varios de reserva por si las dudas.

Saludos.

PD Les dejo unos avances de la matriz... triste porque sólo me funciona hasta el LED que murió por la patria =(

Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: stk500 en 08 de Diciembre de 2014, 02:55:39
No eres el unico, tambien he leido en algunos foros que los Led no duran muchos aunque le ponga el voltage permitido, debo decir que es una mala producion, tambien he visto de algunos, pero claro son mas caros y mejor calidad, el vendedor da un codigo escrito en Bascom AVr y Assembler, puede buscar por Ebay, lo que no te recomiendo comprar eso baratos.
yo llevo casi mas de un comprando Leds por Ebay y experimentando con ellos, hasta ahora me he dados cuenta que los Led made in China (ojos Leds Baratos) son de mala calidad.
Recuerdo que compre a una empresa en Inglaterra Panel (100mm x 50mm) Led Super Bright White a 12 voltio, que normalmente los usan en los Autos, tampoco sirvieron, de Paneles, hasta ahora me va uno.
conclucion, Philips y Osran hasta hora son la mejores calidad, pero no son nada baratos. :?

Saludos
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Marttyn en 08 de Diciembre de 2014, 08:10:22
Felicidades Mig!
Es verdad que son muy fragiles, pero he llegado a controlar casi 1000 leds de estos sin problemas. Cuando que estan todos colocados en su sitio y no se tocan ni se mueven resisten bien. Eso si, las tiras que compre eran de Adafruit, y ellos venden el metro de tira por 25USD, cuando se puede conseguir por 10USD. No se si los que venden son mejores o simplemente le sacan mucho beneficio.
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: migsantiago en 08 de Diciembre de 2014, 19:32:17
Sí Rafa, que mala suerte que sean baratones... ojalá no fallen a medio show jeje. Los vamos a dejar funcionando un buen rato para que fallen los que tengan que fallar. En serio... a la tercer encendida de la matriz es cuando se murió un LED de en medio. Frustrante. :(

Gracias Marttyn. Tenemos una matriz como de tela, es flexible, y su soldadura está hecha a mano por el fabricante. Los LEDs son los que dejan mucho que desear... los presiono y prenden los colores que no prenden... o sea... si mando blanco, los LEDs con burbujas prenden azules; si lo presiono... prenden ya bien el rojo y verde. :(
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: stk500 en 09 de Diciembre de 2014, 03:47:11
Habria que saber que tipo de Led son y su propiedades para asi saber su maxima tension de trabajo. yo por lo regular no uso mis Led a su corriente maxima. Aconsejaria no usar su voltage maximo de los Led.
siempre dependiendo del fabricante.
ahora mismo estoy usando Led Super brillos
esta son sus Caracteristicas:
Código: [Seleccionar]
LED Colour Forward Voltage Vf Forward Current If
White 3.2 V to 3.8 V 20 mA to 30 mA
Warm White 3.2 V to 3.8 V 20 mA to 30 mA
Blue 3.2 V to 3.8 V 20 mA to 30 mA
Red 1.8 V to 2.2 V 20 mA to 30 mA
Green 3.2 V to 3.8 V 20 mA to 30 mA
Yellow 1.8 V to 2.2 V 20 mA to 30 mA
Orange 1.8 V to 2.2 V 20 mA to 30 mA
Pink 3.2 V to 3.8 V 20 mA to 30 mA
UV 3.2 V to 3.8 V 20 mA to 30 mA
.-------------------

he leido esto.
Código: [Seleccionar]
An array of 8 * 8 = 64 RGB LED requires a power supply with 64 * 60mA = 3,84A (5V / 20W). In these streams, the supply lines are to be interpreted carefully. The cooling is also not negligible. Each Led caused ~ 0.25W heat. osea que yo haria bien los calculo para no cargar los vatios maximo, yo lo usaria en 20 vatios.
la informacion la saque de
Aqui (http://www.elektronik-labor.de/AVR/WS2812.html)
Saludos

Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: migsantiago en 09 de Diciembre de 2014, 14:03:28
Es extraño porque su voltaje nominal es de 5V y mi fuente ya con la carga ronda los 5.03V. Son 256 LEDs consumiendo 60mA, dan 15.36A. La pura potencia jejej

Veré si puedo bajar la fuente a unos 4.5V... me convendría por calor (se calienta la matriz) y por vida útil de los LEDs.

Uso una fuente ATX que entrega 5V @ 30A... ¿cómo le reducirían ustedes el voltaje a 4.5V? Lo más tramposo que se me ocurrió es meterle un diodo galletudo, pero solo tengo de 1A.
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: elgarbe en 09 de Diciembre de 2014, 15:14:26
conclucion, Philips y Osran hasta hora son la mejores calidad, pero no son nada baratos. :?

Saludos


+1, usamos miles de led's al mes, generalmente 5050 white, 3528 rojo o ambar o blanco. Siepre compramos a un fabricante chino, pero directo al fabricante.
Los 5050 ya los hemos cambiado por los 3535 de philips, mas baratos y dan mas lm/w. Tambien hay unos 4014 que son terribles y a un precio igual o mejor que los chinos de calidad.

Lo que aún no está resuelto son los led de color. Los de marca son muy caros y los 3528 de mi proveedor no fallan (US42.00 x 1000unidades).

Eso si, los WS desde que leí el primer post que vengo diciendo que no confiaría ni loco para un producto final. A no ser que sea de un fabricante muy conocido. El hecho de que perdes uno y se pierden todos los demas es condicionante!

Saludos!
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: stk500 en 09 de Diciembre de 2014, 16:43:32
Es extraño porque su voltaje nominal es de 5V y mi fuente ya con la carga ronda los 5.03V. Son 256 LEDs consumiendo 60mA, dan 15.36A. La pura potencia jejej

Veré si puedo bajar la fuente a unos 4.5V... me convendría por calor (se calienta la matriz) y por vida útil de los LEDs.

Uso una fuente ATX que entrega 5V @ 30A... ¿cómo le reducirían ustedes el voltaje a 4.5V? Lo más tramposo que se me ocurrió es meterle un diodo galletudo, pero solo tengo de 1A.
eso veo en tu Foto, una Fuente ATX, por lo que yo no me confiaria, aparta una fuente ATX ya consume demasiado y si es de esa barata, te aconsejo que no la use, yo no creo que esos grupos Led que tu usa tengan un consumo de 15,36*5=76,8 Vatios.
lo que si he leido en alguna pagina Alemana de alguien que compro unos modulos a los chinos y cambios la Resistencia de 150 Ohm que van a cada modulo por 180, claro que no te daran mas brillos , pero con menos voltage y corriente no se te estropean los Leds.
yo no uso eso modulo, pero yo pondria una Fuente conmutada regulables, lo de Regular te lo puede hacer tu mismos con un pote ,Mosfet,
o un LM150  (http://www.datasheetdir.com/LM150+Linear-Voltage-Regulators).
Saludos
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Marttyn en 10 de Diciembre de 2014, 10:39:12
Los nuevos ya traen la resistencia interna, por lo que está todo integrado, sólo necesitan un condensador cerámico en la alimentación de cada uno. No podrás cambiarles las resistencias, aunque ser las pudieras cambiar sin 3 resistencias por LED, multiplicado por la cantidad de LEDs es una locura!
Lo que podrías hacer es bajar el brillo al 90%. La librería te lo permite.
Pero no creo que sea problema de alimentación.
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: AKENAFAB en 10 de Diciembre de 2014, 16:29:38
En el panel de LEDs que compre en adafruit tambien vienen unos pocos con burbujillas , supongo que al momento de la soldadura se jodieron.

Para evitarme problemas compre los LEDs directamente del fabricante
Código: [Seleccionar]
http://www.world-semi.com/ , por lo menos un carrete para pruebas.

Saludos!
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: migsantiago en 09 de Febrero de 2015, 21:37:32
Hola, hemos tenido algunos infortunios con el PIC32MZ que elegimos, pero poquito a poco estamos sacando esto jejej Este pequeño video lo tenemos animado por UART hasta que veamos cómo solucionar el problema de la SD card (http://www.todopic.com.ar/foros/index.php?topic=44054.msg364835#msg364835).

Los LEDs se han comportado muy bien. Akenafab los soldó con mucho cuidado y no se quemaron como los otros ni les salieron burbujas.  :mrgreen:

Saludos  :-/

Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Nocturno en 10 de Febrero de 2015, 02:18:29
Está chulísimo, Santiago. ¿Y reproduce vídeo en tiempo real?
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: migsantiago en 10 de Febrero de 2015, 15:36:33
Gracias  :mrgreen:

La idea es que vaya dibujando video desde la SD card. Por ahora eso está fallando. Le estoy mandando el video temporalmente por UART a 115200bps en lo que vemos cómo sacar video sin depender de la compu, ya sea de la SD o desde una memoria ROM paralela que no necesite SPI.

Ya después podríamos enviarle video en tiempo real pero habría que implementar algo como Ethernet o USB (en otro PIC que sí funcione) para soportarlo.  :)
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Marttyn en 24 de Febrero de 2015, 21:33:13
Estas usando la libreria que puse yo? O una propia/adaptacion?
Lo que he notado es que tiene cierto retardo estos leds, por lo sacar video en tiempo real es algo imposible.
Hace unos meses hicimos una pantalla de casi 800 leds de estos,  y mover un punto de color por cada uno de todos los leds podia llevar unos 18 segundos creo!
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: migsantiago en 24 de Febrero de 2015, 23:09:04
Hola Marttyn, es un código propio. Hasta ahora sólo hemos dibujado 274 LEDs a 30 cuadros por segundo. Se han comportado bien. En unos días tendremos la oportunidad de dibujar más, ya te contaré qué tal. Saludos.  :)
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Marttyn en 25 de Febrero de 2015, 13:52:09
Esa es una buena cantidad de LEDs, y con un refresco de 30 veces por segundo esta GENIAL!
Yo estaba planteandome armar un dispositivo POV con estos LEDs, pero lo descarte.
Podrias compartir de que manera envias los datos, o la libreria que usas para controlar los LEDs?
A que velocidad corre tu micro? Entiendo que el protocolo de comunicacion no se puede acelerar, aunque quizas lo que demora tanto el refresco son las operaciones que hago antes de enviar los datos...
Cuando maneje 800-1000 leds fue con un arduino mega, y notaba bastante demora.
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: migsantiago en 26 de Febrero de 2015, 21:25:28
Pues utilizo el SPI en modo enhanced a 12.5MHz en modo de 16 bits. Escribo los siguientes valores para denotar un 1 o un 0 lógicos...

/**
 * Logical 0 and logical 1 for the WS2812B LEDs with a 12.5MHz SPI
 */
#define SPI_BIT_0                       (0xF800)
#define SPI_BIT_1                       (0xFFC0)

El ancho de pulso se modula automáticamente con el SPI.

El modo enhanced te da oportunidad de guardar 8 palabras de 16 bits... lo que equivale a 8 bits en modo WS2812B... lo que equivale a mandar un byte WS2812B por cada enhanced buffer.

Trabajando con tal SPI y a tal velocidad, el ancho de cada bit en total mide 1.28us, que entran en los tiempos permitidos del WS2812B.

El truco está en no perder interrupciones y siempre tener los datos a la mano. Esto es posible con los 200MHz del PIC32MZ y con su fantástica memoria de 512kB en la que puedo almacenar buffers a modo ping-pong.

Actualmente nos faltan pruebas finales. La conversión de videos, GIFs e imágenes de cualquier tipo fue un dolor de cabeza... sobre todo por el que hay pixeles "muertos" en la matriz y por estar ordenando el dibujado de todos los pixeles en modo serpiente.

Toda la conversión la hago en C# y genero una imagen raw para la SD card, sin file system, para agilizar el despacho de pixeles muy rápidamente.

Cuando quede listo espero que Akenafab pueda compartirlo. Es para un cliente y debemos mantener la confidencialidad hasta cierto punto.  :mrgreen:
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Marttyn en 27 de Febrero de 2015, 09:06:13
Yo hice pruebas por SPI, y no consegui los resultados que esperaba. Estaba utilizando un PIC12F1840 con 32MHz internos. Pero midiendo con osciloscopio creo recordar que los tiempos de SPI eran mas amplios que lo que deberian ser. Quizas fue que no supe configurar bien el SPI y por eso los tiempos no se correspondian. Por otro lado, creo que ese pic no tenia buffer, y tenia que estar pendiente de escribirle el byte a enviar cada vez, lo que me hacia perder tiempo entre byte y byte. Y quizas era por esto que los tiempos eran mas largos de lo esperado :(

Como se carga el SPI sin perder tiempo entre byte y byte?

Concuerdo en que debes guardar confidencialidad sobre el proyecto de tu cliente, pero supongo que no tendra los derechos sobre la libreria de WS2812, no?  :mrgreen:
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: migsantiago en 27 de Febrero de 2015, 12:26:58
Como se carga el SPI sin perder tiempo entre byte y byte?

Concuerdo en que debes guardar confidencialidad sobre el proyecto de tu cliente, pero supongo que no tendra los derechos sobre la libreria de WS2812, no?  :mrgreen:

Los cargo en la interrupción del enhanced buffer. La activo cuando las 8 palabras del buffer ya se enviaron, y cuando ya puedo depositar otras 8 palabras nuevas.

Es que no hay librería como tal Marttyn, sólo es depositar los datos en el enhanced buffer como te menciono. El orden de los bytes y pixeles lo determina tu matriz.  ;-)

Le di un vistazo a la librería que publicas al principio y me doy cuenta de que le dejas mucha tarea de procesamiento al PIC... yo lo hice al revés... C# prepara los datos en RAW en la SD card y lo que lee el PIC es lo que manda... casi no le hace procesamiento, sólo se encarga de saber cuántos datos ya mandó.

El orden de los bytes es igual al que pide el WS2812B, GRB.

Se necesita un micro potente para esto, aún sin procesamiento, ya que el mover datos a tan alta velocidad es primordial.

Sería ideal usar DMA como un post en Hackaday, pero Harmony no compila DMA bien y pues por ahora estoy bien sin DMA.
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Marttyn en 27 de Febrero de 2015, 13:29:25
No me extraña... Acabo de ver que tu micro correa 200MHz!  :shock: Mi primer PC era de 200Mhz...
La primera vez lei 20 mhz, y por eso me estrañaba que funcionara tan bien, y el mio va a 32mhz fuera mal.

Tienes (tu o algun otro usuario del foro) experiencia con SPI?
Porque el problema que veo es que cada vez que cargo un dato a enviar pierdo tiempo. Los enhanced mid range, al menos los que yo uso (12F1840, 16f1824, etc) creo que hay que cargarle cada dato, UNO A UNO....

Lo que no entiendo es como no hay un buffer o algo, ya que si hay un hardware dedicado, pero hay que cargar los valores uno a uno, casi no tiene ventaja sobre hacerlo por software.

Creo que me estoy perdiendo algo, sino como lees o escribes una tarjeta SD? Hay que detener la transmision luego de enviar o recibir cada byte para leer o escribir en el registro de salida/entrada?
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: migsantiago en 27 de Febrero de 2015, 14:12:30
jejej Sí, son 200MHz, es rápido el condenado PIC  :5]

Sí, ya usé el SPI de este micro, y me resbalé, tropecé y corregí:

http://www.todopic.com.ar/foros/index.php?topic=44054.msg365076#msg365076

Sí, no te conté la maravilla de este micro, tiene 6 SPIs independientes. Sí... 6.

Entonces... con un SPI estoy leyendo la SD Card mientras que con los otros dibujo LEDs.

Dinos que PIC usaste y podemos ver que SPI tiene... veremos si es SPI viejito o si ya trae el enhanced mode con buffers integrados (FIFO).

Es importante notar que un byte WS2812B equivale a 8 palabras de 16 bits de SPI. El tiempo entre interrupción e interrupción de esos 8 bits WS2812B es de 10us... cosa que un PIC normal no puede manejar.

Saludos.
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: KILLERJC en 27 de Febrero de 2015, 14:37:22
Conseguite uno con QSPI y serias aun mas feliz :), las tasas de refresco se dispararian en x4 a comparacion de un SPI. Aunque seguiria siendo limitante el tema de la lectura SD , a no ser que exista una RAM externa (QSPI tambien)que se pueda pasar los datos ahi y de alli actualizar

Y si haces lo que dice mig de tener los datos RAW directamente en la SD, no deberia haber problema para crear la salida binaria con un programita de una PC.
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Marttyn en 27 de Febrero de 2015, 17:24:24
Dinos que PIC usaste y podemos ver que SPI tiene... veremos si es SPI viejito o si ya trae el enhanced mode con buffers integrados (FIFO).

Estuve usando un PIC12F1840. Con sus 32Mhz consigo que los tiempos vayan bien por sofware, incluso creo que con 8Mhz tambien iba si usaba el protocolo a 400KHz.
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: KILLERJC en 27 de Febrero de 2015, 17:51:33
Con 32Mhz el clock del SPI podria ir a un maximo de 3.3Mhz ( 3Mhz para estar seguro )

Tomando los limites:
Tcy = Fosc/4 =125ns
el tiempo en alto del clk ( Tcy + 20ns ) + tiempo en bajo ( Tcy + 20ns ), estariamos aproximadamente en 290ns siendo el limite. T = 300ns si contamos algo la subida y bajadas.

2.4us para enviar un byte completo + imagino que tendra un tiempo muerto entre esto de un ciclo

si tomo lo que migsantiago dijo sobre que son 8 palabras de 16bits o 16 de 8 bits. 16 * 2.4us = 38.4us

casi 4 veces mas de lo que migsantiago maneja... :/
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: migsantiago en 27 de Febrero de 2015, 22:19:39
Sí, con ese PIC no puede hacerse nada por SPI con los LEDs. No sabía que existiera el modo de 400kHz, supongo que sólo es para los WS2811.

Necesitas algo más rápido Marttyn.
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Marttyn en 28 de Febrero de 2015, 09:40:54
Me pico la curiosidad, y he visto que hay un loco por ahi que saca video a 30 frames por segundo con un arduino. Lleva los PWM a sus minimos y maximos, aprovechando que los WS2812 no son muy estrictos con el timing y parece que lo consigue. Ademas no utiliza 3 bytes de memoria por cada pixel, por lo visto lo genera al vuelo: http://wp.josh.com/2014/05/13/ws2812-neopixels-are-not-so-finicky-once-you-get-to-know-them/
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: KILLERJC en 28 de Febrero de 2015, 13:39:34
Me pico la curiosidad, y he visto que hay un loco por ahi que saca video a 30 frames por segundo con un arduino. Lleva los PWM a sus minimos y maximos, aprovechando que los WS2812 no son muy estrictos con el timing y parece que lo consigue. Ademas no utiliza 3 bytes de memoria por cada pixel, por lo visto lo genera al vuelo: http://wp.josh.com/2014/05/13/ws2812-neopixels-are-not-so-finicky-once-you-get-to-know-them/

utiliza delays, envia 3 bytes ( 1 por cada color ) y esta seria la clave de todo ( el envio del bit, que como mirando el codigo esta usando los valores "tipicos" y no minimos ):

Código: [Seleccionar]
void sendBit( bool bitVal ) {
 
    if ( bitVal ) {      // 1-bit
 
      bitSet( PIXEL_PORT , PIXEL_BIT );
 
      DELAY_CYCLES( NS_TO_CYCLES( T1H ) - 2 ); // 1-bit width less overhead for the actual bit setting
                                                     // Note that this delay could be longer and everything would still work
      bitClear( PIXEL_PORT , PIXEL_BIT );
 
      DELAY_CYCLES( NS_TO_CYCLES( T1L ) - 10 ); // 1-bit gap less the overhead of the loop
 
    } else {             // 0-bit
 
      cli();                                       // We need to protect this bit from being made wider by an interrupt
 
      bitSet( PIXEL_PORT , PIXEL_BIT );
 
      DELAY_CYCLES( NS_TO_CYCLES( T0H ) - 2 ); // 0-bit width less overhead
                                                    // **************************************************************************
                                                    // This line is really the only tight goldilocks timing in the whole program!
                                                    // **************************************************************************
      bitClear( PIXEL_PORT , PIXEL_BIT );
 
      sei();
 
      DELAY_CYCLES( NS_TO_CYCLES( T0L ) - 10 ); // 0-bit gap less overhead of the loop
 
    }
Otra diferencia esto:
Citar
the AVR in an Arduino can toggle a bit from low to high and back again in 4 cycles if you are careful, so we have time.

Habla de 16Mhz y con eso puede hacer que la señal suba y baje en 4 ciclos , cuando tiene que lograr 500ns donde estos serian 8 ciclos.
Mientras que si vamos a un PIC 16Mhz da un Tcy=250ns , solo hariamos la mitad. Mientras uno sube y baja 2 veces en el PIC solo lo hariamos 1 vez.

La diferencia entre lo que dice migsantiago es que en este codigo esta enviando 8 bits por cada color ( 3 bytes a cada led) que es lo justo y necesario. A mig tal ves se le triplica por el hecho de usar el SPI con un duty de 50% (no puede modificarlo ) haciendo que el 1 sean ( 2 unos y un 0) y el 0 ( 1 uno y 2 ceros ). Lo que dije antes es un supuesto ya que habria que ver los timing si dan.
El tema que esto te deja solamente dedicarte a eso para tener un ratio constante de actualizacion, mientras que con SPI te liberas muchisimo y se lo dejas unicamente al modulo. Podrias tranquilamente enviar mas rapido hasta que el led lo permita

Recien leo tu pregunta:

Citar
Como se carga el SPI sin perder tiempo entre byte y byte?

Y estuve viendo el PIC que nombraste y tiene un solo buffer para envio y recepcion, pero incluso el 16F887/16f628 poseen el buff separado, entonces vos cargas el buffer este se carga en otro registro que lo va dezplazando y ya te permite cargar otro dato mas sin perder tiempo entre bytes ( ya que tendrias uno en el buff + 1 en el registro de dezplazamiento )
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Marttyn en 28 de Febrero de 2015, 14:05:35
Sisi, no digo que use el modulo PWM, sino que genera un PWM por bitbanging, pero aprovecha las tiempos no tan estrictos para exprimirle velocidad.
Y no digo que sea mejor opcion que el SPI de Migsantiago, sino que probablemente (no lo probe) consiga mayor velocidad de envio que la libreria que colgue al principio, y esto se puede traducir en mas FPS.... quizas... o quizas no.... hay que probar.
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: cristian_elect en 11 de Mayo de 2015, 12:58:29
Hay una oferta de leds hasta mañana 5M 300 led $26.
http://es.aliexpress.com/item/1m-4m-5m-WS2812B-Smart-led-pixel-strip-Black-White-PCB-30-60-144-leds-m/32261917862.html?recommendVersion=1
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: cristian_elect en 16 de Junio de 2015, 23:59:58
Hay tengo los 5M de leds son 300 con un atmega8 funciona bien a 8MHz. A $28 los 300 leds y con silicon tube estén al tanto de la tienda de link que puse porque uno de estos días pone otra oferta.
Título: Re: Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: jhoncarlos en 29 de Junio de 2015, 14:20:50
hola!! como puedo trabajarlo en un pic16f88?
Título: Re:Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: cristian_elect en 06 de Noviembre de 2015, 13:49:33
Para este dia 11 del 11 la tira de 5 Metros de 300 leds ws2812b costara $25.92 como tubo de silicona, y hay descuentros extras asi que sale menos. Misma tienda de mi comentario anterior.
Título: Re:Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Marttyn en 09 de Noviembre de 2015, 13:13:51
5 metros, de 60 leds por metro a 25 USD es muy buena oferta!
Aunque estoy mirando y no veo que diga que vaya a costar eso.... mirare el 11/11 a ver...
Título: Re:Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: parametro51 en 14 de Febrero de 2016, 19:06:37
 :-/ Gracias por el link de la tienda  :-/ He hecho el pedido porque es donde más baratos los he encontrado y sigo muy de cerca este tema. Porque quiero hacer un proyecto interesante en una casa nueva que me ha comprado el banco (aun es suya, hasta que pague la hipoteca  :D ). Asi que os lloveré a preguntas porque estoy muy verde yo en esto, solo una preguntita para abrir boca, que os parece un 18f2550 a 20mhz y 2 tiras de 5m a 30leds/metro. ¿con esto me llega?, según la flash del micro si, pero ya eso de los tiempos me coge muy de sopetón. :lol:
Título: Re:Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: KILLERJC en 14 de Febrero de 2016, 19:41:14
El 18F2550 tiene PLL lo cual lo podrias hacer trabajar a 48Mhz, te dan los tiempos. Cada instruccion a 48Mhz son 83ns

Lo que si depende de que tan rapido quieras actualizar todos los leds... si son 2 tiras de 5m como decis entonces son 3600bits (por tira) con una media de 1.2us (aunque  hay un +- 600ns) cada bit, son 4.32ms para ( 230Hz  sin contar el tiempo de reset) actualizar toda la tira.
Si dividis esas tiras en mas partes podes usar mas pines. es decir suponete que ahora dividis las 2 tiras en 4 de 2.5m cada una. tendrias 1800 bits, lo cual te deja que se actualiza cada 2.16ms cada tira. Y los podes actualizar todos juntos si es que la libreria lo hace.

Título: Re:Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Axel en 01 de Diciembre de 2016, 04:17:01
Hola Marttyn, ¿crees que sea muy difícil adaptar la librería a un pic18f25k50 trabajando a 48Mhz (12 MIPS)? necesito trabajar a 48Mhz para poder usar el módulo USB, estoy usando una placa llamada Pololu P-Star.
saludos. :)
Título: Re:Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: KILLERJC en 01 de Diciembre de 2016, 07:07:28
Hola Marttyn, ¿crees que sea muy difícil adaptar la librería a un pic18f25k50 trabajando a 48Mhz (12 MIPS)? necesito trabajar a 48Mhz para poder usar el módulo USB, estoy usando una placa llamada Pololu P-Star.
saludos. :)

Leyendo el codigo:

 //necesitamos que el PIC corra a 32MHZ al menos

Es decir 32Mhz o mas
Título: Re:Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Marttyn en 01 de Diciembre de 2016, 10:07:49
Para usarlo a 48Mhz deberias modificar el envio de datos adecuando a la velocidad de tu micro.
Antes que nada, prueba sin hacer modificaciones. Si no me equivoco el LED detecta "porcentajes" de H/L y no tiempos. Asi que si corres a 48Mhz la trama se enviara mas rapido, pero los porcentajes de H/L seran los mismos.
Sino puedes tratar de modificar la libreria para que se adapte a tu velocidad, comparte si lo consigues para que tengamos una libreria mejor :)
Título: Re:Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Axel en 02 de Diciembre de 2016, 01:56:23
Hola Marttyn, ¿crees que sea muy difícil adaptar la librería a un pic18f25k50 trabajando a 48Mhz (12 MIPS)? necesito trabajar a 48Mhz para poder usar el módulo USB, estoy usando una placa llamada Pololu P-Star.
saludos. :)

Leyendo el codigo:

 //necesitamos que el PIC corra a 32MHZ al menos

Es decir 32Mhz o mas

Que tal, en la librería esta la siguiente porción de código:
Código: C
  1. #IF getenv("CLOCK") != 32000000
  2.         //Necesitamos que el PIC corra a 32MHZ
  3.         #ERROR La velocidad del PIC debe ser de 32Mhz
  4. #ENDIF

esto quiere decir que el pic debe estar fijo a 32 Mhz, y no "32 Mhz o más" :)

Para usarlo a 48Mhz deberias modificar el envio de datos adecuando a la velocidad de tu micro.
Antes que nada, prueba sin hacer modificaciones. Si no me equivoco el LED detecta "porcentajes" de H/L y no tiempos. Asi que si corres a 48Mhz la trama se enviara mas rapido, pero los porcentajes de H/L seran los mismos.
Sino puedes tratar de modificar la libreria para que se adapte a tu velocidad, comparte si lo consigues para que tengamos una libreria mejor :)

voy a probarla de esa manera a ver que tal y les cuento.

saludos.
Título: Re:Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: KILLERJC en 02 de Diciembre de 2016, 14:31:11
esto quiere decir que el pic debe estar fijo a 32 Mhz, y no "32 Mhz o más" :)

Lei la primera pagina, donde estaba el codigo, seguro que luego en el link para bajarlo ya dice solamente de 32Mhz, pero en la primer pagina el comentario decia tal y cual lo copie.
Por eso la confusion.

Aunque sabia que habia una nueva version, crei que no iba a cambiar eso.
Título: Re:Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Axel en 02 de Diciembre de 2016, 19:01:07
esto quiere decir que el pic debe estar fijo a 32 Mhz, y no "32 Mhz o más" :)

Lei la primera pagina, donde estaba el codigo, seguro que luego en el link para bajarlo ya dice solamente de 32Mhz, pero en la primer pagina el comentario decia tal y cual lo copie.
Por eso la confusion.

Aunque sabia que habia una nueva version, crei que no iba a cambiar eso.

si acabo de darme cuenta que en la versión 1 tiene esa leyenda jeje.

tengo un problema, todabía no lo pruebo a 48Mhz, por el momento estoy usando un pic a 32Mhz; pero la función "SetBrightness" mantiene los leds en OFF con valores de 0 a 254, pero con el valor de 255 funciona bien como si no usara la función SetBrightness (brillo por default) ¿estaré haciendo algo mal? les dejo mi código: (linea 29 SetBrightness )

Código: C
  1. #include "HEADER_4620.h" //32Mhz
  2. #use fast_io(a)               //se accede al puerto a como memoria
  3. #byte PORTD     = getenv("SFR:PORTD")
  4. #define TRIS_D  0b11111110      //define cuales son entradas y cuales salidas
  5. #bit PIX_PIN        = PORTD.0
  6. #define NUM_LEDS        8
  7. #include "LED_Pixels_v0.2.c"
  8.  
  9. void Rainbow(int wait);
  10. int32 Wheel(int WheelPos);
  11.  
  12. void main(void) {
  13.         set_tris_d(TRIS_D);
  14.         output_d(0);
  15.         InitPixels();
  16.         while(1)
  17.       {
  18.         Rainbow(150);
  19.        }
  20. }
  21.  
  22. void Rainbow(int wait){
  23.         long i, j;
  24.  
  25.         for(j=0; j<256; j++){
  26.                 for(i=0; i<NUM_LEDS; i++){
  27.                         SetPixelColor(i, Wheel((i+j) & 255));
  28.                 }
  29.                 SetBrightness(255); //con valor de 0 hasta 254 no enciende el led, con 255 si enciende.
  30.                 ShowPixels();
  31.                 delay_ms(wait);
  32.         }
  33. }
  34.  
  35. int32 Wheel(int WheelPos) {
  36. // Input a value 0 to 255 to get a color value.
  37. // The colours are a transition r - g - b - back to r.
  38.  
  39.         if(WheelPos < 85){
  40.                 return Color32(WheelPos * 3, 255 - WheelPos * 3, 0);
  41.         }else if(WheelPos < 170){
  42.         WheelPos -= 85;
  43.                 return Color32(255 - WheelPos * 3, 0, WheelPos * 3);
  44.         }else{
  45.         WheelPos -= 170;
  46.                 return Color32(0, WheelPos * 3, 255 - WheelPos * 3);
  47.         }
  48. }
Título: Re:Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Marttyn en 03 de Diciembre de 2016, 06:34:53
Creo recordar que funcionaba bien.
Ahora no puedo hacer pruebas, pero si encuentras algun error en el codigo avisa para modificarlo.
Título: Re:Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Axel en 03 de Diciembre de 2016, 20:01:30
Hola, sigo sin poder corregir los del SetBrightness, pero aqui hago un pequeño aporte, la función de Wheel dice que asiga un color de 0 a 255 en el orden R-G-B-R pero lo que en realidad hace es G-R-B-G, asi que aqui les dejo el que ya es para R-G-B-R:
Código: C
  1. int32 Wheel(int WheelPos) {
  2. // Input a value 0 to 255 to get a color value.
  3. // The colours are a transition r - g - b - back to r.
  4.         if(WheelPos < 85){
  5.                 return Color32(255-WheelPos*3,WheelPos*3,0);
  6.         }else if(WheelPos < 170){
  7.         WheelPos -= 85;
  8.                 return Color32(0,255-WheelPos*3,WheelPos*3);
  9.         }else{
  10.         WheelPos -= 170;
  11.                 return Color32(WheelPos*3,0,255-WheelPos*3);
  12.         }
  13. }

utilicé esta imagen para guiarme en el código:
(https://lh3.googleusercontent.com/S5_JbLAlEkt-pA0Fkb4evHeIGRLjfNo53I2o7afsvm_trlmhgyYyY8Wvm1aLmqxzmwWeArx73psxlZs=w1920-h833)

Saludos.
Título: Re:Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Marttyn en 23 de Enero de 2017, 17:32:13
Estuve trabajando con la libreria esta tarde y he hecho algunas modificaciones, a la vez que comprobaciones de que todo estuviera en orden.
La libreria no es directamente compatible con la anterior, pero es muy similar.
En el .h viene una explicacion extensa de como usarla.

PS: no puedo modificar el primer post para poner el archivo nuevo. Es una pena, ya que quedaria mejor que la ultima version de la libreria estuviese al principio, y no tener que andar buscando entre los posts....

PS2: Axel, tienes razon con la funcion Wheel, mañana pruebo tu modificacion
Título: Re:Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: joseluislo12 en 15 de Febrero de 2017, 13:47:52
Buenos días

He descargado la última versión de la librería (V3) y la he utilizado con este código:

Código: C
  1. #include <16F1827.h>
  2. #FUSES INTRC_IO,
  3.  
  4. #use delay(clock=32M)
  5. #use fast_io(a)
  6.  
  7. #define PIX_PIN   PIN_A1
  8. #define PIX_NUM_LEDS   2
  9.  
  10. #include <led_pixels.c>
  11.  
  12. void main(){
  13.    InitPixels();
  14.    
  15.    while(true){
  16.       SetPixelColor(0,Color32(100,0,0));
  17.       SetPixelColor(1,Color32(0,0,100));
  18.       CambiarBrillo(255);
  19.       MostrarPixels();
  20.       delay_ms(50);
  21.    }
  22. }

Pero no me funciona, ya que los LED jamás prenden

El esquema que tengo es

PIC -> PIN A1 -> Resistencia 470 -> DIN LED 1 -> DOUT LED 1 -> DIN LED 2

No sé si estoy haciendo algo mal, ojalá pudieran ayudarme con esto

He probado el circuito con una librería para arduino y los LED funcionan correctamente.
Título: Re:Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Axel en 16 de Febrero de 2017, 03:57:07
Buenos días

He descargado la última versión de la librería (V3) y la he utilizado con este código:

Código: C
  1. #include <16F1827.h>
  2. #FUSES INTRC_IO,
  3.  
  4. #use delay(clock=32M)
  5. #use fast_io(a)
  6.  
  7. #define PIX_PIN   PIN_A1
  8. #define PIX_NUM_LEDS   2
  9.  
  10. #include <led_pixels.c>
  11.  
  12. void main(){
  13.    InitPixels();
  14.    
  15.    while(true){
  16.       SetPixelColor(0,Color32(100,0,0));
  17.       SetPixelColor(1,Color32(0,0,100));
  18.       CambiarBrillo(255);
  19.       MostrarPixels();
  20.       delay_ms(50);
  21.    }
  22. }

Pero no me funciona, ya que los LED jamás prenden

El esquema que tengo es

PIC -> PIN A1 -> Resistencia 470 -> DIN LED 1 -> DOUT LED 1 -> DIN LED 2

No sé si estoy haciendo algo mal, ojalá pudieran ayudarme con esto

He probado el circuito con una librería para arduino y los LED funcionan correctamente.

Intenta eliminando esta línea:       CambiarBrillo(255);
Título: Re:Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: horatio1989 en 11 de Mayo de 2017, 19:15:45
Buenas! disculpen que moleste, pero ya estoy quemado! no logro encontrar el error en mi código.

Estoy usando la librería "led_pixels_v0.3.h" de Martín (está genial por cierto) y me da error en la frecuencia de mi clock.

Acá muestro la configuración de fuses:

#include <18F2550.h>
#include <led_pixels_v0.3.h>

#fuses NOWDT,NOPROTECT,NOLVP,NODEBUG,PUT
#fuses HSPLL   // High-Speed Crystal/Resonator with PLL Enabled
#fuses PLL5      // Divide por 5 la freq del crystal y la inyecta al PLL que requiere 4MHz para sacar 96MHZ
#fuses CPUDIV2   // Divide los 96MHz del PLL en 3, logrando 32MHz para el PIC
#use delay (clock=32000000)
#use fast_io(c)

Estoy seguro que el PLL está bien configurado, pero me digue dando error la librería diciendo que la velocidad del PIC debe ser de 32 MHz.

Alguna idea de qué estoy haciendo mal?

El resto del programa es lo mismo que el comentario de arriba

Título: Re:Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: KILLERJC en 11 de Mayo de 2017, 19:33:24
Si pones el include  luego de los fuses cambia en algo ? Asi:

Código: C
  1. #include <18F2550.h>
  2.  
  3. #fuses NOWDT,NOPROTECT,NOLVP,NODEBUG,PUT
  4. #fuses HSPLL   // High-Speed Crystal/Resonator with PLL Enabled
  5. #fuses PLL5      // Divide por 5 la freq del crystal y la inyecta al PLL que requiere 4MHz para sacar 96MHZ
  6. #fuses CPUDIV2   // Divide los 96MHz del PLL en 3, logrando 32MHz para el PIC
  7. #use delay (clock=32000000)
  8. #use fast_io(c)
  9.  
  10. #include <led_pixels_v0.3.h>

Sino si estas MUY pero MUY seguro que esta a 32Mhz, simplemente comenta esto del .h

Código: C
  1. #if getenv("CLOCK") != 32000000
  2.         //Necesitamos que el PIC corra a 32MHZ
  3.         #ERROR "La velocidad del PIC debe ser de 32Mhz"
  4. #endif

La otra es que por algun lado tengas que definir aparte que va a 32Mhz para que no salga esto.
Título: Re:Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Marttyn en 12 de Mayo de 2017, 04:27:07
Hola!
Como dice Killer, el error diria que esta en que incluyes la libraria ANTES de decir a que velocidad funciona el PIC.
La libreria comprueba la velocidad del PIC en esta instruccion:
Código: [Seleccionar]
#if getenv("CLOCK") != 32000000Y getenv("CLOCK") obtiene su valor de la ULTIMA declaracion que hayas hecho de #use delay.
Incluyendo la libreria despues deberia solventar el problema.
Como tambien dice Killer, si estas seguro de que tu PIC corre a 32Mhz, elimina/comenta esa linea y te dejara compilar.
Título: Re:Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Marttyn en 12 de Mayo de 2017, 04:30:43
Si quereis la ultima version del codigo, esta siempre disponible en Github. Ademas, si utilizais Git, podeis colaborar para hacer la libreria mejor (y otras que tambien he subido):

https://github.com/ideaalab/led_pixels_library
Título: Re:Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: horatio1989 en 12 de Mayo de 2017, 10:12:56
Hola a todos! Muchas gracias por sus respuestas, paso a comentarles:

Había probado cambiando de lugar el #include <led_pixels_v0.3.h> , sin embargo la cosa sigue sin funcionar.

Probé también comentar la verificación de velocidad, pero me sigue dando otros errores (dice que no defino PIX_PIN, PIX_NUM_LEDS que en realidad sí están definidas)

Les copio todos los errores:

"La velocidad del PIC debe ser de 32Mhz"
"PIX_NUM_LEDS no definido"
"PIX_PIN no definido"
led_pixels_v0.3.h Line 144(2,6): A #DEVICE required before this line
led_pixels_v0.3.h Line 144(32,33): Expecting an identifier  Bad SFR name
led_pixels_v0.3.h Line 145(2,6): Undefined identifier

Estoy seguro que el pic está a 32MHz, ya que probé sacar todo y usar un delay para ver que el temporizado esté como corresponde, y efectivamente me da el delay que quiero.

Copié el código que probó joseluislo12, y me da todos eses errores! la verdad no sé qué estoy haciendo mal.  Copio mi código completo

Código: [Seleccionar]
#include <18F2550.h>

#fuses NOWDT,NOPROTECT,NOLVP,NODEBUG,PUT
#fuses HSPLL // High-Speed Crystal/Resonator with PLL Enabled
#fuses PLL5 // Divide por 5 la freq del crystal y la inyecta al PLL que requiere 4MHz para sacar 96MHZ
#fuses CPUDIV2 // Divide los 96MHz del PLL en 3, logrando 32MHz para el PIC
#use delay (clock=32000000)
#use fast_io(c)

#define PIX_PIN   PIN_C2
#define PIX_NUM_LEDS   3
#define PIX_DELAY_TIMER2
#include <led_pixels_v0.3.h>
#include <led_pixels_v0.3.c>

void main(){
   InitPixels();
   
   while(1){
      SetPixelColor(0,Color32(100,0,0));
      SetPixelColor(1,Color32(0,0,100));
      //CambiarBrillo(255);
      MostrarPixels();
      delay_ms(50);
}
}

Por otro lado, estoy usando MP Lab (de Microchip) para compilar y un pickkit2 para programar. Incluí en mi proyecto, en los header files el led_pixels_v0.3.h y dentro de las sources led_pixels_v0.3.c

Espero alguien tenga idea en qué me estoy equivocando! Muchas gracias de ante mano por la paciencia y la ayuda.

Título: Re:Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Marttyn en 14 de Mayo de 2017, 06:33:24
Me parece que estas incluyendo la libreria como "source file", mientras que deberias incluirla como "important file".
La diferencia es que si la incluyes en source file, intentara compilar la libreria, y en CCS nunca lo he conseguido... Pero si la incluyes en important files, lo que hara es "tenerla a mano" dentro de tu proyecto, pero solo para tu referencia (no la incluye en el codigo).
La referencia a la libreria la tienes que hacer con el #include.
A ver si hay suerte, pero el error no es de la libreria, sino de la configuracion del proyecto.
Un saludo!
Título: Re:Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: horatio1989 en 15 de Mayo de 2017, 11:19:16
Mil Gracias Marttyn! era eso que decías... tenía mal configurado el proyecto.

Ahora surge algo nuevo. Ya no tira errores, sin embargo, no hace nada. Estoy viendo la salida del pin con el osciloscopio y no hay nada. Probé muchas cosas, y recién al comentar la línea del #use fast_io(c) y desconectando el pin de GND de la tira de leds, estos se comportan como los programo.

La verdad ya no sé que es! no es problema de corriente, porque solo estoy probando con 3 leds y alimentado desde el USB.

La librería está fabulosa!

Si a alguien se le ocurre qué puede ser será muy valioso el aporte!

Gracias de todas formas!
Título: Re:Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Marttyn en 15 de Mayo de 2017, 12:17:06
Hola Horatio!
Acabo de crear un codigo "demo" de como usar la libreria.
Puedes descargarlo, junto con la ultima version de la libreria en Github: https://github.com/ideaalab/led_pixels_library
Funciona tal cual, incluso la funcion de ajustar el brillo. En caso de que no te funcione comprueba la version del compilador, yo tengo la v5.064. Me ha ocurrido que de una version para otra hay cosas que me dejan de funcionar :(
Título: Re:Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Marttyn en 26 de Mayo de 2017, 08:26:03
[...] aqui hago un pequeño aporte, la función de Wheel dice que asiga un color de 0 a 255 en el orden R-G-B-R pero lo que en realidad hace es G-R-B-G, asi que aqui les dejo el que ya es para R-G-B-R [...]

Por cierto, no habia probado hasta ahora esto que decias, y (por supuesto) tienes razon. He añadido la funcion Wheel a la libreria con tu correcion.
Gracias!
Título: Re:Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: RedPic en 26 de Mayo de 2017, 10:31:47
Tengo un par de tiras de estos Leds, a ver si hago un poco de tiempo y me pongo a jugar con tu librería, Marttyn, que por cierto: muchas gracias por compartir con todos nosotros  :mrgreen:
Título: Re:Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: proteus7 en 29 de Noviembre de 2017, 13:05:39
Hola,  tengo una pergunta,  veo que en el pic usan una frecuencia de 32Mhz para controlar las tiras, pero en el arduino uno  usan 16Mhz, como es posible hacerlo con 16Mhzen  arduino uno?
Título: Re:Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Marttyn en 29 de Noviembre de 2017, 14:17:32
En arduino (Atmel), los 16Mhz son 1 instruccion por cada ciclo de reloj, mientras que con Microchip, tienes una instruccion por cada 4 ciclos de reloj, con lo cual la velocidad "real" seria de 32Mhz / 4 = 8Mhz.
Título: Re:Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: KILLERJC en 29 de Noviembre de 2017, 14:23:09
EDIT:

Hola,  tengo una pergunta,  veo que en el pic usan una frecuencia de 32Mhz para controlar las tiras, pero en el arduino uno  usan 16Mhz, como es posible hacerlo con 16Mhzen  arduino uno?

Porque en el PIC se busca que todas las instrucciones ocupen solo 1 ciclo de maquina (excepto los saltos) el problema para esto es que 1 ciclo de maquina consta de 4 ciclos de reloj, por eso el Fcy es Fosc/4

Por su parte los micros de la ex-Atmel utiliza otra arquitectura, y los ciclos de instruccion varian con respecto a lo que se desee hacer. Siendo los mas consumidores aquellos que deben escribir un puerto o la RAM/ saltos , mientras que las operaciones dentro de los registros ( equivalente a como lo es W en el PIC ) se hacen con menos ciclos. Aun asi requieren menos ciclos.

Es una de las grandes peleas de lo que era Atmel-Microchip, otro es la forma del espacio de memorias, siendo el PIC16 en bancos y en Atmel continuo, y vectores de interrupcion. Hay cosas mas rapidas que se pueden realizar y otras mas lentas.
Ejemplo:
En un PIC para leer una posicion de la RAM y luego sumarle un numero precargado en W es solo una instruccion. 4 ciclos de reloj
En un ATtiny el proceso requiere 3 instrucciones, llevar el dato de la RAM a un registro interno, sumarle el numero precargado en otro registro y luego volverlo a la RAM.
Pero si solo debo operar mucho sobre los registros internos, el de la ex-Atmel lo supera ampliamente.

Citar
En arduino (Atmel), los 16Mhz son 1 instruccion por cada ciclo de reloj, mientras que con Microchip, tienes una instruccion por cada 4 ciclos de reloj, con lo cual la velocidad "real" seria de 32Mhz / 4 = 8Mhz.

Esta mal, hay instrucciones de 1,2,3, 4 y 5 ciclos de reloj.
Título: Re:Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Marttyn en 29 de Noviembre de 2017, 14:40:18
La pregunta venia diciendo "por que en Arduino se puede hacer andar estos leds a solo 16Mhz, y en Microchip hacen falta 32Mhz?".
No quise entrar en detalle, por que a grandes rasgos mi respuesta responde a lo que se pregunta. Pero tienes razon en todo lo que dices.
Título: Re:Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: proteus7 en 29 de Noviembre de 2017, 16:16:43
ok, gracias por sus respuestas  (Marttyn, KILLERJC)
Título: Re:Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Byakuya en 29 de Noviembre de 2017, 22:39:46
Hola a todos, Esperando que todos se encuentren bien.. Una pregunta la librería aquí expuesta solo trabaja para ese microcontrolador o es universal para cualquier microcontrolador Microchip ? yo usaba solo código -> C <-, Sin herramientas de medición para pulsos y tiempos me decidí a utilizar un pic18f4550 a 48Mhz y con Bootloader y dije asi.... 48Mhz / 4 se requiere determinado tiempo para un uno y para un cero, el chip es tolerante a ciertos tiempo error, entonces mis funciones dicen... Se define el pin del micro a utilizar puede ser cualquiera. la velocidad del micro a 48Mhz según yo utilice pic18f4550....

Código: [Seleccionar]

//*****************************************
//  rutina que fija el color en el pixel
//*****************************************

void setpixelcolor(uint16_t pixel, uint32_t color) {
 uint8_t rede,greene,bluee;
 if(pixel <= neonum) {
   rede   = (uint32_t)(color >> 16);
   greene = (uint32_t)(color >> 8);
   bluee  = (uint32_t)color;
  }
  neored  [pixel] = rede;
  neogreen[pixel] = greene;
  neoblue [pixel] = bluee;
}


Después la rutina que se encargara determinar que bit colocar en la línea de transmisión.

Código: [Seleccionar]


//********************************
// rutina bit uno --- bit cero
//********************************

void neobit (int1 bit) {
 if(bit == 1) {
  output_high(neopin); delay_cycles(6); output_low(neopin); //delay_cycles(3); //bit '1'
 }else {
  output_high(neopin); delay_cycles(3); output_low(neopin);//delay_cycles(6); //bit 'o'
 }
}

 

Después solo dije... hay que enviar los datos según el data dice.. enviar primero el rojo y después el verde y al ultimo el azul entonces....

Código: [Seleccionar]

//*********************************
//    rutina envia datos
//*********************************

void ledshow (void) {
 signed int8 bitcount;
 uint16_t pixel;
 for(pixel = 0; pixel < neonum; pixel++) {
  for(bitcount = 7; bitcount >= 0; bitcount--) {      //envia rojo datha
      neobit(bit_test(neored[pixel], bitcount));  }
  for(bitcount = 7; bitcount >= 0; bitcount--) {     //envia verde datha
      neobit(bit_test(neogreen[pixel], bitcount));}
  for(bitcount = 7; bitcount >= 0; bitcount--) {    //envia azul  datha
      neobit(bit_test(neoblue[pixel], bitcount)); }
  }
 output_low(neopin);
}


Después de estas funciones y trabajando en conjunto.

Código: [Seleccionar]

//**********************
//    inicializa leds
//**********************

void pixelbegin(void) {
 for(i = 0; i < neonum; i++) {
 neored[i] = 0;
 neogreen[i] = 0;
 neoblue[i] = 0; 
 } //ceros
 ledshow();
}

void main (void)
for(;;) {
 setpixelcolor(0,rojo);
 ledshow();
 output_toggle(pin_d0);   // solo muestra funcionamiento de la tarjeta....
}

Todo se inicializo a ceros y fijo el color rojo en primer led funciono :) .... Pero su librería es mucho mas sofisticada, ahora la pregunta es
Funciona para cualquier microcontrolador? Saludos desde México Tlaxcala...

Título: Re:Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Marttyn en 30 de Noviembre de 2017, 09:02:24
Hola Byakuya!
En efecto, tu codigo hace su funcion correctamente. Es una manera facil y directa de implementarlo.
El codigo que muestro yo (derivado de una libreria de Adafruit) es algo mas complejo ya que lleva los tiempos de manera muy exacta.
En tu caso supongo que los calculos que haces de tiempo estan correctos, pero entiendo que no estas teniendo en cuenta los ciclos que se pierden dentro de los bucles FOR de la funcion ledshow(), en los IF de la funcion neobit() y en el salto entre funciones que seguro descuadran los tiempos.

Como bien dices, el IC es tolerante a cierto error, y por eso tu programa funciona bien.
Es necesario ir con los tiempos tan medidos? Pues... depende de lo perfeccionista que seas y del grado de error que puedas permitir en la ejecucion de tu programa.
Quizas te topas con un IC que no es tan tolerante al error y en este el color no va bien... quien sabe.

Ahora, respondiendo a la pregunta "funciona para cualquier microcontrolador?". La respuesta es SI, con un "pero".... Funciona en cualquier microcotrolador que este corriendo a 32Mhz :D

Yo estaria encantado de incluir mas velocidades a la libreria, pero no tengo tiempo de hacer la programacion en ASM. Si alguien quiere aportar no es complicado. Yo me comprometo a añadirlo a la libreria para que pueda funcionar a las velocidades aportadas.
Título: Re:Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: jhordy en 30 de Octubre de 2019, 16:53:51
amigos saludos, una consulta la funcion que se encarga de modificar el brillo en esta tira de led lo unico que hace es reducir o aumentar los valor del las variables RGB  y nada mas por ejemplo RGB: 100,40,50   si quisiéramos mas intensidad tedriamos que subir estos valores 150,90,100  , esto es ai ???????.  o los modifica en el PWM DEL CHIP WS2812B
Título: Re:Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Marttyn en 31 de Octubre de 2019, 06:13:21
Esta libreria solo escala el valor RGB. Si por ejemplo tienes (255,255,255) y lo pones al 50%, lo que hace es cambiar el valor RGB a (127,127,127). Esto conlleva una perdida en algunos casos. Al disminuir el brillo pierdes resolucion, y al volver a aumentarlo puedes encontrarte con un color diferente al inicial.
Título: Re:Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: championz en 08 de Octubre de 2021, 23:33:55
hola! como estan? perdon por revivir este post, pero esoty probando la libreria, que va excelente, pero quiero ampliar la cantidad de leds de 85 a 192, para uzar 3 matrices de 8x8, es posible? esoty utilizando un pic16f1847

gracias!
Título: Re:Libreria CCS para controlar LEDs WS2811/WS2812
Publicado por: Marttyn en 13 de Octubre de 2021, 05:22:41
Hola!
Haciendo las modificaciones necesarias podrias controlar los LEDs que quieras, siempre que dispongas de memoria suficiente.
En este caso no deberia ser complicado. Hay que cambiar la compilacion condicional para que permita mas (ahora esta limitado a 85), y deberias cambiar la variable in por un int16.
Es posible que necesites hacer algun cambio mas, pero las modificaciones son basicamente para que las variables no se desborden, el resto deberia funcionar exactamente igual.
Aqui esta la ultima version: https://github.com/ideaalab/led_pixels_library