AVR Studio programmu piemēri montētājā. Atmel AVR mikrokontrolleru praktiskā programmēšana montāžas valodā

IEVADS Mikrokontrolleri, to izcelsme un pielietojums
Mikrokontrolleru fons
Grieķu stila elektronika
Kāpēc AVR?
Ko tālāk?

I DAĻA. ATMEL AVR KONSTRUKCIJAS UN DARBĪBAS VISPĀRĪGI PRINCIPI

1. nodaļa. Atmel AVR mikrokontrolleru pārskats

AVR ģimenes
Īpatnības praktiska izmantošana MK AVR

2. nodaļa. Vispārējā struktūra, atmiņas organizācija, pulksteņa iestatīšana, atiestatīšana

Programmas atmiņa
Datu atmiņa (RAM, SRAM)
Negaistošo datu atmiņa (EEPROM)
Pulksteņa metodes
Atiestatīt
Papildu ārējās datu atmiņas pievienošanas iespējas

3. nodaļa: Ievads perifērijas ierīcēs

I/O porti
Taimeri-skaitītāji
Analogo-digitālo pārveidotājs
Seriālie porti
UART
SPI interfeiss
TWI interfeiss (12C)
Universāls seriālais interfeiss USI

4. nodaļa. Pārtraukumi un enerģijas taupīšanas režīmi

Pārtrauc
Pārtraukumu veidi
Enerģijas taupīšanas režīmi
MK AVR patēriņš
AYR MK patēriņa un enerģijas taupīšanas režīmi

II DAĻA. ATMEL AVR MIKROKONTROLERU PROGRAMMĒŠANA

5. nodaļa. AVR saimes MCU programmēšanas vispārīgie principi

Asambleja vai C?
AVR programmēšanas metodes un rīki
Koda redaktors
Par AVR Studio
Montētāja izkārtojums
Programmētāji
Par hex failiem
AVR montētāja komandas, instrukcijas un apzīmējumi
Skaitļi un izteiksmes
Direktīvas un funkcijas
AVR programmas vispārējā struktūra
Pārtraukt apstrādi
RESET
Vienkāršākā programma
Kavēšanās
Skaitītāja programma
Pārtraukumu izmantošana
Taimera aizkave
Skaitītāja programma, kas izmanto pārtraukumus
Par konfigurācijas bitiem

6. nodaļa. AVR komandu sistēma

Vadības pārsūtīšanas instrukcijas un SREG reģistrs
Atzīmējiet un izlaidiet komandas
Loģiskās darbības komandas
Shift instrukcijas un bitu darbības
Aritmētiskie norādījumi
Datu pārsūtīšanas komandas
Sistēmas vadības komandas
Standarta procedūru veikšana montētājā
Par steku, vietējiem un globālajiem mainīgajiem

7. nodaļa. Aritmētiskās darbības

Standarta aritmētiskās darbības
Daudzciparu skaitļu reizināšana
Daudzciparu skaitļu dalījums
Darbības ar daļskaitļiem
Gadījuma skaitļu ģenerators
Darbības ar cipariem BCD formātā
Negatīvie skaitļi MK

8. nodaļa. Taimeru programmēšana

8 un 16 bitu taimeri
Veidošanās iestatītā vērtība frekvences
Atpakaļskaitīšana
Precīza laika korekcija
Frekvences mērītājs un perioda mērītājs
Frekvences mērītājs
Periodometrs
Dinamiskā displeja vadība
LED indikatori un to savienojumi
Programmēšana dinamisks displejs
Taimeri PWM režīmā

9. nodaļa. EEPROM lietošana

Vēlreiz par datu drošību EEPROM
Rakstiet un lasiet EEPROM
Konstantu glabāšana EEPROM

10. nodaļa. Analogais salīdzinājums un ADC

Analog-digitālās darbības un to kļūdas
Darbs ar analogo komparatoru
ADC integrēšana uz salīdzinājuma
Darbības princips un aprēķinu formulas
ADC programmas integrēšana
Iebūvēts ADC
ADC lietošanas piemērs
Programma

11. nodaļa: SPI programmēšana

Pamatdarbības, izmantojot SPI
Aparatūras opcija
Programmatūras opcija
Par nepastāvīgās atmiņas veidiem
Rakstiet un lasiet zibatmiņu, izmantojot SPI
Apmaiņas programma ar atmiņu 45DB011B caur SPI
Flash karšu rakstīšana un lasīšana
MMS karšu pievienošana
Komandu iesniegšana un MMC inicializācija
Rakstiet un lasiet MMS

12. nodaļa. TWI (12C) interfeiss un tā praktiskā izmantošana

Pamata 12C protokols
12C protokola programmatūras emulācija
Datu ierakstīšana ārējā nemainīgajā atmiņā
Režīmu apmaiņa ar AT24 atmiņu
Programma
Pulkstenis ar 12C interfeisu
Datu ierakstīšana
Datu lasīšana

13. nodaļa. UART/USART programmēšana

UART inicializācija
Datu pārsūtīšana un saņemšana
Piemērs DS1307 pulksteņa iestatīšanai, izmantojot UART
Paņēmieni aizsardzībai pret sakaru traucējumiem
Paritātes pārbaude
Kā organizēt pareizu apmaiņu
Papildus iespējas USART
RS-232 un RS-485 saskarņu ieviešana
Līmeņu pārveidotāji priekš RS-232
RS-485

14. nodaļa. Enerģijas taupīšanas režīmi un sargsuņa taimeris

Enerģijas taupīšanas režīma programmēšana
Ar akumulatoru darbināmas ierīces piemērs
Programmas pabeigšana
Izmantojot sargsuņa taimeri

LIETOJUMI

1.pielikums. Atmel AVR mikrokontrolleru pamatparametri

2. pielikums. Atmel AVR komandas
Aritmētiskie un loģiskie norādījumi
Bitu lietošanas instrukcijas
Salīdzināšanas komandas
Vadības pārsūtīšanas komandas
Beznosacījumu lēciena un apakšprogrammas izsaukšanas komandas
Instrukcijas par izlaišanu un nosacītās filiāles instrukcijas
Datu pārsūtīšanas komandas
Sistēmas vadības komandas

3. pielikums. Programmu teksti
Demo programma datu apmaiņai ar zibatmiņu 45DB011B caur SPI interfeisu
Apmaiņas procedūras, izmantojot 12C interfeisu

4. pielikums. Apmainieties ar datiem ar personālais dators un atkļūdošanas programmas, izmantojot UART
Darbs ar COM portu Delfos
COM ports un Windows API
Darbs ar COM, izmantojot gatavus komponentus
RTS līnijas instalēšana DOS un Windows
COM2000 programma
Programmu atkļūdošana, izmantojot termināļa programmu

5. pielikums. Izplatīto saīsinājumu un terminu glosārijs
Krievu valodas terminu atbilstība to tulkojumam angļu valodā
Angļu valodas terminu atbilstība to tulkojumam krievu valodā

Literatūra
Priekšmeta rādītājs


Tātad, ceru, ka apzinīgais lasītājs jau ir samontējis programmētāju, eksperimentālo plati, kā arī uzstādījis un konfigurējis nepieciešamo programmatūru.

Tagad, rakstot pirmo sērijas rakstu, saprotu, ka nedaudz aizrāvos un pieļāvu to pašu kļūdu, ko mani priekšgājēji, liekot frāzi “iesācējiem”. Precīzāk būtu formulēt tēmu “Iesācējiem montāžas valodas programmēšanā”, tas ir, pieņemu, ka lasītājam jau ir vismaz virspusēja izpratne par to, kas ir mikrokontrolleris, pretējā gadījumā mums būs nepieciešams daudz laika, lai iepazīties ar šo tēmu. Tiem, kas ar tiem nemaz nav pazīstami, varu ieteikt S. Ryumika rakstu sēriju “AVR Microcontrollers”, kas, manuprāt, ir absolūti brīnišķīga, kas publicēta žurnālā Radioamator (2005. gada 1.-11.nr.) . Šajā ciklā kā bāzes kontrolieris tiek izvēlēts ATmega8, tomēr vispārīgi funkcionālās vienības Iepriekš minētais kontrolieris un ATtiny13 ir praktiski vienādi.

Lai tieši iepazītos ar mikrokontrolleri ATtiny13, iesaku grāmatu A.V. Evstifejevs "Mazās ģimenes AVR mikrokontrolleri. Lietotāja rokasgrāmata" (M.: Izdevniecība "Dodeka-XXI", 2007. - 432 lpp.). Tajā ir tulkotas un sistematizētas datu lapas visam mazās ģimenes kontrolleru klāstam, un, manuprāt, tai vajadzētu būt darbvirsmas atsaucei tiem, kas iesaistīti mikrokontrolleru programmēšanā.

Taču, stāstam turpinoties, sniegšu informāciju par tiem kontrollera mezgliem un moduļiem, kas tiks izmantoti rakstītajās programmās.

Bet tas viss ir liriska atkāpe. Atgriezīsimies tieši pie stāsta.

ATtiny13 kontrolieris, neskatoties uz tā nelielo izmēru, ir ļoti labs funkcionālās īpašības. Un mazo tapu skaitu vairāk nekā kompensē funkciju skaits, ko katrs no tiem veic. Tapu izvads un apraksts ir parādīti zemāk:

Tabula ir ņemta no iepriekš minētās grāmatas A.V. Evstifejeva.

Kā redzat, katra tapa var veikt vismaz trīs funkcijas vai pat daudz vairāk. Sākumā mēs neapsvērsim alternatīvās funkcijas, bet tikai pamata vienu - digitālo ievadi/izvadi.

Kā redzams attēlā un tabulā, visām tapām, izņemot barošanas tapas, ir nosaukums PB, kam seko sērijas numurs. Ko tas nozīmē? Visas kontrollera tapas ir apvienotas 8 daļās, lai ar tām būtu ērtāk strādāt, un katrai 8 kontaktu grupai ir piešķirti trīs īpaši I/O reģistri. Kopumā reģistru jēdziens ir galvenais, strādājot ar kontrolieriem, īpaši montētājā. Apskatīsim tuvāk katru no trim iepriekš minētajiem reģistriem. Tās visas ir viena baita šūnas kontrollera atmiņā. Katrs bits atbilst vienai no kontrollera izejām, un bita numurs reģistrā sakrīt ar izejas numuru (piemēram, 0. bits ir atbildīgs par PB0 izeju, 1. bits ir atbildīgs par PB1 izeju utt.). Visiem reģistriem ir savs nosaukums, ar kuru tiem var piekļūt, rakstot programmas. Kādi nosaukumi tie ir?

1. DDRB reģistrs ir atbildīgs par katras kontrollera tapas informācijas pārraides virzienu. Ja kāds šī reģistra bits ir “0”, tad atbilstošā izvade būs ieeja, un, ja “1”, tad izeja. Turklāt katra izvade tiek konfigurēta atsevišķi un jebkurā programmas vietā. Tas nozīmē, ka dažādos apstākļos vai dažādos laikos vienu un to pašu tapu var konfigurēt kā ieeju vai izvadi neatkarīgi no citiem tapiem.

2. PINB reģistrā ir Pašreizējais stāvoklis visas tapas: ja uz kontakta tiek pielikts spriegums, tad atbilstošajam bitam tiek ierakstīts loģisks “1”, ja sprieguma nav, tiek rakstīts loģisks “0”. Šo reģistru galvenokārt izmanto, lai nolasītu ievades režīmā esošās tapas stāvokli.

3. PORTB reģistrs veic duālu funkciju atkarībā no informācijas pārraides virziena. Ja tapa darbojas kā digitālā izeja, tad, ierakstot “1” uz jebkuru PORTB reģistra bitu, uz atbilstošās tapas parādās spriegums, un, ierakstot “0”, spriegums pazūd. Tādējādi izvades režīmā tieši šis reģistrs nosaka katras tapas stāvokli. Režīmā digitālā ieeja loģiskā "1" rakstīšana jebkuram bitam noved pie iebūvētā vilkšanas rezistora savienojuma uz atbilstošās tapas, bet "0" rakstīšana - pie tā atspējošanas. Kāda veida lieta ir šis “vilkšanas rezistors”, un kam tas ir paredzēts? Ja tapa darbojas kā digitālā ieeja, tad ievades bufera pretestība ir diezgan augsta un ieejas strāva ir diezgan maza. Tāpēc jebkuri elektriskie traucējumi var izraisīt spontānu izejas pārslēgšanos uz patvaļīgu stāvokli. Lai tas nenotiktu, starp ieeju un strāvas avotu ir pievienots rezistors ar vairāku desmitu kiloomu pretestību, “pavelkot” ieejas potenciālu līdz barošanas spriegumam (tātad nosaukums). Strāva, kas plūst caur šo rezistoru, ir pietiekami maza, lai netraucētu pārējai ķēdei, bet pietiekami liela, lai novērstu nejaušu tapu pārslēgšanos. Strādājot ar pogām, mēs bieži izmantosim uzvilkšanas rezistorus, jo, kad tie nav nospiesti, tapas, ar kurām tie ir savienoti, būtībā "karājas" gaisā un ir pakļauti traucējumiem.

Jāpiemin, ka pie ieslēgšanas visi reģistri tiek atiestatīti uz 0 un katra tapa darbojas kā digitālā ieeja bez pievilkšanas rezistora.

Tagad, kad mums ir vismaz zināms priekšstats par to, KAS ir nepieciešams, lai strādātu ar kontrollera ieejām, ir pienācis laiks uzzināt, KĀ ar tām strādāt.

Rakstīsim savu pirmo darba programma montētājā. Vispirms došu pilnu algoritmu jauna projekta izveidei, bet turpmāk to izlaidīšu, koncentrējoties tikai uz pašas programmas tekstu.

1. Dodieties uz mapi asm un izveidojiet tajā jaunu mapi. Pārdēvējiet to par mums ērtu nosaukumu. Lai būtu precīzāk, es tos nosaukšu ar mūsu soļa numuru. Šajā gadījumā "2. solis".

2. Ar peles labo pogu noklikšķiniet noklikšķiniet uz faila build.bat un mainiet ceļu uz avota failu, norādot jaunizveidoto mapi (2. darbība). Pēc tam mans saturs izskatās šādi:

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

Tas var atšķirties atkarībā no tā, kur izpakojāt arhīvu.

3. Dodieties uz mapi Asmedit un palaidiet programmu ASM_Ed.exe

4. Atvērtajā logā ierakstiet programmas tekstu. Es pakavēšos pie šī punkta sīkāk, jo tas ir galvenais mūsu šodienas stundā, kā arī turpmākajās.

Kāds ir montāžas programmas teksts? Tas var ietvert vairākus elementus, kas rakstīti saskaņā ar noteiktiem noteikumiem:

Montāžas instrukcijas ar vai bez operandiem atkarībā no instrukciju sintakses. Starp komandas nosaukumu un pirmo operandu ir jābūt atstarpei, tabulēšanai vai jebkuram abu skaitam. Operandi tiek atdalīti ar komatu, pirms kura vai aiz tā var būt arī patvaļīgs atstarpju vai tabulēšanas zīmju skaits;

direktīvas, no kurām katra sākas ar ".";

Etiķetes, kas ir lietotāja patvaļīgi nosauktas vietas programmā, uz kurām, iespējams, būs jāpārvietojas. Katra etiķete beidzas ar ":" rakstzīmi;

Komentāri, kas sākas ar ";". Veidojot hex failu, tiek ignorēts viss teksts no komentāra sākuma līdz rindas beigām, un tas var būt pilnīgi patvaļīgs;

Tukšas rindas labākai programmas struktūrai un lasāmībai.

Katrā rindā var būt ne vairāk kā viena komanda. Tomēr ir atļauta vienlaicīga etiķetes klātbūtne rindā, kam seko komanda un komentārs.

Izmantojot šos noteikumus, mēs uzrakstīsim programmu, kas ieslēgs LED2, kamēr SB1 poga ir nospiesta, un izslēgs to, ja poga tiek atlaista. Programmas teksts ir parādīts zemāk:

.include "F:\Prog\AVR\asm\Appnotes\tn13def.inc"
sbi DDRB, 4 ;РВ4 - izeja (LED2)
sbi PORTB, 2 ; ieslēdziet uzvilkšanas rezistoru uz PB2 (poga SB1)
sbic PINB, 2 ;Ja PB2=0 (nospiesta poga), izlaidiet nākamo. līniju
sbi PORTB, 4 ;PB4 instalēšana vienā (izslēdzot LED)
sbis PINB, 2 ;Ja PB2=1 (poga atlaista), izlaidiet nākamo. līniju
cbi PORTB, 4 ;PB4 iestatīšana uz 0 (deg LED)

Apskatīsim to sīkāk. Pirmajā rindā ir iekļauta direktīva, kas uzrakstīta saskaņā ar iepriekš minētajiem noteikumiem ar punktu sākumā. Tās mērķis ir programmas tekstā iekļaut aiz tā norādīto failu. Kā jau teicu pirmajā solī, mums būs nepieciešams fails "tn13def.inc". Šajā rindā jums būs jāmaina ceļš uz mapes Appnotes atrašanās vietu datorā. Kāpēc mums ir jāiekļauj šis fails? Zinātkārs lasītājs var tajā ieskatīties un izlasīt tā saturu, taču, visticamāk, sākumā viņš no tā maz ko sapratīs. Pagaidām teikšu, ka tajā ir atbilstība starp reģistru nosaukumiem, kurus montētājs pēc noklusējuma nezina, ar to fiziskajām adresēm kontrolierī.

Šīs rindas ir montētāja komandas. Uzmanīgs lasītājs pamanīs, ka kopā tiek izmantoti četri dažādas komandas. Apskatīsim katra mērķi.

Sbi instrukcijai ir divi operandi: pirmais ir reģistra nosaukums, otrais ir bita numurs. Tā izpildes rezultātā norādītais bits norādītajā reģistrā tiek iestatīts uz "1".

Komanda cbi sintaksē ir līdzīga iepriekšminētajai un veic tieši pretēju funkciju - tā atiestata norādīto bitu norādītajā reģistrā uz "0".

Komanda sbis sintaksē ir līdzīga iepriekšminētajai. Taču atšķirībā no tiem, tas neveic nekādas darbības ar reģistriem, bet tikai pārbauda norādītā bita stāvokli norādītajā reģistrā un, ja tas ir vienāds ar "1", izlaiž rindiņu pēc komandas. Pretējā gadījumā tiek izpildīta rinda, kas seko tai, kā arī visas pārējās pēc tās.

Komanda sbiс ir pretēja komandai sbis. Tas izlaiž nākamo rindu, ja norādītais reģistra bits ir "0".

Tagad, apkopojot visu iepriekš minēto, mēģināsim izprast programmas algoritmu. Lai sāktu, es to darīšu burtiski rindu pa rindiņai.

1 rindiņa. Iekļaušanas direktīvā ir iekļauts fails tn13def.inc, kurā ir reģistra definīcijas.

2. rinda. Sbi komanda DDRB reģistra 4. bitā nosaka "1", tādējādi pārslēdzot PB4 kontaktu uz izeju. Ja paskatās uz plates diagrammu (iepriekšējā soļa 1. att.), jūs varat redzēt, ka LED2 ir savienots ar šo tapu. Pēc komandas un zīmes ";" ir uzrakstīts komentārs, kas īsi izskaidro rindā veikto darbību nozīmi.

3 rinda. Tā pati sbi komanda PORTB reģistra 2. bitā iestata "1", savienojot iekšējo vilkšanas rezistoru ar PB2 tapu, kurai ir pievienota poga SB1. Tā kā mēs nemainījām DDRB reģistra 2. bita stāvokli, šī tapa paliks kā ievade, kas mums patiesībā ir nepieciešama.

4 rinda. Komanda sbic pārbauda, ​​vai PB2 ieejā nav loģiskā "0", izmantojot PINB reģistru. Ja paskatās cieši uz diagrammu, jūs varat redzēt, ka pogas, nospiežot, aizver atbilstošo spaili ar kopējo vadu. Šis ir standarta paņēmiens, jo, atlaižot pogu, uzvilkšanas rezistora dēļ izejā parādās loģisks “1”, un, nospiežot pogu, tiek parādīts loģisks “0” savienojuma dēļ. izvade uz kopējo vadu. Tātad, ja pie PB2 tapas ir loģisks “0”, tas ir, poga ir nospiesta, mēs izlaižam nākamo rindu, un, ja poga tiek atlaista, mēs to izpildām.

5 rinda. Tajā komanda sbi PORTB reģistra 4. bitā iestata loģisku “1”, tādējādi izslēdzot LED2. Asprātīgs lasītājs var brīnīties, kāpēc gaismas diode izslēdzas, ja izvadei pieslēdzam spriegumu. Atbilde slēpjas dizainā. Gaismas diode ir savienota ar anodu ar strāvas vadu un katodu ar kontroliera izeju. Tāpēc, ja izejai pievienosit spriegumu, anoda un katoda potenciāli būs vienādi, un gaismas diode nodzisīs. Ja izejā tiek izvadīts loģisks “0”, gaismas diodei tiks pievienots spriegums un tas iedegsies. Tādējādi 4. un 5. līniju pāris izslēdz LED2, kad poga tiek atlaista.

6 rinda. Nozīme ir pretēja 4. datumam. Komanda sbis pārbauda, ​​vai PB2 ieejā ir loģisks “1”, tas ir, tā pārbauda, ​​vai poga ir atlaista. Ja poga tiek atlaista, nākamā rinda tiek izlaista un nākamā rinda tiek pārieta uz nākamo. Bet tā kā 7.rindiņa ir pēdējā, tad notiek pāreja uz 2.rindu. Ja tiek nospiesta poga, tiek izpildīta 7. rinda.

7 rinda. Pretstatā 5. datumam. Komanda cbi atiestata PORTB reģistra 4. bitu uz "0", tādējādi ieslēdzot LED2. Tādējādi 6. un 7. līniju pāris ieslēdz LED2, kad tiek nospiesta poga SB1.

Kā redzat, mēs neko īpaši sarežģītu nedarījām. Izmantojot zināšanas tikai par 3 reģistriem un 4 instrukcijām, mēs uzrakstījām savu pirmo programmu. Ko darīt ar viņu tālāk? Ja vēl neesat aizmirsis, turpinām rakstīt programmas izveides algoritmu.

5. Pēc programmas teksta ierakstīšanas redaktora logā atlasiet izvēlnes vienumu “Fails” un atvērtajā sarakstā noklikšķiniet uz “Saglabāt kā...”. Faila saglabāšanas logā atlasiet mūsu izveidoto step2 mapi un norādiet faila nosaukumu “main”, jo tas ir nosaukums, ko mēs norādījām failā “build.bat”.

Pēc saglabāšanas programmas logam vajadzētu izskatīties šādi:

6. Izveidojiet hex failu. Lai to izdarītu, rīkjoslā noklikšķiniet uz pogas "II". Ir jāparādās šādam logam:

Tas mums paziņo, ka montāža tika pabeigta bez kļūdām un tika izveidots programmaparatūras fails "main.hex" ar 6 vārdu apjomu, tas ir, 12 baiti. Es atzīmēju, ka līdzīgai programmai C valodā būtu vismaz 5 reizes lielāks skaļums.

7. Pārgājuši uz mapi step2, atrodam tai papildinājumu jaunizveidota main.hex faila veidā, kuru tagad var iešūt kontrollerī ar jebkuru programmētāju, kas ir jādara, lai redzētu rezultātus programma, kuru mēs uzrakstījām. Pēc kontrollera mirgošanas, ja ķēde ir salikta pareizi, visam jādarbojas saskaņā ar mūsu izstrādāto algoritmu: kad pogas ir atlaistas, LED2 ir jābūt izslēgtam, un, kamēr poga SB1 tiek turēta nospiesta, tai jābūt ieslēgtai.

Pirms nākamās darbības es iesaku veikt šādus uzdevumus:

1. Pievienojiet programmas apstrādei pogas SB2 nospiešanu ar pretēju algoritmu: atlaižot SB2 pogu, LED1 ir jāiedegas, un, nospiežot, tai jābūt izslēgtai.

2. Uzrakstiet programmu LED2 vadīšanai, izmantojot abas pogas. Kad tiek nospiesta poga SB1, LED jāiedegas un jāpaliek ieslēgtam, līdz tiek nospiesta poga SB2, kas to izslēdz līdz nākamajai SB1 nospiešanai.

Visi Labvakar! Es raidu no mājīgas pasaules, ko sauc par “assembler”. Tūlīt paskaidrošu, par ko šī tēma attiecas AVR mikrokontrolleri- un es vēl nezinu, vai šī ziņa būs noderīga tiem, kas vēlas izmantot montētāju jebkuram citam uzdevumam. Fakts ir tāds, ka burtiski pirms dažām dienām es sāku mācīties montētāju no nulles - man ir jāizgatavo viena ierīce - un es nolēmu visu izdarīt pats. Tātad, vienā jaukā dienā es to sapratu Mācīties montētāju ir absolūti bezjēdzīgi! Montāžas valodu var tikai saprast! Tas ir, visiem tiem, kas vēlas programmēt montāžas valodā, es ļoti iesaku jums detalizēti iedziļināties mikrokontrolleris FIZISKI darbībā un pēc tam izpētīt komandu sarežģījumus.
Tāpēc es droši vien sākšu nelielu rakstu sēriju, kurā es jums pastāstīšu no paša sākuma kā tieši Asamblejas valodas programmēšanā es sapratu noteiktas lietas - domāju, ka tiem, kas vispār nesaprot, kas ir ASM, es būšu tikai tāds “tulkotājs” no to valodas, kurām šī lieta ir ļoti laba.

Uzreiz teikšu, ka šajā tēmā vairāk vai mazāk nokļuvu pēc DIHALT ierosinājuma - tāpēc šie raksti būs sava veida tulkojums no super-duper montāžas-mikrokontrollera valodas uz vairumam saprotamu valodu. Nu ceru, ka guru lugas gaitā mani izlabos, un, ja es pēkšņi kaut ko nepareizi paskaidrošu, viņi mani izlabos.
Tātad, pirmie secinājumi par assembler, ko izdarīju pirms pāris dienām, mani šokēja līdz sirds dziļumiem - un es sēdēju, lasot DI HALT rakstus no pulksten 23:00 līdz 5:00, pēc tam es devos gulēt apmierināts un laimīgs. Es sapratu lietas būtību. montāžas valodas programmēšana mikrokontrolleriem.
Kā to var izskaidrot vēl vienkāršāk? Es domāju, ka mums jāsāk no pašas būtības.
***
Sākotnēji mēs neiedziļināsimies tehniskās detaļās (par tām mēs runāsim nākamajā rakstā) - vienkārši iedomājieties, ka ir 3 rakstzīmes:
1. Mikrokontrolleris — Tas ir anglis Stīvs, kurš ieradās pie krieva. Viņš lieliski zina angļu valoda, bet viņš vispār nesaprot krievu valodu - ne vārda. Tikai angliski. Viņš zaudēja strīdu un bez šaubām apņēmās darīt visu, ko krievs viņam prasīs.
2. Montētājs -Šī ir tulkotāja Vasja, kuras māte ir angļu valoda, bet tēvs ir krievs. Viņš lieliski zina gan angļu, gan krievu valodu.
3. Mēs - Tas ir krievs, pie kura ir atnācis anglis. Nu, tas ir, mēs esam mēs =) Tajā pašā laikā mēs lieliski zinām krievu valodu un (!!!) nedaudz angļu valodu - tikai nedaudz, ar vārdnīcu.
***
Iedomājieties šādu situāciju - anglis sēž uz krēsla jūsu istabā. Un tu sēdi pie sava datora un lasi šo ziņu, kad pēkšņi tavs logs pēkšņi atvērās! Tā ir slikta veiksme! Pūš vējš, priekškars pārvērties burā... Būtu jauki aizvērt! Bet ir slinkums piecelties no krēsla, noņemt kājas no sistēmas bloka, iebāzt tās čībās, nolikt kafijas (alus) krūzi un doties cīnīties ar elementiem. Un tad jūs pēkšņi saprotat, ka istabā ir anglis, kurš ir zaudējis likmi, un ir pienācis laiks viņu vajāt! Un tu viņam tik mīļi saki: “Drušs! Lūdzu, aizveriet logu, un tad atkal varēsiet apsēsties uz krēsla! un viņš sēž, neizpratnē skatās uz tevi un neko nedara! Jūs, protams, varat iesist kāpostu zupu, bet tad viņš joprojām jūs nesapratīs! Tad tu piezvani savam tulkam draugam Vasilijam – viņš atnāk un apsēžas blakus anglim uz krēsla. Un tu saki - Tulko: “Stīv, ej un aizver logu un tad apsēdies uz krēsla!” Tulkotājs tulko angliski – anglis saprot un aiziet un aizver logu, un tad nāk un apsēžas uz krēsla.
Šajā brīdī jums tikai jāsaprot montētāja loma šajā ķēdē "Mēs-montētājs-kontrolieris"
Tas ir, kā visi saprastu, kas ir montētājs? Tad lasiet tālāk.
***

Tātad, iedomāsimies šo situāciju. Tu saki Vasjai - “Klausies, nu, īsi sakot, šis ir tas gadījums – es aizmirsu mājās kalkulatoru, izdaliet 56983 ar 2 un saki Stīvam izdarīt tik daudz atspiešanās ar dūrēm” un Vasja rēķinās ar kalkulatoru un Stīvs stāsta angļu valodā “Do push-ups with your fists 28491 times” To sauc "DIREKTĪVA"- citiem vārdiem sakot, direktīva ir uzdevums Vasijai, kura rezultāts ir Stīva rīcība.

Ir arī cita situācija – jūs sakāt Vasjai “Pasaki Stīvam izdarīt 28491 atspiešanos”, un Vasja vienkārši pārtulko jūsu vārdus angļu valodā. Tas tiek saukts OPERATORS

Vienkārši – ir direktīva un ir operators. Operators ir jūsu tiešais norādījums Stīvam, kā rīkoties - Vasja šeit tikai tulko jūsu pieprasījumu angļu valodā. Un direktīva ir uzdevums pašam Vasjam – un Vasja vispirms izdara to, ko tu viņam teici, un tad atkarībā no rezultāta viņš kaut ko pastāsta Stīvam.

Tagad angliski mocīsim regulāri! Bet vispirms mums ir labāk jāiepazīst mūsu tulkotājs Vasja. Jums jāzina sekojošais - Vasja vienmēr jums paklausa neapšaubāmi - ko viņam teica, to viņš dara. Vasjas kalkulatorā nav zīmju aiz komata - ja paskatās uz piemēru ar atspiešanos, tad 56983 \ 2 = 28491.5 - bet Vasijam viss pēc komata ir nogriezts - un viņš redz tikai veselu skaitli - un tam nav nozīmes vai būs 28491.000001 vai būs 28491.9999999 - Vasjai tas ir viens liels darījums abos gadījumos būs 28491. Nekas nav noapaļots. Vairāk svarīga informācija par Vasju. Vasja ir nežēlīga - viņam ir vienalga, ka Stīvs divdesmit astoņus tūkstošus reižu izdara atspiešanos. Viņi viņam teica, ka Vasja tulkoja. Un viņš ne tikai tulkoja, bet arī piespieda mani darīt to, ko tu prasi. Tātad, ja Stīvs nomirs divdesmit trīs tūkstoši pieci simti trīspadsmitajā atspiešanās reizē, tā būs tikai jūsu vaina.

Patiesībā pagaidām tas arī viss. Nākamajā ierakstā mēs padziļināsimies - pagaidām pietiek tikai to saprast. Iedomājieties šo situāciju un saprotiet, kas ir kas, kurš kādu lomu spēlē un kā direktīva atšķiras no operatora.
Un tad mēģināsim visu nosaukt īstajā vārdā un aptuveni novērtēt, kā montētājs strādā ar mikrokontrolleri kā pieaugušais.

Slavenā Tetris klons, kas rakstīts montāžas valodā. Tas pilnībā iekļaujas 512 baitu sāknēšanas sektorā (tam ir nepieciešami tikai 446 baiti vietas, kas ir tieši maksimālais sāknēšanas ielādes izmērs MBR).

MBR ir sadaļa, kurā ir kods un dati, kas nepieciešami turpmākai operētājsistēmas ielādei un atrodas pirmajos fiziskajos sektoros. Paši pirmie 446 diska baiti tiek nodoti sāknēšanas ielādētāja kodam. Tieši šajā vietā ir rakstīts TetrOS.

Protams, šādu īpašību dēļ tas tiek ielādēts pirms jebkura operētājsistēma- tam nav nepieciešama OS, tā darbojas pati par sevi. Jā, jā, jūs dzirdējāt pareizi, TetrOS ir savs sāknēšanas ielādētājs.

Lūk, kā tas izskatās uz ekrāna:

Un avota kods sāknēšanas sektorā izskatās šādi:

Un jā, tā ir visi avots. Vai atceraties, ka tas sver tikai 446 baitus?

Varat palaist šo "brīnumaino operētājsistēmu" zem qemu vai pat faktiski instalēt to diska vai zibatmiņas diska sāknēšanas nodalījumā.

Palaist

Vienkārši instalējiet qemu:

sudo apt-get install qemu

un palaist:

Notiek ielāde USB zibatmiņas diskā

Kopējiet attēlu zibatmiņas diskā. Pieņemsim, ja zibatmiņas disks ir uzstādīts kā /dev/sde, jums būs jāpalaiž šāda komanda, lai tajā rakstītu sāknēšanas sektors TetrOS:

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

Spēles apraksts

Izstrādātājam izdevās iespiest ne pārāk garlaicīgu dizainu tikai 512 baitu atmiņā. Katram spēles ķieģelim ir sava krāsa, to kontrolē ar pogām, sakāves gadījumā spēle beidzas, ķieģeļi tiek ģenerēti nejauši... BolgenOS nebija pat tuvu!

Diemžēl izmēra dēļ no dažām funkcijām nācās atteikties. Spēlei nav punktu skaita, restartējiet spēli bez pārstartēšanas vai parādiet, kāds būs nākamais ķieģelis.

Vārds: Atmel AVR mikrokontrolleru praktiskā programmēšana montāžas valodā 2. izdevums

Izdevējs:"BHV-Pēterburga"

Izdošanas gads: 2011

Lapas: 354

Valoda: krievu valoda

Formāts: DjVu

Izmērs: 12,2 MB

Atmel AVR mikrokontrolleru darbības principi, arhitektūras iezīmes un programmēšanas metodes ir uzliktas.

Tiek nodrošinātas gatavas receptes mūsdienu mikroelektronisko iekārtu pamatfunkciju programmēšanai: no reaģēšanas uz pogas nospiešanu vai dinamiska displeja konstruēšanu līdz sarežģītiem datu ierakstīšanas protokoliem ārējā atmiņa vai reāllaika pulksteņa savienojuma funkcijas. Īpaša uzmanība koncentrējas uz datu apmaiņu no mikroelektroniskajām ierīcēm ar personālo datoru, un sniedz programmu piemērus. Grāmatā ir ņemtas vērā funkcijas mūsdienīgi modeļi AVR un ar to saistītās pēdējo gadu ražošanas mikroshēmas.
Lietojumprogrammā ir AVR mikrokontrolleru galvenie parametri, komandu un tekstu saraksts.Aplikācijas satur AVR mikrokontrolleru galvenos parametrus, tiem paredzēto komandu un programmu tekstu sarakstu, kā arī lietoto terminu un saīsinājumu sarakstu.
Studentiem, inženieriem un radioamatieriem

7. Mikrokontrolleri, to izcelsme un pielietojums
8. Mikrokontrolleru fons
10. Grieķu stila elektronika
12. Kāpēc AVR?
14. Kas tālāk?
17. L DAĻA ATMEL AVR KONSTRUKCIJAS UN DARBĪBAS VISPĀRĪGI PRINCIPI
19. Nodaļa 1. Pārskats par Atmel AVR mikrokontrolleriem
21. AVR ģimenes
23. AVR MK praktiskās lietošanas iezīmes
23.Par patēriņu
25. Dažas AVR izmantošanas iespējas shēmās
27. Nodaļa 2. Vispārējā struktūra, atmiņas organizācija, pulksteņi, atiestatīšana
27. Programmas atmiņa
29. Datu atmiņa (RAM, SRAM)
31. Nepastāvīgā datu atmiņa (EEPROM)
32.Pulksteņu metodes
34. Atiestatīt
37. 3. nodaļa: Ievads perifērijas ierīcēs
38. I/O porti
39. Taimeri-skaitītāji
41. Analogo-digitālo pārveidotājs
42. Seriālie porti
43. UART
46. ​​SPI interfeiss
50. TWI interfeiss (I2C)
50. Universal Serial Interface USI
53. 4. nodaļa. Pārtraukumi un enerģijas taupīšanas režīmi
53.Pārtraucas
57. Pārtraukumu veidi
58. Enerģijas taupīšanas režīmi
61. II DAĻA. ATMELAVR MIKROKONTROLES PROGRAMMĒŠANA
63. 5. nodaļa. AVR saimes MK programmēšanas vispārīgie principi
63. Assembler vai C?
67. AVR programmēšanas metodes un rīki
67.Koda redaktors
68. Par AVR Studio
70. Montētāja sakārtojums
71. Programmētāji
75. Par hex failiem
78. AVR montētāja komandas, instrukcijas un apzīmējumi
79. Skaitļi un izteiksmes
80. Direktīvas un funkcijas
84. AVR programmas vispārējā struktūra
85. Pārtraukumu apstrāde
89.ATCELT
90. Vienkāršākā programma
92.Kavēšanās
94. Skaitītāja programma
96. Pārtraukumu izmantošana
97. Taimera aizkave
98. Skaitītāja programma, kas izmanto pārtraukumus
101. Par konfigurācijas bitiem
105. 6. nodaļa, AVR komandu sistēma
105. Vadības nodošanas instrukcijas un SREG reģistrs
111. Check-pass komandas
113. Loģisko operāciju komandas
114. Pārslēgšanas instrukcijas un bitu darbības
116. Aritmētisko darbību norādījumi
118. Datu pārsūtīšanas komandas
122. Sistēmas vadības komandas
123. Standarta procedūru veikšana montētājā
125. Par steku, lokāliem un globālajiem mainīgajiem
127. 7. nodaļa. Aritmētiskās darbības
128. Standarta aritmētiskās darbības
129. Daudzciparu skaitļu reizināšana
131. Daudzciparu skaitļu dalījums
134.Darbības ar daļskaitļiem
136. Gadījuma skaitļu ģenerators
138. Darbības ar cipariem BCD formātā
143. Negatīvie skaitļi MK
147. 8. nodaļa. Taimeru programmēšana
147. 8 un 16 bitu taimeri
149. Dotās frekvences vērtības veidošana
153. Atpakaļskaitīšana
158. Precīza laika korekcija
160. Frekvences mērītājs un perioda mērītājs
160. Frekvences mērītājs
164. Periodometrs
167. Dinamiskā displeja vadība
168. LED indikatori un to pieslēgums
171. Dinamisko displeju programmēšana
174. Taimeri PWM režīmā
179. 9. nodaļa. EEPROM lietošana
179. Vēlreiz par datu drošību EEPROM
181. Rakstiet un lasiet EEPROM
183. Konstantu glabāšana EEPROM
187. 10. nodaļa. Analogais komparators un ADC
187. Analogi-digitālās darbības un to kļūdas
190. Darbs ar analogo komparatoru
193. ADC integrēšana uz salīdzinājuma
194. Darbības princips un aprēķinu formulas
198. ADC programmas integrēšana
201. Iebūvēts ADC
204. ADC izmantošanas piemērs
206. Programma
215. 11. nodaļa. SPI programmēšana
215. Pamatoperācijas, izmantojot SPI
216. Aparatūras iespēja
218. Programmatūras iespēja
219. Par nepastāvīgās atmiņas veidiem
221. Rakstīt un lasīt zibatmiņu caur SP!
224. Apmaiņas programma ar atmiņu 45DB011B caur SPI
225. Flash karšu rakstīšana un lasīšana
225. MMS karšu pievienošana
228. Komandu iesniegšana un MMC inicializācija
232. MMS rakstīšana un lasīšana
237. Nodaļa 12. TW1 (I2C) interfeiss un tā praktiskā izmantošana
237. Pamatprotokols 1 2 C
240. I 2 C protokola programmatūras emulācija
241. Datu ierakstīšana ārējā nemainīgajā atmiņā
241. Režīmu apmaiņa ar AT24 atmiņu
243. Programma
247. Pulkstenis ar I 2 C interfeisu
255. Datu ierakstīšana
259. Datu nolasīšana
261. Nodaļa 13. UART/USART Programmēšana
262. UART inicializācija
263. Datu nosūtīšana un saņemšana
266. Piemērs DS1307 pulksteņa iestatīšanai, izmantojot UART
271. Paņēmieni aizsardzībai pret sakaru traucējumiem
271. Paritātes pārbaude
273. Kā pareizi organizēt apmaiņu
274. USART papildu iespējas
276. RS-232 un RS-485 saskarņu ieviešana
280. Līmeņa pārveidotāji priekš RS-232
283.RS-485
285. Nodaļa 14. Enerģijas taupīšanas režīmi un sargsuņa taimeris
286. Enerģijas taupīšanas režīma programmēšana
287. Ar akumulatoru darbināmas ierīces piemērs
289. Programmas pabeigšana
293. Sargsuņa taimera izmantošana
299. PIETEIKUMS
301. Pielikums 1. Atmel AVR mikrokontrolleru pamatparametri
309. 2. pielikums. Atmel AVR komandas
310. Aritmētiskie un loģiskie norādījumi
311. Bitu darbības instrukcijas
312. Salīdzināšanas komandas
313. Vadības nodošanas komandas
313. Komandas beznosacījuma lēcienam un apakšprogrammu izsaukšanai
314. Check-skip komandas un nosacījuma lēciena komandas
315. Datu pārsūtīšanas komandas
316. Sistēmas vadības komandas
317. 3. pielikums Programmu teksti
317. Demonstrācijas programma datu apmaiņai ar zibatmiņu 45DB011B caur SPI interfeisu
321. Apmaiņas procedūras, izmantojot I2C saskarni
329. 4. pielikums. Datu apmaiņa ar personālo datoru un atkļūdošanas programmas caur UART
329. Darbs ar COM portu Delfos
335. RTS līnijas instalēšana DOS un Windows
337. COM2000 programma
339. Programmu atkļūdošana, izmantojot termināļa emulatoru
341. 5. pielikums. Biežāk lietoto saīsinājumu un terminu vārdnīca
347. Literatūra
349. Priekšmeta rādītājs