Atmel AVR mikrokontrollerlərinin montaj dilində praktiki proqramlaşdırılması. (3-cü nəşr)

10.09.2021

Bir dəfə İnternetdə maraqlı bir video gördüm, o, mikrokontroller və 8x8 LED matrisində tətbiq olunan ilan oyunu nümayiş etdirdi, sonra məni maraqlandıran daha bir neçə oxşar video tapdım. Onların arasında Tetris oyununun "güclü" mikrokontrollerdə yığıldığı bir video da var idi. Baxdıqdan sonra mən PIC16F688 mikrokontrolleri və 8x16 piksel təsvir ölçülü oyun sahəsini göstərən iki LED matrisindən istifadə edərək hər iki oyunu birləşdirən cihazın öz versiyasını hazırlamaq qərarına gəldim.

Cihaz diaqramı aşağıda göstərilmişdir. Məlumat istifadə edərək dinamik rejimdə H1, H2 matrislərinə çıxarılır keçid registrləri DD2, DD3, DD4. DD2, DD3 mikrosxemlərinin çıxışları matrislərin anodlarına qoşulur. Hər iki matrisin katodları VT1-VT8 tranzistorlarının kollektorlarına qoşulur, onların idarəetmə siqnalları DD4 mikrosxemi tərəfindən yaradılır. Mikrokontroller məlumatları DD4 registrinə yükləyir, daşdıqda pin 9-dan məlumat DD3 registrinin girişinə, sonra eyni şəkildə DD2 registrinə ötürülür. Rezistorlar R1-R16 matris LEDləri vasitəsilə cərəyanı məhdudlaşdırır. R17-R23 rezistorları VT1-VT8 tranzistorlarının əsas cərəyanını təyin edir. Mikrokontroller daxili osilatordan 8 MHz tezliyində işləyir. Şəkil yeniləmə sürəti 100Hz-dir.


Güc tətbiq edildikdən sonra oyun sahəsində “İlan” oyun ekran qoruyucusu göstərilir. Sahənin yuxarı hissəsində 1 rəqəmi, aşağı hissəsində isə oyunun fraqmentinin təsviri var. SB5 “Start/Pause” düyməsini basdığınız zaman siz oyun menyusuna daxil olursunuz, onun yuxarı hissəsində oyun səviyyəsi 1-dən 9-a qədər rəqəmlər şəklində göstərilir. Oyun səviyyəsi SB1 “Yuxarı” ilə müəyyən edilir. düyməsini hər basdıqda səviyyə nömrəsi ardıcıl olaraq vahid artır. 9 rəqəmindən sonra yenidən 1 rəqəmi göstərilir. İlanın ilkin uzunluğu oyunun təyin olunmuş səviyyəsindən asılıdır, ona görə də 1-ci səviyyə üçün uzunluq 3 xal, 9-cu səviyyə üçün 11 xaldır. Menyunun aşağı hissəsində ilanın hərəkət sürəti haqqında məlumat göstərilir. 1 nömrə uyğun gəlir minimum sürət, və 9 rəqəmi maksimumdur. Sürət dəyəri oyun səviyyəsinin qurulmasına bənzər SB4 “Aşağı” düyməsi ilə təyin edilir. Menyuda sahənin perimetri ətrafında LED-lərin parıltısı sahənin perimetri ətrafında sərhədlərin olması ilə oyun rejiminin seçildiyini bildirir. Bu rejimdə ilan oyun sahəsini tərk etdikdə itki baş verir. Menyuda sahənin perimetri ətrafında LED-lər sönürsə, sərhədsiz rejim seçilir. Bu zaman oyun meydançasından çıxarkən meydançanın əks tərəfində ilanın başı görünür. Tələb olunan oyun rejimini qurmaq üçün SB2 “Sağ” və SB3 “Sol” düymələrindən istifadə edin. Oyun menyusuna ilk dəfə girdiyiniz zaman uzunluq və sürət dəyərləri birinə təyin edilir və sərhədləri olan rejim seçilir.

Oyun menyusundan “Start/Pause” düyməsini basdıqdan sonra oyun meydançasında əsas mövqeyində olan ilan və təsadüfi boş nöqtə göstərilir. “Yuxarı”, “Sol”, “Sağ” düymələrindən hər hansı birinə basmaq ilanın müvafiq istiqamətdə hərəkət etməsinə səbəb olur. Hərəkət başlayandan sonra ilanı idarə etmək üçün "Aşağı" düyməsi də əlçatan olur. İşıqlı bir nöqtəyə toxunduqda, ilanın uzunluğu artır. 14 xal topladıqdan sonra oyunun növbəti səviyyəsinə keçirsiniz. 9-cu səviyyədən sonra birinci səviyyəyə keçid var. İlan öz bədəninə dəyirsə və ya sərhəd rejimində oyun sahəsindən kənara çıxarsa, itki baş verir. 3 məğlubiyyətdən sonra siz cari oyun səviyyəsinin və sürətinin göstərildiyi oyun menyusuna qayıdırsınız. İlan hərəkət etməyə başladıqdan sonra siz “Start/Pause” düymələrinə basaraq oyunu dayandıra və davam etdirə bilərsiniz.

Oyun menyusundan çıxmaq üçün “Start/Pause” düyməsini 1 saniyə basıb saxlayın, bundan sonra oyun sahəsində oyun ekranı görünəcək. Oyunlar arasında keçid "Yuxarı", "Aşağı", "Sol", "Sağ" düymələrindən hər hansı birini sıxmaqla həyata keçirilir. Eyni zamanda, müvafiq oyunun açılış ekranı göstərilir.

Tetris oyun ekran qoruyucusunun yuxarı hissəsində 2 rəqəmi, aşağı hissəsində isə oyunun fraqmentinin təsviri var. "Başlat/Pauza" düyməsini basaraq oyun menyusuna keçin. Oyunçunun qazandığı xalların sayı menyunun yuxarı hissəsində göstərilir. Hər silinmiş xətt üçün xallar verilir. Nöqtə sayğacı 99-a qədər sayır, sonra sıfıra sıfırlanır və yenidən başlayır. Hər birinin əvvəlində yeni oyun, sayğac da sıfıra sıfırlanır. Menyunun aşağı hissəsində müvafiq olaraq "Yuxarı" və "Aşağı" düymələri ilə təyin olunan rəqəmlərin hərəkət sürəti haqqında məlumat göstərilir. Menyudan “Start/Pause” düyməsini basdıqdan sonra oyun başlayır, sahənin yuxarı hissəsində “Sol” və “Sağ” düymələri ilə müvafiq istiqamətdə hərəkət etdirilə bilən təsadüfi fiqurlar görünür. Yuxarı düyməsi hər dəfə basılanda formanı 90 dərəcə saat əqrəbinə çevirir. Aşağı düyməsini basıb saxlamaqla fiqurun hərəkətini sürətləndirə bilərsiniz. “Start/Pause” düyməsi sizə oyunu dayandırmağa və davam etdirməyə imkan verir. Yeni rəqəm oyun sahəsinə sığmayanda oyun başa çatır, bundan sonra o, oyunçunun topladığı xalların sayını görə biləcəyiniz menyuya keçir. Menyudan çıxmaq "İlan" oyununda olduğu kimi həyata keçirilir.

4 dəqiqə ərzində heç bir düyməyə basılmazsa, cihaz aşağı güc rejiminə keçir, mikrokontroller LED massivlərini söndürür və yuxu rejiminə keçir. Cihaz “Start” düyməsini basdıqdan sonra “oyanır” və əvvəlki vəziyyətinə qayıdır.

Cihaz səthə montaj üçün rezistorlardan istifadə edir - ölçüsü 1206. C2, C3 kondansatörləri keramikadır, ölçüsü 1206. LED matrisləri H1, H2 – LED diametri 3 mm və təsvir ölçüsü 8x8 piksel olan TOM-1088BG-B yaşıl rəng. Düymələr standart toxunma qabiliyyətinə malikdir.

Enerji mənbəyi 3,7-5V gərginlikli stabilləşdirilmiş enerji təchizatıdır, siz həmçinin galvanik elementlərdən və ya batareyalardan istifadə edə bilərsiniz, məsələn, ardıcıl olaraq qoşulmuş 3 1,5V AA və ya AAA batareyaları, məsələn mən 3 AA batareya istifadə edirəm. Təchizat gərginliyi 3,3V-ə endirildikdə, LED matrislərinin parlaqlığı azaldıqda cihaz işləməyə davam edir.

Hər kəsə axşamınız xeyir! “Assembler” adlı rahat dünyadan yayım edirəm. Dərhal aydınlaşdıracağam ki, mövzu AVR mikrokontrollerlərinə aiddir - və bu yazının assemblerdən başqa tapşırıq üçün istifadə etmək istəyənlər üçün faydalı olub-olmayacağını hələ bilmirəm. Məsələ burasındadır ki, sözün əsl mənasında bir neçə gün əvvəl mən assembleri sıfırdan öyrənməyə başladım - bir cihaz düzəltməliyəm - və hər şeyi özüm etmək qərarına gəldim. Beləliklə, bir gün bunu anladım assembler öyrənmək tamamilə faydasızdır! Assambleya dili yalnız başa düşülə bilər! Yəni, assembler dilində proqramlaşdırmaq istəyənlərin hamısına mikrokontrollerin FİZİKİ necə işlədiyini təfərrüatı ilə öyrənməyinizi, sonra isə əmrlərin incəliklərini öyrənməyinizi şiddətlə tövsiyə edirəm.
Beləliklə, yəqin ki, əvvəldən sizə deyəcəyim kiçik bir məqalə seriyasına başlayacağam necə dəqiq Assembly dili proqramlaşdırmada bəzi şeyləri başa düşdüm - düşünürəm ki, ASM-nin nə olduğunu ümumiyyətlə başa düşməyənlər üçün bu məsələdə çox yaxşı olanların dilindən belə bir "tərcüməçi" olacağam.

Dərhal deyim ki, mən bu mövzuya az-çox DIHALT-ın təşəbbüsü ilə daxil oldum - buna görə də bu məqalələr super-duper assembly-mikrokontroller dilindən əksər insanlar üçün başa düşülən dilə bir növ tərcümə olacaq. Yaxşı, ümid edirəm ki, gurular tamaşa irəlilədikcə məni düzəldəcəklər və birdən bir şeyi səhv izah etsəm, məni düzəldəcəklər.
Beləliklə, bir neçə gün əvvəl assembler haqqında verdiyim ilk nəticələr məni kökündən sarsıtdı - və mən 23: 00-dan səhər 5-ə qədər DI HALT məqalələrini oxudum - bundan sonra məmnuniyyətlə yatağa getdim və mahiyyətini anladım mikrokontrollerlər üçün montaj dili proqramlaşdırma.
Bunu daha sadə necə izah etmək olar? Məncə, biz mahiyyətdən başlamalıyıq.
***
Əvvəlcə texniki detallara girməyəcəyik (bunlar haqqında növbəti məqalədə danışacağıq) - sadəcə 3 simvol olduğunu təsəvvür edin:
1. Mikrokontroller - Bu, ruslara gələn ingilis Stivdir. O, mükəmməl bilir İngilis dili, amma rus dilini ümumiyyətlə başa düşmür - bir kəlmə də yoxdur. Yalnız ingilis dili. O, mübahisəni uduzdu və rusun ondan soruşduğu hər şeyi sorğu-sualsız yerinə yetirəcəyinə söz verdi.
2. Montajçı - Bu, anası ingilis, atası rus olan tərcüməçi Vasyadır. O, həm ingilis, həm də rus dillərini mükəmməl bilir.
3.Biz - Bu, bir ingilisin gəldiyi bir rusdur. Yaxşı, yəni biz özümüz =) Eyni zamanda rus dilini mükəmməl bilirik və (!!!) bir az ingiliscə - bir az, lüğətlə.
***
Bu vəziyyəti təsəvvür edin - bir ingilis otağınızda stulda oturur. Və siz kompüterinizdə oturub bu yazını oxuyursunuz, birdən pəncərəniz qəfil açıldı! Bu bədbəxtlikdir! Külək əsir, pərdə yelkənə çevrilib... Bağlamaq yaxşı olardı! Ancaq stuldan qalxmaq, ayaqlarınızı sistem blokundan götürmək, başmaqlara doldurmaq, qəhvə (pivə) fincanınızı yerə qoymaq və elementlərlə mübarizə aparmaq çox tənbəllikdir. Və sonra birdən başa düşürsən ki, otaqda mərcini itirmiş bir ingilis var və onu təqib etmək vaxtıdır! Və sən ona o qədər şirin deyirsən ki, “Dostum! Zəhmət olmasa pəncərəni bağlayın, sonra yenidən stulda əyləşə bilərsiniz!” və oturur, çaşqın halda sənə baxır və heç nə etmir! Əlbətdə ki, kələm şorbasını vura bilərsiniz - amma sonra yenə də sizi başa düşməyəcək! Sonra tərcüməçi dostunuz Vasilini çağırırsınız - o, gəlib ingilisin yanında stulda əyləşir. Və deyirsən - Tərcümə et: "Stiv, get pəncərəni bağla, sonra stulda otur!" Tərcüməçi ingilis dilinə tərcümə edir - ingilis başa düşür və gedib pəncərəni bağlayır, sonra gəlib stulda oturur.
Bu nöqtədə sadəcə bu "Biz-Assembler-Nəzarətçi" zəncirində assemblerin rolunu başa düşməlisiniz.
Yəni, hamı assemblerin nə olduğunu necə başa düşəcək? Sonra oxuyun.
***

Beləliklə, bu vəziyyəti təsəvvür edək. Siz Vasyaya deyirsiniz - "Qulaq as, yaxşı, bir sözlə, belədir - mən evdə kalkulyatoru unutmuşam, 56983-ü 2-yə bölün və Stivə yumruqlarınızla bu qədər təkan verməsini söyləyin" və Vasya kalkulyatorda hesablayır və Stivə ingiliscə deyir: “28491 dəfə yumruqlarınızla təkan qaldırın” Bu adlanır "DİREKTİV"- başqa sözlə, direktiv Vasya üçün bir tapşırıqdır, nəticəsi Stivin hərəkətidir.

Başqa bir vəziyyət də var - siz Vasyaya “Stivə 28491 təkan qaldırmasını deyin” deyirsiniz və Vasya sadəcə olaraq sözlərinizi ingilis dilinə tərcümə edir. Bu adlanır OPERATOR

Bu sadədir - bir direktiv var və bir operator var. Operator sizin Stivə nə edəcəyinizi birbaşa göstərişinizdir - Vasya burada sorğunuzu yalnız ingilis dilinə tərcümə edir. Direktiv Vasyanın özü üçün bir tapşırıqdır - və Vasya əvvəlcə ona dediyinizi edir, sonra nəticədən asılı olaraq Stivə nəsə deyir.

İndi ingilisə müntəzəm olaraq işgəncə verəcəyik! Ancaq əvvəlcə tərcüməçimiz Vasyanı daha yaxından tanımaq lazımdır. Aşağıdakıları bilmək lazımdır - Vasya həmişə sizə sözsüz itaət edir - ona deyilənləri edir. Vasyanın kalkulyatorunda onluq yerlər yoxdur - nümunəyə təkanlarla baxırsınızsa, onda 56983 \ 2 = 28491.5 - ancaq ondalık nöqtə kəsildikdən sonra Vasyanın hər şeyi var - və o, yalnız tam ədəd görür - və bunun əhəmiyyəti yoxdur. 28491.000001 və ya 28491.9999999 olacaq - Vasya üçün bu, hər iki halda 28491 olacaq. Heç bir şey yuvarlaqlaşdırılmır. Daha çox mühüm məlumat Vasya haqqında. Vasya qəddardır - Stivin iyirmi səkkiz min dəfə təkan qaldırması ona əhəmiyyət vermir. Ona Vasyanın tərcümə etdiyini dedilər. Və nəinki tərcümə etdi, həm də məni sizin istəyinizə əməl etməyə məcbur etdi. Beləliklə, əgər Stiv iyirmi üç min beş yüz on üçüncü təkanda ölürsə, bu, tamamilə sizin günahınız olacaq.

Əslində, hələlik bu qədər. Növbəti yazıda daha da dərinləşəcəyik - hələlik bunu başa düşmək kifayətdir. Sadəcə bu vəziyyəti təsəvvür edin və nəyin nə olduğunu, kimin hansı rolu oynadığını və direktivin operatordan nə ilə fərqləndiyini anlayın.
Və sonra biz hər şeyi öz adı ilə çağırmağa çalışacağıq və assemblerin böyüklər kimi mikrokontrollerlə necə işlədiyini təxmini təxmin edəcəyik.


Beləliklə, ümid edirəm ki, vicdanlı oxucu artıq bir proqramçı, eksperimental lövhə toplayıb, həmçinin tələb olunan proqram təminatını quraşdırıb konfiqurasiya edib.

İndi seriyadakı ilk məqaləni yazdıqdan sonra başa düşürəm ki, bir az həyəcanlandım və "yeni başlayanlar üçün" ifadəsini qoyaraq sələflərim kimi eyni səhvi etdim. “Assembly dili proqramlaşdırmasına yeni başlayanlar üçün” mövzusunu formalaşdırmaq daha doğru olardı, yəni mən hesab edirəm ki, oxucu artıq mikrokontrolörün nə olduğu barədə ən azı səthi anlayışa malikdir, əks halda bu, bizə çox vaxt aparacaq. bu mövzu ilə tanış olun. Onlarla heç tanış olmayanlar üçün S. Ryumikin tamamilə gözəl məqalə silsiləsi tövsiyə edə bilərəm, mənim fikrimcə " AVR mikro nəzarətçiləri", Radioamator jurnalında dərc edilmişdir (2005-ci il üçün № 1-11). Bu dövrədə ATmega8 əsas nəzarətçi kimi seçilmişdir, lakin ümumi funksional vahidlər Yuxarıdakı nəzarətçi və ATtiny13 praktiki olaraq eynidir.

ATtiny13 mikro nəzarət cihazı ilə birbaşa tanış olmaq üçün A.V.-nin kitabını tövsiyə edirəm. Evstifeev "Kiçik ailənin AVR mikrokontrolleri. İstifadəçi təlimatı" (M.: "Dodeka-XXI" nəşriyyatı, 2007. - 432 s.). O, kiçik ailənin bütün nəzarətçiləri üçün tərcümə edilmiş və sistemləşdirilmiş məlumat cədvəllərini ehtiva edir və mənim fikrimcə, mikrokontrollerlərin proqramlaşdırılması ilə məşğul olanlar üçün iş masası istinadı olmalıdır.

Bununla belə, hekayə irəlilədikcə, yazılı proqramlarda istifadə ediləcək nəzarətçinin həmin qovşaqları və modulları haqqında bəzi məlumatlar verəcəyəm.

Amma bütün bunlar lirik bir kənarlaşmadır. Gəlin birbaşa hekayəyə qayıdaq.

ATtiny13 nəzarətçi, kiçik ölçülərinə baxmayaraq, çox yaxşı funksional xüsusiyyətlərə malikdir. Və az sayda sancaqlar, onların hər birinin yerinə yetirdiyi funksiyaların sayından daha çox kompensasiya olunur. Sancaqların pinout və təsviri aşağıda təqdim olunur:

Cədvəl A.V.-nin yuxarıda qeyd etdiyimiz kitabından götürülmüşdür. Evstifeeva.

Gördüyünüz kimi, hər bir pin ən azı üç və ya daha çox funksiyanı yerinə yetirə bilər. Əvvəlcə alternativ funksiyaları deyil, yalnız əsas olanı - rəqəmsal giriş/çıxışı nəzərdən keçirəcəyik.

Şəkildən və cədvəldən göründüyü kimi, güc sancaqları istisna olmaqla, bütün sancaqlar PB adı və sonra seriya nömrəsinə malikdir. Bu nə deməkdir? Bütün nəzarətçi pinləri onlarla işləmək rahatlığı üçün 8 hissəyə birləşdirilib və 8 pindən ibarət hər qrupa üç xüsusi giriş/çıxış registrləri ayrılıb. Ümumiyyətlə, registrlər anlayışı nəzarətçilərlə işləyərkən, xüsusən assemblerdə əsasdır. Yuxarıda qeyd olunan üç registrdən hər birinə daha yaxından nəzər salaq. Onların hamısı nəzarətçi yaddaşında bir baytlıq hüceyrələrdir. Hər bir bit nəzarətçi çıxışlarından birinə uyğun gəlir və registrdəki bit nömrəsi çıxış nömrəsi ilə üst-üstə düşür (məsələn, 0-cı bit PB0 çıxışına, 1-ci bit PB1 çıxışına cavabdehdir və s.). Bütün registrlərin öz adları var, proqramların yazılması zamanı onlara daxil olurlar. Bunlar hansı adlardır?

1. DDRB reyestri hər bir nəzarətçi pininin məlumat ötürülməsi istiqamətinə cavabdehdir. Bu registrin hər hansı biti “0” olarsa, müvafiq çıxış giriş, “1” olarsa, çıxış olacaqdır. Üstəlik, hər bir çıxış fərdi olaraq və proqramın istənilən yerində konfiqurasiya edilir. Bu o deməkdir ki, müxtəlif şəraitlərdə və ya müxtəlif vaxtlarda eyni pin digər pinlərdən asılı olmayaraq giriş və ya çıxış kimi konfiqurasiya edilə bilər.

2. PINB registrində bütün pinlərin cari vəziyyəti var: əgər pinə gərginlik verilirsə, onda müvafiq bitə məntiqi “1” yazılır, əgər gərginlik yoxdursa, məntiqi “0” yazılır; Bu registr əsasən giriş rejimində olan pin vəziyyətini oxumaq üçün istifadə olunur.

3. PORTB registri informasiyanın ötürülməsi istiqamətindən asılı olaraq ikili funksiyanı yerinə yetirir. Əgər pin rəqəmsal çıxış kimi işləyirsə, o zaman PORTB registrinin istənilən bitinə “1” yazmaq müvafiq pində gərginliyin görünməsinə, “0” yazılması isə gərginliyin yox olmasına səbəb olur. Beləliklə, çıxış rejimində hər bir pin vəziyyətini təyin edən bu registrdir. Rəqəmsal giriş rejimində hər hansı bir bitə məntiqi "1" yazmaq, quraşdırılmış pull-up rezistorunun müvafiq pinə qoşulmasına və onu söndürmək üçün "0" yazmasına səbəb olur. Bu "çəkmə rezistoru" nə deməkdir və nə üçün nəzərdə tutulub? Əgər pin rəqəmsal giriş kimi çıxış edirsə, o zaman giriş tamponunun müqaviməti kifayət qədər yüksəkdir və giriş cərəyanı olduqca kiçikdir. Buna görə də, hər hansı bir elektrik müdaxiləsi çıxışın ixtiyari vəziyyətə kortəbii keçidinə səbəb ola bilər. Bunun baş verməsinin qarşısını almaq üçün giriş və enerji mənbəyi arasında bir neçə on kilo-ohm müqaviməti olan bir rezistor bağlanır, giriş potensialını təchizatı gərginliyinə (buna görə də adı) "çəkir". Bu rezistordan keçən cərəyan dövrənin qalan hissəsinə müdaxilə etməyəcək qədər kiçikdir, lakin təsadüfən pin keçidinin qarşısını almaq üçün kifayət qədər böyükdür. Düymələrlə işləyərkən tez-tez açılan rezistorlardan istifadə edəcəyik, çünki onlar basılmadıqda, onların qoşulduğu sancaqlar mahiyyətcə havada "asılır" və müdaxiləyə məruz qalır.

Qeyd etmək lazımdır ki, işə salındıqda bütün registrlər 0-a sıfırlanır və hər bir pin açılan rezistor olmadan rəqəmsal giriş kimi çıxış edir.

İndi nəzarətçi girişləri ilə işləmək üçün NƏLƏR haqqında heç olmasa bir fikrimiz var, onlarla NECƏ işləməyi öyrənməyin vaxtı gəldi.

Gəlin birincimizi yazaq iş proqramı assemblerdə. Əvvəlcə verəcəm tam alqoritm yeni bir layihə yaratmaqla, gələcəkdə yalnız proqramın mətninə diqqət yetirərək onu buraxacağam.

1. Asm qovluğuna keçin və orada yeni qovluq yaradın. Adını bizim üçün uyğun olan bir adla dəyişdirin. Konkret olmaq üçün addım nömrəmizlə onlara istinad edəcəyəm. Bu vəziyyətdə "addım 2".

2. build.bat faylına sağ klikləyin və yeni yaradılmış qovluğa işarə edərək mənbə faylın yolunu dəyişdirin (addım 2). Bundan sonra məzmunum belə görünür:

"F:\Prog\AVR\asm\avrasm32 -fI %F:\Prog\AVR\asm\step2\main.asm
fasilə"

Arxivi harada açmağınızdan asılı olaraq sizin üçün fərqli ola bilər.

3. Asmedit qovluğuna keçin və ASM_Ed.exe proqramını işə salın

4. Açılan pəncərədə proqramın mətnini yazın. Bugünkü dərsimizdə də, sonrakı dərslərimizdə də əsas olduğu üçün bu məqam üzərində daha ətraflı dayanacağam.

Assembler proqramının mətni nədir? Müəyyən qaydalara uyğun olaraq yazılmış bir neçə elementdən ibarət ola bilər:

Təlimat sintaksisindən asılı olaraq operandlı və ya operandsız montaj təlimatları. Komanda adı ilə birinci operand arasında ya boşluq, tab və ya hər ikisinin istənilən nömrəsi olmalıdır. Operandlar vergüllə ayrılır, ondan əvvəl və ya ardınca ixtiyari sayda boşluqlar və ya nişanlar da ola bilər;

Hər biri "." ilə başlayan direktivlər;

Proqramda istifadəçi tərəfindən özbaşına adlandırılan və naviqasiya edilməli olan yerlər olan etiketlər. Hər bir etiket ":" simvolu ilə bitir;

";" ilə başlayan şərhlər. Şərhin əvvəlindən sətrin sonuna qədər bütün mətn hex faylı yaratarkən nəzərə alınmır və tamamilə ixtiyari ola bilər;

Proqramın daha yaxşı strukturu və oxunaqlılığı üçün boş sətirlər.

Hər sətirdə birdən çox əmr ola bilməz. Bununla belə, əmr və şərhdən sonra sətirdə etiketin eyni vaxtda olmasına icazə verilir.

Bu qaydalardan istifadə edərək, SB1 düyməsi basılarkən LED2-ni yandıracaq, düymə buraxıldıqda isə onu söndürəcək proqram yazacağıq. Proqramın mətni aşağıda təqdim olunur:

.daxil edin "F:\Prog\AVR\asm\Appnotes\tn13def.inc"
sbi DDRB, 4 ;РВ4 - çıxış (LED2)
sbi PORTB, 2 PB2-də açılan rezistoru yandırın (SB1 düyməsi)
sbic PINB, 2 ;Əgər PB2=0 (düymə basılıbsa), növbətini keçin. xətt
sbi PORTB, 4; PB4-ün 1-də quraşdırılması (LED-in söndürülməsi)
sbis PINB, 2 ;Əgər PB2=1 (düymə buraxılıb), növbətini keçin. xətt
cbi PORTB, 4 ;PB4-ün 0-a təyin edilməsi (LED aktiv)

Gəlin buna daha ətraflı baxaq. Birinci sətir yuxarıdakı qaydalara uyğun olaraq əvvəlində nöqtə ilə yazılmış "daxil et" direktivindən ibarətdir. Onun məqsədi arxasında göstərilən faylı proqram mətninə daxil etməkdir. İlk addımda dediyim kimi, bizə "tn13def.inc" faylı lazım olacaq. Bu sətirdə kompüterinizdə Appnotes qovluğunun yerinin yolunu dəyişməli olacaqsınız. Niyə bu faylı daxil etməliyik? Maraqlı oxucu ona baxa və məzmununu oxuya bilər, lakin çox güman ki, əvvəlcə bunu az başa düşəcək. Hələlik onu deyim ki, o, assemblerin standart olaraq bilmədiyi registrlərin adları ilə kontrollerdəki fiziki ünvanları arasında uyğunluğu ehtiva edir.

Aşağıdakı sətirlər assembler əmrləridir. Diqqətli oxucu cəmi dörd fərqli əmrdən istifadə edildiyini görəcək. Gəlin hər birinin məqsədinə baxaq.

sbi təlimatının iki operandı var: birincisi registr adı, ikincisi bit nömrəsidir. Onun icrası nəticəsində göstərilən registrdə göstərilən bit "1"-ə təyin olunur.

cbi əmri sintaksis baxımından yuxarıdakılara bənzəyir və tam əks funksiyanı yerinə yetirir - göstərilən registrdə göstərilən biti "0" vəziyyətinə qaytarır.

Sbis əmri də sintaksis baxımından yuxarıdakılara bənzəyir. Lakin onlardan fərqli olaraq o, registrlərlə heç bir əməliyyat aparmır, yalnız göstərilən registrdə göstərilən bitin vəziyyətini yoxlayır, əgər “1”ə bərabərdirsə, əmrdən sonra sətri keçir. Əks təqdirdə, ondan sonrakı sətir, ondan sonrakı bütün digərləri yerinə yetirilir.

sbis əmri sbis əmrinin əksidir. Göstərilən registr biti "0" olarsa, o, növbəti sətri keçir.

İndi yuxarıda göstərilənlərin hamısını yekunlaşdıraraq, proqramın alqoritmini anlamağa çalışaq. Başlamaq üçün mən bunu hərfi mənada sətir-sətir edəcəyəm.

1 xətt. Daxil etmə direktivinə registr təriflərini ehtiva edən tn13def.inc faylı daxildir.

2-ci sıra. sbi əmri DDRB registrinin 4-cü bitində "1" təyin edir və bununla da PB4 pinini çıxışa keçir. Lövhənin diaqramına baxsanız (əvvəlki addımın 1-ci şəkli), LED2-nin bu pinlə bağlı olduğunu görə bilərsiniz. Əmr və işarədən sonra ";" sətirdə yerinə yetirilən hərəkətlərin mənasını qısaca izah edən şərh yazılmışdır.

3 xətt. Eyni sbi əmri PORTB registrinin 2-ci bitində "1" təyin edir, daxili çəkilmə rezistorunu SB1 düyməsinin qoşulduğu PB2 pininə birləşdirir. DDRB registrinin 2-ci bitinin vəziyyətini dəyişdirmədiyimiz üçün bu pin giriş olaraq qalacaq, əslində bizə lazım olan budur.

4 xətt. sbic əmri PINB registrindən istifadə edərək PB2 girişində məntiqi "0" varlığını yoxlayır. Diaqrama diqqətlə baxsanız, düymələrin basıldıqda müvafiq terminalı ümumi tel ilə bağladığını görə bilərsiniz. Bu standart bir texnikadır, çünki düymə sərbəst buraxıldıqda, açılan rezistor səbəbindən çıxışda məntiqi "1" olur və düyməyə basıldıqda, məntiqi "0" işarəsi görünür. üçün çıxış ümumi tel. Beləliklə, PB2 pinində məntiqi "0" varsa, yəni düymə basılırsa, növbəti sətri keçirik və düymə buraxılıbsa, onu icra edirik.

5 sətir. Orada sbi əmri PORTB registrinin 4-cü bitində məntiqi “1” təyin edir və bununla da LED2-ni söndürür. Ağıllı bir oxucu, çıxışa gərginlik tətbiq etsək, LED-nin niyə söndüyü ilə maraqlana bilər. Cavab dizayndadır. LED anodla elektrik naqilinə, katod isə nəzarətçi çıxışına birləşdirilir. Buna görə, çıxışa gərginlik tətbiq etsəniz, anod və katodun potensialları bərabər olacaq və LED sönəcəkdir. Çıxışa məntiqi "0" çıxırsa, o zaman LED-ə gərginlik tətbiq olunacaq və yanacaq. Beləliklə, 4 və 5-ci sətir cütü düyməni buraxdıqda LED2-ni söndürür.

6 xətt. Məna 4-ün əksinədir. Sbis əmri PB2 girişində məntiqi “1”-in olub-olmadığını yoxlayır, yəni düymənin buraxılıb-boşalmadığını yoxlayır. Düymə buraxılarsa, növbəti sətir atlanır və növbəti sətir növbəti sətirə keçir. Amma 7-ci sətir sonuncu olduğu üçün 2-ci sıraya keçid var. Düymə sıxılırsa, 7-ci sətir yerinə yetirilir.

7 xətt. 5-ci ilə üzbəüz. cbi əmri PORTB registrinin 4-cü bitini "0" vəziyyətinə qaytarır və bununla da LED2-ni yandırır. Beləliklə, SB1 düyməsini basdıqda bir cüt 6 və 7 sətir LED2-ni yandırır.

Gördüyünüz kimi, biz xüsusilə çətin bir şey etmədik. Yalnız 3 registr və 4 təlimat biliklərindən istifadə edərək ilk proqramımızı yazdıq. Bundan sonra onunla nə etmək lazımdır? Əgər hələ də unutmamısınızsa, proqram yaratma alqoritmini yazmağa davam edirik.

5. Proqram mətnini redaktorun pəncərəsində yazdıqdan sonra “Fayl” menyusunu seçin və açılan siyahıda “Farklı Saxla...” düyməsini sıxın. Fayl saxlama pəncərəsində yaratdığımız step2 qovluğunu seçin və fayl adını "əsas" təyin edin, çünki bu, "build.bat" faylında göstərdiyimiz addır.

Saxladıqdan sonra proqram pəncərəsi belə görünməlidir:

6. Hex faylı yaradın. Bunu etmək üçün alətlər panelində "II" düyməsini sıxın. Aşağıdakı pəncərə görünməlidir:

Bu, montajın səhvsiz tamamlandığını və 6 söz həcmində, yəni 12 bayt həcmdə “main.hex” proqram faylının yaradıldığını bildirir. Qeyd edim ki, C dilində oxşar proqram ən azı 5 dəfə həcmə malik olardı.

7. Step2 qovluğuna keçdikdən sonra ona yeni yaradılmış main.hex faylı şəklində əlavə tapırıq ki, bu da indi istənilən proqramçı ilə nəzarətçiyə tikilə bilər, nəticəni görmək üçün bunu etmək lazımdır. yazdığımız proqram. Nəzarətçini yanıb-söndürdükdən sonra, dövrə düzgün yığılıbsa, hər şey bizim hazırladığımız alqoritmə uyğun işləməlidir: düymələr buraxıldıqda, LED2 söndürülməlidir və SB1 düyməsini basdıqda, o, açıq olmalıdır.

Növbəti addımdan əvvəl sizə aşağıdakı tapşırıqları yerinə yetirməyi təklif edirəm:

1. Əks alqoritmlə SB2 düyməsini basmağın işlənməsini proqrama əlavə edin: SB2 düyməsi buraxıldıqda LED1 yanmalı, basıldıqda isə sönməlidir.

2. Hər iki düymədən istifadə edərək LED2-ni idarə etmək üçün proqram yazın. SB1 düyməsinə basıldıqda, LED yanmalı və SB2 düyməsi basılana qədər yanılı qalmalıdır, bu isə SB1-in növbəti dəfə basılmasına qədər onu söndürür.

Assembly dilində yazılmış məşhur Tetrisin klonu. O, tamamilə 512 bayt yükləmə sektoruna uyğun gəlir (bu, yalnız 446 bayt yer tələb edir ki, bu da MBR-də tam yükləyicinin maksimum ölçüsüdür).

MBR əməliyyat sisteminin sonrakı yüklənməsi üçün lazım olan kodu və məlumatları ehtiva edən və ilk fiziki sektorlarda yerləşən bölmədir. Diskin ilk 446 baytı yükləyici koduna verilir. Məhz bu yerdə TetrOS yazılmışdır.

Təbii ki, bu cür xüsusiyyətlərə görə hər hansı bir şeydən əvvəl yüklənir əməliyyat sistemi- heç bir OS tələb etmir, özü işləyir. Bəli, bəli, düz eşitdiniz, TetrOS özünün yükləyicisidir.

Ekranda belə görünür:

Və açılış sektorunda mənbə kodu belə görünür:

Və bəli hamısı mənbə. Yalnız 446 bayt ağırlığında olduğunu xatırlayırsınız?

Siz bu “möcüzəli əməliyyat sistemini” qemu altında işlədə və ya hətta onu diskin və ya flash sürücünün açılış bölməsinə quraşdıra bilərsiniz.

Başlayın

Sadəcə qemu quraşdırın:

sudo apt-get quraşdırma qemu

və qaç:

USB flash sürücüsünə yüklənir

Şəkli bir flash sürücüyə kopyalayın. Deyək ki, əgər flash sürücü /dev/sde kimi quraşdırılıbsa, onun TetrOS yükləmə sektoruna yazmaq üçün aşağıdakı əmri yerinə yetirməli olacaqsınız:

sudo dd if=tetros.img of=/dev/sde

Oyun təsviri

Tərtibatçı o qədər də darıxdırıcı olmayan dizaynı cəmi 512 bayt yaddaşa yerləşdirməyi bacardı. Oyundakı hər bir kərpicin öz rəngi var, düymələr tərəfindən idarə olunur, məğlubiyyət halında oyun başa çatır, kərpiclər təsadüfi şəkildə yaranır... BolgenOS hətta yaxın deyil!

Təəssüf ki, ölçüsünə görə bəzi xüsusiyyətlərdən imtina edilməli oldu. Oyunda xal yoxdur, yenidən başlamadan oyunu yenidən başladın və ya növbəti kərpicin nə olacağını göstərin.