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
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