• version 0.0
    04/04/2019
    rev ..24/04/2019


    Test Anneau 60 Leds WS2812 avec PIC 18F26K22

    Usage d'un PIC18F26K22 PDIP 28 pins et du Pickit3 Microchip pour charger l'executable
    *un PIC12F1840 DIP 8 serait suffisant ...
    Environnemen t: Mikro C V 7.30
    MCU : FOSC interne 16x4=64MHz

    ANNEAU 60 leds

    exemple de fournisseur : modele 60leds : 12,07€
    Brand Name : XUNATA
    LED Chip Brand : Epistar
    Model Number:WS2812 LED Chip
    LED Chip Model:SMD5050
    Voltage : 5V
    Interface: VCC,GND,DIN,DOUT
    Diametre externe 170mm ( 155mm interne)

    datasheet WS2812

    Intelligent control LED integrated light source
    La lecture de cette datasheet est INDISPENSABLE pour comprendre le fonctionnement ASYNCHRONE de
    la liaison pour commander ce composant.

    ( Traduction partielle)
    le circuit de controle RGB (Rouge Vert Bleu) est intégré dansle boitier et formme un controle comple de pixell.
    Un circuit interne de remise en forme apres chaque element permet de ne pas accumuler les erreurs.
    Un circuit interne de RESET et perte d'alimentation est inclus .
    Chaque pixel des 3 couleurs elementaires RGB peunet avoir 256 niveaux d'amplitude , pouvant ainsi definir 6777216 couleurs
    La frequence de rafraichissement doit etre > 400KHz.
    Une sortie permet de monter les elements (aneaux) en cascade , pour une transmission unifilaire ... jusqu'à L=5M
    On peut avoir un rafraichissement jusqu'à 30Frame/sec jusqu'à 512 leds en cascade.
    Les data sont envoyée à 800 Kbps.

    Caracteristique LED :

     

    nM

    mCd

    mA

    volt

    Rouge

    620-630

    550-700

    20

    1.8-2.2

    Vert

    515-530

    1100-1400

    20

    3.0-3.2

    Bleu

    465-475

    200-400

    20

    3.0-3.4


    WS2812
    Operation frequency Fosc2 —— —— 800 —— KHz
    transmission data rate mini 400Kbps
    Data transfer time( TH+TL=1.25µsħ600ns)
    T0H 0 code ,high voltage time 0.35us ħ150ns
    T1H 1 code ,high voltage time 0.7us ħ150ns
    T0L 0 code , low voltage time 0.8us ħ150ns
    T1L 1 code ,low voltage time 0.6us ħ150ns
    RES low voltage time Above 50µs

    1 bit de commande => necessite 1 byte
    3 bytes pour GRB valeur
    donc 3 x 8 = 24 bits de commande
    60 leds * 3 bytes couleur GRB => 180 bytes
    180 x 8 bits de commandes => 1440 bytes pour piloter 60 leds RGB


    MCU à 64 MHz ==> 62.5nS par cycle = 1 NOP
    un bit de commande doit avoir une periode comprise entre 1,2µS +- 600nS
    soit de 600nS à 1800 ns ( en therorie)
    recommandé 1,2 à 1,4µS maxi

    avec ajustage du nombre de NOP dans ZEROS et ONES
    Zero = 380ns ON + 860nS OFF soit T= 1260 nS
    UN= 620ns ON + 640nS OFF soit T= 1260 nS

    Anneau_60_leds_RGB_SPI_Hardw_Test_190408.c
    sequence de test :
    SQA=1;
    ZEROS();ZEROS();ZEROS();ZEROS();ONES();ONES();ONES();ONES(); // VERT
    SQA=0;
    ZEROS();ZEROS(); ZEROS();ZEROS();ZEROS();ZEROS();ZEROS();ZEROS() ; // ROUGE
    SQA=1;
    ZEROS();ZEROS(); ZEROS();ZEROS();ZEROS();ZEROS();ZEROS();ZEROS() ; // BLEU
    SQA=0;

    allume la 1ere led en VERT !


    Partie ASM pour generatioon d'un bit de commande

    unsigned char LATCx absolute 0x0F8B;

    void ONES ()
    {
    _asm {
    BSF _LATCx,5;
    NOP;
    NOP;
    NOP;
    NOP;
    NOP;
    NOP;
    NOP;
    NOP;
    NOP;
    BCF _LATCx,5;
    NOP;
    NOP;
    NOP;
    NOP;
    NOP;
    }
    }



    Analyse signal avec IKAlogig SQA50 analyser

    images/t_SQA_test-routine_ZEROS.gif images/t_SQA_test-routine_ONES.gif
    envoi d'un bit à ZERO envoi d'un bit à UN

    le timing est respecté ..( precision du NOP =62.5nS avec reglage fin de +-3% possible avec valeur du registre OSCTUNE )
    L'extinction de l'anneau se fait en envoyant 1440 bytes à ZERO

    L'index pointeur de led est remis à zero si Dout à zéro pendant > 50µS


    la boucle principale :


    // index led = 0
    DOut=0;
    Delay_us(100);
    for (j=0;j<NB_LEDS;j++)
    {
    DOut=0;
    Delay_us(100);
    for (k=0;k<j;k++)
    { SQA=1;
    ZEROS();ZEROS(); ZEROS();ZEROS();ZEROS();ZEROS();ZEROS();ZEROS();
    ONES(); ONES(); ONES(); ONES(); ONES(); ONES(); ONES(); ONES(); // ROUGE
    ZEROS();ZEROS(); ZEROS();ZEROS();ZEROS();ZEROS();ZEROS();ZEROS();
    SQA=0;
    }
    //Delay_1sec();
    Delay_ms(100);
    UART1_Write_CText(" time is ");
    WordToStr(j,CRam1);
    UART1_Write_Text(CRam1);
    CRLF1();
    }
    Delay_1sec(); Delay_1sec(); Delay_1sec(); Delay_1sec();
    UART1_Write_CText(" RAZ anneau \r\n" );
    for (j=0;j<1440;j++)
    {
    ZEROS();

    }
    UART1_Write_CText(" fin \r\n");



    Schema de test :

    Usage de la platine BASE TEST 18F26K22
    DOut RC5 est relié à DIN anneau Leds ( et bien sur le +5V et Le Gnd 0V)
    Liaison UART<-> Terminal PC via cordon Prolific USB/TTL
    Liaison RC0 pour synchro analyser SQA


    SOFTWARE :

    projet mikroC : TEST_Anneau_60leds_RGB_18F26K22.zip
    exec :
    Anneau_60leds_cde_bit_bang_18F26K22.hex
    main source :
    Anneau_60_leds_RGB_Bit_bang_Hardw_Test_190408.c

    Video :
    Anneau_60leds_Test_190408.webm





    Mesure de la durée d' Execution d'une Fonction ou sous programme
    Exemple : l'operation RAZ anneau 60 leds :

    la fonction :



    L'outil : Le Timer3 , est utilié simplement comme compteur HARDWARE
    declenché juste AVANT l'appel de la fonction ....et arreté juste APRES
    la lecture , écart de comptage , renseigne sur la duree écoulé, en nombre de cycles .

    void Init_Timer3()
    {
    // Fosc=64Mhz
    //Prescaler 1:8; TMR3 Preload = 5536; Actual Interrupt Time : 30 ms


    T3CON = 0x31;
    TMR3ON_bit=0; // STOP
    TMR3IF_bit = 0;
    TMR3H = 0x15;
    TMR3L = 0xA0;
    TMR3IE_bit = 0; // no interrupt
    }


    On peut aussi , mesurer uniquement la partie effective de la RAZ
    sans la partie RESET pointeur led , qui prend 900µS en amont et 1000µS en aval
    en mettant le depart et l'arret timer3 , dans la partie RAZ , envoi des 1440 bytes
    La methode d'utilisation :

    Arreter ,si necessaire, toute source d'interruption pouvant modifier la mesure de durée..

    CRLF1();
    //UART1_Write_CText("mesure Delay_ms(59); r\n");
    // UART1_Write_CText("mesure RAZ_Anneau_60_Leds\r\n");
    UART1_Write_CText("Mesure Delay_ms(5);\r\n");
    Init_Timer3(); // 0.5µS / count at 64MHz
    val1=(TMR3H<<8)|TMR1L;

    Etat=INTCON; // sauve etat GIE bit ..etc
    GIE_bit=0;
    TMR3ON_bit=1;
    Delay_ms(5); // Duree mesuree = 4992µS +-1µ5
    // Delay_ms(59); //Duree mesuree= 59008µS +-1µ5
    //UART1_Write_CText("Duree mesurée RAZ_Anneau_60_Leds\r\n);
    TMR3ON_bit=0;

    val2=(TMR3H<<8)|TMR1L;
    if (TMR3IF_bit==1) val2=val2+65536;
    val3=val2-val1;
    val3=val3>>1;
    LongWordToStr(val3,CRam1);
    UART1_Write_Text(CRam1);UART1_Write_CText("µS\r\n");
    CRLF1();

    INTCON=Etat;

    Résultats:

    // Duree globale fonction RAZ anneau= 4480µS
    // Duree seulement de la partie RAZ= 2688µS ( envoi de 1440 bytes en simili ASM)
    // autre moyen de mesure : avec MikroC Debugger + chrono : 41993 cycles * 0.0625=> 2624µS





    Horloge 4 xMatrice 8x8 et Anneau 60 leds






















    paulfjujo@free.fr


    Retour à l'index general