İçindekiler:
- Gereçler
- Adım 1: Devre
- 2. Adım: Zamanlama Şeması
- Adım 3: Programlama. Makrolar ve Tanımlar
- Adım 4: Programlama. Ana döngü
- Adım 5: Programlama. Yardımcı Fonksiyonlar
- Adım 6: Programlama. Protothread Rutinleri
- 7. Adım: Dahili
Video: Attiny85 Eşzamanlı Programlama veya Çok Renkli Gözlü Kabak: 7 Adım
2024 Yazar: John Day | [email protected]. Son düzenleme: 2024-01-30 13:17
Yazan jumbleviewJumbleview.infoTakip Yazar tarafından daha fazlası:
Hakkında: Bay Area (California) şirketlerinden birinde yazılım mühendisi olarak çalışıyorum. Ne zaman vaktim olsa mikro denetleyicileri programlamayı, mekanik oyuncaklar yapmayı ve bazı ev geliştirme projeleri yapmayı seviyorum. Jumbleview hakkında daha fazla bilgi »
Bu proje, iki adet 10 mm'lik üç renkli ortak anot LED'inin (Kabak Cadılar Bayramı Parıltısının çok renkli gözleri) Attiny85 çipi ile nasıl kontrol edileceğini gösterir. Projenin amacı, okuyucuyu eşzamanlı programlama sanatıyla ve Adam Dunkels protothreads kitaplığının kullanımıyla tanıştırmaktır. Bu proje, okuyucunun AVR 8-bit kontrolörleri bildiğini, bazı C-programları yazabileceğini ve Atmel stüdyosu ile biraz deneyime sahip olduğunu varsayar.
GitHub'da yayınlanan proje kodu:
Gereçler
Programlamadan önce yine de devreyi kurmanız gerekir. İşte bileşenler:
- Attiny85 denetleyicisi (herhangi bir elektronik tedarikçi).
- Ortak anotlu iki adet üç renkli 10mm LED. Adafruit LED'leri
- Dirençler 100 Ohm, 120 Ohm, 150 Ohm 0.125 veya 0.250 Wt (herhangi bir elektronik tedarikçisi).
- AVR ISP arayüzü için Altı Pin başlığı. Bu Adafruit başlığından yapılabilir
- Bazı ekmek tahtası veya baskılı şablon tahtası. Bunu kullandım
- AVR ISP MKII arayüzü ve Atmel Studio 6.1 (Sonraki sürüm de çalışmalıdır).
Adım 1: Devre
Tasarım beş çip pimi kullanır:
- Anotları kontrol etmek için kullanılan iki pim: her bir LED anot, özel pime bağlı.
- LED'lerin katotlarına bağlı üç pim (dirençler aracılığıyla) (aynı pime bağlı her bir ledin aynı renk katodu)
Biri şunu sorabilir: LED anotlar doğrudan +5 v'ye bağlanacak ve her katodun kendi özel pimi olacak şekilde neden çipin altı giriş/çıkış pininin hepsini kullanmıyorsunuz? Bu, programlamayı basit hale getirecektir. Ne yazık ki, bir sorun var: pin PB5 (RESET), ~20 mA'ya ihtiyaç duyulurken, akımın sadece ~2 mA'sını sağlayabilen zayıf bir pindir.
Elbette bu zayıf pin için transistör amplifikatörü yapılabilir ama ben kendim mümkün olduğunda kodu kullanarak sorunu çözmeyi tercih ederim.
2. Adım: Zamanlama Şeması
Zamanlama diyagramı, neyi programlamamız gerektiğini anlamamıza yardımcı olur.
Diyagramdaki en üstteki iki sıra, LED anotlarındaki voltaj değişimini gösterir. LED anotlarına bağlı pinlerdeki voltaj ~ 250 Hz frekansla salınır. Sol LED için bu voltaj salınımı, sağ LED'in salınımının tersidir. Anottaki voltaj yüksek olduğunda ilgili LED parlak olabilir. Düşük olduğunda ilgili LED karanlıktır. Bu, her LED'in 2 milisaniyelik aralıklarla parlak olabileceği ve 2 milisaniye daha karanlık olabileceği anlamına gelir. İnsan gözünün bir miktar ataleti olduğu için 250 Hz'lik yanıp sönme gözlemci tarafından fark edilmez. Diyagramın alt üç satırı LED'lerin katotlarına bağlı pinlerdeki voltaj değişimini gösterir. İlk diyagram sütununa bakalım. Sol LED'in kırmızı, sağ LED'in yeşil renkte olduğu durumu gösterir. Burada KIRMIZI katotlar sol anot yüksekken düşük kalır, YEŞİL katot sağ anot yüksekken düşük kalır ve MAVİ katot her zaman düşük kalır. Diyagramdaki diğer sütunlar, çeşitli renkler için katot ve anot voltajının kombinasyonlarını gösterir.
Gördüğümüz gibi pin durumu üzerinde karşılıklı bağımlılık vardır. Bazı çerçeve olmadan çözmek kolay olmazdı. İşte protothread library'nin kullanışlı olduğu yer burasıdır.
Adım 3: Programlama. Makrolar ve Tanımlar
Programlama adımlarındaki örnek, biraz basitleştirilmiş versiyonu temsil eder. Program kısaltılır ve bazı sembolik tanımlar açık sabitlerle değiştirilir.
En baştan başlayalım. Program, Atmel Studio ile gelen dosyaların yanı sıra protothread kitaplık başlığını içerir. Daha sonra pin seviyelerini manipüle etmek için iki makro ve pin sinyallerine mantıksal isimler vermek için bazı tanımlar vardır. Şimdiye kadar özel bir şey yok.
Adım 4: Programlama. Ana döngü
O zaman ana prosedürün neler içerdiğini görmek için sona bakalım.
Ana işlev, bazı başlatma işlemlerinden sonra sonsuza kadar döngüde kalır. Bu döngüde sonraki adımları yapar:
- Sol LED için protothread rutinini çağırır. Bazı pinlerin voltajını değiştirir.
- İki milisaniye gecikme yapın. Pin geriliminde bir değişiklik yok.
- Sağ LED için protothread'i çağırır. Bazı pin voltajını değiştirir.
- 2 MS gecikme yapın. Pin geriliminde bir değişiklik yok.
Adım 5: Programlama. Yardımcı Fonksiyonlar
Protothreadleri tartışmaya başlamadan önce bazı yardımcı fonksiyonlara bakmamız gerekiyor. İlk olarak, belirli bir rengi ayarlamak için işlevler vardır. Onlar basit. Desteklenen renk sayısı (yedi) gibi birçok işlev ve LED'i karanlık (NoColor) ayarlamak için bir işlev daha vardır.
Ve doğrudan protothread rutini tarafından çağrılacak bir fonksiyon daha var. Adı DoAndCountdown().
Teknik olarak böyle bir fonksiyonun kullanımı zorunlu değil ama ben uygun buldum. Üç argümanı var:
- LED rengini ayarlayan işleve yönelik işaretçi (RedColor veya GreenColor vb. gibi)
- Ters sayacın başlangıç değeri: belirli protothread aşamasında bu işlevin kaç kez çağrılması gerektiği.
- Sayacın tersine çevrilmesi için işaretçi. Renkte bir değişiklik olduğunda ters sayacın 0 olduğu varsayılır, bu nedenle ilk iterasyonda o sayaca başlangıç değeri atanır. Her yinelemeden sonra sayaç azaltılır.
DoAndCountdown() işlevi, ters sayacın değerini döndürür.
Adım 6: Programlama. Protothread Rutinleri
Ve işte çerçeve çekirdeği: protothread rutini. Basitlik adına örnek yalnızca üç adımla sınırlıdır: KIRMIZI, YEŞİL ve MAVİ renk değişimi için.
İşlev iki bağımsız değişkenle çağrılır:
- Protothread yapısına işaretçi. Bu yapı, ana döngü başlamadan önce ana tarafından başlatıldı.
- Sayacın tersine çevrilmesi için işaretçi. Ana döngü başlamadan önce ana tarafından 0'a ayarlandı.
Fonksiyon, sol LED'i aktif hale getirmek için voltajları ayarlar ve ardından protothread segmentini başlatır. Bu segment, PT_BEGIN ve PT_END makroları arasındadır. İçinde bizim durumumuzda sadece PT_WAIT_UNTIL makrolarını tekrarlayan bazı kodlar var. Bu makrolar aşağıdakileri gerçekleştirir:
- DoAndCountdown işlevinin çağrılması. Bu, belirli bir rengi yaymak için LED katotlarındaki voltajı ayarlar.
- 0 ile karşılaştırıldığında döndürülen sonuç. Eğer koşul 'yanlış' ise protothread işlevi hemen döner ve kontrolü ana döngüye verir.
- Protothread bir dahaki sefere çağrıldığında, PT_BEGIN'den önce kodu yeniden yürütür, ardından doğrudan son kez döndüğü PT_WAIT_UNTIL makrolarının içine atlar.
- Bu işlemler DoAndCountdown sonucu 0 olana kadar tekrarlanır. Bu durumda geri dönüş olmaz, program protothread'de kalır ve kodun sonraki satırını yürütür. Bizim durumumuzda bir sonraki PT_WAIT_UNTIL'dir, ancak genel olarak konuşursak, neredeyse herhangi bir C kodu olabilir.
- İkinci PT_WAIT_UNTIL ters sayacının ilk yürütülmesinde 0'dır, bu nedenle DoAndCountdown() prosedürü onu başlangıç değerine ayarlar. İkinci makrolar, ters dönüş sayacı 0'a ulaşana kadar 250 kez yürütülür.
- pt yapısının durumu, kontrol PT_END makrolarına ulaşır ulaşmaz sıfırlanır. Protothread işlevi bir dahaki sefere çağrıldığında, protothread segmenti PT_BEGIN'den hemen sonra kod satırını çalıştırmaya başladığında.
Sağ LED için benzer protothread rutini vardır. Örneğimizde sadece farklı renk düzenini zorunlu kılar, ancak bunu tamamen farklı şekilde yapabilirsek: sol ve sağ LED rutini arasında sıkı bir bağlantı yoktur.
7. Adım: Dahili
Tüm program 200 satırdan daha azdır (yorumlar ve boş satırlar ile) ve Attiny85 kod belleğinin %20'sinden daha azını alır. Gerekirse, burada birkaç tane daha protothread rutini kullanmak ve onlara çok daha karmaşık mantık atamak mümkündür.
Protothreads kitaplığı, bilgisayar eşzamanlı programlamanın en basit şeklidir. Eşzamanlı programlama, programı mantıksal parçalara ayırmaya izin veren bir yaklaşımdır: bazen eşyordamlar, bazen iş parçacığı, bazen görevler olarak adlandırılırlar. İlke, bu tür her bir görevin aynı işlemci gücünü paylaşırken, kodu az çok doğrusal ve diğer parçalardan bağımsız tutmasıdır. Mantıksal açıdan görevler aynı anda yürütülebilir.
Gelişmiş sistemler için, işletim sistemi çekirdeği veya derleyici tarafından yürütülebilir dosyaya gömülü dil çalışma zamanı tarafından gerçekleştirilen bu tür görevlerin kontrolleri. Ancak protothreads durumunda, uygulama programcısı, görev rutinlerinde protothreads makroları kitaplığını kullanarak ve bu tür rutinleri (genellikle ana döngü dışında) çağırarak manuel olarak kontrol eder.
Muhtemelen protothread'in gerçekte nasıl çalıştığını bilmek ister misiniz? Sihir nerede saklandı? Protothreads özel C dili özelliğine dayanır: C switch case ifadesinin if veya başka bir bloğa (while veya for gibi) gömülebileceği gerçeği. Ayrıntıları Adam Dunkels sitesinde bulabilirsiniz
Bu projenin elektronik iç kısımları çok basittir. Yukarıdaki fotoğraf size biraz ipucu veriyor. Eminim daha iyisini yapabilirsin.
Önerilen:
Çok Renkli Nokta Yazıcı: 6 Adım
Çok Renkli Nokta Yazıcı: Herkese merhaba. Bu talimat, Çok Renkli Noktalı Yazıcının tasarımı ve üretimi hakkındadır. Esas olarak, burada öğretilebilir olarak yayınlanmış olan benzer bir çalışmaya dayanıyordu. Bahsettiğim çalışma “Dotter: Huge Arduino Tabanlı Dot Matrix Pr
Müzik Reaktif Çok Renkli LED Işıklar - Arduino Ses Algılama Sensörü - RGB LED Şerit: 4 Adım
Müzik Reaktif Çok Renkli LED Işıklar | Arduino Ses Algılama Sensörü | RGB LED Şerit: Müzikle tepki veren çok renkli LED ışıklar projesi. Bu projede basit bir 5050 RGB LED şerit (Adreslenebilir LED WS2812 değil), Arduino ses algılama sensörü ve 12V adaptör kullanılmıştır
Çok Renkli Işık Boyacısı (Dokunmaya Duyarlı): 8 Adım (Resimlerle)
Çok Renkli Işık Boyacısı (Dokunmaya Duyarlı): Işıkla boyama, düşük deklanşör hızlarında özel efektler oluşturmak için kullanılan bir fotoğraf tekniğidir. "Boyamak" için genellikle bir el feneri kullanılır. görüntüler. Bu Eğitilebilir Kitapta, dokunuşla hepsi bir arada bir ışık ressamının nasıl oluşturulacağını göstereceğim
Hava Durumu ile Accu Çok Renkli LED Lamba: 6 Adım
Accu Hava Durumuna Sahip Çok Renkli LED Lamba: Sevgili Herkes, Wifi ile herhangi bir tarayıcı özellikli cihazla kontrol edilebilen Accu şarj edilebilir WS2812 LED lambalı bir proje var ve Apple Home Kit'e entegre edilebilir ve bunlar aracılığıyla kontrol edilebilirBazı özellikler:1. Entegre 2xAccu 18650 p
Çok Renkli LED'leri Kullanan Seri LED Işık: 3 Adım (Resimlerle)
Çok Renkli LED'leri Kullanan Seri LED Işık: Bir Seri LED ışığı o kadar pahalı değil ama benim gibi DIY sever (bir Hobi) iseniz o zaman kendi seri LED'lerinizi yapabilirsiniz ve piyasada bulunan ışıktan daha ucuzdur. Yani, Bugün I 5 Vol ile çalışan kendi Seri LED ışığımı yapacağım