Salutări tuturor. Odată ce mi-a placut un vas de sticla, care emite lumină în întuneric, acumulate în timpul zilei, și, de asemenea, în suportul pentru el a fost RGB lumina de fundal. Cu toate acestea, lumina a fost atât de neglijent (8 culori, și mi-au sar), sa decis să facă propria lor, astfel încât chiar și cu chifle. Baza schemei este microcontrolerul AVR Attiny13. Deși se acceptă numai 2 canale PWM hardware (puls lățime de modulare), iar LED-uri RGB 3 necesită nici o problemă - punerea în aplicare a software-ului PWM. În urma plus față de un coc PWM LED-uri RGB regulament: ajustarea vitezei de schimbare a culorii de la o schimbare de culoare de la un al doilea ciclu de la 1000 de secunde, și capacitatea de a opri efectele de iluminare apăsând și îngheța culoarea curentă. Am apelat această funcție "Stop Color". Pe numărul de culori este, de asemenea implementat caracteristica - schimbarea culorilor nu este doar liniar de la roșu la violet pentru culorile curcubeului, dar, de asemenea, printr-o combinație de zero și o valoare maximă de culoare - adică, de la 100 la sută saturație la zero saturație a culorilor, adică, până la alb. Programul de schimbare a culorii este linear, strict programat. Memoria flash Attiny13 nu a permis implementarea unei schimbări aleatorii aleatorii de culoare. Poate că e pentru cele mai bune.
Schema a demonstrat acest lucru:
Ce da, așa cum sa făcut. Reglați viteza. Să începem cu funcția de întârziere _delay_ms ();. acesta este de obicei redus la utilizarea intrărilor în paranteze de o anumită importanță, în timpul căreia trebuie să treacă întârzierea, dar dacă a pus în paranteze variabila, dimensiunea programului va creste in mod dramatic. Acest lucru nu face deloc, pentru că deja riscăm să nu intrăm în memoria lui Attiny13. Ieșirea este simplă - organizăm o buclă a unui apel cu un număr finit de ori de durată a funcției de întârziere, spun 1 milă secundă. Dimensiunea programului pentru controler este din nou normală. Acum puteți utiliza această funcție pentru a regla viteza efectului luminii. Atunci, unde vom lua variația dinamică a variabilei de întârziere? Prea simplu, Tinkoff are la bord ADC valoare de 10 biți 0-1024 (analog-digital convertor) - se va potrivi perfect pentru această întârziere. Aceasta înseamnă că întârzierea dintre creșterea sau scăderea luminozității va fi de la 1 mile la secundă până la 1 secundă. De la 1 deoarece, cu întârziere zero, va fi doar o mică schimbare, este urâtă, deci zero este exclusă. Deci, luați valoarea de la ADC și împingeți-o în valoarea variabilei de întârziere. De asemenea, valoarea ADC poate fi luată ca 10 biți, adică 1024 eșantioane, și pur și simplu împărțiți această valoare de 2, 4, 8 și așa mai departe, și o gamă mai restrânsă de ajustare. ajustare hardware se va face potențiometru sau un rezistor variabil conectat la bornele plus și minus alimentarea periferice și la intrarea microcontroler medie ADC. R3 pentru protecția portului, limitarea curentului. R1 limitează tensiunea, astfel încât valoarea maximă a ADC a fost de 1000 de 24 de referință rămasă a fost planificat pentru a conecta un alt buton, dar funcțională distinctă nu a primit, așa că rămâne atât de oportunități viitoare pe care o „terminat“. Sursa tensiunii de referință a ADC este tensiunea de alimentare de 5 V microcontroler. În ceea ce privește efectul de a opri schimbarea culorii, apăsarea butonului, aruncarea S2 din principalul efect de lumină buclă infinită cu o buclă fără sfârșit gol diferit, apăsând butonul rastoarna execuția programului înapoi la bucla infinit principal. Simplu și supărat.
Programul a implicat două întrerupe: overflow cronometrul întrerupere 0 la sondaj starea buton, și la ADC conversie completă întrerupere. După cum sa menționat, schimbarea culorii se produce nu numai de la o culoare la alta, dar, de asemenea, cu schimbarea de saturație, adică, nu numai orizontal ci și pe verticală. La saturație minimă culoare va fi erodat unul cu celălalt (vezi. Figura de mai jos) și, în cele din urmă se dovedesc paleta de culoare alba, cu toate că cifra este prezentă și există gri, dar LED-urile RGB nu permit posibilitatea de a transmite, precum și negru. Rezultă pur și simplu luminozitatea albului în loc de trecerea de la negru la alb. Prin urmare, nivelurile de negru nu au încercat nici măcar să pună în aplicare))
Programul se dovedește astfel (cod de program pentru gcc):
Variabila k este responsabilă pentru oprirea schimbării culorii, comută la diferite cicluri de programe.
Variabila n este responsabilă pentru schimbarea de la saturația de 100% a culorilor la estomparea lor în alb, nu poate exista mai mult de 1/2 din pwm
Variabila pwm este valoarea de eșantionare PWM
Acesta este programul principal al microcontrolerului pentru acest dispozitiv.
Dispozitivul terminat sa dovedit a fi de acest fel (asamblat cu ajutorul unui panou de producție proprie pentru tiny13):
Domeniul de aplicare al acestui dispozitiv, ca și aproape orice altul, este limitat doar de imaginația unui inginer sau a unui radio amator. Dispozitivul poate fi ușor modernizat pentru orice alt scop datorită simplității sale, repetabilității și capacității de a face schimbări simple în circuit.
Biti de fuziune pentru programarea microcontrolerului Attiny13:
Lista elementelor radio
Frumoasă, deosebit de impresionată de lucrarea cu flori. Singurul lucru este neclar (poate greșit) cu privire la funcția de întârziere și la cantitatea de memorie. În ceea ce privește compilația, funcția este compilată o singură dată, iar apoi poate fi numită de mai multe ori cu parametrii de intrare. astfel dacă vom scrie codul sursă (cum ar fi inițializarea periferiei) și apăsați de compilare - obține plin de cantitatea de program, atunci ne înscriem funcția noastră - programul va crește cantitatea funcției + posibilă comanda de tranziție (în cazul în care compilatorul decide să intre în funcția separat), Pământul în codul sursă pentru a continua să intre funcția noastră - domeniul de aplicare al programului Acesta va crește prin comanda de tranziție + posibile mișcări anterioare ale variabilelor (astfel încât funcția să le poată accepta). este nesemnificativă în comparație cu prima inscripție a funcției. pentru că este, de asemenea, un fel de funcție care este de asemenea apelată și care are mișcările anterioare în mișcare. astfel cantitatea de memorie neobhodimoy ++). În general, trebuie să luați un compilator specific și să verificați. Vă mulțumesc pentru atenție)
Vezi ce că „caracteristici individuale“ viziune cod compilator astfel nu a observat când ceva pe ATTiny2313 care produc formatat de ieșire prin intermediul UART, acolo ea funcția printf a avut aproximativ 800 de octeți, iar apoi a invocat-l ridicat treptat. O altă întrebare, dacă am putea să nu fie există datorită faptului că scrie _delay_ms, nu delay_ms (în sensul cuvântului fără subliniere pentru întârziere)?
Doar în AS nu există nici o funcție delay_ms (un apel în acest form va da o eroare), numai tu poți apela funcția de întârziere în forma _delay_ms. În controlere, în general, toate aceste întârzieri nu pot fi utilizate (dacă sunt multe dintre ele), dar utilizează sistemul de operare, RTOS-ul unor