Mündəricat:

AVR Assembler Dərsliyi 9: 7 Addımlar
AVR Assembler Dərsliyi 9: 7 Addımlar

Video: AVR Assembler Dərsliyi 9: 7 Addımlar

Video: AVR Assembler Dərsliyi 9: 7 Addımlar
Video: LDmicro 1: Введение (программирование релейной логики ПЛК микроконтроллера с помощью LDmicro) 2024, Iyul
Anonim
AVR Assembler Dərsliyi 9
AVR Assembler Dərsliyi 9

Tutorial 9 -a xoş gəldiniz.

Bu gün ATmega328P və AVR montaj dil kodumuzdan istifadə edərək həm 7 seqmentli ekranı, həm də 4 rəqəmli ekranı necə idarə edəcəyimizi göstərəcəyik. Bunu edərkən, bağlamağımız lazım olan qeydlərin sayını azaltmaq üçün yığının necə istifadə olunacağına dair fikirlərimizi dəyişməliyik. Klaviaturamızdakı səs-küyü azaltmağa çalışmaq üçün bir neçə kondansatör (aşağı keçid filtri) əlavə edəcəyik. Bir neçə tranzistordan bir gərginlik gücləndiricisi yaradacağıq ki, INT0 kəsmə açarımız klaviaturanın alt sırasındakı aşağı gərginlik düymələri üçün daha yaxşı işləsin. İşin düzgün işləməsi üçün başımızı divara vuraraq düzgün müqavimət göstərməyə çalışacağıq.

Tutorial 7 -dən klaviatura istifadə edəcəyik

Bu dərsliyi etmək üçün standart şeylərə əlavə olaraq sizə lazım olacaq:

  1. 7 seqmentli ekran

    www.sparkfun.com/products/8546

  2. 4 rəqəmli ekran

    www.sparkfun.com/products/11407

  3. Bir düymə

    www.sparkfun.com/products/97

  4. Yuxarıda göstərilən əlaqəli səhifələrdən yüklənə bilən ekran üçün məlumat cədvəlləri.
  5. 68 pf seramik kondansatör, bir neçə 104 kondansatör, bir dəstə rezistor, iki 2N3904 NPN tranzistoru.

AVR montajçı dərslərimin tam kolleksiyasına bir link:

Addım 1: 7 seqrlik Ekranın naqilləri

7 seqmentlik Ekranın naqilləri
7 seqmentlik Ekranın naqilləri
7 seqmentlik Ekranın naqilləri
7 seqmentlik Ekranın naqilləri
7 seqmentlik Ekranın naqilləri
7 seqmentlik Ekranın naqilləri

7 seqmentli displeyə nəzarət etmək üçün Tutorial 7-də istifadə etdiyimiz kodu klaviatura üçün istifadə edəcəyik. Buna görə bunun bir nüsxəsini çıxarmalısınız və biz onu dəyişdirəcəyik.

Segmentləri mikro nəzarətçimizin pinlərinə aşağıdakı kimi xəritələyəcəyik:

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

burada seqmentlərin hərfləri ümumi 5V -ə uyğun olan pinout və ekranın aşağı sağındakı ondalık nöqtəsi (dp) daxil olmaqla LED seqmentlərinin hər biri ilə birlikdə göstərilmişdir. Bunun səbəbi budur ki, bütün nömrəni vahid bir reyestrə daxil edək və seqmentləri işıqlandırmaq üçün B və D limanlarına qeydiyyatdan keçək. Gördüyünüz kimi bitlər 0 -dan 7 -ə qədər ardıcıl olaraq nömrələnir və buna görə də ayrı -ayrı bitləri təyin etmədən və silmədən düzgün sancaqlar ilə xəritələnəcəklər.

Növbəti addımda əlavə etdiyimiz koddan görə biləcəyiniz kimi, ekran rejimimizi makroya köçürdük və gələcək Dərslikdə gələcək istifadə üçün SDA və SCL sancaqlarını azad etdik.

Əlavə etməliyəm ki, ekranın ümumi anodu ilə 5V ray arasında bir rezistor qoymalısınız. Həmişə olduğu kimi 330 ohm rezistor seçdim, amma istəsəniz, ekrandan qızarmadan maksimum parlaqlığı çıxarmaq üçün lazım olan minimum müqaviməti hesablaya bilərsiniz. Budur bunu necə etmək olar:

Əvvəlcə məlumat vərəqinə baxın və ilk səhifədə ekranın müxtəlif xüsusiyyətlərini verdiyinə diqqət yetirin. Əhəmiyyətli kəmiyyətlər "İrəli Cərəyan" (I_f = 20mA) və "İrəli Gərginlik" dir (V_f = 2.2V). Bunlar, cərəyanın irəli cərəyana bərabər olduğu təqdirdə ekrandakı gərginliyin azalmasını istədiyinizi söyləyir. Bu, ekranın qızartmadan alacağı maksimum cərəyandır. Nəticədə, seqmentlərdən çıxara biləcəyiniz maksimum parlaqlıqdır.

Maksimum parlaqlığı əldə etmək üçün ekranla birlikdə hansı minimum müqavimət göstərməli olduğumuzu anlamaq üçün Ohm qanunu və Kirchoff döngəsi qaydasından istifadə edək. Kirchoff qaydası, bir dövrədəki qapalı bir dövrə ətrafında dəyişən gərginliyin cəminin sıfıra bərabər olduğunu söyləyir və Ohm qanunu R müqavimətinin bir müqavimətində gerilim düşməsinin olduğunu bildirir: V = I R, burada I rezistordan axan cərəyandır.

Beləliklə, V bir qaynaq gərginliyi verildikdə və dövrəmiz ətrafında gəzdiyimizdə:

V - V_f - I R = 0

deməkdir (V - V_f)/I = R. Beləliklə, maksimum parlaqlığı əldə etmək üçün lazım olan müqavimət (və ehtimal ki, seqmentləri qızartmaq) olardı:

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

İstəyirsinizsə, narahat olmadan 150 ohmdan məmnuniyyətlə istifadə edə bilərsiniz. Ancaq düşünürəm ki, 140 ohm bəyəndiyim üçün çox parlaq edir və buna görə də 330 ohm istifadə edirəm (LEDlər üçün şəxsi Goldilocks müqavimətimdir)

Addım 2: Montaj Kodu və Video

Quraşdırma kodunu və klaviatura işini göstərən bir videonu ekrana əlavə etdim. Gördüyünüz kimi, Redial düyməsini "r", flash düyməsini "F", ulduz "A" və hash işarəsini "H" ilə müqayisə etdik. LCD ekranlarda və ya 4 rəqəmli ekranlarda nömrələr yazmaq üçün klaviaturadan istifadə etməyə davam etmək istəsəniz, geri çəkmək, daxil etmək və etməmək kimi müxtəlif əməliyyatlarla əlaqələndirilə bilər. Əvvəlki dərslərdə etdiyimizə çox oxşar olduğu üçün bu dəfə koddan keçməyəcəyəm. Fərqlər, fasilələr və baxma masaları kimi necə edəcəyimizi bildiyimiz eyni şeylərdən daha çoxdur. Yalnız kodu keçərək əlavə etdiyimiz yeni şeylərə və dəyişdirdiyimiz şeylərə baxmalı və oradan anlamalısınız. Növbəti dərslikdə AVR mikrokontrolörlərində montaj dili kodlaşdırmasının yeni aspektlərini təqdim etdikdə, sətir-sətir təhlilə qayıdacağıq.

İndi 4 rəqəmli ekrana baxaq.

Addım 3: 4 rəqəmli ekranı bağlayın

4 rəqəmli Ekranın naqilləri
4 rəqəmli Ekranın naqilləri
4 rəqəmli Ekranın naqilləri
4 rəqəmli Ekranın naqilləri

Məlumat cədvəlinə görə, 4 rəqəmli displey 60 mA İrəli Cərəyana və 2,2 volt irəli bir gərginliyə malikdir. Beləliklə, əvvəllər olduğu kimi eyni hesablama ilə istəsəm 47 ohm rezistordan istifadə edə bilərdim. Bunun əvəzinə bir… hrm istifadə edəcəm.. görüm… 330 ohm haqqında.

4 rəqəmli ekranın telli olması, hər bir rəqəm üçün 4 anodun olması və hər birində hansı seqmentin çıxacağını digər pinlərin idarə etməsidir. Eyni anda 4 rəqəm göstərə bilərsiniz, çünki çoxsaylıdır. Başqa sözlə desək, bir cüt zər üçün etdiyimiz kimi, hər bir anodun gücünü növbə ilə dövr edirik və bir -birinin ardınca yanıb sönəcək. Bunu o qədər sürətli edəcək ki, gözlərimiz yanıp sönənləri görməyəcək və dörd rəqəmin hamısı yanmış kimi görünəcək. Ancaq əmin olmaq üçün kodlaşdırma üsulumuz dörd rəqəmin hamısını təyin etməkdir, sonra anodları qurmaq, hərəkət etmək, qurmaq, hərəkət etmək və s..

Hələlik, bütün seqmentlərin işlədiyini sınayaq.

330 ohm rezistorunuzu çörək taxtanızın müsbət rayı ilə ekrandakı ilk anodun arasına qoyun. Məlumat cədvəli, pinlərin sol altdan başlayaraq saat əqrəbinin əksinə 1-dən 16-a qədər nömrələndiyini söyləyir (ekrana normal baxdığınız zaman.. altındakı ondalık nöqtələri ilə) və anodların pin nömrələri 6 olduğunu bildirir, 8, 9 və 12.

Beləliklə, pin 6 -ı 5V -ə bağlayırıq və sonra GND dəmir yolunuzdan mənfi bir qurğuşun götürürük və digər pinlərin hamısına yapışdırırıq və görürük ki, bütün seqmentlər ona uyğun gələn rəqəmdə yanır (əslində ikinci rəqəmdir) sağ). Yandırmaq üçün bütün 7 seqmenti və ondalık nöqtəni aldığınızdan əmin olun.

İndi seqmentlərdən birini işıqlandırmaq üçün GND telinizi sancaqlardan birinə yapışdırın və bu dəfə rezistoru digər 3 anoda köçürün və eyni seqmentin digər rəqəmlərin hər birində yandığını görün.

Qeyri -adi bir şey varmı?

Məlumat səhifəsindəki pinout səhv olduğu ortaya çıxdı. Bunun səbəbi, 12 pinli, 4 rəqəmli bir ekran üçün məlumat cədvəli və pinout olmasıdır. Yəni kolon və ya yuxarı onluq nöqtəsi olmayan biri. Sifariş verərkən aldığım ekran 16 pinli 4 rəqəmli ekrandır. Əslində, mənim üçün seqment anodları 1, 2, 6 və 8 sancaqdadır. Kolon anodu pin 4 (katot pin 12) və yuxarı dp anod pin 10 (katot pin 9)

Məşq 1: Ekrandakı hansı pimin hansı seqmentə və ondalık nöqtəyə uyğun olduğunu təyin etmək üçün müqavimətçinizdən və torpaq telinizdən istifadə edin ki, kodlaşdıranda düzgün seqmentləri işıqlandıraq.

Segment xəritəsini kodlaşdırmaq istədiyimiz üsul, yuxarıdakı tək rəqəmli 7 seqmentli ekranda etdiyimiz kimidir-koddakı bir şeyi dəyişdirmək məcburiyyətində deyilik, dəyişdiyimiz tək şey tellərin necə bağlanmasıdır. lövhədə. Mikro nəzarətçidəki düzgün port pinini 4 rəqəmli ekrandakı müvafiq pinə bağlayın ki, məsələn, PB0 yenə də a seqmentinə uyğun olan pinə, PB1 B seqmentinə və s.

Yalnız fərq, artıq 5V rayına gedə bilmədiyimiz üçün anodlar üçün 4 əlavə sancağa ehtiyacımız var. Şirəni hansı rəqəmin alacağına qərar vermək üçün mikro nəzarətçiyə ehtiyacımız var.

Beləliklə, 4 rəqəmin anodlarını idarə etmək üçün PC1, PC2, PC3 və PD4 istifadə edəcəyik.

Gedib telləri bağlaya bilərsiniz. (anod tellərindəki 330 ohm rezistorları unutmayın!)

Addım 4: 4 rəqəmli ekranın kodlaşdırılması

4 rəqəmli ekranın kodlaşdırılması
4 rəqəmli ekranın kodlaşdırılması

Bu ekranı necə kodlaşdırmaq istədiyimizi düşünək.

İstifadəçinin klaviatura düymələrini basmasını və hər düyməni basdıqda rəqəmlərin ardıcıl olaraq ekranda görünməsini istərdik. Buna görə 1 -i 2 -ni izləsəm ekranda 12 olaraq görünəcək. Mən də bu dəyəri 12 -ni daxili istifadə üçün saxlamaq istərdim amma buna bir az sonra çatacağıq. Hələlik sadəcə düymələrinizi götürən və onları göstərən yeni bir makro yazmaq istəyirəm. Ancaq yalnız 4 rəqəmimiz olduğundan, yalnız dörd rəqəm yazmağa imkan verdiyinə əmin olmaq istəyirəm.

Başqa bir məsələ, çoxpilləli 4 rəqəmli ekranın işləmə üsulu, anodları dövrə vurmaqdır ki, hər bir rəqəm yalnız bir saniyə ərzində yanar, sonra növbəti, sonra da nəhayət yenidən birinciyə qayıdır və s. Bunu kodlaşdırmaq üçün bir yol lazımdır.

Növbəti rəqəmi yazdığımız zaman "kursoru" sağa bir boşluq üzərinə köçürməsini də istəyirik. Beləliklə, məsələn 1234 yazmaq istəsəm, 1 yazdıqdan sonra, kursor hərəkət edəcək ki, yazdığım növbəti rəqəm növbəti 7-hissəli ekranda görünsün və s. Bütün bunlar baş verərkən, yazdıqlarımı görmək istəyirəm, buna görə rəqəmləri gəzmək və göstərmək lazımdır.

Uzun bir sifariş kimi səslənirsiniz?

Əslində işlər daha da pisdir. Göstərmək istədiyimiz 4 rəqəmin cari dəyərlərini saxlamaq üçün istifadə edə biləcəyimiz daha 4 ümumi təyinatlı reyestrə ehtiyacımız var (əgər onların arasından keçəcəyiksə, onları bir yerdə saxlamalıyıq) və bununla bağlı problem dəli kimi ümumi təyinatlı reyestrlərdən istifadə edirik və diqqət etməsək heç bir qalmayacaq. Bu problemi gec -tez həll etmək və yığını istifadə edərək qeydlərin necə boşaldılacağını göstərmək yaxşı bir fikirdir.

İşləri bir az sadələşdirməklə başlayaq, yığın istifadə edin və bəzi qeydləri boşaldın və sonra nömrələrimizi 4 rəqəmli ekranda oxumaq və göstərmək vəzifəsini yerinə yetirməyə çalışaq.

Addım 5: Popu itələyin

Push 'n Pop
Push 'n Pop

Əlimizdə olan bir neçə "Ümumi Məqsədli Qeydlər" var və istifadə edildikdən sonra artıq yoxdur. Buna görə də onları yalnız limanlardan və SRAM -dan oxumaq və yazmaq üçün lazım olan müvəqqəti yaddaş olaraq istifadə olunan bir neçə dəyişən üçün istifadə etmək yaxşı proqramlaşdırma təcrübəsidir və ya hər yerdə alt proqramlarda ehtiyacınız olacaq. onlara ad verin. Beləliklə, indi başladıqdan və Stack -dən istifadə etməyi öyrəndiyimizdən sonra etdiyim şey, kodu keçmək və yalnız bir alt proqramın içərisində istifadə olunan və ya kodun başqa heç bir yerində olmayan ümumi məqsədli qeydləri tapmaqdır. onları temp qeydlərimizdən biri ilə yığışdırıb itələyin. Daha doğrusu, kiçik mikrokontrollerlər üçün yazılmış koda baxsanız və ya bütün fişlərin daha kiçik olduğu vaxta qayıtsanız, hər şey üçün istifadə edilməli olan bir neçə ümumi təyinatlı qeyd görürsünüz. Orada bir dəyər saxla və başqa şeylər üçün bu reyestrə ehtiyac duyduğundan əmin ol. Beləliklə, kodun hər yerində pushin və poppin görəcəksiniz. Bəlkə də keçmiş günlərimizə hörmətli bir şükür olaraq AX və BX adlı ümumi təyinatlı qeydlərimizi qeyd etməliydim.

Bir nümunə bunu daha aydınlaşdırmağa kömək edəcək.

Diqqət yetirin ki, ADC_int -dən Analog -a tam çevrilmə zamanı ADCH dəyərini yükləmək üçün istifadə etdiyimiz buttonH adını verdiyimiz ümumi bir məqsədli reyestrdən istifadə edirik və onu analoqdan düyməyə basma dönüşümləri ilə müqayisə edirik. Yalnız bu düyməni istifadə edirikH qeydiyyatı ADC_int alt proqramında və başqa heç bir yerdə deyil. Bunun əvəzinə, hər hansı bir alt proqramda istifadə edə biləcəyimiz müvəqqəti bir dəyişən olaraq istifadə etdiyimiz temp2 -dən istifadə edəcəyik və dəyəri bu alt proqramdan kənar heç bir şeyə təsir etməyəcək (yəni ADC_int -də verdiyimiz dəyər heç bir yerdə istifadə olunmayacaq) başqa).

Başqa bir nümunə gecikmə makrosumuzdur. Gecikmə müddətimizi milisaniyələrdə ehtiva edən "milisaniyələr" adında bir reyestrimiz var. Bu vəziyyətdə bir makroda olur və xatırlayırıq ki, makronun işi, montajçı bütün makro kodu çağırıldığı proqramın yerinə qoymasıdır. Bu vəziyyətdə "milisaniyə" dəyişənindən qurtulmaq və onu müvəqqəti dəyişənlərimizdən biri ilə əvəz etmək istərdik. Bu vəziyyətdə, dəyişənin dəyərinin başqa bir yerə ehtiyac olsa belə, yığını istifadə edərək hələ də istifadə edə biləcəyimizi göstərmək üçün bunu bir az fərqli edəcəyəm. Millisekundlar əvəzinə "temp" istifadə edirik və temp dəyərini də istifadə edən digər şeyləri yıxmamaq üçün "gecikmə" makrosuna tempi yığına "itələməklə" başlayırıq, sonra istifadə edirik. milisaniyə əvəzinə, sonra makronun sonunda əvvəlki dəyərini yığından "atırıq".

Xalis nəticə, müvəqqəti istifadə üçün temp və temp2 -ni "borc götürdük" və bitirdikdən sonra əvvəlki dəyərlərinə qaytardıq.

Bu dəyişikliyi etdikdən sonra ADC_int ara vermə qaydası budur:

ADC_int:

itələmə temperaturu; tempi burada dəyişdirdiyimiz üçün temp2 -ə qənaət edin; temp2 saxlamaq lds temp2, ADCH; yük düyməsini basın ldi ZH, yüksək (2*ədəd) ldi ZL, aşağı (2*ədəd) cpi temp2, 0 geri dönmə; səs -küy tetikleyicileri 7segnumber setkeyini dəyişmirsə: lpm temp, Z+; cədvəldən yükləmə və artım clc cp temp2, temp; düyməni basaraq brlo PC+4 cədvəli ilə müqayisə edin; ADCH aşağıdırsa, yenidən cəhd edin lpm 7segnumber, Z; əks halda keyvalue cədvəli daxil olmaqla rəqəmi yükləyin; rjmp qaytarma rəqəmini artırın; və adi ZH: ZL, 1; artım Z rjmp setkey; və geri qayıt: pop temp2; temp 2 pop tempini bərpa edin; temp retini bərpa edin

Yığın necə işlədiyinə diqqət yetirin ki, ilk açılış son sondur. Bir kağız vərəqi kimi. İlk iki sətrimizdə tempin dəyərini yığına, sonra temp2 -ni yığının üzərinə yığıb, sonra alt proqramda başqa şeylər üçün istifadə etdiyimizi və nəhayət yenidən əvvəlki dəyərlərinə qaytardığımızı görürsünüz. əvvəlcə temp2 söndürülür (sonuncusu yığılanın üstündədir və geri atdığımız ilk olacaq) və sonra tempi çıxarıb.

Odur ki, bundan sonra həmişə bu üsuldan istifadə edəcəyik. Müvəqqəti dəyişəndən başqa bir şey üçün bir qeyd təyin edəcəyimiz yeganə vaxt, hər yerə ehtiyacımız olacağı vaxtdır. Məsələn, "daşqınlar" adlı qeyd, proqramın bir neçə fərqli yerində istifadə etdiyimiz bir kitabdır və buna görə də ona bir ad vermək istərdik. Əlbəttə ki, hələ temp və temp2 ilə etdiyimiz kimi istifadə edə bilərik, çünki bitdikdən sonra dəyərini bərpa edəcəyik. Ancaq bu, hər şeyi çox spaghettify edəcək. Adları bir səbəbdən verilmişdir və bu iş üçün artıq temp və temp2 təyin olunmuşuq.

Addım 6: Aşağı keçidli filtrlər və gərginlik gücləndiricisi

Aşağı keçid filtrləri və gərginlik gücləndiricisi
Aşağı keçid filtrləri və gərginlik gücləndiricisi
Aşağı keçid filtrləri və gərginlik gücləndiricisi
Aşağı keçid filtrləri və gərginlik gücləndiricisi

Səs-küyü bir az təmizləmək və klaviaturamızı daha yaxşı işlətmək üçün bir neçə aşağı keçidli filtr əlavə etmək istəyirik. Bunlar yüksək tezlikli səsləri süzür və aşağı tezlikli siqnalın keçməsinə imkan verir. Əslində bunu etmənin yolu, analoq girişimizlə topraklama arasında 68 pf kondansatör və PD4 (INT0) kəsmə ilə topraklama arasında 0.1 mikrofarad (yəni 104) kondansatör əlavə etməkdir. Klaviaturadakı düymələri basaraq bunlarla oynasanız nə etdiklərini görə biləcəksiniz.

Sonra bir gərginlik gücləndiricisi etmək istəyirik. Məlum olur ki, klaviaturadakı düymələrin alt sırası (eləcə də yenidən zəng düyməsi) INT0 kəsilməsini açmaq üçün çox aşağı bir gərginlik söndürür. Analog port, bu düymələrdən aşağı gərginliyi oxumaq üçün kifayət qədər həssasdır, lakin kəsmə pinimiz bu düymələri basdığımız zaman kəsmək üçün kifayət qədər yaxşı bir yüksəliş kənarına çatmır. Beləliklə, gözəl bir gərginliyin yüksələn kənarının PD4 -ə, amma eyni aşağı gərginliyin ADC0 -ə vurduğundan əmin olmaq üçün bir yol istərdik. Bu olduqca yüksək bir sifarişdir, çünki hər iki siqnal klaviaturamızın eyni çıxış telindən gəlir. Bunu etmək üçün bir çox mürəkkəb yollar var, amma bu dərsdən sonra klaviaturamızı artıq istifadə etməyəcəyik, buna görə işləyən bir metodu (çətinliklə) birləşdirək.

INT0 kəsilməsini əvəz etmək və klaviaturada bir düyməni basıb düyməni basaraq ekranı idarə etmək üçün əvvəlcə xarici bir düyməni bağlamalısınız. Bu daha az klaviatura probleminə malikdir və gərginliklərinizin klaviatura axtarış masasında düzgün qurulduğundan əmin olmağınıza imkan verəcəkdir. Klaviaturanın düzgün bir şəkildə bağlandığını bildikdən sonra düyməni qurtarın və INT0 kəsilməsini geri qoyun. Klaviaturanı bu şəkildə idarə edən bəzi ciddi səs -küy və gərginlik problemləri var, buna görə də gələcək problemlərin INT0 düyməsinə ayrılması üçün hər şeyin işlədiyini bilmək yaxşıdır.

Klaviatura və gərginlik gücləndiricinizə tel bağladığınız zaman, istifadə etdiyim rezistor dəyərlərinin işləməyəcəyi ehtimalı yüksəkdir. Sizin üçün faydalı olan dəyərləri əldə etmək üçün bir az təcrübə etməli olacaqsınız.

Bu addıma əlavə etdiyim diaqrama baxsanız, gərginlik gücləndiricisinin necə işlədiyini görəcəksiniz. Bəzi rezistorlardan və iki tranzistordan istifadə edirik. Transistorların işləmə üsulu (məlumat vərəqlərinə baxın!) Transistorun əsas pininə (orta pin) daxil etməli olduğunuz minimum gərginlikdir ki, onu doyuracaq və kollektor pimi ilə emitent arasında cərəyan axmasına imkan verəcəkdir. pin. Burada istifadə etdiyimiz 2N3904 tranzistoru vəziyyətində gərginlik 0.65V -dir. İndi bu gərginliyi klaviaturadan çıxışımızdan alırıq və bu çıxışı dəyişdirmək istəmirik, buna görə klaviatura çıxışı ilə ilk tranzistorun bazası arasında böyük bir rezistor qoyacağıq (1Mohm istifadə etdim). Bunu diaqramda R_1 olaraq qeyd etdim. Sonra bir gərginlik bölücü qurmaq istəyirik ki, tranzistorun əsası "demək olar ki" 0.65 volt olsun və yalnız bir az da olsa, onu yuxarıya itələsin və doyuracaq. Bir düyməni basdığımız zaman bu kiçik cazibə, klaviatura çıxışından gəlir. Klaviatura üzərindəki aşağı düymələr yalnız kiçik bir gərginliyi söndürdüyündən, kifayət qədər olması üçün doyma səviyyəsinə çox yaxın olmalıyıq. Gərginlik bölücü müqavimətçilərinə diaqramda R_a və R_b yazılır. R_a = 1Mohm və R_b = 560Kohm istifadə etdim, ancaq qurulmağınız üçün düzgün olmaq üçün bu ədədlərlə oynayacağınız demək olar ki, dəqiqdir. Yaxınlıqda başınızı vurmaq üçün bir divar və əlinizdə iki və ya üç stəkan skotç olmasını istəyə bilərsiniz (Laphroaig -ı tövsiyə edərdim - bahalı, amma tüstünü sevirsinizsə buna dəyər. Hər şey həqiqətən dəli olarsa, bir küpə götürün. BV və gecəyə yerləşin)

İndi tranzistorların INT0 düyməsinə girmək üçün gözəl bir yüksəliş əldə etməyimizi və düymə kəsilməsini necə yaratdığına baxaq. Əvvəlcə bir düyməni basmadığım zaman nə olacağına baxaq. Bu halda, ilk tranzistor (diaqramda T1 ilə qeyd olunur) sönür. Beləliklə, kollektor və emitör pinləri arasında heç bir cərəyan axmır. Beləliklə, digər tranzistorun (T2 etiketli) əsası yuxarı çəkiləcək və beləliklə, pinlər arasında cərəyan axmasına imkan verən doyacaq. Bu o deməkdir ki, T2 emitenti aşağıya doğru çəkiləcək, çünki özü torpağa bağlı olan kollektora bağlıdır. Beləliklə, INT0 düyməsini basma kəsmə pinimizə (PD4) gedən çıxış aşağı olacaq və heç bir fasilə olmayacaq.

İndi düyməni basanda nə olur? Yaxşı, onda T1 -in bazası 0.65V -dən yuxarı çıxır (aşağı düymələr vəziyyətində yalnız yuxarı qalxır!) Və sonra T2 -nin əsasını aşağı gərginliyə çəkəcək və bu T2 -ni bağlayacaq cərəyana icazə veriləcəkdir. Ancaq görürük ki, T2 söndürüldükdə, çıxış yüksək çəkilir və bu səbəbdən INT0 pinimizə gedən 5V siqnalı alacağıq və bu da kəsilməyə səbəb olacaq.

Burada xalis nəticənin nə olduğuna diqqət yetirin. 1 düyməsini bassaq, ADC0 -ə gedən çıxışı əhəmiyyətli dərəcədə dəyişmədən PD4 -ə 5V gedərik və daha da önəmlisi, Ulduz, 0, Hash və ya Yenidən Düyməni bassaq belə INT0 -a gedən 5V siqnalı alırıq. kəsilməyə səbəb olur! Bu vacibdir, çünki birbaşa klaviatura çıxışından INT0 pininə keçsək, bu düymələr demək olar ki, heç bir gərginlik yaratmır və bu kəsmə pinini işə salmaq üçün kifayət etməyəcəklər. Gərginlik gücləndiricimiz bu problemi həll etdi.

Addım 7: 4 rəqəmli Ekran Kodu və Video

Hamısı dərs 9 üçün! Əməliyyatı göstərən kodu və videonu əlavə etdim.

Analog klaviaturadan son dəfə istifadə edəcəyik (şükür Allaha). İstifadəsi çətin idi, ancaq analoq-rəqəmsal çevrilmə, analoq limanlar, kəsilmələr, çoxlama, səs-küy filtrləri, gərginlik gücləndiriciləri və axtarış cədvəllərindən taymer/sayğaclara qədər montaj kodlaşdırmasının bir çox aspektlərini öyrənməyimizdə çox faydalı idi. və s. Bu səbəbdən istifadə etməyə qərar verdik. (üstəlik, əşyaları yığmaq əyləncəlidir).

İndi yenidən ünsiyyətə baxacağıq və 7 seqmentimizi və 4 rəqəmli ekranlarımızı zar silindrimizdən qeyd analizatorumuzda olduğu kimi oxudum. Bu dəfə birlikdə sındırılmış mors kodu metodumuzdan çox iki telli interfeysdən istifadə edəcəyik.

Ünsiyyət qurduqdan və ekranlarda görünən rulonlardan sonra nəhayət son məhsulumuzun ilk hissəsini hazırlaya bilərik. Analog portların hamısı olmadan kodumuzun əhəmiyyətli dərəcədə qısalacağını və yəqin ki, daha asan oxunacağını görəcəksiniz.

Aranızda iddialı olanlar üçün. Bütün bu dərsləri bu nöqtəyə qədər keçmisinizsə, əlbəttə ki, bu anda edə biləcəyiniz biliklərə sahib ola biləcəyinizi sınaya biləcəyiniz bir "layihə" dir:

Layihə: Kalkulyator yaradın! 4 rəqəmli ekrandan və klaviatura düyməmizdən istifadə edin və "gir" düyməsi kimi işləyəcək xarici düyməni basın. Ulduz işarəsini "vaxtlar" a, təkrar yığmağı "artı" ya və flaşı "eksi" yə bölün və bütün mühəndislərin köhnə HP "tərs cilalı" hesablayıcılarından biri kimi işləyən bir kalkulyator qaydası yazın. günün əvvəlində. Yəni necə işlədikləri bir nömrəni daxil etməyiniz və "enter" düyməsini basmağınızdır. Bu, o nömrəni yığına itələyir, sonra ikinci bir rəqəm daxil edirsiniz və ikinci nömrəni yığının üzərinə itələyən "daxil edin" düyməsini basırsınız. Nəhayət, X, /, + və ya - kimi əməliyyatlardan birini basarsanız, bu əməliyyatı yığının üst iki rəqəminə tətbiq edəcək, nəticəni göstərəcək və nəticəni yığının üzərinə itələyəcəksiniz ki, yenidən istifadə edə bilərsiniz. kimi. Məsələn, 2+3 əlavə etmək üçün: 2, "daxil edin", 3, "daxil edin", "+" və ekranda daha sonra 5. Yığını, ekranı, klaviaturanı necə istifadə edəcəyinizi bilirsiniz. fon kodunun çoxu artıq yazılmışdır. Kalkulyator üçün lazım olan enter düyməsini və alt proqramları əlavə etmək kifayətdir. Əvvəlcə düşündüyünüzdən bir az daha mürəkkəbdir, amma əyləncəlidir və edə bilər.

Gələn dəfə görüşənədək!

Tövsiyə: