İçindekiler:

ATtiny2313 ile Okuma Anahtarları: 9 Adım
ATtiny2313 ile Okuma Anahtarları: 9 Adım

Video: ATtiny2313 ile Okuma Anahtarları: 9 Adım

Video: ATtiny2313 ile Okuma Anahtarları: 9 Adım
Video: Using Digispark Attiny85 Mini Arduino boards: Lesson 108 2024, Temmuz
Anonim
ATtiny2313 ile Anahtarları Okuma
ATtiny2313 ile Anahtarları Okuma

ATtiny2313 ve benzeri AVR cihazlarından gelen çıktılarla ilgilenen birkaç Instructables olmuştur. Örneğin, https://www.instructables.com/id/Ghetto-Programming%3a-Getting-started-with-AVR-micro/, https://www.instructables.com/id/Drive-a-Stepper- AVR-Mikroişlemcili Motor/. The Real Elliot'tan step motorların nasıl kontrol edileceğini gösteren en sonuncusu üzerinde çalışırken, aynı programda alternatif kod bölümlerini çalıştırabilmenin gerçekten yararlı olacağını buldum, böylece ATtiny2313'ü her birini yeniden programlamak zorunda kalmadım zaman küçük bir kod varyasyonu denemek istedim (yarım adım veya adımlayıcıyı ters yönde çalıştırmak gibi). Alternatif varyasyonların seçimine izin vermek için bir switch/case ifadesi kullanarak kod yazmak kolay olsa da, vakayı seçmenin bir yolu gereklidir. Bu, kasayı kontrol etmek için bir tür giriş cihazının okunması gerektiği anlamına gelir. Neyse ki ATtiny2313'te çok sayıda G/Ç pini vardır ve anahtarlardan girişleri okumak için iyi tasarlanmıştır. Bu Eğitilebilir Tablo, girdilerin nasıl okunacağını ve durumlarına göre kararların nasıl alınacağını gösterecektir. Bu tek başına oldukça sıkıcı bir Eğitilebilirlik oluşturacağından, ATtiny2313'ün zamanlayıcı/sayaç özelliğini küçük bir hoparlörü bip olarak kullanmak için kullanmanın basit bir yolunu açıklayacağım. Ayrıca basit hata ayıklama teknikleri hakkında küçük bir ara verilecektir.

Adım 1: Giriş Aygıtı

Giriş Aygıtı
Giriş Aygıtı
Giriş Aygıtı
Giriş Aygıtı

Bu Eğitilebilir Kitap, The Real Elliot'un mükemmel çalışmasına dayanır ve onun anlattığı ATtiny2313 Getto geliştirme sistemini kullanır. Atmel'in ATtiny2313 veri sayfası, tüm işlevler için nihai referanstır, ancak okunması kolay değildir. https://www.atmel.com/dyn/products/datasheets.asp?family_id=607 (Bağlantıda tüm AVR veri sayfaları vardır, 2313'ü bulun.) Şekilde basit bir giriş anahtarı seti gösterilmektedir. Bu sadece dört açma/kapama anahtarından oluşan bir pakettir; tek kutuplu, tek atışlı anahtarlar (SPST) olarak da bilinir. Tipik olarak, her anahtarın bir bağlantısı veya kutbu toprağa bağlanırken, diğer bağlantı bir akım sınırlama direnci (10K ya da öylesine) aracılığıyla yükseğe çekilir. Direnç ile direğe bir mikrodenetleyici girişi bağlanır. Anahtar açıksa, mikrodenetleyici girişi HI olarak okuyacaktır. Anahtar kapalıysa, mikrodenetleyici LO girişini okuyacaktır. Ayrıntılar için şemaya bakın. ATtiny2313, giriş olarak yapılandırıldıklarında G/Ç pinlerinde programlanabilir çekme dirençleri sağlayarak işleri basitleştirir. Bu, anahtarların bir kutbu toprağa (LO) ve diğer kutbu bir işlemci girişine bağlı olabileceği anlamına gelir. İlk örnek sadece iki anahtarı göstermektedir. Anahtarlar aşağıdaki kodla okunur ve yapılandırılır. Anahtarları giriş olarak yapılandırın: (Kod gerekmez; bu varsayılandır.) Çekme dirençlerini açın: PORTB = _BV(PB0) | _BV(PB1);Girişleri okuyun: but1 = ~PINB & 0x03; Doğru değeri elde etmek için ters çevirme ve maskeleme kullanımına dikkat edin.

2. Adım: Bir Sinyal için yanıp sönen ışıklar

Bir LED'i programlanabilir sayıda yanıp sönmek için bu iki anahtarı kullanacağız. Kullanacağımız LED'ler, The Real Elliot'ın meşhur ettiği yanıp sönen ışıklar olacak. 1 ve 2 anahtarları iki ikili basamak olarak ele alınacaktır, bu nedenle kombinasyon 0, 1, 2 ve 3 sayılarını temsil edebilir. Programımız iki anahtarı okuyacak ve LED'i uygun sayıda yanıp sönecek, ancak yalnızca anahtar varsa ayarlar değişti. Anahtarlar 500 milisaniye için geri döner (optimize edilmemiştir). Geri dönme algoritması oldukça basittir. Anahtarlar okunur ve okuma not edilir. OldBut değerinden (son kaydedilen değerden) farklı ise program 500 milisaniye geciktirilir ve anahtarlar tekrar okunur. Değer daha önce okunanla aynıysa, oldBut değeri güncellenecek ve LED, iki anahtarın ikili değerinin ima ettiği sayıda yanıp sönecektir. "Açık" olan bir anahtar LO yazdığından, değerin tersine çevrildiğine dikkat edin. Anahtarlar, daha fazla değişiklik için sürekli olarak taranacaktır. Lütfen yanıp sönen ışıklar hakkında daha fazla bilgi edinmek için The Real Elliot'un önceki Instructables'ına bakın. Zıplatma anahtarları hakkında daha fazla bilgi edinmek için bu https://www.ganssle.com/debouncing.pdf'ye bir göz atın. Bu örnek için ATtiny2313 kodu burada. Çalışma sırasında, bu program başlatıldığını göstermek için PB4 (fiziksel pin 8) üzerindeki LED'i iki kez yanıp sönecektir. Ardından, bir ve iki anahtarları okuyacak ve her değiştirildiğinde anahtar ayarına bağlı olarak bir ila üç kez yanıp sönecektir. Anahtarlar değişmediğinde, LED yavaş yanıp sönecektir. Bu kodu çalıştırmak için yeni bir dizin oluşturun (isterseniz "Basic" olarak adlandırın) ve aşağıdaki C kod dosyasını indirin ve içine dosya yapın. Makefile1.txt dosyasını yalnızca Makefile olarak yeniden adlandırın. WinAVR kullanarak programı derleyin ve ATtiny2313'ünüze yükleyin.

Adım 3: Hata Ayıklamada Küçük Bir Araya Girme

Eğer benim gibiyseniz (ve dünyadaki diğer tüm programcılar), dikkatli bir şekilde yazdığınız ve derlediğiniz "hatasız" kodun beklediğiniz şeyi yapmadığı zamanlar yaşamışsınızdır. Belki de hiçbir şey yapmıyor! Sorun nedir? Nasıl öğreneceksin? Neyse ki, işlerin yürümesi için birkaç yaklaşım var. (Hata ayıklama konusunu mükemmel bir şekilde ele almak için bu kitabı edinin. https://www.debuggingrules.com/) Mikrodenetleyici uygulamalarında hata ayıklama konusuyla ilgili birkaç basit öneri sunmak istiyorum. Birinci adım, bunun üzerine inşa etmektir. ne biliyorsun. Bir kez çalışmak için bir yanıp sönen ışık aldıysanız, programınızda nerede olduğunuzu görmek için tekrar kullanın. Programın başladığını belirtmek için LED'in iki kez yanıp sönmesini seviyorum. Bunu yapmak için kodu başlangıçta programınızın başlangıcında koyabilirsiniz. Donanımınızda hiçbir sorun olmadığını anladıktan sonra, yanıp sönmeyi yapacak bir işlev oluşturun. İşte kullandığım fonksiyon./*------------------------------------------ ------------------------------** flashEm - PD4 kullanarak LED'i yanıp sönme işlevi** PD4 bir çıkış olarak yapılandırılmalıdır. ** ------------------------------------------------ ---------------------*/void flashEm(uint8_t say){ while (sayım > 0){ PORTD = _BV(PD4); _delay_ms(1000); PORTD = ~_BV(PD4); _delay_ms(1000); saymak--; }}Artık bu işlevi, kodun o ana kadar yürüttüğünün bir işareti olarak kodunuzun çeşitli noktalarında kullanmak mümkündür. Kodun çalıştığını bilmek, hataları bulmak için çalışan ancak beklediğiniz şeyi yapmayan her bölümü dikkatlice inceleyebileceğiniz anlamına gelir. Her seferinde bir şeyi değiştirmek, hata ayıklama için de önemli bir tekniktir (yukarıdaki referansta açıklanmıştır). Bu klasik yöntem, "böl ve yönet" ile birlikte çalışır: adım adım işlevsellik eklemek için küçük adımlar atmak. Bu yavaş bir yaklaşım gibi görünebilir, ancak çalışmayan kodun büyük bir bölümünde aynı anda hata ayıklamaya çalışmak kadar yavaş değildir.

4. Adım: Daha Fazla Hata Ayıklama

Çoğu zaman bir kod bölümünü, içindeki satırların çoğunu atlayarak ve ardından her birinin çalıştığını doğrularken birer birer etkinleştirerek kontrol etmek istediğimizde. Genellikle bunu, atlamak istediğimiz satırları "yorumlayarak" yaparız. Bu tekniğin bir uzantısı, bir kod bloğunu kesip yapıştırmak, orijinali yorumlamak (böylece onu kaybetmemek) ve kopyayı kesmektir. C'nin satırları yorumlamanın dört kolay yolu vardır. Bir satırın önüne "//" koymak, o satırın yorumunu yapar. "/*" ve "*/" içine bir veya daha fazla satır eklemek, tüm bölümü yorumlayacaktır. Bu yöntemin etkili bir şekilde çalışması için, kod bloğunda (bitiş olandan başka) başka bir "*/" olmamalıdır. Bu nedenle, etkili bir disiplin, kod blokları içindeki yorumlar için // kullanmak ve /* */ yapısını yorum blokları ve kodun bölümlerini yorumlamak için ayırmaktır. Yorum yapmak için bloğun başına "#if 0" koymak ve bölümü "#endif" ile bitirmek. Bir bloğun başında "#ifdef (tanımlayıcı)" ve sonunda "#endif" kullanılarak daha seçici kontrol mümkündür. Bloğun derlenmesini istiyorsanız, programda daha önce "#define (tanımlayıcı)" kullanın. Alıntı işaretlerinin yalnızca vurgu amaçlı olduğunu ve dahil edilmeyeceğini unutmayın. Bu tekniklerin birleştirilmesi, ATtiny2313 programlarınızda hata ayıklamak için yararlı bir yaklaşım sağlamalıdır. Bu Eğitilebilir Tabloda ilerlerken bu araçları faydalı bulabilirsiniz.

Adım 5: Bip Sesleri için Zamanlayıcı/Sayaç 0'ı Kullanma

Bip Sesleri için Zamanlayıcı/Sayaç 0'ı Kullanma
Bip Sesleri için Zamanlayıcı/Sayaç 0'ı Kullanma

ATtiny2313'ün iki güçlü zamanlayıcı/sayıcı kaynağı vardır: bir 8-bit ve bir 16-bit. Bunlar frekans üreteçleri, değişken darbe genişliği modülasyon kontrolörleri ve çıkış karşılaştırma kayıtları olarak yapılandırılabilir. Bunların tam işlevselliği veri sayfasının 49 sayfasında açıklanmıştır. Ancak, basit bir durum kullanacağız. Yalnızca Zamanlayıcı/Sayaç 0 (8 bitlik olan) kullanılacaktır ve yalnızca bir frekans üreteci olarak kullanılacaktır. Frekans, bir bip sesi çıkarmak için küçük bir hoparlöre yönlendirilecektir. Zamanlayıcı/Sayaç 0, ATtiny2313 veri sayfasının 66 ila 83. sayfalarında tam olarak açıklanmıştır. Bu materyalin yakından okunması, Zaman/Sayaç 0'ın tam olarak anlaşılmasını sağlayacaktır. Neyse ki, oldukça basit bir mod olan Karşılaştırmada Zamanlayıcıyı Temizle (CTC), istediğimiz bip tonunu oluşturmak için gereken tek şey budur.

Kullanacağımız mod için Timer/Counter'ın çalışması basittir. Bir saat sinyali seçildiğinde, sayaç sıfırdan başlar ve her saat darbesini artırır. Sayaç değeri Çıkış Karşılaştırma Kaydı'ndaki (TOP) değere ulaştığında, sayaç sıfırlanır ve sayma yeniden başlar. Zamanlayıcı/Sayaç ile ilişkili çıkış biti, bir kare dalga çıkışı üretmek için değiştirilir. Bu, bir bip sesi çıkarmak için doğrudan bir ses dönüştürücüsünü çalıştırır. Küçük bir TDK Ses Dönüştürücü bip sesi çıkarır. Uygun bir birim Digikey 445-2530-ND, TDK SD1209T3-A1'dir (bunun erken bir versiyonunu kullandım). Bu 3 voltluk bir versiyondur; 5 volt versiyonu da beklediğim gibi çalışacak. Bunu doğrudan Attiny2313'ün çıkış portundan sürüyorum ve iyi çalışıyor gibi görünüyor. Sparkfun'un benzer bir cihazı var.

Adım 6: Zamanlayıcı/Sayacı Yapılandırma 0

CTC modu, Pin 2, Port B (fiziksel pin 14) üzerindeki OC0A çıkışını değiştirmek için kullanılabilir. Bu pinde çıkışı etkinleştirmek için DDRB uygun şekilde ayarlanmalıdır. Bunun için C kodu, yanıp sönen bir ışık için bir çıkış ayarlamak gibidir. DDRB = _BV(PB2); // Port B2 bir çıkıştır. Sonraki adım, bir saat sinyali sağlamak ve bir frekans olarak bir dalga formu üretmek için çıkış karşılaştırma kaydını yüklemektir. Ortaya çıkan frekansın denklemi veri sayfasında verilmiştir (sayfa 72). Denklemdeki terimler aşağıda açıklanacaktır. İşte denklem: fOC0A = fclk_I/O / 2*N*(1+OCR0A)Burada fOC0A:= çıkış frekansı fclk_I/O:= saat kaynağı frekansı N:= saat ön ölçek faktörü OCR0A:= çıkış karşılaştırma kaydındaki değer Zamanlayıcı/ Sayaç 0A. Clock Kaynak Frekansı, fclk_I/OBu sistem saatinin frekansıdır. Varsayılan değer 1MHz'dir. TCCR0B'nin CS00, CS01 ve CS02 bitleri bu seçimi kontrol eder. Bu bitler ayrıca N'nin değerini de seçtiğinden, aşağıda açıklanmıştır. Ön Ölçekleyici Değeri, NN, sistem saatini bölmek veya önceden ölçeklendirmek için kullanılan değerdir. TCCR0B'nin CS00, CS01 ve CS02 bitleri bu seçimi kontrol eder. ATtiny2313 veri sayfasının 81. sayfasındaki Tablo 41, kombinasyonları açıklar. 1kHz'e yakın bir frekans istendiğinden, TCCR0B'nin CS00 ve CS01 bitleri ayarlanacaktır. Her üç bitin de 0'a ayarlanmasının, böylece hiçbir saat kaynağının seçilmemesinin, çıkışı etkin bir şekilde durdurduğunu unutmayın. Bu, bip sesini başlatmak ve durdurmak için kullanılacak yöntemdir. ÜST Değer, OCR0ABu değer, Zamanlayıcı/Sayaç 0A için Çıkış Karşılaştırma Kaydı'na yüklenen sayacın ÜST değeridir. Bu değere ulaşıldığında, sayaç sıfırlanacak ve TOP'a ulaşılana kadar sayma tekrar başlayacak ve döngü tekrarlanacaktır. TOP kolayca değiştirilebilir, bu nedenle bipleyicinin frekansını değiştirmek kolaydır. 1 kHz'e yakın bir frekans istendiğinden, TOP 7'ye ayarlanır (Ön ölçekleyicinin 8'e ve TOP'un 63'e ayarlanabileceğini unutmayın. Aynı sonuç - sizin seçiminiz.) Çıkış Frekansı, fOC0AU çıkış frekansı sonuçlarını hesaplamak için denklemi kullanarak içinde: fOC0A = 1, 000, 000 / 2 * 64 * (1+7) fOC0A = 977HzYeterince yakın! Çıkış Karşılaştırma Kaydı ve Zamanlayıcı Sayacı Kontrol Kaydı 0B'yi yüklemek için gereken kod burada. Bunların nasıl kullanıldığını anlamak için lütfen gerçek program koduna bakın. OCR0A = 7; // Zaman Değeri TCCR0B = _BV(CS01) | _BV(CS00); // Dahili saat ve ön ölçeği seçin=8 TCCR0B = 0; // hiçbir saat kaynağı tonu kapatmaz Zaman/Sayaç Modunu Ayarlama Son bir detay olarak, Zamanlayıcı/Sayaç Kontrol Kaydı 0A'da uygun bitleri ayarlayarak istediğimiz Zamanlayıcı/Sayaç modunu belirteceğiz. CTC modu, veri sayfasının Tablo 40, 79. sayfasında açıklandığı gibi bit WGM01 ayarlanarak seçilir. Çıkışın her çevrimi değiştirmesini istediğimiz için, COM0A0 bitinin de Tablo 34 sayfa 77'de açıklandığı gibi ayarlanması gerekir. Kod şudur: TCCR0A = _BV(COM0A0) | _BV(WGM01); // CTC Geçiş Modu

7. Adım: Dört Anahtarı Kullanma

Bipleyiciyi uygularken, donanım ve yazılımımızı dört anahtarı işleyecek şekilde genişletelim. Zamanlayıcı Sayacı 0A'nın çıkışı Port B, pin 2'de olduğu için, Port B'ye sırayla daha fazla anahtar bağlayamayız. Port D'yi kullanmak kolay bir çözüm olabilir, ancak bu portu diğer işlevler için kullanılabilir tutalım (belki de step motor). Öyleyse, ek anahtarları PB3 ve PB4'e bağlayalım. Anahtarların okunması çoğunlukla değişmez. Maske değeri, bit 2'yi 5, 6 ve 7 ile birlikte maskelemek için 0x1B (00011011 ikili) olarak değiştirilir. 4 bitlik bir ikili sayı oluşturmak için bir başka numara daha kullanılır. Bit 3 ve 4'ü bir bit sağa kaydırın ve bunları 0 ve 1 bitleriyle 4 bitlik bir ikili sayı halinde birleştirin. Bu, bitleri kaydırmak ve birleştirmek için standart C sözdizimidir, ancak acemiler tarafından iyi bilinmeyebilir. but1a = (but1 & 0x03) | ((but1 & 0x18) >> 1); // but1'de anahtar okuma varÇalışmada, program iki kez yanıp sönecek ve başlatma sinyalini vermek için iki kez bip sesi çıkaracaktır. Anahtarlar her değiştirildiğinde, temsil ettikleri numara biplenir. Anahtarlar değişmediğinde LED yanıp sönecektir. Bu kodu çalıştırmak için yeni bir dizin oluşturun (isterseniz Beep olarak adlandırın) ve aşağıdaki C kod dosyasını indirin ve içine dosya yapın. Makefile2.txt dosyasını yalnızca Makefile olarak yeniden adlandırın. WinAVR kullanarak programı derleyin ve Attiny2313'ünüze yükleyin.

Adım 8: Switch/case Construct'ı kullanma

Son adım "sadece yazılım"dır: Söz verdiğimiz gibi, switch/case yapısını uygulayacağız. Bu örnek yalnızca iki alternatif eylemi gösterse de, birkaç alternatif kod bölümünden birini seçmek için bu yapının nasıl kullanılacağı çok açık olmalıdır. Çalışma sırasında bu program anahtarları izler ve eğer bir değişiklik varsa, tek ise uygun sayıda bip sesi çıkarır; sayı çift ise yanıp söner. Bir anahtar değişmediği sürece hiçbir şey yapmaz.

Bu kodu çalıştırmak için yeni bir dizin oluşturun (isterseniz Switch olarak adlandırın) ve aşağıdaki C kod dosyasını indirin ve içine dosya yapın. Makefile3.txt dosyasını yalnızca Makefile olarak yeniden adlandırın. WinAVR kullanarak programı derleyin ve Attiny2313'ünüze yükleyin.

9. Adım: Sonuç

Çözüm
Çözüm

İşte bu kadar! Artık, anahtarları okuyarak ve anahtar ayarına göre bir eylem seçerek programınızın yürütülmesini kontrol etmek için anahtarları nasıl kullanacağınızı biliyorsunuz. Ayrıca bir bip sesi oluşturmayı da biliyorsunuz ve bazı hata ayıklama stratejilerini de öğrendiniz.

Anlayıp anlamadığınızı test etmek istiyorsanız, son programı çift ise yüksek sesle bip, tekse düşük nota çalacak ve anahtarlarda herhangi bir değişiklik yoksa LED'i sürekli yanıp sönecek şekilde değiştirmeyi deneyin. Bakmak isteyebilirsiniz. yardım için hata ayıklama bölümüne geri dönün.

Önerilen: