İçindekiler:

AVR Assembler Eğitimi 9: 7 Adım
AVR Assembler Eğitimi 9: 7 Adım

Video: AVR Assembler Eğitimi 9: 7 Adım

Video: AVR Assembler Eğitimi 9: 7 Adım
Video: Getting started with AVR and Atmel Studio 7 2024, Temmuz
Anonim
AVR Assembler Eğitimi 9
AVR Assembler Eğitimi 9

Eğitim 9'a hoş geldiniz.

Bugün ATmega328P ve AVR montaj dili kodumuzu kullanarak hem 7 segmentli hem de 4 basamaklı bir ekranın nasıl kontrol edileceğini göstereceğiz. Bunu yaparken, bağlamamız gereken yazmaç sayısını azaltmak için yığının nasıl kullanılacağına dair sapmalar yapmamız gerekecek. Tuş takımımızdaki gürültüyü azaltmaya çalışmak için birkaç kapasitör (düşük geçişli filtreler) ekleyeceğiz. Birkaç transistörden bir voltaj yükseltici oluşturacağız, böylece INT0 kesme anahtarımız, tuş takımının alt sırasındaki düşük voltaj düğmeleri için daha iyi çalışır. Ve bu şeyin düzgün çalışması için doğru dirençleri almaya çalışırken biraz kafamızı duvara çarpacağız.

Tutorial 7'deki tuş takımımızı kullanacağız

Bu öğreticiyi yapmak için standart öğelere ek olarak şunlara ihtiyacınız olacak:

  1. 7 segmentli bir ekran

    www.sparkfun.com/products/8546

  2. 4 haneli ekran

    www.sparkfun.com/products/11407

  3. bir buton

    www.sparkfun.com/products/97

  4. Yukarıda bağlantılı ilgili sayfalarından indirilebilen ekran için veri sayfaları.
  5. 68 pf seramik kapasitör, birkaç 104 kapasitör, bir grup direnç, iki 2N3904 NPN transistör.

İşte AVR montajcı eğitimlerimin tam koleksiyonuna bir bağlantı:

Adım 1: 7 Segment Ekranın Kablolanması

7 segmentli Ekranın Kablolanması
7 segmentli Ekranın Kablolanması
7 segmentli Ekranın Kablolanması
7 segmentli Ekranın Kablolanması
7 segmentli Ekranın Kablolanması
7 segmentli Ekranın Kablolanması

Tutorial 7'de 7 segmentli ekranı kontrol etmek için keypad için kullandığımız kodun aynısını kullanacağız. Yani bunun bir kopyasını yapmanız gerekecek ve biz onu değiştireceğiz.

Segmentleri mikrodenetleyicimizin pinlerine aşağıdaki gibi eşleştireceğiz:

(dp, g, f, e, d, c, b, a) = (PD7, PD6, PB5, PB4, PB3, PB2, PB1, PB0)

Segmentlerin harfleri, ortak 5V'a karşılık gelen pin çıkışı ve ekranın sağ alt kısmındaki ondalık nokta (dp) dahil olmak üzere LED segmentlerinin her biri ile birlikte resimde gösterilir. Bunun nedeni, tüm sayıyı tek bir kayıt defterine girebilmemiz ve bölümleri aydınlatmak için B ve D bağlantı noktalarına kayıt yapan çıkış yapabilmemizdir. Gördüğünüz gibi, bitler sırayla 0'dan 7'ye kadar numaralandırılmıştır ve böylece tek tek bitleri ayarlamak ve temizlemek zorunda kalmadan doğru pinlere eşlenirler.

Bir sonraki adımda eklediğimiz kodda görebileceğiniz gibi, görüntüleme rutinimizi bir makroya taşıdık ve bir sonraki Eğitimde ileride kullanmak üzere SDA ve SCL pinlerini serbest bıraktık.

Ekranın ortak anodu ile 5V rayı arasına bir direnç koymanız gerektiğini de eklemeliyim. Her zamanki gibi 330 ohm'luk bir direnç seçtim, ancak isterseniz ekrandan maksimum parlaklığı elde etmek için gereken minimum direnci kızartmadan hesaplayabilirsiniz. Bunu nasıl yapacağınız aşağıda açıklanmıştır:

Önce veri sayfasına bakın ve ilk sayfada ekranın çeşitli özelliklerini verdiğine dikkat edin. Önemli büyüklükler "İleri Akım" (I_f = 20mA) ve "İleri Gerilim"dir (V_f = 2.2V). Bunlar, akım ileri akıma eşitse, ekrandaki voltaj düşüşünün olmasını istediğinizi söyler. Bu, ekranın kızartma yapmadan alacağı maksimum akımdır. Sonuç olarak, aynı zamanda segmentlerden alabileceğiniz maksimum parlaklıktır.

Öyleyse, maksimum parlaklığı elde etmek için ekrana seri olarak hangi minimum direnci koymamız gerektiğini bulmak için Ohm yasasını ve Kirchoff'un döngü kuralını kullanalım. Kirchoff'un kuralı, bir devredeki kapalı bir döngü etrafındaki voltaj değişikliklerinin toplamının sıfıra eşit olduğunu söyler ve Ohm yasası, R direncine sahip bir direnç üzerindeki voltaj düşüşünün şöyle olduğunu söyler: V = I R, burada I, dirençten geçen akımdır.

Yani bir V kaynak voltajı verildiğinde ve devremizin etrafında dolaşarak:

V - V_f - I R = 0

yani (V - V_f)/I = R. Yani maksimum parlaklığı elde etmek (ve muhtemelen bölümleri kızartmak) için gereken direnç:

R = (V - V_f)/I_f = (5.0V - 2.2V)/0.02A = 140 ohm

Yani isterseniz 150 ohm'u endişe etmeden mutlu bir şekilde kullanabilirsiniz. Ancak, 140 ohm'un sevdiğim için çok parlak olduğunu düşünüyorum ve bu yüzden 330 ohm kullanıyorum (bu, LED'ler için kişisel Goldilocks direncimdir)

2. Adım: Montaj Kodu ve Videosu

Montaj kodunu ve ekranlı tuş takımının çalışmasını gösteren bir video ekledim. Gördüğünüz gibi, Yeniden Ara tuşunu "r" ile, flaş tuşunu "F" ile, yıldız işaretini "A" ile ve kare işaretini "H" ile eşleştirdik. Bunlar, LCD ekranlara veya 4 haneli ekranlara sayıları yazmak için tuş takımını kullanmaya devam etmek istiyorsanız, geri al, gir ve ne-değil gibi çeşitli işlemlerle eşleştirilebilir. Daha önceki derslerde yaptığımıza çok benzer olduğu için bu sefer kodu satır satır incelemeyeceğim. Farklılıklar, esas olarak, kesmeler ve arama tabloları gibi nasıl yapılacağını zaten bildiğimiz şeylerden sadece daha fazlasıdır. Sadece kodu gözden geçirip eklediğimiz yeni şeylere ve değiştirdiğimiz şeylere bakmalı ve oradan çözmelisiniz. AVR mikrodenetleyicileri üzerinde montaj dili kodlamasının yeni yönlerini tanıttığımızda, sonraki eğitimde satır satır analize geri döneceğiz.

Şimdi 4 basamaklı bir ekrana bakalım.

Adım 3: 4 haneli Ekranı Kablolama

4 haneli Ekranı Kablolama
4 haneli Ekranı Kablolama
4 haneli Ekranı Kablolama
4 haneli Ekranı Kablolama

Veri sayfasına göre, 4 basamaklı ekran 60 mA İleri Akım ve 2,2 volt ileri voltaja sahiptir. Yani, daha önce yaptığım hesaplamayla, istersem 47 ohm'luk bir direnç kullanabilirim. Bunun yerine bir… hrm… bir bakayım… 330 ohm kullanacağım.

4 basamaklı ekranın kablolanma şekli, her basamak için bir tane olmak üzere 4 anot olması ve diğer pinlerin her birinde hangi segmentin geleceğini kontrol etmesidir. Çoğul oldukları için 4 haneyi aynı anda görüntüleyebilirsiniz. Başka bir deyişle, tıpkı bir çift zar için yaptığımız gibi, gücü her bir anottan sırayla geçiririz ve birbiri ardına yanıp söner. Bunu o kadar hızlı yapacak ki gözlerimiz yanıp sönmeyi görmeyecek ve dört rakamın hepsi açıkmış gibi görünecek. Ancak, emin olmak için, kodlayacağımız yol, dört basamağın tamamını ayarlamak, ardından anotları ayarlamak, taşımak, ayarlamak, taşımak vb. yerine anotları döndürmek olacaktır. Bu şekilde, her bir basamağı aydınlatmak arasında kesin bir zamanlama elde edebiliriz..

Şimdilik, segmentlerin hepsinin çalıştığını test edelim.

330 ohm'luk direncinizi, breadboard'unuzun pozitif rayı ile ekrandaki ilk anot arasına yerleştirin. Veri sayfası bize pinlerin sol alttan başlayarak saat yönünün tersine 1'den 16'ya kadar numaralandırıldığını söyler (ekrana normal olarak baktığınızda.. altta ondalık noktalarla) ve anotların pin numaraları 6 olduğunu belirtir., 8, 9 ve 12.

Böylece pim 6'yı 5V'a bağlarız ve ardından GND rayınızdan negatif bir uç alır ve diğer tüm pimlere sokarız ve tüm segmentlerin karşılık geldiği rakamda (aslında ikinci basamaktır) yandığını görürüz. doğru). 7 segmentin tümünü ve yanacak ondalık noktayı aldığınızdan emin olun.

Şimdi segmentlerden birini aydınlatmak için GND telinizi pinlerden birine yapıştırın ve bu sefer direnci diğer 3 anoda hareket ettirin ve diğer hanelerin her birinde aynı segmentin yandığını görün.

Olağandışı bir şey var mı?

Veri sayfasındaki pin çıkışının yanlış olduğu ortaya çıktı. Bunun nedeni, 12 pinli, 4 haneli bir ekran için veri sayfası ve pin çıkışı olmasıdır. yani iki nokta üst üste veya üst ondalık noktası olmayan biri. Sipariş ettiğimde aldığım ekran 16 pinli, 4 haneli bir ekran. Aslında benimkinde segment anotları 1, 2, 6 ve 8 numaralı pinlerdedir. Kolon anotu 4 numaralı pin (katot 12) ve üst dp anodu pin 10 (katot 9) pinidir.

Alıştırma 1: Ekranda hangi pinin hangi segmente ve ondalık basamağa karşılık geldiğini bulmak için direncinizi ve topraklama kablonuzu kullanın, böylece kodladığımızda doğru segmentleri aydınlatalım.

Segment haritasını kodlamak istediğimiz yol, yukarıdaki tek haneli 7 segmentli gösterimde yaptığımız gibidir -- kodda hiçbir şeyi değiştirmek zorunda değiliz, değiştirdiğimiz tek şey kabloların nasıl bağlandığıdır. gemide. Mikrodenetleyicideki doğru bağlantı noktası pimini 4 basamaklı ekrandaki ilgili pime takmanız yeterlidir, böylece örneğin PB0 hala segment a'ya karşılık gelen pime, PB1 segment B'ye gider, vb.

Tek fark, artık anotlar için 4 ekstra pime ihtiyacımız var, çünkü artık 5V rayına gidemiyoruz. Hangi basamağın suyu alacağına karar vermek için mikrodenetleyiciye ihtiyacımız var.

Bu yüzden 4 hanenin anotlarını kontrol etmek için PC1, PC2, PC3 ve PD4 kullanacağız.

Devam edip kabloları da takabilirsin. (anot kablolarındaki 330 ohm'luk dirençleri unutmayın!)

Adım 4: 4 basamaklı Ekranın Kodlanması

4 haneli Ekranın Kodlanması
4 haneli Ekranın Kodlanması

Şimdi bu ekranı nasıl kodlamak istediğimizi düşünelim.

Kullanıcının tuş takımı düğmelerine basmasını ve her düğmeye basarken sayıların ekranda sırayla görünmesini istiyoruz. Yani 1'e ve ardından 2'ye basarsam, ekranda 12 olarak görünecektir. Bu değeri, 12'yi dahili kullanım için de saklamak istiyorum ama buna biraz sonra geleceğiz. Şimdilik sadece tuşa basmalarınızı alan ve görüntüleyen yeni bir makro yazmak istiyorum. Ancak, sadece 4 rakamımız olduğu için, sadece dört rakam yazmanıza izin verdiğinden emin olmak istiyorum.

Diğer bir konu ise, çoğullanmış 4 basamaklı ekranın çalışma şekli, anotları döngüye almaktır, böylece her basamak bir sonrakini ve ardından sonrakini ve son olarak tekrar ilkini göstermeden önce yalnızca bir saniye açık kalır. Bunu kodlamanın bir yoluna ihtiyacım var.

Ayrıca bir sonraki basamağı yazarken "imleç"i bir boşluk sağa kaydırmasını istiyoruz. Yani örneğin 1234 yazmak istersem, 1'i yazdıktan sonra imleç hareket edecek, böylece yazdığım bir sonraki rakam bir sonraki 7-segment ekranda görünecek vb. Tüm bunlar olurken, hala yazdıklarımı görebilmek istiyorum, bu yüzden hala rakamlar arasında dolaşıp onları görüntülemesi gerekiyor.

Uzun bir emir gibi mi geliyor?

Aslında işler daha da kötü. Görüntülemek istediğimiz 4 basamağın mevcut değerlerini saklamak için kullanabileceğimiz 4 genel amaçlı kayıt defterine daha ihtiyacımız var (eğer bunlar arasında dolaşacaksak onları bir yerde saklamamız gerekiyor) ve bununla ilgili sorun şu ki deli gibi genel amaçlı kayıtlar kullanıyoruz ve eğer dikkat etmezsek hiç kalmayacağız. Bu nedenle, bu sorunu daha sonra değil, daha erken çözmek ve yığını kullanarak kayıtları nasıl serbest bırakacağınızı göstermek muhtemelen iyi bir fikirdir.

Öyleyse, işleri biraz basitleştirerek başlayalım, yığını kullanalım ve bazı kayıtları serbest bırakalım ve sonra 4 haneli ekranda sayılarımızı okuma ve gösterme görevini tamamlamaya çalışacağız.

Adım 5: Bas ve Pop

Bas ve Pop
Bas ve Pop

Elimizde sadece birkaç "Genel Amaçlı Kayıt" var ve bir kez kullanıldıklarında artık yoklar. Bu nedenle, bunları yalnızca okumanız ve bağlantı noktalarına ve SRAM'a yazmanız için ihtiyaç duyduğunuz geçici depolama olarak kullanılan veya diğer her yerde alt programlarda ihtiyaç duyacağınız birkaç değişken için kullanmak iyi bir programlama uygulamasıdır. onları adlandırın. Yaptığım şey, şimdi başlattığımıza ve Yığını kullanmayı öğrendiğimize göre, kodu gözden geçirmek ve yalnızca tek bir alt programda veya kesmede kullanılan ve kodda başka hiçbir yerde kullanılan adlandırılmış genel amaçlı kayıtları bulmak ve değiştirmek. onları geçici kayıtlarımızdan biri ve yığına bir itme ve açma ile. Aslında, daha küçük mikrodenetleyiciler için yazılmış koda bakarsanız veya tüm çiplerin daha küçük olduğu zamanlara geri dönerseniz, her şey için kullanılması gereken sadece birkaç genel amaçlı kayıt göreceksiniz, bu yüzden yapamazsınız. sadece orada bir değer saklayın ve başka şeyler için o kayda ihtiyacınız olduğundan emin olduğunuzdan onu yalnız bırakın. Böylece kodun her yerinde itme ve patlama göreceksiniz. Belki de geçici genel amaçlı kayıtlarımıza AX ve BX'i geçmiş günlere saygılı bir övgü olarak adlandırmalıydım.

Bir örnek bunu daha açık hale getirmeye yardımcı olacaktır.

Analogdan Dijitale dönüştürme tamamlama kesmesi ADC_int'te, ADCH değerini yüklemek için kullandığımız ve buttonH olarak adlandırdığımız genel amaçlı bir kayıt kullandığımıza ve bunu analogdan düğmeye basma dönüşümleri arama tablomuzla karşılaştırdığımıza dikkat edin. Bu buttonH kaydını yalnızca ADC_int alt yordamı içinde kullanıyoruz ve başka hiçbir yerde kullanmıyoruz. Bunun yerine, herhangi bir alt programda kullanabileceğimiz geçici bir değişken olarak kullandığımız temp2 değişkenimizi kullanacağız ve değeri bu alt program dışında hiçbir şeyi etkilemeyecektir (yani, ADC_int'te verdiğimiz değer hiçbir yerde kullanılmayacaktır). Başka).

Bir başka örnek de gecikme makromuzda. Milisaniye cinsinden gecikme süremizi içeren "milisaniye" adını verdiğimiz bir kaydımız var. Bu durumda, bir makrodadır ve makronun çalışma şeklinin, montajcının tüm makro kodunu programın çağrıldığı noktaya yerleştirmesi olduğunu hatırlıyoruz. Bu durumda "milisaniye" değişkeninden kurtulmak ve onu geçici değişkenlerimizden biriyle değiştirmek istiyoruz. Bu durumda, değişkenin değerine başka bir yerde ihtiyaç duyulsa bile yığını kullanarak nasıl kullanabileceğimizi size göstermek için biraz farklı yapacağım. Yani milisaniye yerine "temp" kullanıyoruz ve temp değerini de kullanan diğer şeyleri mahvetmemek için temp'i yığına "iterek" "gecikme" makrosuna başlıyoruz, sonra kullanıyoruz milisaniye yerine, ve sonra makronun sonunda, önceki değerini yığından geri "açarız".

Net sonuç, geçici kullanım için temp ve temp2'yi "ödünç aldık" ve işimiz bittiğinde bunları önceki değerlerine geri yükledik.

Bu değişikliği yaptıktan sonra ADC_int kesme yordamı:

ADC_int:

itme sıcaklığı; burada değiştirdiğimiz için temp'i kaydedin temp2'ye basın; temp2 lds temp2'yi kaydet, ADCH; tuşa basma ldi ZH, yüksek(2*sayı) ldi ZL, düşük(2*sayı) cpi temp2, 0 breq dönüş; gürültü tetikleyicileri 7segnumber setkey değişmezse: lpm temp, Z+; tablodan yükleme ve artış sonrası clc cp temp2, temp; tuşa basmayı brlo PC+4 tablosuyla karşılaştırın; ADCH daha düşükse, tekrar deneyin lpm 7segnumber, Z; aksi takdirde anahtar/değer tablosunu basamak olarak yükleyin; rjmp dönüş basamak sayısını artırın; ve adiw ZH:ZL, 1; artış Z rjmp setkey; ve başa dön dön: pop temp2; temp2 pop temp'i geri yükle; temp reti'yi geri yükle

Yığının çalışma şeklinin, ilk açmanın son kapalı olduğuna dikkat edin. Tıpkı bir kağıt yığını gibi. Görüyorsunuz ki ilk iki satırımızda temp değerini yığına itiyoruz, sonra temp2'yi yığına itiyoruz, sonra onları alt programda başka şeyler için kullanıyoruz ve son olarak onları tekrar eski değerlerine döndürüyoruz. ilk olarak temp2'yi patlatır (en son üzerine basıldığından, yığının en üstündedir ve ilk geri döndüğümüz olacaktır) ve ardından temp patlar.

O yüzden bundan sonra hep bu yöntemi kullanacağız. Temp değişkeninden başka bir şey için gerçekten bir register atayacağımız tek zaman, ona her yerde ihtiyaç duyacağımız zamandır. Örneğin, "overflows" adı verilen kayıt, programda birkaç farklı yerde kullandığımız bir kayıttır ve bu nedenle ona bir isim vermek istiyoruz. Tabii ki yine de temp ve temp2 ile yaptığımız gibi kullanabiliriz, çünkü işimiz bittikten sonra değerini geri yükleyeceğiz. Ama bu işleri çok fazla spagetti yapar. Bir sebepten dolayı adlandırılmışlar ve bu iş için önceden belirlenmiş temp ve temp2'ye sahibiz.

Adım 6: Alçak Geçiren Filtreler ve Voltaj Yükseltici

Alçak Geçiren Filtreler ve Voltaj Yükseltici
Alçak Geçiren Filtreler ve Voltaj Yükseltici
Alçak Geçiren Filtreler ve Voltaj Yükseltici
Alçak Geçiren Filtreler ve Voltaj Yükseltici

Gürültüyü biraz temizlemek ve tuş takımımızın daha iyi çalışmasını sağlamak için birkaç alçak geçiren filtre eklemek istiyoruz. Bunlar yüksek frekanslı gürültüyü filtreler ve düşük frekanslı sinyalin geçmesine izin verir. Esasen bunu yapmanın yolu, analog girişimiz ile toprak arasına 68 pf'lik bir kapasitör ve ayrıca PD4 (INT0) kesintimiz ile toprak arasına 0.1 mikrofarad (yani 104) bir kapasitör eklemektir. Tuş takımındaki düğmelere basarken bunlarla oynarsanız, ne yaptıklarını görebileceksiniz.

Sonra bir voltaj yükseltici yapmak istiyoruz. Tuş takımındaki alt sıradaki tuşlar (ve yeniden arama tuşu) INT0 kesintisini tetiklemek için çok düşük voltaj veriyor. Analog port, bu tuşlardan gelen düşük voltajları okuyacak kadar hassastır ancak kesme pinimiz, bu tuşlara bastığımızda kesintiye uğramak için yeterince iyi bir yükselen kenar almıyor. Bu nedenle, güzel bir voltajın yükselen kenarının PD4'e çarptığından, ancak aynı düşük voltajın ADC0'a çarptığından emin olmanın bir yolunu istiyoruz. Her iki sinyal de tuş takımımızın aynı çıkış kablosundan geldiği için bu oldukça uzun bir sipariş. Bunu yapmanın birkaç karmaşık yolu var, ancak bu eğitimden sonra artık tuş takımımızı kullanmayacağız, bu yüzden işe yarayan (zar zor) bir yöntemi bir araya getirelim.

INT0 kesmesini değiştirmek için önce harici bir düğme bağlamalı ve tuş takımında bir tuşu basılı tutup düğmeye tıklayarak ekranı kontrol etmelisiniz. Bunun daha az tuş takımı sorunu vardır ve voltajlarınızın tuş takımı arama tablosunda doğru ayarlandığından emin olmanızı sağlar. Tuş takımının doğru şekilde kablolandığını öğrendikten sonra düğmeden kurtulun ve INT0 kesmesini geri koyun. Tuş takımını bu şekilde kontrol eden bazı ciddi gürültü ve voltaj sorunları vardır, bu nedenle gelecekteki sorunların INT0 anahtarına izole edilebilmesi için her şeyin çalıştığını bilmek iyidir.

Tuş takımınızı ve voltaj yükselticinizi bağladığınızda, kullandığım direnç değerlerinin çalışmaması çok muhtemeldir. Bu nedenle, sizin için işe yarayan değerleri elde etmek için bazı deneyler yapmanız gerekecek.

Bu adıma eklediğim şemaya bakarsanız, voltaj yükselticinin nasıl çalışacağını göreceksiniz. Bazı dirençler ve iki transistör kullanıyoruz. Transistörlerin çalışma şekli (veri sayfalarına bakın!), transister üzerindeki taban pimine (orta pim) girmeniz gereken, onu doyuracak ve akımın kolektör pimi ile verici arasında akmasına izin verecek bir minimum voltaj vardır. toplu iğne. Burada kullandığımız 2N3904 transistör durumunda voltaj 0,65V'dir. Şimdi klavyeden çıkışımızdan bu voltajı alıyoruz ve bu çıkışı değiştirmek istemiyoruz, bu yüzden tuş takımından gelen çıkış ile ilk transistörün tabanı arasına büyük bir direnç koyacağız (1Mohm kullandım). Bunu şemada R_1 olarak etiketledim. Sonra bir voltaj bölücü kurmak istiyoruz, böylece transistörün tabanı zaten 0,65 voltta "neredeyse" olacak ve sadece ufacık bir ufacık biraz daha fazlası onu yukarı itecek ve doyuracak. Bu ufacık bit, bir düğmeye bastığımızda tuş takımının çıkışından gelecek. Tuş takımındaki alt tuşlar sadece küçük bir voltaj çıkardığından, yeterli olmaları için zaten doygunluğa çok yakın olmamız gerekiyor. Gerilim bölücü dirençler şemada R_a ve R_b olarak etiketlenmiştir. R_a = 1Mohm ve R_b = 560Kohm kullandım, ancak kurulumunuz için doğru olanı elde etmek için bu sayılarla oynamanız gerekeceği neredeyse kesin. Yakınınızda kafanızı çarpmak için bir duvar ve elinizde iki veya üç bardak viski olmasını isteyebilirsiniz (Laphroaig'i tavsiye ederim - pahalı, ama sigara içmeyi seviyorsanız buna değer. İşler gerçekten çılgına dönerse, o zaman bir sürahi alın. BV ve geceye yerleşmek)

Şimdi transistörlerin bize INT0 anahtarına giden güzel bir yükselen kenarı nasıl sağlayacağına ve tuşa basma kesmemizi oluşturacağına bakalım. Önce bir tuşa basmadığımda ne olduğuna bakalım. Bu durumda ilk transistör (şemada T1 olarak etiketlenmiştir) kapalıdır. Yani kollektör ve emiter pinleri arasında akım akmaz. Böylece diğer transistörün (T2 etiketli) tabanı yukarı çekilecek ve böylece akımın pinleri arasında akmasına izin verecek şekilde doyurulacaktır. Bu, T2'nin emitörünün, kendisi toprağa bağlı olan kollektöre bağlı olduğu için aşağı çekileceği anlamına gelir. Böylece INT0 tuşa basma kesme pinimize (PD4) giden çıkış düşük olacak ve herhangi bir kesinti olmayacaktır.

Şimdi bir tuşa bastığımda ne oluyor? O zaman T1'in tabanı 0,65V'nin üzerine çıkar (alt tuşlar durumunda sadece çok az üstüne çıkar!) ve sonra akımın akmasına izin verilir, bu da T2'nin tabanını düşük voltaja çeker ve bu T2'yi kapatır. Ancak T2 kapalıyken çıkışın yükseğe çekildiğini ve dolayısıyla INT0 pinimize giden 5V'luk bir sinyal alacağımızı ve kesintiye neden olacağını görüyoruz.

Net sonucun burada ne olduğuna dikkat edin. 1 tuşuna basarsak, ADC0'a giden çıkışı önemli ölçüde değiştirmeden PD4'e giden 5V alırız ve daha da önemlisi, Asterisk, 0, Hash veya Redial'e bassak bile, INT0'a giden bir 5V sinyali de alırız ve ayrıca kesintiye neden oluyor! Bu önemlidir, çünkü doğrudan tuş takımı çıkışından INT0 pinine gidersek, bu tuşlar neredeyse hiç voltaj üretmez ve bu kesme pinini tetiklemek için yeterli olmazlar. Voltaj yükselticimiz bu sorunu çözmüştür.

7. Adım: 4 haneli Görüntü Kodu ve Video

Hepsi bu, öğretici 9 için! Kodu ve işlemi gösteren bir video ekledim.

Bu, analog tuş takımını son kullanışımız olacak (şükürler olsun). Kullanımı zordu, ancak analogdan dijitale dönüştürme, analog bağlantı noktaları, kesintiler, çoğullama, gürültü filtreleri, voltaj yükselticileri ve montaj kodlamasının arama tablolarından zamanlayıcı/sayaçlara kadar birçok yönü hakkında bilgi edinmemize yardımcı olması açısından da çok yararlı oldu., vb. Bu yüzden kullanmaya karar verdik. (artı bir şeyleri temizlemek eğlencelidir).

Şimdi tekrar iletişime bakacağız ve 7-segmentli ve 4 haneli ekranlarımızı, register analizörümüzle yaptığımız gibi zar rulomuzdan zar rulolarımızı okutacağız. Bu sefer hacklenmiş mors kodu yöntemimiz yerine iki telli arayüzü kullanacağız.

İletişimler çalıştığında ve ekranlarda rulolar göründüğünde nihayet nihai ürünümüzün ilk parçasını yapabiliriz. Tüm analog bağlantı noktası öğeleri olmadan kodumuzun önemli ölçüde daha kısa olacağını ve muhtemelen okunması daha kolay olacağını fark edeceksiniz.

Hırslı olanlarınız için. Tüm bu öğreticilerden bu noktaya kadar geçtiyseniz, bu noktada kesinlikle yapacak bilgiye sahip olduğunuzu deneyebileceğiniz bir "proje" var:

Proje: Bir hesap makinesi yapın! 4 haneli ekranımızı ve tuş takımımızı kullanın ve "enter" tuşu gibi davranacak harici bir düğmeye basma ekleyin. Yıldız işaretini "kez" ile, yeniden aramayı "artı" ve flaşı "eksi" olarak "bölmek" için eşleyin ve tüm mühendislerin sahip olduğu eski HP "ters cila" hesaplayıcılarından biri gibi davranan bir hesap makinesi rutini yazın. gün içinde. yani çalışma şekli, bir sayı girip "enter" tuşuna basmanızdır. Bu, o numarayı yığına iter, ardından ikinci bir sayı girersiniz ve ikinci sayıyı yığına iten "enter" tuşuna basarsınız. Son olarak, X, /, + veya - gibi işlemlerden birine basarsınız ve bu işlemi yığındaki en üstteki iki sayıya uygular, sonucu görüntüler ve sonucu yığının üzerine iter, böylece tekrar kullanabilirsiniz. sevmek. Örneğin, 2+3'ü eklemek için şunları yaparsınız: 2, "enter", 3, "enter", "+" ve ardından ekran 5 okurdu. Yığını, ekranı, tuş takımını nasıl kullanacağınızı biliyorsunuz ve siz arka plan kodunun çoğu zaten yazılmış. Hesap makinesi için gerekli olan enter tuşunu ve alt rutinleri eklemeniz yeterlidir. İlk başta düşündüğünüzden biraz daha karmaşık, ancak eğlenceli ve yapılabilir.

Bir dahaki sefere görüşürüz!

Önerilen: