İçindekiler:

Attiny85 Eşzamanlı Programlama veya Çok Renkli Gözlü Kabak: 7 Adım
Attiny85 Eşzamanlı Programlama veya Çok Renkli Gözlü Kabak: 7 Adım

Video: Attiny85 Eşzamanlı Programlama veya Çok Renkli Gözlü Kabak: 7 Adım

Video: Attiny85 Eşzamanlı Programlama veya Çok Renkli Gözlü Kabak: 7 Adım
Video: C ile Programlama #1: İşaretçiler (Pointers) 2024, Kasım
Anonim

Yazan jumbleviewJumbleview.infoTakip Yazar tarafından daha fazlası:

Çığlık
Çığlık
Çığlık
Çığlık
NiCd Pilin Harici Güç Kaynağıyla Değiştirilmesi
NiCd Pilin Harici Güç Kaynağıyla Değiştirilmesi
NiCd Pilin Harici Güç Kaynağı ile Değiştirilmesi
NiCd Pilin Harici Güç Kaynağı ile Değiştirilmesi
Dijital Kamera Kolu
Dijital Kamera Kolu
Dijital Kamera Kolu
Dijital Kamera Kolu

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

devre
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 Şeması
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. Makrolar ve Tanımlar
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ü

Programlama. Ana döngü
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

Programlama. Yardımcı Fonksiyonlar
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

Programlama. Protothread Rutinleri
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

Dahili
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: