Liviu M Postat Mai 27, 2016 Partajează Postat Mai 27, 2016 Si niq_ro tot bibliotecile Adafruit le foloseste. Link spre comentariu
kinderu56 Postat Mai 27, 2016 Partajează Postat Mai 27, 2016 nu toata lumea are acasa arduino ,construim cu ce avem Link spre comentariu
Liviu M Postat Mai 27, 2016 Partajează Postat Mai 27, 2016 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
Bandi Szasz Postat Iunie 1, 2016 Partajează Postat Iunie 1, 2016 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
kinderu56 Postat Iunie 1, 2016 Partajează Postat Iunie 1, 2016 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 Link spre comentariu
Bandi Szasz Postat Iunie 1, 2016 Partajează Postat Iunie 1, 2016 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
kinderu56 Postat Iunie 1, 2016 Partajează Postat Iunie 1, 2016 pai si le adaugam ? Link spre comentariu
Liviu M Postat Iunie 2, 2016 Partajează Postat Iunie 2, 2016 (editat) 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 Iunie 2, 2016 de Liviu M Link spre comentariu
Bandi Szasz Postat Iunie 2, 2016 Partajează Postat Iunie 2, 2016 pai si le adaugam ? Am adaugat si acele 6LED-uri acuma sunt 14 in total. 14LED.rar Link spre comentariu
Liviu M Postat Iunie 2, 2016 Partajează Postat Iunie 2, 2016 (editat) 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 Iunie 2, 2016 de Liviu M Link spre comentariu
Bandi Szasz Postat Iunie 2, 2016 Partajează Postat Iunie 2, 2016 (editat) 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 Iunie 2, 2016 de bandi12 Link spre comentariu
core Postat Iunie 2, 2016 Partajează Postat Iunie 2, 2016 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
Liviu M Postat Iunie 2, 2016 Partajează Postat Iunie 2, 2016 (editat) 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 Iunie 2, 2016 de Liviu M Link spre comentariu
Bandi Szasz Postat Iunie 2, 2016 Partajează Postat Iunie 2, 2016 (editat) 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 Iunie 2, 2016 de bandi12 Link spre comentariu
Liviu M Postat Iunie 4, 2016 Partajează Postat Iunie 4, 2016 (editat) 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 Iunie 4, 2016 de Liviu M Link spre comentariu
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum