Mündəricat:

Çox rəngli gözlərlə Attiny85 eyni vaxtda proqramlaşdırma və ya balqabaq: 7 addım
Çox rəngli gözlərlə Attiny85 eyni vaxtda proqramlaşdırma və ya balqabaq: 7 addım

Video: Çox rəngli gözlərlə Attiny85 eyni vaxtda proqramlaşdırma və ya balqabaq: 7 addım

Video: Çox rəngli gözlərlə Attiny85 eyni vaxtda proqramlaşdırma və ya balqabaq: 7 addım
Video: Xumar Qədimova — Miyana Gözlər 2024, Iyul
Anonim

Müəllif tərəfindən daha çoxunu izləyin: jumbleviewJumbleview.info

Qışqırıq
Qışqırıq
Qışqırıq
Qışqırıq
NiCd Batareyanın Xarici Güc Təchizatı ilə dəyişdirilməsi
NiCd Batareyanın Xarici Güc Təchizatı ilə dəyişdirilməsi
NiCd Batareyanın Xarici Güc Təchizatı ilə dəyişdirilməsi
NiCd Batareyanın Xarici Güc Təchizatı ilə dəyişdirilməsi
Rəqəmsal Kamera Tutacağı
Rəqəmsal Kamera Tutacağı
Rəqəmsal Kamera Tutacağı
Rəqəmsal Kamera Tutacağı

Haqqında: Bay Area (California) şirkətlərindən birində proqram mühəndisi işləyirəm. Vaxtım olanda mikro idarəediciləri proqramlaşdırmağı, mexaniki oyuncaqlar qurmağı və bir neçə ev yaxşılaşdırma layihəsi etməyi sevirəm. Jumbleview haqqında daha çox »

Bu layihə, Attiny85 çipi ilə iki ədəd 10 mm-lik üç rəngli ümumi anod LED-lərinin (Balqabaq Halloween Parıltısının çox rəngli gözləri) necə idarə olunacağını göstərir. Layihənin məqsədi oxucunu eyni vaxtda proqramlaşdırma sənətinə və Adam Dunkels prototreads kitabxanasının istifadəsinə cəlb etməkdir. Bu layihə, oxucunun AVR 8 bit nəzarətçiləri haqqında bildiyini, bəzi C proqramı yaza biləcəyini və Atmel studiyası ilə müəyyən təcrübəyə malik olduğunu güman edir.

GitHub -da yayımlanan layihə kodu:

Təchizat

Proqramlaşdırmadan əvvəl hələ də dövrə qurmaq lazımdır. Budur komponentlər:

  • Attiny85 nəzarətçi (hər hansı bir elektron təchizatçı).
  • Ümumi anodlu iki üç rəngli 10 mm LED. Adafruit LEDləri
  • Rezistorlar 100 Ohm, 120 Ohm, 150 Ohm 0.125 və ya 0.250 Wt (hər hansı bir elektron təchizatçı).
  • AVR ISP interfeysi üçün altı pin başlıq. Bu Adafruit başlığından hazırlana bilər
  • Bəzi çörək lövhəsi və ya çap edilmiş şablon lövhəsi. Bunu https://www.adafruit.com/product/589 istifadə etdim
  • AVR ISP MKII interfeysi və Atmel Studio 6.1 (Sonrakı versiya da işləməlidir).

Addım 1: Sirkulyasiya

Sirk
Sirk

Dizayn beş çip pinindən istifadə edir:

  • Anodları idarə etmək üçün iki sancaq istifadə olunur: hər bir LED anod xüsusi pinə bərkidilir.
  • LED -lərin katotlarına üç rezin (rezistorlar vasitəsilə) bərkidilir (hər bir ledin eyni rəngli katodu eyni pinə bərkidilir)

Biri soruşacaq: niyə LED anodları +5 v -ə birbaşa bağlanacaq və hər bir katodun xüsusi pininə sahib olacaqsınız? Bu, proqramlaşdırmanı asanlaşdıracaq. Təəssüf ki, bir problem var: pin PB5 (RESET) ~ 2 mA cərəyan verməyə qadir olan zəif bir pindir.

Əlbəttə ki, bu zəif pin üçün tranzistor gücləndiricisi qurmaq olar, amma mən özüm problemi kod vasitəsilə həll etməyə üstünlük verirəm.

Addım 2: Zamanlama Diaqramı

Zamanlama Diaqramı
Zamanlama Diaqramı

Zamanlama diaqramı, proqramlaşdırmaq üçün nəyə ehtiyacımız olduğunu anlamağa kömək edir.

Diaqramdakı ilk iki sıra LED anodlarında gərginlik dəyişikliyini göstərir. LED anodlarına qoşulan sancaqlardakı gərginlik ~ 250 Hz tezliyi ilə salınır. Sol LED üçün bu gərginlik salınması sağ LED -in əksinədir. Anoddakı gərginlik yüksək olduqda müvafiq LED parlaq ola bilər. Aşağı olduqda müvafiq LED qaranlıqdır. Bu o deməkdir ki, hər bir LED 2 milisaniyə ərzində parlaq ola bilər və başqa 2 milisaniyə ərzində qaranlıqdır. İnsan gözündə müəyyən bir ətalət olduğu üçün müşahidəçi 250 Hz -lik yanıb -sönməsini fərq etmir. Diaqramdakı üç sıra LED, katodlara bağlı pinlərdəki gərginliyin dəyişməsini göstərir. Birinci diaqram sütununa baxaq. Sol LED qırmızı rəngdə, sağ LED isə yaşıl rəngdədir. Burada sol anod yüksək olarkən QIRMIZ katodlar aşağı, YAŞIL katot aşağı, sağ anod yüksək və MAVİ katod hər zaman aşağı qalır. Diaqramdakı digər sütunlar müxtəlif rənglər üçün katot və anod gərginliyinin birləşmələrini göstərir.

Gördüyümüz kimi sancaqlar vəziyyətində qarşılıqlı asılılıq var. Bəzi çərçivələr olmadan həll etmək asan olmayacaq. Və prototipli kitabxananın lazımlı olduğu yer budur.

Addım 3: Proqramlaşdırma. Makrolar və təriflər

Proqramlaşdırma. Makrolar və təriflər
Proqramlaşdırma. Makrolar və təriflər

Proqramlaşdırma addımlarında bir az sadələşdirilmiş versiyanı təmsil edir. Proqram qısaldılır və bəzi simvolik tərif açıq sabitlərlə əvəz olunur.

Gəlin əvvəldən başlayaq. Proqrama Atmel Studio ilə gələn fayllar, həmçinin prototeka kitabxana başlığı daxildir. Sonra pin səviyyələrini manipulyasiya etmək üçün iki makro və pin siqnallarına məntiqi adlar vermək üçün bəzi təriflər var. İndiyə qədər xüsusi bir şey yoxdur.

Addım 4: Proqramlaşdırma. Əsas döngə

Proqramlaşdırma. Əsas döngə
Proqramlaşdırma. Əsas döngə

Sonra əsas prosedurun nə olduğunu görmək üçün sona baxaq.

Bəzi başlatma etdikdən sonra əsas funksiya əbədi döngədə qalır. Bu dövrədə növbəti addımları atır:

  • Sol LED üçün prototip işləmə rejimini çağırır. Bəzi sancaqlar gərginliyini dəyişir.
  • İki milisaniyə gecikdirin. Pin gərginliyində heç bir dəyişiklik yoxdur.
  • Doğru LED üçün prototip çağırır. Bəzi pin gərginliyini dəyişir.
  • 2 MS gecikmə edin. Pin gərginliyində heç bir dəyişiklik yoxdur.

Addım 5: Proqramlaşdırma. Köməkçi funksiyalar

Proqramlaşdırma. Köməkçi funksiyalar
Proqramlaşdırma. Köməkçi funksiyalar

Prototipləri müzakirə etməyə başlamazdan əvvəl bəzi köməkçi funksiyalara baxmalıyıq. Əvvəlcə müəyyən bir rəng təyin etmək üçün funksiyalar var. Düzdürlər. Dəstəklənən rənglərin sayı (yeddi) və LED qaranlığını (NoColor) təyin etmək üçün daha bir funksiya kimi bir çox funksiya var.

Və birbaşa prototip rutini ilə çağırılacaq daha bir funksiya var. Adı DoAndCountdown () dur.

Texniki cəhətdən belə bir funksiyanın istifadəsi məcburi deyil, amma bunu əlverişli hesab etdim. Üç arqumenti var:

  • LED rəngini təyin etmək üçün işarəçi (RedColor və ya GreenColor və s. Kimi)
  • Tərs sayğacın ilkin dəyəri: xüsusi prototip mərhələsində bu funksiyanın neçə dəfə çağırılmasının sayı.
  • Əks sayğac üçün göstərici. Rəngdə dəyişiklik olduqda, əks sayğac 0 -a bərabərdir, buna görə əvvəlcə iterasiya kodu həmin sayğaca ilkin dəyəri təyin edəcək. Hər təkrarlama sayğacının azaldılmasından sonra.

DoAndCountdown () funksiyası tərs sayğacın dəyərini qaytarır.

Addım 6: Proqramlaşdırma. Protothread Rutinləri

Proqramlaşdırma. Protothread Rutinləri
Proqramlaşdırma. Protothread Rutinləri

Və burada çərçivə nüvəsi var: prototip qaydası. Sadəlik naminə yalnız üç addımla məhdudlaşırıq: rəng dəyişikliyi QIRMIZI, YAŞIL və MAVİ.

Funksiya iki arqumentlə çağırılır:

  • Prototip quruluşuna işarə. Bu quruluş, əsas döngə başlamazdan əvvəl main tərəfindən başlatıldı.
  • Əks sayğac üçün göstərici. Əsas döngə başlamazdan əvvəl 0 tərəfindən əsas olaraq təyin edildi.

Sol LED -i aktiv etmək üçün funksiya gərginlikləri təyin edir və sonra prototip seqmentini işə salır. Bu seqment PT_BEGIN və PT_END makroları arasındadır. İçəridə bizim vəziyyətimizdə yalnız PT_WAIT_UNTIL makrolarını təkrarlayan bəzi kodlar var. Bu makrolar aşağıdakıları yerinə yetirir:

  • DoAndCountdown funksiyasının çağırılması. Xüsusi rəng yaymaq üçün LED katodlarında gərginliyi təyin edir.
  • 0 ilə müqayisədə nəticə qaytarılır. Şərt 'yalan' olarsa, prototip funksiyası dərhal geri qayıdır və əsas döngəyə nəzarət verir.
  • Növbəti dəfə prototip işə salındıqda, kodu PT_BEGIN -dən əvvəl yenidən yerinə yetirir, sonra son dəfə geri qaytardığı PT_WAIT_UNTIL makroların içərisinə atlayır.
  • DoAndCountdown nəticəsi 0 olana qədər bu cür hərəkətlər təkrarlanır. Bu halda geri dönüş yoxdur, proqram prototipdə qalır və kodun növbəti sətrini icra edir. Bizim vəziyyətimiz növbəti PT_WAIT_UNTIL -dır, amma ümumiyyətlə demək olar ki, hər hansı bir C kodu ola bilər.
  • İkinci PT_WAIT_UNTIL tərs sayğacın ilkin icrasında 0 olur, buna görə DoAndCountdown () proseduru onu ilkin dəyərə qoyur. İkinci makrolar, əks sayaç 0 -a çatana qədər yenidən 250 dəfə icra olunacaq.
  • Nəzarət PT_END makrolarına çatan kimi struktur pt vəziyyəti sıfırlanır. Növbəti dəfə prototip funksiyası işə salındıqda, PT_BEGIN -dən dərhal sonra kod sətri icra olunmağa başlayır.

Doğru LED üçün oxşar prototip rutini var. Nümunəmizdə, fərqli rəng sıralarını tətbiq edir, amma bunu tamamilə fərqli şəkildə edə bilsək: sol və sağ LED rejimi arasında sıx bir əlaqə yoxdur.

Addım 7: Daxili işlər

Daxili
Daxili

Bütün proqram 200 satırdan azdır (şərh və boş sətirlərlə) və Attiny85 kod yaddaşının 20% -dən azını tutur. Lazım gələrsə, burada daha bir neçə prototip qaydalarından istifadə etmək və onlara daha mürəkkəb məntiq təyin etmək mümkündür.

Protothreads kitabxanası kompüterin eyni vaxtda proqramlaşdırmasının ən sadə formasıdır. Eşzamanlı proqramlaşdırma, proqramı məntiqi hissələrə bölməyə imkan verən bir yanaşmadır: bəzən onlara koroutinlər, bəzən mövzu, bəzən vəzifələr deyilir. Prinsip budur ki, bu cür hər bir tapşırıq eyni az miqdarda xətti və digər hissələrdən asılı olmayaraq eyni prosessor gücünü paylaşa bilər. Məntiq baxımından tapşırıqlar eyni vaxtda icra oluna bilər.

İnkişaf etmiş sistemlər üçün bu cür vəzifələrin ya əməliyyat sistemi nüvəsi, ya da tərtibçi tərəfindən icra edilə bilən dilin iş vaxtı ilə yerinə yetirilməsi. Ancaq prototeklər tətbiq edildikdə proqramçı, vəzifə prosedurlarında prototeklər makro kitabxanasını istifadə edərək və bu cür rutinləri çağıraraq (adətən əsas döngədən kənarda) əl ilə idarə edir.

Yəqin ki, prototipin əslində necə işlədiyini bilmək istəyirsiniz? Sehr harada gizlidir? Prototeklər xüsusi C dil xüsusiyyətinə əsaslanır: C switch case ifadəsinin əgər və ya başqa bir bloka (zaman və ya kimi) daxil edilə biləcəyi faktı. Ətraflı məlumatı Adam Dunkels saytında tapa bilərsiniz

Bu layihənin elektronikası çox sadədir. Yuxarıdakı fotoşəkil sizə bir ipucu verir. Daha yaxşı edə biləcəyinizə əminəm.

Tövsiyə: