Sari la conținut
ELFORUM - Forumul electronistilor

Banda led programabila


Vizitator Ovidiu Busuioc

Postări Recomandate

Se poate , implementând un oscilator cu unul din comparatoarele existente în PIC . 

 

La asta nu ma pricep :). In schimb pot sa postez codul sursa daca vrea cineva sa-l modifice.

Codul sursa:

 

 

#define timeStep 25  //msunsigned char LATB = 0;unsigned char LATA = 0;unsigned long millis = 0;char timeSetting = 1;unsigned long timeUntilNextStep = 0;char oldstate1 = 0;char oldstate2 = 0;void fill() {  if(millis-timeUntilNextStep >= timeSetting*timeStep)  {    if(LATA == 255)    {      LATA = 0;      LATB = 0;    }    else if (LATB<255)    {    LATB <<=1;    LATB|=1;    }    else    {     if(LATA == 0xF)     {        LATA <<=1;        LATA|=1;        LATA <<=1;        LATA|=1;        LATA <<=1;        LATA|=1;     }     else     {     LATA <<=1;     LATA|=1;     }    }    PORTB = LATB;    PORTA = LATA;    timeUntilNextStep = millis;  }}void buttons(){    if (oldstate1 == 0 && Button(&PORTA, 4, 5, 0)) {      oldstate1 = 1;    }    if (oldstate1  && Button(&PORTA, 4, 5, 1)) {      timeSetting++;      delay_ms(10);      EEPROM_Write(0x02,timeSetting);      delay_ms(10);      oldstate1 = 0;    }    if (oldstate2 == 0 && Button(&PORTA, 5, 5, 0)) {      oldstate2 = 1;    }    if (oldstate2 && Button(&PORTA,5, 5, 1)) {      if(timeSetting > 1)      {          timeSetting--;          delay_ms(10);          EEPROM_Write(0x02,timeSetting);          delay_ms(10);      }      oldstate2 = 0;    }}void InitTimer0(){  OPTION_REG         = 0x81;  TMR0                 = 6;  INTCON         = 0xA0;}void Interrupt(){  if (TMR0IF_bit){    TMR0IF_bit         = 0;    TMR0                 = 6;    millis++;  }}void main() {PCON.F3 = 1;TRISB = 0x00;PORTB = 0x00;TRISA = 0x30;InitTimer0(); while(1) {   timeSetting = EEPROM_Read(0x02);   if(timeSetting == 0xFF)     timeSetting = 1;  fill();  buttons(); }} 

 

 

Editat de bandi12
Link spre comentariu

Din păcate nu am timp până spre sfârșitul lunii . Pot eventual să încerc să postez câteva detalii , poate te încumeți să continui !

 

Ideea e că acel oscilator poate genera o întrerupere la intevale  reglabile prin potențiometru ( de la , să zicem , 1ms la 100ms ) . Aceste durate ar înlocui timeSetting din codul tău . În plus nici nu ar mai fi nevoie de scriere/citire în/din EEPROM . 

 

Varianta imediată este cu configurarea comparatoarelor în modul 110 . RA0, RA2 ar fi intrări iar RA3 ar fi ieșire . RA1 și RA4 ar fi , din păcate , irosite . 

O altă variantă care complică puțin lucrurile în soft ar fi fără scoaterea ieșirii la exterior . Aici s-ar putea folosi modul 101 care ar consuma doar doi pini de la comparator plus un pin oarecare , ieșire digitală.

Pot să detaliez dacă există interes . 

 

Evident că pinii menționați de mine nu mai pot fi folosiți ca ieșiri pentru LED-uri . 

Editat de UDAR
Link spre comentariu

Pentru intreruperi nu cred ca avem nevoie de comparator, putem folosii RB0 care e pin "External interrupt" si masuram intervalul intre cele doua intreruperi generate de un 555 sau alte circuite mai simple ?. Acuma depinde daca se merita adaugarea unui 555 fata de un pic gen PIC16F1503/7 care costa 5 respectiv 7 lei.

 

Daca e ok asa cu 555 pot incerca realizarea. 

Link spre comentariu

Ideea cu comparatorul din PIC era tocmai de a nu adăuga alte circuite . În fine , desigur există multe soluții . 

PS Eu m-am referit strict la F628A - asta am înțeles că e tema . Evident că folosind un PIC cu ADC lucrurile se simplifică enorm . 

Editat de UDAR
Link spre comentariu

Am inteles, eu credeam ca era vorba de un oscilator extern ( am fost neatent cand am citit). Si da era vorba de F628/A, eu m-am referit la faptul ca daca trebuie folosit un oscilator extern  nu merita munca depusa cand un PIC cu adc la un pret relativ mic rezolva mult mai elegant problema. 

 

Interesanta treaba si folosirea comparatorului pe post de "adc", din pacate saptamana viitoare cel putin pana joi sunt ocupat si nu am timp de studii probabil spre weekend daca nu e problema sa renuntam la cateva leduri pentru a include semireglabilul o sa ma documentez si sa incerc o implementare.

Link spre comentariu

Nu-i nevoie sa renunti, folosesti codul potrivit si le folosesti pe toate 24. :rade: 24 pe o parte, bineinteles. :da:

 

 Am cam amestecat doua proiecte pe un topic :). Eu vorbeam de codul meu fara banda digitala pe care il foloseste  @kinderu56.  Si da cu banda led digitala nu se pune problema renuntarii la LED-uri findca este nevoie doar de 2 pini pentru cele doua benzi a cate 24 de leduri 

Link spre comentariu

Salut,

Am urcat pe github o varianta care aprinde ledurile (eu am lasat 12 active, ca 24 mi s-au parut multe) cam ca in filmuletul  din primul post. N-are posibilitati de reglaj al vitezei si nici nu cred ca ma intereseaza sa-i fac.

Din punctul meu de vedere (sa vad daca sunt in stare sa aprind cum vreau led-uri ws2812b), "proiectul" e terminat. Daca e cineva interesat sa-l continue, sursele sunt disponibile pe github.

Utilizarea in scopuri personale (invatat, facut montaje prin casa/masina proprie) e libera de orice constrangere. Pentru utilizarea comerciala, mi-ar placea sa fiu macar anuntat (daca nu intrebat) inainte.

 

Spor,

Liviu

Editat de Liviu M
Link spre comentariu

Probabil ca nu intereseaza pe nimeni, da' cum nu cere de mancare, scriu in continuare aici.

Pentru ca ma rodea putin structura programului (nu reuseam sa mut o parte din operatiii intr-o functie), am mai sapat putin la program.

Pana la urma am reusit sa-i dau de cap. Si pentru ca tot eram la el, l-am si periat si comentat putin.

Ultima versiune, ca intotdeauna pe github.

 

Numai bine,

Liviu

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