Praktično programiranje Atmel AVR mikrokontrolera na asembleru. (3. izdanje)

10.09.2021

Jednom sam video na internetu zanimljiv video, demonstrirao je igru ​​zmija implementiranu na mikrokontroleru i 8x8 LED matrici, zatim sam pronašao još nekoliko sličnih videa koji su me zainteresovali. Među njima je bio i video u kojem je igra Tetris sastavljena na "moćnom" mikrokontroleru. Nakon gledanja odlučio sam da razvijem sopstvenu verziju uređaja, koja kombinuje obe igre, koristeći mikrokontroler PIC16F688 i dve LED matrice koje prikazuju polje za igru ​​u rezoluciji 8x16 piksela.

Dijagram uređaja je prikazan ispod. Informacije se izlaze u matrice H1, H2 u dinamičkom modu koristeći registri pomaka DD2, DD3, DD4. Izlazi mikrokola DD2, DD3 povezani su na anode matrice. Katode obje matrice spojene su na kolektore tranzistora VT1-VT8, za koje upravljačke signale generira mikrokolo DD4. Mikrokontroler učitava podatke u registar DD4, kada se on prelije, informacija sa pina 9 se prenosi na ulaz registra DD3, a zatim se na isti način podaci prenose u registar DD2. Otpornici R1-R16 ograničavaju struju kroz matrične LED diode. Otpornici R17-R23 postavljaju osnovnu struju tranzistora VT1-VT8. Mikrokontroler radi na 8 MHz od internog oscilatora. Brzina osvježavanja slike je 100Hz.


Nakon što se uključi napajanje, screensaver igre “Snake” se prikazuje na polju za igru. Na vrhu polja je prikazan broj 1, a na dnu je slika fragmenta igre. Kada pritisnete dugme SB5 “Start/Pauza” ide se na meni igre, na čijem vrhu je prikazan nivo igre u obliku brojeva od 1 do 9. Nivo igre se podešava pomoću SB1 “Up” dugme, svakim pritiskom broj nivoa se uzastopno povećava za jedinicu. Nakon broja 9, ponovo se prikazuje broj 1 Početna dužina zmije zavisi od postavljenog nivoa igre, tako da je za 1. nivo dužina 3 boda, za 9. nivo 11 poena. Na dnu menija se prikazuje informacija o brzini kretanja zmije. Broj 1 odgovara minimalna brzina, a broj 9 je maksimalan. Vrijednost brzine se postavlja tipkom SB4 “Dolje”, slično postavljanju nivoa igre. Sjaj LED dioda po obodu terena u meniju znači da je odabran način igre sa prisustvom granica po obodu terena. U ovom načinu rada, kada zmija napusti teren za igru, dolazi do gubitka. Ako su u izborniku LED diode oko perimetra polja isključene, tada je odabran način rada bez granica. U ovom slučaju, pri napuštanju igrališta, zmijska glava se pojavljuje na suprotnoj strani terena. Koristite dugmad SB2 “desno” i SB3 “lijevo” da postavite željeni način igre. Kada prvi put uđete u meni igre, vrednosti dužine i brzine se postavljaju na jedan, a bira se režim sa granicama.

Nakon pritiska na dugme “Start/Pauza” iz menija igre, zmija u svom osnovnom položaju i nasumična slobodna tačka se prikazuju na polju za igru. Pritiskom na bilo koje od dugmadi “gore”, “lijevo”, “desno” zmija se kreće u odgovarajućem smjeru. Nakon pokretanja pokreta, dugme “Dolje” također postaje dostupno za kontrolu zmije. Kada udarite u svjetleću tačku, dužina zmije se povećava. Nakon što sakupite 14 bodova, prelazite na sljedeći nivo igre. Nakon 9. nivoa dolazi do prelaska na prvi nivo. Ako zmija udari svoje tijelo, ili ode izvan igrališta u graničnom modu, dolazi do gubitka. Nakon 3 poraza, vraćate se na meni igre, gdje su prikazani trenutni nivo igre i brzina. Nakon što se zmija počne kretati, možete pauzirati i nastaviti igru ​​pritiskom na tipke “Start/Pauza”.

Da biste izašli iz menija igre, morate držati pritisnuto dugme “Start/Pauza” 1 sekundu, nakon čega će se početni ekran igre pojaviti na polju za igru. Prebacivanje između igara vrši se pritiskom na bilo koje od tipki “gore”, “dolje”, “lijevo”, “desno”. Istovremeno se prikazuje početni ekran odgovarajuće igre.

Na vrhu čuvara ekrana igre Tetris prikazuje se broj 2, na dnu je slika fragmenta igre. Idite na meni igre pritiskom na dugme “Start/Pauza”. Broj poena koje je igrač postigao prikazan je na vrhu menija. Bodovi se dodjeljuju za svaku izbrisanu liniju. Brojač bodova broji do 99, zatim se vraća na nulu i ponovo počinje. Na početku svake nova igra, brojač se takođe vraća na nulu. Na dnu menija prikazana je informacija o brzini kretanja figura, koja se podešava pomoću tipki „Gore“ i „Dolje“. Nakon pritiska na dugme “Start/Pauza” iz menija, igra počinje, na vrhu polja se pojavljuju nasumične figure koje se mogu pomerati tasterima “Levo” i “Desno” u odgovarajućem smeru. Dugme Gore rotira oblik za 90 stepeni u smjeru kazaljke na satu svaki put kada se pritisne. Držeći tipku Dolje, možete ubrzati kretanje figure. Dugme “Start/Pauza” vam omogućava da pauzirate i nastavite igru. Igra se završava kada nova figura ne može stati na polje za igru, nakon čega se prelazi u meni gdje možete vidjeti broj poena koje je igrač postigao. Izlazak iz menija se izvodi na isti način kao u igrici “Zmija”.

Ako se nijedno dugme ne pritisne u roku od 4 minuta, uređaj prelazi u režim niske potrošnje energije, mikrokontroler isključuje LED nizove i prelazi u režim mirovanja. Uređaj se „budi“ nakon pritiska na dugme „Start“ i vraća se u prethodno stanje.

Uređaj koristi otpornike – veličine 1206 za površinsku montažu. Kondenzatori C2, C3 su keramički, veličine 1206. LED matrice H1, H2 – TOM-1088BG-B zelene boje sa LED prečnikom 3mm, i rezolucijom 8x8 piksela. Tasteri su standardni taktilni.

Izvor napajanja je stabilizirano napajanje sa naponom 3,7-5V, možete koristiti i galvanske ćelije ili baterije, na primjer 3 1,5V AA ili AAA baterije povezane u seriju, na primjer koristim 3 AA baterije. Uređaj ostaje u funkciji kada se napon napajanja smanji na 3,3V, dok se svjetlina LED matrica smanjuje.

Dobro veče svima! Emitujem iz ugodnog svijeta koji se zove “assembler”. Odmah ću pojasniti da se tema tiče AVR mikrokontrolera - a još ne znam hoće li ovaj post biti koristan onima koji žele koristiti asembler za bilo koji drugi zadatak. Činjenica je da sam bukvalno prije nekoliko dana počeo da učim asembler od nule – trebam napraviti jedan uređaj – i odlučio sam da sve u njemu radim sam. I tako, jednog lepog dana sam to shvatio Učenje asemblera je apsolutno beskorisno! Jezik asemblera se jedino može razumjeti! Odnosno, svima onima koji žele programirati na asemblerskom jeziku, toplo preporučujem da se detaljno udubite u to kako mikrokontroler FIZIČKI radi, a zatim proučite zamršenost naredbi.
Dakle, vjerovatno ću započeti malu seriju članaka u kojima ću vam pričati od samog početka kako tačno Razumio sam određene stvari u programiranju na asembleru - mislim da ću za one koji uopće ne razumiju šta je ASM, biti upravo takav "prevodilac" sa jezika onih koji su jako dobri u ovoj stvari.

Odmah ću reći da sam manje-više ušao u ovu temu na poticaj DIHALT-a - stoga će ovi članci biti svojevrsni prijevod sa super-duper jezika sklopa-mikrokontrolera na jezik razumljiv većini ljudi. Pa, nadam se da će me gurui ispravljati kako predstava bude napredovala, a ako odjednom nešto netačno objasnim, ispraviće me.
Dakle, prvi zaključci o asembleru koje sam napravio prije par dana šokirali su me do srži - i sjedio sam čitajući DI HALT članke od 23 sata uveče do 5 sati ujutro - nakon čega sam otišao na spavanje zadovoljan i sretan shvatio sam suštinu programiranje na asemblerskom jeziku za mikrokontrolere.
Kako se ovo može još jednostavnije objasniti? Mislim da treba da krenemo od same suštine.
***
U početku nećemo ulaziti u tehničke detalje (o njima ćemo govoriti u sljedećem članku) - samo zamislite da postoje 3 znaka:
1. Mikrokontroler - Ovo je Englez Steve, koji je došao kod Rusa. On zna savršeno engleski jezik, ali uopšte ne razume ruski - nijednu reč. Samo engleski. Izgubio je raspravu i obećao da će bez pitanja učiniti sve što mu Rus zatraži.
2. Asembler - Ovo je prevodilac Vasja, čija je majka Engleskinja, a otac Rus. Savršeno zna i engleski i ruski.
3.Mi - Ovo je Rus kome je došao Englez. Pa, to jest, mi smo mi =) Istovremeno, savršeno znamo ruski i (!!!) malo engleski - samo malo, sa rječnikom.
***
Zamislite ovu situaciju - Englez sjedi na stolici u vašoj sobi. I sjedite za kompjuterom i čitate ovaj post, kada vam se iznenada otvori prozor! To je loša sreća! Vetar duva, zavesa se pretvorila u jedro... Bilo bi lepo zatvoriti! Ali previše je lijeno ustati sa stolice, skinuti noge sa sistemske jedinice, strpati ih u papuče, spustiti šolju kafe (piva) i krenuti u borbu sa elementima. A onda odjednom shvatite da u prostoriji imamo Engleza koji je izgubio opkladu i vrijeme je da ga jurimo! A ti mu tako slatko kažeš: „Čovječe! Molim vas zatvorite prozor i onda možete ponovo sjesti na stolicu!” a on sjedi, gleda te zabezeknuto i ne radi ništa! Možete, naravno, pogoditi čorbu od kupusa - ali onda vas on i dalje neće razumjeti! Onda pozoveš svog prijatelja prevodioca Vasilija - on dođe i sjedne pored Engleza na stolicu. A ti kažeš - Prevedi: "Steve, idi i zatvori prozor, a onda se zavali na stolicu!" Prevodilac prevodi na engleski - Englez razume i ode i zatvori prozor, a onda dođe i sedne na stolicu.
U ovom trenutku samo trebate razumjeti ulogu asemblera u ovom lancu „Mi-Assembler-Controller“
Odnosno, kako bi svi shvatili šta je asembler? Onda čitajte dalje.
***

Dakle, zamislimo ovu situaciju. Kažeš Vasji - "Slušaj, ukratko, to je tako - zaboravio sam kalkulator kod kuće, podijeli 56983 sa 2 i reci Steveu da napravi toliko sklekova šakama" i Vasja računa na kalkulator i kaže Steveu na engleskom "Radi sklekove šakama 28491 put" To se zove "DIREKTIVE"- drugim riječima, direktiva je zadatak za Vasju, čiji je rezultat Steveova akcija.

Postoji još jedna situacija - kažete Vasji "Reci Steveu da uradi 28491 sklekova" i Vasja jednostavno prevodi vaše riječi na engleski. To se zove OPERATOR

Jednostavno je - postoji direktiva i postoji operator. Operater je vaša direktna instrukcija Steveu šta da radi - Vasya ovdje samo prevodi vaš zahtjev na engleski. A Direktiva je zadatak za samog Vasju - i Vasja prvo uradi ono što si mu rekao, a onda, u zavisnosti od rezultata, nešto kaže Stivu.

Sad ćemo redovno mučiti Engleza! Ali prvo moramo bolje upoznati našeg prevodioca Vasju. Morate znati sljedeće - Vasja vas uvijek bespogovorno sluša - ono što mu je rečeno, on radi. Vasjin kalkulator nema decimalna mjesta - ako pogledate primjer sa sklekovima, onda je 56983 \ 2 = 28491,5 - ali Vasjin sve nakon decimalnog zareza je odsječen - i on vidi samo cijeli broj - i nije važno da li će biti 28491,000001 ili će biti 28491,9999999 - za Vasju je ovo jedna velika stvar biće 28491 u oba slučaja. Ništa nije zaokruženo. Više važne informacije o Vasji. Vasja je okrutan - nije ga briga što Steve jebeno radi sklekove dvadeset osam hiljada puta. Rekli su mu da Vasja prevodi. I ne samo da je prevodio, već me je i tjerao da radim ono što ste tražili. Dakle, ako Steve umre na dvadeset tri hiljade petsto trinaestom skleku, to će biti u potpunosti tvoja krivica.

Zapravo, to je sve za sada. U sljedećem postu ćemo kopati dublje - za sada je dovoljno samo ovo razumjeti. Zamislite samo ovu situaciju i shvatite šta je šta, ko igra koju ulogu i po čemu se direktiva razlikuje od operatera.
A onda ćemo pokušati sve nazvati pravim imenom i otprilike procijeniti kako asembler radi s mikrokontrolerom kao odrasla osoba.


Dakle, nadam se da je savjestan čitatelj već sastavio programator, eksperimentalnu ploču, te instalirao i konfigurirao potreban softver.

Sada, nakon što sam napisao prvi članak u nizu, shvatam da sam se malo uzbudio i napravio istu grešku kao moji prethodnici, stavljajući frazu „za početnike“. Bilo bi tačnije formulisati temu „Za početnike u programiranju asemblerskog jezika“, odnosno pretpostavljam da čitalac već barem površno razume šta je mikrokontroler, inače će nam trebati dosta vremena samo da upoznajte se sa ovom temom. Za one koji ih uopće nisu upoznati, mogu preporučiti apsolutno divnu seriju članaka S. Ryumika, po mom mišljenju " AVR mikrokontroleri“, objavljen u časopisu Radioamator (br. 1-11 za 2005. godinu). U ovom ciklusu ATmega8 je odabran kao bazni kontroler, ali generalno funkcionalne jedinice Gore navedeni kontroler i ATtiny13 su praktično isti.

Za direktno upoznavanje sa mikrokontrolerom ATtiny13 preporučujem knjigu A.V. Evstifeev "AVR mikrokontroleri male porodice. Uputstvo za upotrebu" (M.: Izdavačka kuća "Dodeka-XXI", 2007. - 432 str.). Sadrži prevedene i sistematizovane listove podataka za čitav niz kontrolera male porodice i, po mom mišljenju, trebalo bi da bude referenca za radnu površinu za one koji se bave programiranjem mikrokontrolera.

Međutim, kako priča bude napredovala, dat ću neke informacije u vezi sa onim čvorovima i modulima kontrolera koji će se koristiti u pisanim programima.

Ali sve je ovo lirska digresija. Vratimo se direktno na priču.

ATtiny13 kontroler, uprkos svojoj maloj veličini, ima vrlo dobre funkcionalne karakteristike. A mali broj pinova je više nego nadoknađen brojem funkcija koje svaki od njih obavlja. Pinout i opis pinova su predstavljeni u nastavku:

Tabela je preuzeta iz gore pomenute knjige A.V. Evstifeeva.

Kao što vidite, svaki pin može obavljati najmanje tri funkcije, ili čak mnogo više. U početku nećemo razmatrati alternativne funkcije, već samo onu osnovnu - digitalni ulaz/izlaz.

Kao što se vidi iz slike i tabele, svi pinovi, osim pinova za napajanje, imaju naziv PB iza kojeg slijedi serijski broj. Šta ovo znači? Svi pinovi kontrolera su kombinovani u 8 delova radi lakšeg rada sa njima, a svakoj grupi od 8 pinova dodeljena su tri posebna I/O registra. Generalno, koncept registara je ključan kada se radi sa kontrolerima, posebno u asembleru. Pogledajmo pobliže svaki od tri gore navedena registra. Sve su one jednobajtne ćelije u memoriji kontrolera. Svaki bit odgovara jednom od izlaza kontrolera, a broj bita u registru se poklapa sa brojem izlaza (na primjer, 0. bit je odgovoran za PB0 izlaz, 1. bit je odgovoran za PB1 izlaz itd.). Svi registri imaju svoje ime, pomoću kojeg im se pristupa prilikom pisanja programa. Kakva su ovo imena?

1. DDRB registar je odgovoran za smjer prijenosa informacija svakog pina kontrolera. Ako je bilo koji bit ovog registra “0”, tada će odgovarajući izlaz biti ulaz, a ako je “1”, onda izlaz. Štaviše, svaki izlaz se konfiguriše pojedinačno i bilo gde u programu. To znači da pod različitim uslovima ili u različito vreme, isti pin može biti konfigurisan kao ulaz ili kao izlaz, nezavisno od drugih pinova.

2. PINB registar sadrži trenutno stanje svih pinova: ako se na pin dovede napon, onda se u odgovarajući bit upisuje logička “1” ako nema napona, upisuje se logička “0”. Ovaj registar se uglavnom koristi za čitanje stanja pina koji je u ulaznom modu.

3. PORTB registar obavlja dvostruku funkciju ovisno o smjeru prijenosa informacija. Ako pin radi kao digitalni izlaz, tada upisivanje “1” u bilo koji bit PORTB registra uzrokuje pojavu napona na odgovarajućem pinu, a pisanje “0” uzrokuje da napon nestane. Dakle, u izlaznom modu, taj registar je taj koji određuje stanje svakog pina. U režimu digitalnog ulaza, upisivanje logičke "1" u bilo koji bit uzrokuje da se ugrađeni pull-up otpornik poveže na odgovarajući pin, a upisivanje "0" da ga onemogući. Kakva je to stvar ovaj “pull-up otpornik” i čemu je namijenjen? Ako pin djeluje kao digitalni ulaz, tada je otpor ulaznog bafera prilično visok, a ulazna struja prilično mala. Stoga, svaka električna smetnja može dovesti do spontanog prebacivanja izlaza u proizvoljno stanje. Kako bi se to spriječilo, između ulaza i izvora napajanja spojen je otpornik s otporom od nekoliko desetina kilo-oma, koji "povlači" ulazni potencijal na napon napajanja (otuda i naziv). Struja koja teče kroz ovaj otpornik je dovoljno mala da ne ometa ostatak kola, ali dovoljno velika da spriječi slučajno prebacivanje pinova. Često ćemo koristiti pull-up otpornike kada radimo sa dugmadima, jer kada nisu pritisnuti, pinovi na koje su spojeni u suštini "vise" u vazduhu i podložni su smetnjama.

Treba napomenuti da se pri uključivanju svi registri resetuju na 0 i svaki pin djeluje kao digitalni ulaz bez pull-up otpornika.

Sada kada imamo barem neku ideju o tome ŠTA je potrebno za rad s ulazima kontrolera, vrijeme je da saznamo KAKO raditi s njima.

Hajde da napišemo naše prvo program rada u asembleru. Prvo ću dati kompletan algoritam kreirajući novi projekat, ubuduće ću ga izostaviti, fokusirajući se samo na tekst samog programa.

1. Idite na asm folder i kreirajte novi folder u njemu. Preimenujte ga u naziv koji nam odgovara. Da budemo precizni, ja ću ih pozvati po našem broju koraka. U ovom slučaju "step2".

2. Kliknite desnim tasterom miša na datoteku build.bat i promijenite putanju do izvorne datoteke, pokazujući na novokreirani folder (korak 2). Nakon ovoga moj sadržaj izgleda ovako:

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

Za vas se može razlikovati ovisno o tome gdje ste raspakovali arhivu.

3. Idite u fasciklu Asmedit i pokrenite program ASM_Ed.exe

4. U prozoru koji se otvori upišite tekst programa. Zadržaću se na ovoj tački detaljnije, jer je ona glavna u našoj lekciji danas, kao i u narednim.

Šta je tekst asemblerskog programa? Može uključivati ​​nekoliko elemenata napisanih prema određenim pravilima:

Instrukcije sastavljanja sa ili bez operanda u zavisnosti od sintaksi instrukcija. Između imena komande i prvog operanda mora postojati razmak, tabulator ili bilo koji broj oboje. Operandi su odvojeni zarezom, kojem također može prethoditi ili slijediti proizvoljan broj razmaka ili tabulatora;

Direktive, od kojih svaka počinje sa ".";

Oznake, koje su mjesta u programu koja je korisnik proizvoljno imenovao do kojih će se možda morati kretati. Svaka oznaka završava znakom ":";

Komentari koji počinju sa ";". Sav tekst od početka komentara do kraja reda se zanemaruje prilikom kreiranja hex datoteke i može biti potpuno proizvoljan;

Prazni redovi za bolju strukturu i čitljivost programa.

Ne može biti više od jedne naredbe u svakoj liniji. Međutim, dozvoljeno je istovremeno prisustvo oznake u redu nakon koje slijede naredba i komentar.

Koristeći ova pravila, napisaćemo program koji će uključiti LED2 dok je dugme SB1 pritisnuto, a isključiti ga ako se dugme otpusti. Tekst programa je predstavljen u nastavku:

.include "F:\Prog\AVR\asm\Appnotes\tn13def.inc"
sbi DDRB, 4 ;RV4 - izlaz (LED2)
sbi PORTB, 2 Uključite pull-up otpornik na PB2 (dugme SB1);
sbic PINB, 2 ;Ako je PB2=0 (pritisnuto dugme), preskočite sljedeće. linija
sbi PORTB, 4 ;Ugradnja PB4 u 1 (gašenje LED diode)
sbis PINB, 2 ;Ako je PB2=1 (dugme otpušteno), preskočite sljedeće. linija
cbi PORTB, 4 ; Postavljanje PB4 na 0 (LED uključen)

Pogledajmo to detaljnije. Prvi red sadrži direktivu "include", napisanu prema gornjim pravilima sa tačkom na početku. Njegova svrha je da u tekst programa uključi datoteku specificiranu iza nje. Kao što sam rekao u prvom koraku, trebat će nam datoteka "tn13def.inc". U ovom redu moraćete da promenite putanju do lokacije fascikle Appnotes na vašem računaru. Zašto trebamo uključiti ovaj fajl? Radoznali čitalac može ga pogledati i pročitati njegov sadržaj, ali će najvjerovatnije u početku malo razumjeti. Za sada ću reći da sadrži korespondenciju između imena registara, koje asembler ne zna po defaultu, sa njihovim fizičkim adresama u kontroleru.

Sljedeći redovi su komande asemblera. Pažljivi čitalac će primijetiti da se koriste ukupno četiri različite komande. Pogledajmo svrhu svakog od njih.

Sbi instrukcija ima dva operanda: prvi je ime registra, drugi je broj bita. Kao rezultat njegovog izvršenja, specificirani bit u navedenom registru je postavljen na "1".

Naredba cbi je po sintaksi slična gornjoj i obavlja potpuno suprotnu funkciju - resetuje specificirani bit u navedenom registru na "0".

Naredba sbis je također po sintaksi slična gornjoj. Međutim, za razliku od njih, on ne obavlja nikakve operacije sa registrima, već samo provjerava stanje navedenog bita u navedenom registru, a ako je jednako "1", preskače red nakon naredbe. U suprotnom se izvršava red koji slijedi, kao i svi ostali nakon njega.

Komanda sbis je suprotna od sbis komande. Preskače sljedeći red ako je specificirani bit registra "0".

Sada, sumirajući sve gore navedeno, pokušajmo razumjeti algoritam programa. Za početak, uradiću ovo doslovno red po red.

1 red. Direktiva uključivanja uključuje datoteku tn13def.inc, koja sadrži definicije registra.

2. red. Komanda sbi postavlja "1" u bit 4 registra DDRB, čime se PB4 pin prebacuje na izlaz. Ako pogledate dijagram ploče (slika 1 prethodnog koraka), možete vidjeti da je LED2 spojen na ovaj pin. Nakon naredbe i znaka ";" napisan je komentar koji ukratko objašnjava značenje radnji koje se izvode u liniji.

3 linija. Ista sbi komanda postavlja "1" u bit 2 registra PORTB, povezujući interni pull-up otpornik na pin PB2, na koji je spojeno dugme SB1. Pošto nismo promijenili stanje bita 2 registra DDRB, ovaj pin će ostati ulaz, što nam je zapravo potrebno.

4 linija. Komanda sbic provjerava prisutnost logičke "0" na PB2 ulazu koristeći PINB registar. Ako pažljivo pogledate dijagram, možete vidjeti da tipke, kada se pritisnu, zatvaraju odgovarajući terminal zajedničkom žicom. Ovo je standardna tehnika, jer kada se dugme otpusti, na izlazu je prisutna logička "1" zbog pull-up otpornika, a kada se dugme pritisne, pojavljuje se logička "0" zbog povezivanja izlaz na zajednička žica. Dakle, ako postoji logička „0” na pinu PB2, odnosno pritisnuto dugme, preskačemo sledeći red, a ako je dugme otpušteno, onda ga izvršavamo.

5 linija. U njemu, sbi komanda postavlja logičku "1" u bit 4 PORTB registra, čime se isključuje LED2. Pronicljivi čitalac može se zapitati zašto se LED dioda gasi ako dovedemo napon na izlaz. Odgovor leži u dizajnu. LED dioda je spojena sa anodom na napojnu žicu, a katodom sa izlazom kontrolera. Stoga, ako dovedete napon na izlaz, potencijali anode i katode će biti jednaki, a LED će se ugasiti. Ako se na izlazu izlazi logička "0", tada će se napon primijeniti na LED i ona će zasvijetliti. Dakle, par linija 4 i 5 isključuje LED2 kada se dugme otpusti.

6 linija. Značenje je suprotno od 4. Komanda sbis provjerava prisutnost logičke “1” na PB2 ulazu, odnosno provjerava da li je dugme otpušteno. Ako se dugme otpusti, sledeći red se preskače i sledeći red prelazi na sledeći. Ali pošto je 7. red posljednji, postoji prijelaz u 2. red. Ako se pritisne dugme, tada se izvršava red 7.

7 linija. Nasuprot 5. Komanda cbi resetuje bit 4 registra PORTB na "0", čime se uključuje LED2. Dakle, par linija 6 i 7 uključuje LED2 kada se pritisne dugme SB1.

Kao što vidite, nismo uradili ništa posebno teško. Koristeći znanje o samo 3 registra i 4 instrukcije, napisali smo naš prvi program. Šta dalje s njom? Ako još niste zaboravili, nastavljamo sa pisanjem algoritma za kreiranje programa.

5. Nakon što ste napisali tekst programa u prozoru editora, izaberite stavku menija „Datoteka“ i na listi koja se otvori kliknite na „Sačuvaj kao...“. U prozoru za čuvanje datoteke odaberite folder step2 koji smo kreirali i navedite naziv datoteke "main", jer je to ime koje smo naveli u datoteci "build.bat"

Nakon spremanja, prozor programa bi trebao izgledati ovako:

6. Kreirajte heksadecimalni fajl. Da biste to učinili, kliknite na dugme "II" na traci sa alatkama. Trebao bi se pojaviti sljedeći prozor:

Obavještava nas da je sklapanje završeno bez grešaka i kreirana je firmver datoteka “main.hex” sa zapreminom od 6 riječi, odnosno 12 bajtova. Napominjem da bi sličan program u C-u imao najmanje 5 puta veći volumen.

7. Otišavši u folder step2, nalazimo mu dodatak u vidu novostvorenog main.hex fajla, koji se sada može ušiti u kontroler bilo kojim programatorom, što se mora uraditi da bi se vidjeli rezultati program koji smo napisali. Nakon bljeskanja kontrolera, ako je kolo pravilno sastavljeno, sve bi trebalo raditi prema algoritmu koji smo razvili: kada su tipke otpuštene, LED2 bi trebao biti isključen, a dok je tipka SB1 pritisnuta, trebala bi biti uključena.

Prije sljedećeg koraka predlažem da obavite sljedeće zadatke:

1. Dodajte u programsku obradu pritiskanje dugmeta SB2 sa suprotnim algoritmom: kada se dugme SB2 otpusti, LED1 treba da svetli, a kada se pritisne, treba da se ugasi.

2. Napišite program za kontrolu LED2 pomoću oba dugmeta. Kada se pritisne dugme SB1, LED treba da svetli i ostane upaljen dok se ne pritisne dugme SB2, što ga isključuje do sledećeg pritiska na SB1.

Klon čuvenog Tetrisa, napisan na asemblerskom jeziku. U potpunosti se uklapa u sektor za pokretanje od 512 bajta (zahteva samo 446 bajtova prostora, što je upravo maksimalna veličina pokretačkog programa u MBR-u).

MBR je odeljak koji sadrži kod i podatke potrebne za naknadno učitavanje operativnog sistema i nalazi se u prvim fizičkim sektorima. Prvih 446 bajtova diska predaju se kodu pokretačkog programa. Na ovom mjestu je napisan TetrOS.

Naravno, zbog takvih svojstava se učitava prije bilo kojeg operativni sistem- ne zahtijeva nikakav OS, radi samostalno. Da, da, dobro ste čuli, TetrOS je sopstveni pokretač.

Ovako to izgleda na ekranu:

A izvorni kod na boot sektoru izgleda ovako:

I jeste sve izvor. Sjećate li se da je težak samo 446 bajtova?

Možete pokrenuti ovaj „čudesni operativni sistem“ pod qemu-om ili ga čak instalirati na particiju za pokretanje diska ili fleš diska.

Pokreni

Samo instalirajte qemu:

sudo apt-get install qemu

i pokrenite:

Učitavanje na USB fleš disk

Kopirajte sliku na fleš disk. Recimo ako je fleš disk montiran kao /dev/sde, morat ćete pokrenuti sljedeću naredbu da upišete u njegov TetroOS sektor za pokretanje:

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

Opis igre

Programer je uspio ugurati ne tako dosadan dizajn u samo 512 bajtova memorije. Svaka kockica u igri ima svoju boju, kontroliše se dugmadima, u slučaju poraza igra se završava, kockice se generišu nasumično... BolgenOS nije bio ni blizu!

Nažalost, zbog veličine, neke karakteristike su morale biti napuštene. Igra nema bodovanje, ponovo pokrenite igru ​​bez ponovnog pokretanja ili prikažite koja će sljedeća cigla biti.