Sari la conținut
ELFORUM - Forumul electronistilor

Banda led programabila


Vizitator Ovidiu Busuioc

Postări Recomandate

Sigur, ai dreptate. Eu nu am spus ca e varianta cea mai buna, am spus ca e varianta cea mai la indemana cand nu stii sa-ti scrii singur programele. Iei ceva gata functional si usor de reprodus.

Intamplator m-am jucat cu niste led-uri de-astea si am studiat putin codul Arduino care controleaza comunicatia cu led-urile si nu e deloc trivial. E scris direct in asamblor si instructiunile sunt numarate. Timingul e destul de strans, desi ulterior am inteles ca la implementarea in Arduino au cam exagerat, mergea si putin mai relaxat. Dar doar putin.

Pentru un pasionat de programare, implementarea comunicatiei asteia e in mod sigur interesanta. Asa ca daca bandi12 decide sa incerce si-i iese, aveti noroc.

Daca nu, cum ziceam, un Arduino nu-i chiar un capat de tara. :)

Link spre comentariu

Am incercat astazi sa mesteresc ceva pentru ledurile digitale dar nu pot sa ma apropiu de viteza ceruta. Am cautat alte proiecte pentru PIC si exista cateva dar mai toate folosesc PIC18F pentru a atinge viteza necesara, posibil sa mearga si cu PIC16F dar numai direct din _asm la care eu nu ma pricep.  Cum s-a mai mentionat pentru un arduino nano la 2.5$ nu cred ca se merita.

Link spre comentariu

este ok viteza im momentul e fata cu ultimul soft, difera realizarea fizica de ce in simulare, treaba este daca se poate face pe mai multe canale decat cele 8 

 

Cu viteza ma refeream la rata de transfer a datelor pentru banda digitala cu ws2812b care este de 0.4us. Da mai putem adauga maxim 6 LED-uri pt PIC16F628.

Link spre comentariu

 cu ws2812b care este de 0.4us.

Din cate am citit despre ws2812, critic este timpul cat pulsul este high (400 ns pentru 1 si 800 pentru 0). Daca nu depasesti lungimea pentru reset (50 us), timpii cat semnalul e low nu e critic. Si la 20 MHz => 200 ns/instructiune => in 50 us ai 25 instructiuni, sunt sanse sa mearga.

Asa ca daca ce am citit e adevarat, sunt sanse sa functioneze cu o bucla de genul (pentru un oscilator de 20 MHz):

#define NR_LEDURI  2unsigned char mask[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};unsigned char data[3 * NR_LEDURI] = {0};unsigned char ledNr;unsigned char i;/*definire culori*/for(ledNr = 0; ledNr < NR_LEDURI; ledNr++){   data[ledNr++] = ...; //verde   data[ledNr++] = ...; //rosu   data[ledNr] = ...; //albastru}for(ledNr = 0; ledNr < 3 * NR_LEDURI; ledNr++){  for(i=0; i<8; i++)  {    if(data[ledNr] & mask[i])    {       pin = 1;       NOP(); //200 ns pentru oscilator de 20 MHz       pin = 0; //alte 200 ns    }    else    {       pin = 1;       NOP(); //200 ns        NOP(); //200 ns        NOP(); //200 ns        pin = 0; //alte 200 ns    } //else  } //for(i=0; i<8; i++)} //for(ledNr = 0; ledNr < 3 * NR_LEDURI;

Eu am in plan sa testez o varianta de genul asta, numai ca are prioritate mica de tot, nu stiu cand (si daca) ajung s-o fac, asa ca daca reuseste altcineva s-o testeze...

Editat de Liviu M
Link spre comentariu

Eu am in plan sa testez o varianta de genul asta,

Testat, la mine nu merge. Ori compilatorul meu face magarii (e varianta free, nu optimizeaza deloc), ori am socotit gresit.

Am incercat sa inserez si putin asamblor in cod, da' tot degeaba, nu-mi iese.

Editat de Liviu M
Link spre comentariu

Testat, la mine nu merge. Ori compilatorul meu face magarii (e varianta free, nu optimizeaza deloc), ori am socotit gresit.

Am incercat sa inserez si putin asamblor in cod, da' tot degeaba, nu-mi iese.

 

Socotelile sunt corecte problema este la compilatorul de C. M-am documentat putin despre _asm si dupa ce am inclus cod _asm in MikroC au iesit timpii necesari, personal nu detin banda led digitala, daca are cineva si are timp poate face o proba.

 

Codul este  pentru 10LED-uri folosind PIC16F628/A cu oscillator  extern de 20Mhz iar banda led este legat la pin-ul RA0.

#define  testbit(var, bit)  ((var) & (1 <<(bit)))signed long led_strip_colors[10];#define LEDCOUNT 10unsigned char brightness = 1;void WS2812(char bit_data) {  if(bit_data == 0)  {     asm{     bsf PORTA, 0;     nop;     bcf PORTA, 0;     nop;     nop;     nop;     nop;     }  }  else  {     asm{     bsf PORTA, 0;     nop;     nop;     nop;     bcf PORTA, 0;     nop;     nop;  }  }}void Clear_Strip() { char pos;    for(pos = 0; pos < LEDCOUNT*24; pos++)    {       WS2812(0);    }}void WS2812_frame() {  unsigned int i;  unsigned long this_led;  unsigned int loop;for(i = 0; i < LEDCOUNT; i++){  this_led = led_strip_colors[i];  for(loop = 0; loop < 24; loop++)      {      if(testbit(this_led, 23))          {          WS2812(1);          }      else          {          WS2812(0);          }      this_led *= 2;      }  delay_ms(10);}Clear_Strip();}void Set_Color(unsigned long rred, unsigned int ggreen, char bblue, char position) {   unsigned long temp, temp1;   temp = 0;   temp1 = 0;   temp1 = (rred / brightness)<<16;   temp = temp + temp1;   temp1 = 0;   temp1 = (ggreen / brightness) << 8;   temp = temp + temp1;   temp1 = 0;   temp1 = (bblue / brightness);   temp = temp + temp1;   led_strip_colors[position] = temp;}void initLEDColors() { int i; for(i = 0; i < LEDCOUNT; i++)  Set_Color(255,100,0,i);}void main() {  TRISA = 0x00;  PORTA = 0x00;  initLEDColors();    while(1) {    WS2812_frame();  }}

MyProject.rar

Editat de bandi12
Link spre comentariu

trebuie sa tineti cont si de timpii pierduti de bula for, cel putin 3 cicli, testul din for, incrementarea si testul din bucla.

daca aveti posibilitatea urmariti codul dezasamblat si numarat cicli. Din cate stiam exista o optiune de generare si listing asm inainte de generare fisier obiect.

din cate imi aduc aminte, un test poate lua unul sau doi cicli, in functie de valoarea de adevar.

Link spre comentariu

Cum ziceam intr-un post anterior, citisem pe undeva ca importanti sunt timpii "sus", timpii jos nu (atata timp cat nu generezi reseturi).

La mine, cu comenzi direct asm pentru pulsuri, aproape ca-mi merge. Aproape pentru ca nu iese chiar culoarea care trebuie si cam flicare. M-am uitat cu osciloscopul si pulsurile (cele 400/800 de ns) sunt chiar OK, pauzele intre pulsuri fiind cam de 5 us.

Poate-mi fac timp sa mai sap.

LE M-am uitat prin codul asm generat de compilator si e mult mai lung decat imi imaginam eu. De-aia am pus secventele asm pentru generarea de pulsuri, altfel n-aveau nici o treaba cu ce trebuia sa iasa.

Editat de Liviu M
Link spre comentariu

In principiu da cele mai importante sunt timpii sus respectiv sa fie minim 450 respectiv 850ns LOW inainte de urmatorul HIGH, daca este tinut LOW pentru cel putin 50us bitii trimisi sunt puse pe iesiri generand culoarea trimisa.  Trebuie incercat intai cu fiecare culoare in parte daca functioneaza atunci e ok, lucrez si eu la un controller RGB pentru  banda led RGB ( cea normala) si am observat ca LED-urile rosii sunt mai slabe decat cele verzi si albastre, normal codul RGB pentru portocaliu este 255,150,0 la mine codul acesta rezulta in galben verzui pentru a obtine portocaliu codul este 255,25,0 ( 255 = 100% PWM ). 

Editat de bandi12
Link spre comentariu

Am reusit sa-l conving sa mearga. Proiectul complet (aproape netestat) e pe github. Din readme-ul de la github:

Semnalizator cu PIC (16F877 sau 16F628) si led-uri WS2812B. Conexiuni:

  • [*]intrare semnalizare stanga RA0 [*]intrare semnalizare dreapta RA1 [*]iesire semnalizare stanga RA2 [*]iesire semnalizare dreapta RA3 Intrarile sunt active low (butoane catre masa). Iesirile se conecteaza la DIN ale sirurilor de leduri. Maxim 24 de led-uri pentru fiecare directie.

Toate ldurile dintr-o directie se aprind in acelasi timp. Se pot defini "jocuri de lumini", dar nu asta a fost scopul meu.

Pentru curajosii care doresc sa-l testeze, proiectul poate fi clonat cu git sau poate fi descarcat ca arhiva.
Dupa dezarhivare ar trebui sa se poata deschide si compila direct din mplabx (si compilator xc8).

Am definit doua configuratii, una pentru pic628 si una pentru 877. N-am testat decat o ramura cu 877. Mai multe leduri n-am si nici 628.

Probabil se pot defini configuratii pentru multe alte controllere.

Asa cum e, probabil ca functioneaza numai cu oscilator de 20 MHz.

Cine are intrebari sa intrebe. :)

Editat de Liviu M
Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum
×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări