AVR mikrokontrolleru programmēšanas procedūra. Ieteikumi iesācēju mikrokontrolleru programmētājiem. Nepieciešamais programmu komplekts

Tātad, mēs sakārtojām kodola darbu attiecībā uz pārejām un adresēšanu. Ir pienācis laiks pievērst mūsu uzmanību citai jomai – atmiņai.

Ir divi tā veidi (EEPROM netiek ņemts vērā, jo tas parasti ir perifērijas ierīce, bet par to vēlāk):

  • RAM - RAM
  • ROM - ROM, aka zibatmiņa, aka programmas atmiņa

Tā kā mūsu arhitektūra ir Hārvarda, tad operatīvajam darbiniekam ir sava adrese, un zibspuldzei ir sava. Datu lapā varat redzēt RAM adresācijas struktūru.

Nekavējoties pievērsiet uzmanību adresēm! RON un perifērijas reģistri, kā arī RAM atrodas vienā adrešu telpā. Tie. adreses no 0000 līdz 001F aizņem mūsu reģistrus, tad līdz adresei 005F ir I/O šūnas - porti. Caur portiem tiek konfigurēts viss, kas atrodas uz kontroliera. Un tikai tad no adreses 0060 nāk mūsu RAM, ko varam izmantot paredzētajam mērķim.

Turklāt jāņem vērā, ka arī I/O reģistriem ir sava adresācija - I/O reģistru adrešu telpa (no 00 līdz 3F), tā norādīta attēla kreisajā pusē. IO/reģistra bloks Šī adresēšana darbojas TIKAI OUT un IN instrukcijās.Tas noved pie interesantas funkcijas.

Perifērijas reģistriem var piekļūt divos dažādos veidos:

  • Izmantojot IN/OUT komandas īsā adresē I/O adrešu telpā
  • Izmantojot LOAD/STORE komandu grupu pilnā adresē RAM adrešu telpā

Piemērs. Ņemsim asinhronā raiduztvērēja UDR ievades reģistru, tam ir adrese 0x0C (0x2C), adrese vispārējā adrešu telpā ir norādīta iekavās.

LDI R18,10; Mēs ielādējām R18 reģistrā numuru 10. Tāpat kā OUT UDR,R18; Secināts pirmajā veidā, pats kompilators; Aizstāj vērtību 0x0C, nevis UDR STS 0x2C,R18 ; Viņi mani izveda pa otro ceļu. Izmantojot komandu Veikals; Ievadot adresi tieši.

Abas metodes dod identiskus rezultātus. BET! Tie, kas darbojas, adresējot ievades/izvades telpā (OUT/IN), ir par diviem baitiem īsāki. Tas ir saprotams - viņiem nav jāuzglabā patvaļīgas atmiņas šūnas divbaitu adrese, un ievades-izvades vietas īsā adrese iekļaujas divbaitu instrukciju kodā.

Tiesa, šeit ir vēl viens joks. Fakts ir tāds, ka katru gadu parādās arvien vairāk akmeņu no AVR, un tajos ir arvien vairāk gaļas. Un katram sprakšķam ir nepieciešami savi perifērijas I/O reģistri. Un tagad mēs esam sasnieguši punktu, kurā ATMega88 (kas aizstāja Mega8) jau ir tik daudz perifērijas ierīču, ka tā I/O reģistri vairs neietilpst 3F adrešu telpas ierobežojumā.

Ak, viņi ir ieradušies. Un šeit tie, kas pāriet no vecajiem akmeņiem uz jauniem, sāk izteikt neizpratnē izteicienus - kāpēc komandas OUT/IN darbojas uz dažiem perifērajiem reģistriem, bet ne uz citiem?

Un tas ir vienkārši - nebija pietiekami daudz dziļuma.

Bet kodols ir viens, to vairs nevar pārtaisīt. Un te ATMEL cilvēki rīkojās viltīgi – ieviesa tā saucamos atmiņas kartētos reģistrus. Tie. visi tie reģistri, kas neiekļāvās 3F limitā, tagad ir pieejami tikai vienā veidā - caur Load/Store.

Kas par joku. Ja atver kādu m88def.inc, tad var redzēt, kuri no I/O reģistriem ir “pareizi” un kuri ir atmiņas kartēti.

Būs kaut kas līdzīgs šim:

; ***** I/O REĢISTRĀCIJAS DEFINĪCIJAS ******************************************** ******* * ; PIEZĪME: ; Definīcijas ar atzīmi "MEMORY MAPPED" ir paplašinātas I/O porti; un to nevar izmantot ar IN/OUT instrukcijām .equ UDR0 = 0xc6 ; ATMIŅA KARTEĒTA .equ UBRR0L = 0xc4 ; ATMIŅA KARTEĒTA .equ UBRR0H = 0xc5 ; ATMIŅA KARTEĒTA .equ UCSR0C = 0xc2 ; ATMIŅA KARTEĒTA .equ UCSR0B = 0xc1 ; ATMIŅA KARTEĒTA .equ UCSR0A = 0xc0 ; ATMIŅAS KARTE bla, bla, bla, un daudz kas cits.equ OSCCAL = 0x66 ; MEMORY MAPPED .equ PRR = 0x64 ; ATMIŅA KARTEĒTA .equ CLKPR = 0x61 ; MEMORY MAPPED .equ WDTCSR = 0x60 ; ATMIŅA KARTEĒTA .equ SREG = 0x3f ;<------ А тут пошли обычные.equ SPL = 0x3d .equ SPH = 0x3e .equ SPMCSR = 0x37 .equ MCUCR = 0x35 .equ MCUSR = 0x34 .equ SMCR = 0x33 .equ ACSR = 0x30

Tie ir pīrāgi.

Un šajā laukā jūs saprotat, ka liels pūkains orgāns lido pretī montāžas koda savstarpējai saderībai ar mērķi to cieši nosegt. Galu galā viena lieta ir labot visa veida makro definīcijas un definīcijas, kas apraksta reģistrus, un cita lieta ir sēdēt un, tāpat kā Pelnrušķīte, atdalīt pareizos portus no nepareizajiem.

Tomēr ir risinājums. Makrovaloda! Nepatīk komandu sistēma? Izveidojiet savu ar blekdžeku un prostitūtām!
Veidosim savu komandu UOUT, piemēram, universālu OUT

Līdzīgi arī IN komandai.Vispār ar tādiem makro var ĻOTI ļoti dažādot montētāju, pārvēršot to par jaudīgu programmēšanas valodu, kas var saplēst visādus C un Pascal kā lupatu.

Nu ko es runāju... par RAM.

Tātad, mēs sakārtojām adresāciju. Tagad jūs zināt, kur meklēt atmiņas adreses, kur sākas lietotāja RAM šūnas - datu lapas sadaļā Atmiņas karte. Bet tur, lai uzzinātu.

Un mūsu kodā RAM sākas ar direktīvu.DSEG Atcerieties mūsu veidni?

Iekļauts "m16def.inc" ; Mēs izmantojam ATMega16 ;= Start macro.inc =============================== ; Makro šeit;= Beigt makro.inc ================================= ; RAM ================================================== ============ .DSEG ; RAM segments; zibspuldze ================================================== ========== .CSEG ; Koda segments; EEPROM ================================================== ======== .ESEG ; EEPROM segments

Pēc .DSEG mēs varam iestatīt savus mainīgos. Un šeit mums vienkārši ir šūnu uzliesmojums - aizņem jebkuru. Ievadi adresi un esi laimīgs. Bet kāpēc adreses jāskaita manuāli? Lai te padomā sastādītājs.

Tāpēc mēs ņemsim un uzliksim etiķeti

0x0060 ## ;Mainīgie 0x0061 ## 0x0062 ## 0x0063 ## ;Mainīgie2 0x0064 ## 0x0065 ## ;Mainīgie4 varētu sākties šeit

Kā ## jebkurš baits. Pēc noklusējuma FF. Protams, nav jārunā par mainīgo lielumu rakstīšanu, sākotnējo inicializāciju, pārplūdes kontroli un citiem buržuāziskiem priekiem. Šī ir Sparta! Es domāju, montētājs. Viss ar rokām.
Ja mēs zīmējam analoģiju ar C, tad tas ir kā darbs ar atmiņu, izmantojot tikai tukšās norādes. Šišņiki sapratīs. Viņi sapratīs un šausminās. Jo šī pasaule ir nežēlīga un nodevīga. Es nedaudz nepareizi aprēķināju indeksu un pazaudēju citus datus. Un, sasodīts, jūs uztversit šo kļūdu, ja tā uzreiz neparādīsies.

Tātad uzmanība, uzmanība un vēlreiz uzmanība. Mēs palaižam visas atmiņas darbības, izmantojot izsekošanu, un nekas neizdosies vai pārplūdīs.

.ORG direktīva darbojas arī datu segmentā.Tā darbojas tieši tāpat - tā pārsūta adreses, šajā gadījumā atzīmes, no šejienes uz atmiņas beigām. Tikai viens smalkums - ORG 0000 sniegs mums pašu RAM sākumu, un tas ir R0 un citi reģistri. Un nulle kilometra RAM, izmantojot Mega16 kā piemēru, dos ORG 0x0060. Un citos kontrolleros ir kāda cita vērtība. Ir slinks katru reizi skatīt datu lapu, tāpēc ir tāda makro definīcija kā SRAM_START, kas norāda RAM sākumu konkrētam MK.

Tātad, ja mēs vēlamies, lai RAM sākums, teiksim, 100 baiti, tiktu atstāts zem kāda veida atkritumu bufera, mēs veicam šo triku.

1 2 3 4 .DSEG .ORG SRAM_START+100 mainīgie: 3. baits

DSEG .ORG SRAM_START+100 mainīgie: 3. baits

Gatavs, mēs notīrījām buferzonu no sākuma līdz 100.

Labi, mēs esam sakārtojuši adresāciju. Kā strādāt ar atmiņas šūnām? Un šiem nolūkiem ir divas komandu grupas. LOAD un STORE ir lielākā komandu grupa.

Fakts ir tāds, ka ar RAM šūnu nevar izdarīt neko citu kā tikai ielādēt tajā baitu no RON vai izlādēt baitu no tā uz RON.

Saglabāt (ST**) komandas tiek ierakstītas RAM, un komandas Load (LD**) tiek lasītas.

Lasīšana notiek reģistrā R16…R31, un šūnas adrese tiek norādīta tieši komandā. Šeit ir vienkāršs piemērs. Ir trīs baitu mainīgais mainīgais, tas jāpalielina par 1. Tas ir. veikt Variable++ operāciju

DSEG mainīgie: .byte 3 Variables2: .byte 1 .CSEG ; Mainīgais ir atmiņā; vispirms jums tas ir jāiegūst. LDS R16, Mainīgie ; Izlasiet pirmo mainīgo baitu R16 LDS R17, Mainīgie+1 ; Lasīt otro mainīgo baitu R17 LDS R18, Mainīgie+2 ; Nu, trešais baits R18; Tagad pievienosim tam 1, jo AVR nevar pievienot tikai ar konstanti; lai atņemtu, ir jāizkropļo. Tomēr tas nerada īpašas problēmas. SUBI R16,(-1) ; kopumā SUBI ir atņemšana, bet -(- dod + SBCI R17,(-1) ; Un šeit tiek ņemta vērā pārnešana. Bet par to vēlāk. SBCI R18,(-1) ; Matemātika asamblejā ir atšķirīgs stāsts STS mainīgie, R16 ; Saglabāt visu, kā tas bija. STS mainīgie+1,R17 STS mainīgie+2,R18

Vai arī varat izmantot citu metodi. Netieša ierakstīšana, izmantojot indeksu reģistru.

DSEG mainīgie: .byte 3 Variables2: .byte 1 .CSEG ; Ņemiet mūsu mainīgā LDI YL,low(Variables) LDI YH,High(Variables) adresi; Mainīgais ir atmiņā; vispirms jums tas ir jāiegūst. LD R16, Y+ ; Lasīt pirmo Variables baitu R16 LD R17, Y+ ; Nolasīt otro mainīgo baitu R17 LD R18, Y+ ; Nu, trešais baits R18; Tagad pievienosim tam 1, jo AVR nevar pievienot tikai ar konstanti; lai atņemtu, ir jāizkropļo. Tomēr tas nerada īpašas problēmas. SUBI R16,(-1) ; patiesībā SUBI ir atņemšana, bet -(- dod + SBCI R17,(-1) ; Un šeit tiek ņemta vērā pārnešana. Bet par to vēlāk. SBCI R18,(-1) ; Matemātika asamblejā ir cits stāsts ST -Y,R18 ; Mēs saglabājam visu kā bija. ST -Y,R17 ; Bet apgrieztā secībā ST -Y,R16

Šeit jau tiek izmantotas darbības ar pēcpieaugumu un pirmssamazināšanu. Pirmajā mēs vispirms nolasām, pēc tam pievienojam adresei 1. Otrajā vispirms no adreses atņemam 1 un pēc tam saglabājam.

Ir ērti izmantot šādas pakāpeniskas komandas, lai atkārtotu masīvus atmiņā vai tabulās.
Un ir arī netieša relatīvā rakstīšanas/lasīšanas LDD/STD un citas iespējas visiem trīs indeksu veidiem (X,Y,Z). Kopumā smēķējiet datu lapu un komandu sistēmu.

Kaudze
Ak, kaudze ir lieliska lieta. Man tajā patīk tas, ka steka darbības traucējumi pārvērš darba programmu pilnīgā haosā. Jo steka operācijām nepieciešama pastiprināta uzmanība, jo, ja steka kaut kur ir saplīsusi un uzreiz nevari izsekot, tad vēlāk noķersi... Vispār jau smukulītis, nevis gizmo.

Kāpēc es tevi mīlu? Nu, ja C ir stulba amatniecība, ātra un efektīva, tad montāža ir filigrāna māksla. Kā maniakiem patīk Džims kniedēt šedevrus no papīra un tikai no papīra, lai gan varētu šķist, ka savam priekam varētu nopirkt gatavu saliekamo modeli un līmi. Tātad arī šeit - process pats par sevi ir milzīgs. Tostarp no atkļūdošanas grūtībām :))))

Tātad, par kaudzi. Kas tas ir? Un šī ir atmiņas zona. Darbojas pēc kaudzes principa. Tie. Pēdējo, ko viņš nolika, viņš paņēma pirmo.

Kaudzītei ir rādītājs, kas norāda uz kaudzes augšdaļu. Par steka rādītāju ir atbildīgs īpašs reģistrs SP, vai drīzāk tas ir reģistru pāris SPL un SPH. Bet mikrokontrolleros ar nelielu RAM daudzumu, piemēram, Tini2313, ir tikai SPL

Kad kontrolieris startē, parasti pirmais, ko viņi dara, ir inicializēt steku, SP ierakstot tās dibena adresi, no kurienes tas izaugs. Parasti tas ir RAM beigas, un tas pieaug uz sākumu.

Tas tiek darīts šādā veidā pašā programmas sākumā:

1 2 3 4 5 LDI R16, Zems (RAMEND) OUT SPL, R16 LDI R16, augsts (RAMEND) OUT SPH, R16

LDI R16, Zems (RAMEND) OUT SPL, R16 LDI R16, augsts (RAMEND) OUT SPH, R16

Kur RAMEND ir makro definīcija, kas norāda RAM beigas pašreizējā MK.

Tas arī viss, kaudze ir gatava lietošanai. Dati tiek pārsūtīti uz steku, izmantojot komandu PUSH Rn, un izgūti, izmantojot POP Rn.
Rn ir jebkurš no RON.

Komandas CALL, RCALL, ICALL, RET, RETI un pārtraukuma izsaukšana arī darbojas ar steku, bet vairāk par to vēlāk.

Paspēlēsimies ar kaudzi, lai sajustu, kā tas darbojas, saprastu, kā un kur tas pārvietojas.

Studijā ievadiet šādu kodu:

CSEG ; LDI koda segments R16,Zems(RAMEND) ; Stack inicializācija OUT SPL,R16 LDI R16,High(RAMEND) OUT SPH,R16 LDI R17,0 ; Slodzes vērtības LDI R18.1 LDI R19.2 LDI R20.3 LDI R21.4 LDI R22.5 LDI R23.6 LDI R24.7 LDI R25.8 LDI R26.9 PUSH R17 ; Mēs ievietojām vērtības uz kaudzītes PUSH R18 PUSH R19 PUSH R20 PUSH R21 PUSH R22 PUSH R23 PUSH R24 PUSH R25 PUSH R26 POP R0 ; Pop vērtības no steka POP R1 POP R2 POP R3 POP R4 POP R5 POP R6 POP R7 POP R8 POP R9

Tagad palaidiet studiju soli pa solim un skatieties, kā mainās SP. Stack Pointer var redzēt studijā tajā pašā vietā, kur programmu skaitītājs.

Pirmkārt, mēs inicializējam steku un ielādējam reģistrus ar datiem. Rezultāts būs šāds attēls:

Tālāk, izmantojot POP komandu, mēs izgūstam datus no steka. Lūdzu, ņemiet vērā, ka mums nav svarīgi, kur mēs ievietojam datus stekā un kur tos ielādējam. Galvenais ir uzstādīšanas secība! Mēs to ievietojam no augstākajiem reģistriem un saņemsim zemākajos. Tas palielinās kaudzes rādītāju.

PUSH R16 PUSH R17 POP R16 POP R17

Piemēram, es jau runāju par zemāko RON ierobežojumu - tie neļauj ierakstīt skaitli tieši sevī. Tikai caur vecākās grupas reģistriem. Bet tas ir neērti!

Problēma tiek atrisināta, izmantojot makro. Es to nosaucu par LDIL - LDI zems

MACRO LDIL PUSH R17; Saglabāsim viena no augstākajiem reģistriem vērtību stekā. LDI R17,@1; Ielādēsim tajā mūsu tūlītējo vērtību MOV @0,R17; Pārnesim vērtību uz zemās grupas reģistru. POP R17; Atjaunosim no steka augstākā reģistra vērtību. .ENDM

Tagad jūs varat viegli izmantot mūsu pašdarināto komandu.

1 LDIL R0,18

Laika gaitā fails ar makro iegūst šādas pašdarinātas komandas un strādāt kļūst viegli un patīkami.

Stack kļūdas
Kaudzīte palielinās pretī datiem, un tagad iedomājieties, ka mums atmiņā ir statusa mainīgais un tas atrodas adresē, piemēram, 0x0450. Bīstami tuvu kaudzes augšdaļai. Mainīgais saglabā, piemēram, galīgā stāvokļa mašīnas stāvokli, no kura ir atkarīga tālākā programmas loģika. Teiksim, ja ir 3, tad darām vienu lietu, ja ir 4, tad kaut ko citu, ja ir 5, tad kaut ko citu un tā tālāk līdz 255 stāvokļiem. Un pēc darba loģikas pēc 3 ir jābūt 4re, bet ne 10

Un tad bija 3. Un tad vienā šausmīgā brīdī apstākļi sakrita tik ļoti, ka kaudze pieauga un tā augšdaļa sasniedza šo mainīgo, ievadot tur vērtību, piemēram, 20, un tad kurts atkrita. Muļķu atstāšana ir klasisks kaudzes pārpildes piemērs. Un šī iemesla dēļ programmas loģika pilnībā sabruka.

Vai arī pretējs piemērs - steku uzbīdīja līdz mainīgajiem, bet tajā brīdī mainīgie tika atjaunināti un pārrakstīja steka datus. Rezultātā no steka tika izņemts kaut kas nepareizs (parasti greizas atgriešanas adreses), un programma avarēja. Šis variants, starp citu, ir daudz nekaitīgāks, jo... šajā gadījumā aploksne ir redzama uzreiz un tā Pēkšņi neizlec pēc dievs zina cik ilga laika.

Turklāt šī kļūda var parādīties un pazust. Atkarībā no tā, kā programma darbojas un cik dziļi tā ielādē steku. Tomēr šāda bēda ir biežāka, rakstot C valodā, kur nevar redzēt, cik aktīvi notiek darbs ar steku. Uz ASMA viss ir daudz pārredzamāks. Un šeit tas var rasties atklāti greiza algoritma dēļ.

Montētāji bieži saskaras ar citām steka kļūdām. Pirmkārt, aizmāršība. Es kaut ko ieliku un aizmirsu izņemt. Ja problēma bija apakšprogrammā vai pārtraukumā, tad atgriešanas adrese tiek izkropļota (par to nedaudz vēlāk), steks tiek norauts un programma uzreiz sabrūk. Vai arī neuzmanība – datus saglabāju vienā secībā un izguvu citā. Hmm, reģistru saturs ir apmainīts.

Lai izvairītos no šādām kļūdām, pirmkārt, ir jāuzrauga kaudze un, otrkārt, pareizi jāplāno mainīgo lielumu izvietojums atmiņā. Viskritiskāko apgabalu un mainīgo (piemēram, stāvokļa mašīnu vai programmu loģisko karogu) turēšana tālāk no steka augšdaļas, tuvāk atmiņas sākumam.

Daži cilvēki domā, ka viņi var paņemt steku un novietot to nevis pašā RAM galā, bet kaut kur tuvāk, atstājot aiz tā kabatu kritiskiem datiem. Nav īsti laba ideja. Fakts ir tāds, ka steku var nospiest gan uz leju, izmantojot komandu PUSH, gan uz augšu, izmantojot POP komandas. Otrs, lai gan tas notiek daudz retāk, jo... Tas drīzāk ir šķību roku grēks, nevis apgrūtinošs algoritms, taču tā arī notiek.
Bet galvenais ir tas, ka pati kaudze ir ļoti svarīga struktūra. Uz tā balstās viss apakšprogrammu un funkciju mehānisms. Tātad skursteņa kļūme ir ārkārtas situācija jebkurā gadījumā.

Stack perversijas
Mana mīļākā tēma. =)))) Neskatoties uz to, ka pats steka rādītājs tiek aprēķināts PUSH un POP komandu laikā, neviens neliedz mums to izņemt no SP un izmantot tā vērtības, lai manuāli aprēķinātu glabājamo datu adresi. kaudze. Vai arī izlabojiet kaudzes datus, kā mēs to vēlamies.
Par ko? Nu pielietojumu var atrast daudz, ja sasprindzinās smadzenes un sāc domāt ārpus rāmjiem :))))

Turklāt parametri tiek nodoti cauri kaudzītei klasiskajā C un Pascal versijā x86 arhitektūrā, un darbojas vietējie mainīgie. Tie. Pirms funkcijas izsaukšanas vispirms visi mainīgie tiek nospiesti stekā, un pēc tam pēc funkcijas izsaukšanas stekā tiek nospiesti nākotnes lokālo mainīgo baiti.

Pēc tam, izmantojot SP kā atskaites punktu, mēs varam apstrādāt šos mainīgos pēc saviem ieskatiem. Un, kad steks tiek atbrīvots ar POP komandu, tie tiek iznīcināti, atbrīvojot atmiņu.

AVR viss ir nedaudz savādāk (acīmredzot mazā atmiņas apjoma dēļ, kur īsti nevar iebāzt stekā, bet ir daudz RON), taču var arī mēģināt izmantot šo mehānismu.

Tiesa, tas jau atgādina neiroķirurģiju. Es pieļāvu nelielu kļūdu, un pacients ir miris.

Pateicoties skurstei un RAM, jūs varat iztikt tikai ar diviem vai trim reģistriem, bez īpaša stresa par to trūkumu.

Zibatmiņa

EEPROM atmiņa ir maza, tikai daži baiti, un dažreiz jums ir jāsaglabā daudz datu, piemēram, ziņojums citplanētiešiem vai sinusu tabula, lai netērētu laiku tās aprēķināšanai. Jūs nekad nezināt, kas iepriekš jāsaglabā atmiņā. Tāpēc datus var saglabāt programmas atmiņā tajos pašos kilobaitos zibspuldzes, kas ir kontrolierim.

Mēs to pierakstīsim, bet kā mēs to varam iegūt? Lai to izdarītu, vispirms tur kaut kas jāievieto.
Tāpēc programmas beigās .CSEG segmenta ietvaros pievienojiet etiķeti, piemēram, datus un pēc tās, izmantojot operatoru .db, ievadiet savus datus.

DB operators nozīmē, ka mēs izmantojam baitu katrai konstantei. Ir arī operatori, kas norāda divbaitu konstantes DW (kā arī DD un DQ).

1 dati: .db 12,34,45,23

dati: .db 12,34,45,23

Tagad datu etiķete norāda uz masīva pirmā baita adresi, atlikušie baiti atrodas ar nobīdi, vienkārši pievienojot adresei vienu.

Viens smalkums ir tāds, ka kompilators aizstāj atzīmes adresi un uzskata to par programmas skaitītāja lēciena adresi. Un viņš, ja atceraties, uzrunā divbaitu vārdus - galu galā komandas garums var būt vai nu 2, vai 4 baiti.

Un mūsu dati ir baiti pa baitam, un, tiem piekļūstot, kontrolieris tos arī adresē pa baitam. Adrese vārdos ir divreiz mazāka par adresi baitos, un tas ir jāņem vērā, reizinot adresi ar divi.

Lai ielādētu datus no programmas atmiņas, izmantojiet komandu no grupas Ielādēt programmas atmiņu

Piemēram, LPM Rn,Z

Tas ievada reģistrā Rn numuru no šūnas, uz kuru norāda reģistru pāris Z. Atgādināšu, ka Z ir divi reģistri, R30 (ZL) un R31 (ZH). Adreses zemākais baits tiek ievadīts R30, bet augstākais baits - R31.

Kodā tas izskatās šādi:

LDI ZL,zems(dati*2) ; Adreses zemo baitu ievadām reģistru pārī Z LDI ZH,high(data*2) ; Adreses augsto baitu ievadām reģistru pārī Z; reizināšana ar divi ir saistīta ar to, ka adrese ir norādīta; divbaitu vārdos, bet mums tie ir vajadzīgi baitos. ; Tāpēc mēs reizinām ar divi; Pēc adreses ielādes numuru var ielādēt no atmiņas LPM R16, Z; reģistrā R16 pēc šīs komandas būs skaitlis 12, ; ņemts no programmas atmiņas. ; kaut kur programmas beigās, bet .CSEG datu segmentā: .db 12,34,45,23

Tagad, kad mēs jau esam iepazinušies ar dažām mikrokontrolleru iespējām un funkcijām, dabiski rodas loģisks jautājums: kas ir nepieciešams mikrokontrolleru programmēšanai? Kādas programmas un ierīces ir nepieciešamas, un kur tās iegūt?


Lai mikrokontrolleris risinātu problēmas un veiktu noteiktas funkcijas, tas ir jāprogrammē, tas ir, tajā jāieraksta programma vai programmas kods.

Programmas rakstīšanas struktūra un secība

Pirmkārt, pirms sākat rakstīt jebkuru programmu vai drīzāk programmas kodu, jums vajadzētu skaidri saprast, kādas funkcijas veiks mikrokontrolleris. Tāpēc vispirms ir jānosaka programmas galvenais mērķis. Kad tas ir definēts un pilnībā izprasts, tad tiek sastādīts programmas algoritms. Algoritms ir komandas izpildes secība. Algoritmu izmantošana ļauj skaidrāk strukturēt koda rakstīšanas procesu, un, rakstot sarežģītas programmas, tas bieži vien ļauj samazināt laiku, kas pavadīts to izstrādei un atkļūdošanai.

Nākamais solis pēc algoritma sastādīšanas ir tieši programmas koda rakstīšana. Programmas mikrokontrolleriem ir rakstītas valodā Si vai montētājs . Tikai Assembly ir vairāk instrukciju kopums, nevis programmēšanas valoda, un tā ir zema līmeņa valoda.


Mēs rakstīsim programmas C valodā, kas ir augsta līmeņa valoda. Programmas C valodā tiek rakstītas daudz ātrāk, salīdzinot ar līdzīgām programmām Assembly. Turklāt visas sarežģītās programmas galvenokārt ir rakstītas C valodā.

Šeit mēs nesalīdzināsim Assembly un C programmu rakstīšanas priekšrocības un trūkumus. Laika gaitā, uzkrājot zināmu pieredzi MK programmēšanā, jūs izdarīsiet sev noderīgus secinājumus.

Programmas kodu var ierakstīt jebkurā standarta teksta redaktorā, piemēram, Notepad. Tomēr praksē viņi izmanto ērtākus redaktorus, kas tiks apspriesti turpmāk.

Programmas sastādīšana

Mūsu rakstītais C kods vēl nav saprotams mikrokontrolleram, jo ​​MK saprot komandas tikai binārajā (vai heksadecimālajā) sistēmā, kas ir nulles un vieninieku kopa. Tāpēc C kods ir jāpārvērš par nullēm un vieniniekiem. Šim nolūkam tiek izmantota īpaša programma, ko sauc kompilators, un pats process koda transformāciju sauc par kompilāciju.

Lai mirgotu MK programmaparatūru, ierīce sauca programmētājs. Atkarībā no programmētāja veida tā ieeja ir savienota ar COM vai USB portu, un tā izeja ir savienota ar noteiktiem mikrokontrollera tapām.


Programmētāju un izstrādes dēļu izvēle ir plaša, taču esam apmierināti ar vienkāršāko programmētājs, kas Ķīnā maksā ne vairāk kā 3 USD.


Pēc mikrokontrollera mirgošanas programma tiek atkļūdota un pārbaudīta reālā ierīcē vai, kā mēdz teikt, aparatūrā.

Tagad apkoposim mikrokontrolleru programmēšanas darbības.


Rakstot vienkāršas programmas, var iztikt bez otrā punkta, t.i., bez algoritma sastādīšanas uz papīra, pietiek to paturēt galvā.

Jāatzīmē, ka pirms MK programmaparatūras mirgošanas tiek veikta arī programmas atkļūdošana un testēšana.

Nepieciešamais programmu komplekts

MK programmēšanai ir daudz noderīgu un ērtu programmu. Tie ir gan maksas, gan bezmaksas. Starp tiem ir trīs galvenie:

1) Atmel studija

2) CodeVisionAVR

3) WinAVR

Visas šīs programmas ir saistītas ar IDEes integrēta D attīstību E vide – integrēta attīstības vide. Tajos var ierakstīt kodu, apkopot un atkļūdot.

Jums vajadzētu pievērst uzmanību Code Vision AVR. Šī IDE padara koda rakstīšanu vienkāršāku un ātrāku. Tomēr programma ir apmaksāta.

Programmēšanas sākumposmā visas programmas ir labāk rakstīt manuāli, bez jebkādiem vienkāršojumiem. Tas palīdzēs ātri apgūt nepieciešamās prasmes, un nākotnē varēsit labi saprast un rediģēt kāda cita rakstītus kodus atbilstoši savām vajadzībām. Tāpēc iesaku izmantot Atmel Studio. Pirmkārt, tas ir absolūti bezmaksas un pastāvīgi tiek atjaunināts, un, otrkārt, to izstrādāja uzņēmums, kas ražo mikrokontrollerus, uz kuriem mēs iemācīsimies programmēt.

Programmaparatūras un programmu atkļūdošana

Mēs mirgosim mikrokontrollerus, izmantojot papildu programmu.

Ja mikrokontrolleris nav pieejams, tad tā darbību var emulēt, izmantojot programmu. Tas ievērojami vienkāršo programmas atkļūdošanas procesu pat tad, ja jums ir mikrokontrolleris, tāpēc jums tas nav bieži jāatkārto, jo jebkuram mikrokontrollerim ir ierobežots pārrakstīšanas reižu skaits, lai gan šis skaitlis ir diezgan liels.

Mirgojot un atkļūdojot MK, to ir ērti novietot uz maizes dēļa, taču tas nemaz nav nepieciešams. Tāpēc lielākai ērtībai noder arī maizes dēlis. Maizes dēļu izvēle ir liela, taču iesaku ņemt to, kam ir pēc iespējas vairāk caurumu. Kad sāksim savienot septiņu segmentu displejus, jūs sāksit novērtēt lielāku maizes dēļu priekšrocības.

Vēl viens svarīgs elements, kas mums noderēs, ir MK tehniskā dokumentācija, saukta datu lapas. Kopumā jums ir nepieciešams lejupielādēt ATmega8 mikrokontrollera datu lapa.

Kiseļevs Romāns, 2007. gada maijs Raksts atjaunināts 2014. gada 26. maijā

Tātad, kas ir mikrokontrolleris (turpmāk tekstā MK)? Nosacīti runājot, tas ir neliels dators, kas atrodas vienā integrālajā shēmā. Tam ir procesors (aritmētiskā loģiskā vienība jeb ALU), zibatmiņa, EEPROM atmiņa, daudzi reģistri, I/O porti, kā arī papildu zvani un svilpes, piemēram, taimeri, skaitītāji, komparatori, USART utt. Pēc strāvas padeves , mikrokontrolleris sāk darboties un sāk izpildīt zibatmiņā saglabāto programmu. Tajā pašā laikā tas var kontrolēt dažādas ārējās ierīces, izmantojot I/O portus.

Ko tas nozīmē? Tas nozīmē, ka MK jūs varat ieviest jebkuru loģisko shēmu, kas veiks noteiktas funkcijas. Tas nozīmē, ka MK ir mikroshēma, kuras iekšējo saturu patiesībā veidojam mēs paši. Tas ļauj, iegādājoties vairākus pilnīgi identiskus MK, uz tiem salikt pilnīgi atšķirīgas shēmas un ierīces. Ja vēlaties veikt kādas izmaiņas elektroniskās ierīces darbībā, jums nebūs jāizmanto lodāmurs, jums būs tikai jāpārprogrammē MK. Šajā gadījumā jums pat nav nepieciešams to noņemt no ierīces, ja izmantojat AVR, jo šie MK atbalsta programmēšanu ķēdē. Tādējādi mikrokontrolleri mazina plaisu starp programmēšanu un elektroniku.

AVR ir 8 bitu mikrokontrolleri, t.i., to ALU var veikt vienkāršas darbības tikai ar 8 bitu skaitļiem vienā pulksteņa ciklā. Tagad ir pienācis laiks runāt par to, kuru MK mēs izmantosim. Es strādāju ar ATMega16 MK. Tas ir ļoti izplatīts, un to var iegādāties gandrīz jebkurā radio detaļu veikalā par aptuveni 100 rubļiem. Ja neatrodi, tad vari iegādāties jebkuru citu MEGA sērijas MK, taču šajā gadījumā tam būs jāmeklē dokumentācija, jo vienas un tās pašas dažādu MK “kājas” var pildīt dažādas funkcijas, un līdz plkst. pieslēdzoties, šķiet, Ja visi secinājumi ir pareizi, var dabūt kādu strādājošu aparātu, vai varbūt vienkārši smirdīgu dūmu mākoni. Pērkot ATMega16, pārliecinieties, ka tas ir aprīkots ar lielu 40 kontaktu DIP iepakojumu, kā arī iegādājieties tam ligzdu, kurā to var ievietot. Lai strādātu ar to, jums būs nepieciešamas arī papildu ierīces: gaismas diodes, pogas, savienotāji utt.

ATMega16 ir ļoti daudz dažādu funkciju. Šeit ir dažas no tā īpašībām:

  • Maksimālā takts frekvence – 16 MHz (8 MHz ATMega16L)
  • Lielākā daļa komandu tiek izpildītas vienā pulksteņa ciklā
  • 32 8 bitu darba reģistri
  • 4 pilni 8 bitu I/O porti
  • divi 8 bitu taimeris/skaitītāji un viens 16 bitu
  • 10 bitu analogo-ciparu pārveidotājs (ADC)
  • iekšējais pulksteņa ģenerators pie 1 MHz
  • analogais komparators
  • saskarnes SPI, I2C, TWI, RS-232, JTAG
  • programmēšana ķēdē un pašprogrammēšana
  • impulsa platuma modulācijas (PWM) modulis

Visas šīs ierīces īpašības, kā arī to lietošanas instrukcijas ir atrodamas šīs MK atsauces grāmatā (datu lapā). Tiesa, tas ir angļu valodā. Ja zināt angļu valodu, noteikti lejupielādējiet šo datu lapu, tajā ir daudz noderīgas informācijas.

Beidzot ķersimies pie lietas. Iesaku uztaisīt speciālu mikrokontrolleram izstrādes un atkļūdošanas plati, uz kuras bez lodāmura (vai gandrīz bez tā) var salikt jebkuru elektrisko ķēdi ar mikrokontrolleri. Šādas tāfeles izmantošana ievērojami atvieglos darbu ar MK un paātrinās tā programmēšanas apgūšanas procesu. Tas izskatās šādi:

Kas jums būs vajadzīgs šim nolūkam?

Pirmkārt, jums būs nepieciešams pats dēlis. Es nopirku gatavu radio detaļu veikalā par 115 rubļiem. Pēc tam pielodēju visas nepieciešamās detaļas. Rezultāts ir neticami ērta lieta, uz kuras jūs varat samontēt jebkuru elektrisko ķēdi dažu minūšu laikā, pievienojot kabeļus un uzstādot mikroshēmas un indikatorus.

Lai savienotu ķēdes elementus, ir ļoti ērti izmantot kabeļus ar savienotājiem galos. Šie savienotāji ir uzlikti uz “kājām”, kas izceļas blakus katram MK portam. Mikrokontrolleris ir jāuzstāda ligzdā, nevis jāpielodē pie tāfeles, pretējā gadījumā to būs ļoti grūti noņemt, ja to nejauši sadedzināsit. Zemāk ir ATMEGA16 MK spraudnis:

Paskaidrosim, kuras kājas mūs interesē tagad.

  • VCC - šeit tiek piegādāta strāva (4,5 - 5,5 V) no stabilizēta avota
  • GND – zemējums
  • RESET – atiestatīšana (zemā sprieguma līmenī)
  • XTAL1, XTAL2 – šeit ir pieslēgts kvarca rezonators
  • PA, PB, PC, PD – ievades/izvades porti (attiecīgi A, B, C un D).

Kā strāvas avotu var izmantot visu, kas rada 7–11 V līdzstrāvu. Stabilai MK darbībai ir nepieciešams stabilizēts barošanas avots. Kā stabilizatoru var izmantot 7805 sērijas mikroshēmas.Tie ir lineāri integrēti stabilizatori, kuru ieejā tiek pievadīta 7-11 V tiešā nestabilizētā strāva, bet izeja ir 5 V stabilizētā strāva. Pirms un pēc 7805 ir jāinstalē filtra kondensatori (elektrolītiskie zemfrekvences traucējumu filtrēšanai un keramikas augstfrekvences traucējumi). Ja nevarat atrast stabilizatoru, tad kā barošanas avotu varat izmantot akumulatoru 4,5 V. MK ir jābaro tieši no tā.

Zemāk ir MK savienojuma shēma:

Tagad izdomāsim, kas šeit ir.

BQ1 ir kvarca rezonators, kas nosaka MK darbības frekvenci. Varat iestatīt jebkuru līdz 16 MHz, taču, tā kā mēs nākotnē plānojam strādāt ar COM portu, es iesaku izmantot rezonatorus šādām frekvencēm: 14,7456 MHz, 11,0592 MHz, 7,3725 MHz, 3,6864 MHz vai 1,8432 MHz (vēlāk). kļūs skaidrs, kāpēc). Es izmantoju 11,0592 MHz. Ir skaidrs, ka jo augstāka ir frekvence, jo lielāks ir ierīces ātrums.

R1 ir uzvilkšanas rezistors, kas uztur 5 V spriegumu pie RESET ieejas. Zems sprieguma līmenis šajā ieejā norāda uz atiestatīšanu. Pēc atiestatīšanas MK sāk darboties (10–15 ms) un atkal sāk izpildīt programmu. Tā kā šī ir augstas pretestības ieeja, jūs nevarat atstāt to “karājoties gaisā” — neliels signāls uz tā novedīs pie negaidītas MK atiestatīšanas. Tas ir tieši tas, kam R1 ir paredzēts. Uzticamības labad es iesaku uzstādīt arī kondensatoru C6 (ne vairāk kā 20 µF).

SB1 – atiestatīšanas poga.

Kvarca rezonators un filtra kondensators C3 jāatrodas pēc iespējas tuvāk MK (ne tālāk par 5-7 cm), jo pretējā gadījumā vados var rasties traucējumi, kas izraisa MK darbības traucējumus.

Zilais taisnstūris diagrammā iezīmē pašu programmētāju. Ērti to izgatavot vadu veidā, kura viens gals ir iesprausts LPT pieslēgvietā, bet otrs – noteiktā savienotājā blakus MK. Vadam nevajadzētu būt pārāk garam. Ja ar šo kabeli rodas problēmas (parasti tās nerodas, taču var notikt jebkas), jums būs jālodē Altera ByteBlaster adapteris. Kā to izdarīt, ir rakstīts AVReal programmētāja aprakstā.

Tagad, kad esam tikuši galā ar aparatūru, ir pienācis laiks pāriet uz programmatūru.

AVR programmēšanai ir vairākas izstrādes vides. Pirmkārt, šī ir AVR Studio - oficiālā Atmel programmēšanas sistēma. Tas ļauj rakstīt montāžas un atkļūdošanas programmās, kas rakstītas montāžā, C un C++. IAR ir komerciāla programmēšanas sistēma C, C++ un montāžas valodā. WinAVR ir atvērtā koda kompilators. AtmanAVR ir AVR programmēšanas sistēma ar gandrīz tieši tādu pašu saskarni kā Visual C++ 6. AtmanAVR arī ļauj atkļūdot programmas un satur daudzas palīgfunkcijas, kas atvieglo koda rakstīšanu. Šī programmēšanas sistēma ir komerciāla, taču, saskaņā ar licenci, to var lietot bez maksas mēnesi.

Iesaku sākt strādāt ar IAR kā caurskatāmāko izstrādes vidi. IAR projekts tiek veidots pilnībā ar roku, tāpēc, pabeidzot vairākus projektus, jūs jau skaidri zināt, ko nozīmē katra koda rindiņa un kas notiks, ja to mainīsit. Strādājot ar AtmanAVR, būs vai nu jāizmanto iepriekš izveidota veidne, kas cilvēkam bez pieredzes ir ļoti apgrūtinoša un grūti saprotama, vai arī, saliekot projektu no nulles, būs daudz problēmu ar header failiem. Tikuši galā ar IAR, mēs pēc tam apskatīsim citus kompilatorus.

Tātad, vispirms iegūstiet IAR. Tas ir ļoti izplatīts, un tā atrašanai nevajadzētu būt problēmai. Pēc IAR 3.20 lejupielādes no kaut kurienes instalējiet kompilatoru/darba vidi un palaidiet to. Pēc tam jūs varat sākt strādāt.

Pēc IAR palaišanas atlasiet fails/jauns/darbvieta, atlasiet ceļu uz mūsu projektu un izveidojiet tam mapi un piešķiriet tai nosaukumu, piemēram, “Prog1”. Tagad izveidosim projektu: Projekts / Izveidot jaunu projektu… Sauksim to arī par “Prog1”. Ar peles labo pogu noklikšķiniet uz projekta nosaukuma projekta kokā un atlasiet “Opcijas”.

Šeit mēs konfigurēsim kompilatoru konkrētam MK. Vispirms cilnē Mērķis ir jāatlasa ATMega16 procesora tips, cilnē Bibliotēkas konfigurācija atzīmējiet izvēles rūtiņu Iespējot bitu definīcijas I/O-iekļaut failos (lai programmas kodā varētu izmantot dažādu MK reģistru bitu nosaukumus. ) un tur atlasiet C bibliotēkas veidu /EU++. Kategorijā ICCAVR jums ir jāatzīmē izvēles rūtiņa Iespējot vairāku baitu atbalstu cilnē Valoda un jāizslēdz optimizācija cilnē Optimizācija (pretējā gadījumā tas sabojās mūsu pirmo programmu).

Pēc tam atlasiet XLINK kategoriju. Šeit jums ir jānosaka apkopotā faila formāts. Tā kā mēs tagad iestatām atkļūdošanas režīma opcijas, kā aprakstīts virsrakstā, mums kā izvade jāiegūst atkļūdošanas fails. Vēlāk to atvērsim AVR Studio. Lai to izdarītu, jums ir jāatlasa paplašinājums.cof, un faila tips ir ubrof 7.

Tagad noklikšķiniet uz Labi, pēc tam mainiet Debug uz Izlaidi.

Atkal dodieties uz Opcijas, kur visi parametri, izņemot XLINK, ir iestatīti vienādi. Programmā XLINK mainiet paplašinājumu uz .hex un faila formātu uz Intel-standart.

Tas ir viss. Tagad jūs varat sākt rakstīt savu pirmo programmu. Izveidojiet jaunu avotu/tekstu un ievadiet tajā šādu kodu:

#iekļauts"iom16.h" īss neparakstīts int i; nederīgs galvenais ( nederīgs) (DDRB = 255; PORTB = 0; kamēr(1) { ja(PORTB == 255) PORTB = 0; cits PORTB++; priekš(i=0; i

Fails "iom16.h" atrodas mapē (C:\Program Files)\IAR Systems\Embedded Workbench 3.2\avr\inc. Ja izmantojat citu MK, piemēram, ATMega64, atlasiet failu “iom64.h”. Šajos galvenes failos tiek glabāta informācija par MK: reģistru nosaukumi, reģistru biti un pārtraukumu nosaukumi. Katra atsevišķa porta A, B, C vai D tapa var darboties kā ieeja vai izeja. To nosaka datu virzienu reģistrs (DDR). 1 padara kāju par izvadi, 0 par ievadi. Tādējādi, iestatot, piemēram, DDRA = 13, izgatavojam “kājas” PB0, PB2, PB3 izejas, pārējās - ieejas, jo 13 binārā ir 00001101.

PORTB ir reģistrs, kas nosaka porta tapu stāvokli. Ierakstījuši tur 0, iestatām spriegumu visās izejās uz 0 V. Tad ir bezgalīga cilpa. Programmējot MK, viņi vienmēr veido nebeidzamu cilpu, kurā MK veic kādu darbību, līdz tas tiek atiestatīts vai līdz rodas pārtraukums. Šajā ciklā viņi raksta it kā “fona kodu”, ko MK izpilda kā pēdējo. Tas varētu būt, piemēram, informācijas parādīšana displejā. Mūsu gadījumā PORTB reģistra saturs tiek palielināts, līdz tas ir pilns. Pēc tam viss sākas no jauna. Visbeidzot, desmit tūkstošu cikls cilpai. Tas ir nepieciešams, lai izveidotu redzamu aizkavi porta B stāvokļa pārslēgšanā.



Tagad mēs saglabājam šo failu projekta mapē kā Prog1.c, kopējam iom16.h failu projekta mapē, atlasiet Project/Add Files un pievienojam “iom16.h” un “Prog1.c”. Izvēlieties Atbrīvot, nospiediet F7, programma tiek apkopota un jāparādās ziņojumam:


Kopējais kļūdu skaits: 0
Kopējais brīdinājumu skaits: 0

Šeit ir mana programmētāja fotogrāfija:

Lejupielādējiet AVReal programmētāju. Kopējiet to (AVReal32.exe) mapē Release/exe, kur jāatrodas failam Prog1.hex. Piegādājam strāvu MK, pievienojam programmēšanas kabeli. Atveriet Far Manager (visērtāk ir mirgot MK), dodieties uz šo mapi, nospiediet Ctrl+O. Tā kā mums ir pilnīgi jauns MK, mēs pildām

avreal32.exe +MEGA16 -o11.0592MHZ -p1 -fblev=0,jtagen=1,cksel=F,sut=1 –w

Neaizmirstiet ievadīt pareizo frekvenci, ja neizmantojat 11059200 Hz! Tajā pašā laikā t.s drošinātāji – reģistri, kas kontrolē tā darbību (iekšējā ģeneratora izmantošana, Jtag u.c.). Pēc tam tas ir gatavs saņemt pirmo programmu. Programmētājam kā parametri tiek norādīts izmantotais LPT ports, frekvence, faila nosaukums un citi (tie visi ir norādīti AVReal aprakstā). Mēs zvanām:

Avreal32.exe +Mega16 -o11,0592MHz -p1 -e -w -az -% Prog1.hex

Ja savienojums ir pareizs, programmētājs ziņos par veiksmīgu programmēšanu. Nav garantijas, ka tas darbosies pirmajā reizē (pirmo reizi zvanot programmai). Man pašam dažreiz tiek ieprogrammēts otrreiz. Iespējams, ka LPT ports ir bojāts vai kabelī ir traucējumi. Ja rodas problēmas, rūpīgi pārbaudiet kabeli. No savas pieredzes zinu, ka 60% darbības traucējumu ir saistīti ar kontakta trūkumu pareizajā vietā, 20% ar nevajadzīga klātbūtni un vēl 15% ar kļūdainu nepareizas lietas pielodēšanu pie nepareizās lietas. Ja nekas cits neizdodas, izlasiet programmētāja aprakstu un mēģiniet izveidot Byte Blaster.

Pieņemsim, ka viss darbojas jūsu labā. Ja tagad pievienosit astoņas gaismas diodes MK pieslēgvietai B (to dariet, kad MK ir izslēgts, un ieteicams virknē ar gaismas diodēm iekļaut 300–400 omu rezistorus) un pieslēgsit jaudu, notiks mazs brīnums - vilnis” vīsies cauri tiem!

© Kiseļevs Romāns
2007. gada maijs

2015. gada decembris

1. Piedāvātās metodes priekšrocības

Ierīču shēmas, kuru pamatā ir mikrokontrolleri (MCU), parasti izceļas ar divu grūti kombinējamu īpašību kombināciju: maksimālu vienkāršību un augstu funkcionalitāti. Turklāt funkcionalitāti var mainīt un paplašināt nākotnē, neveicot nekādas izmaiņas shēmā - vienkārši nomainot programmu (mirgo). Šīs īpašības tiek skaidrotas ar to, ka mūsdienu mikrokontrolleru veidotāji centās vienā mikroshēmā ievietot visu, kas varētu būt nepieciešams elektroniskas ierīces izstrādātājam – vismaz pēc iespējas vairāk. Rezultātā uzsvars tika pārcelts no shēmām un instalēšanas uz programmatūru. Izmantojot MK, tagad ir mazāka vajadzība “noslogot” ķēdi ar detaļām, un starp komponentiem ir mazāk savienojumu. Tas, protams, padara shēmu pievilcīgāku atkārtošanai gan pieredzējušiem, gan iesācējiem elektronikas inženieriem. Bet, kā parasti, par visu ir jāmaksā. Arī tas nebija bez grūtībām. Ja iegādājaties jaunu MK, instalējiet to ķēdē, kas ir pareizi samontēta no apkalpojamām daļām, un pieslēdziet jaudu, tad nekas nedarbosies - ierīce nedarbosies. Mikrokontrolleram ir nepieciešama programma.

Šķiet, ka arī ar to viss ir vienkārši - internetā var atrast daudzas shēmas ar bezmaksas programmaparatūru. Bet šeit ir viens āķis: programmaparatūra kaut kādā veidā ir “jāaugšupielādē” mikrokontrollerī. Cilvēkam, kurš to nekad agrāk nav darījis, šāds uzdevums bieži kļūst par problēmu un galveno atbaidošo faktoru, nereti liekot atteikties no MK lietošanas priekiem un meklēt shēmas, kas balstītas uz “brīvu” un stingru loģiku. Bet viss nav tik sarežģīti, kā varētu šķist no pirmā acu uzmetiena.

Analizējot publikācijas internetā, jūs varat redzēt, ka šī problēma visbiežāk tiek atrisināta vienā no diviem veidiem: pērkot gatavu programmētāju vai izveidojot mājās gatavotu programmētāju. Tajā pašā laikā paštaisītu programmētāju publicētās shēmas ļoti bieži ir nepamatoti sarežģītas - daudz sarežģītākas, nekā patiešām nepieciešams. Protams, ja plānojat mirgot MK katru dienu, labāk ir izvēlēties “foršu” programmētāju. Bet, ja nepieciešamība pēc šādas procedūras rodas reti, ik pa laikam, tad bez programmētāja var iztikt pavisam. Nē, protams, mēs nerunājam par mācīšanos to darīt ar domu spēku. Tas nozīmē, ka, saprotot, kā programmētājs mijiedarbojas ar mikrokontrolleri, rakstot un lasot informāciju tā programmēšanas režīmā, mēs varam iztikt ar pieejamajiem rīkiem plašākam mērķim. Šiem rīkiem būs jāaizstāj gan programmētāja programmatūras, gan aparatūras daļas. Aparatūrai jānodrošina fizisks savienojums ar MK mikroshēmu, iespēja piemērot loģiskos līmeņus tās ieejām un nolasīt datus no tā izvadiem. Programmatūras daļai ir jānodrošina algoritma darbība, kas kontrolē visus nepieciešamos procesus. Mēs arī atzīmējam, ka informācijas ierakstīšanas kvalitāte MK nav atkarīga no tā, cik “foršs” ir jūsu programmētājs. Nav tādas lietas kā “labāk ierakstīts” vai “sliktāks”. Ir tikai divas iespējas: “reģistrēts” un “nav reģistrēts”. Tas izskaidrojams ar to, ka ierakstīšanas procesu kristāla iekšienē tieši kontrolē pats MK. Jums vienkārši jānodrošina tai augstas kvalitātes barošana (bez traucējumiem vai pulsācijas) un pareizi jāsakārto saskarne. Ja testa nolasījuma rezultāti neatklāj kļūdas, tad viss ir kārtībā - jūs varat izmantot kontrolieri paredzētajam mērķim.

Lai ierakstītu programmu MK bez programmētāja, mums ir nepieciešams USB-RS232TTL porta pārveidotājs un arī. USB-RS232TTL pārveidotājs ļauj izmantot USB portu, lai izveidotu COM portu, kas atšķiras no “īstā” tikai ar to, ka tā ieejas un izejas izmanto TTL loģiskos līmeņus, tas ir, spriegumu diapazonā no 0 līdz 5 voltiem ( jūs varat lasīt vairāk rakstā ""). Jebkurā gadījumā šāds pārveidotājs ir noderīgs, lai tas būtu jūsu “mājsaimniecībā”, tādēļ, ja jums tāda vēl nav, noteikti ir vērts to iegādāties. Runājot par loģiskajiem līmeņiem, mūsu gadījumā TTL ir pat priekšrocība salīdzinājumā ar parasto COM portu, jo šāda pieslēgvietas ieejas un izejas var tieši savienot ar jebkuru mikrokontrolleru, ko darbina 5 V, ieskaitot ATtiny un ATmega. Bet nemēģiniet izmantot parasto COM portu - tie izmanto spriegumu diapazonā no -12 līdz +12 V (vai -15...+15 V). Šajā gadījumā tiešais savienojums ar mikrokontrolleru nav pieļaujams!!!

Ideja izveidot skriptu programmai Perpetuum M, kas īsteno programmētāja funkcijas, radās pēc vairāku publikāciju izlasīšanas internetā, kas piedāvā noteiktus risinājumus MK programmaparatūrai. Katrā gadījumā tika atklāti nopietni trūkumi vai pārmērīgas grūtības. Bieži es saskāros ar programmētāju shēmām, kurās bija mikrokontrolleris, un tajā pašā laikā tika sniegti diezgan nopietni padomi, piemēram: "... un, lai ieprogrammētu mikrokontrolleri šim programmētājam, mums būs nepieciešams ... tieši tā - cits programmētājs!" Tālāk tika ieteikts aiziet pie drauga, meklēt maksas pakalpojumu utt. Arī šiem nolūkiem tīklā izplatītās programmatūras kvalitāte nebija iespaidīga - tika pamanītas daudzas problēmas gan ar funkcionalitāti, gan ar lietotāja interfeisa "duļķainību". Bieži vien ir nepieciešams daudz laika, lai saprastu, kā lietot programmu - tā ir jāizpēta pat visvienkāršākās darbības veikšanai. Cita programma var kaut ko darīt ilgi un rūpīgi, taču lietotājs uzzina, ka nekas netiek rakstīts MK, tikai pēc tam, kad ir pilnībā pabeigta visa programmaparatūra un tai sekojošā testa nolasīšana. Rodas arī šāda problēma: lietotājs mēģina atlasīt savu MK no atbalstīto kristālu saraksta, bet tas nav sarakstā. Šajā gadījumā jūs nevarēsit izmantot programmu - iekļaušana trūkstošo MK sarakstā, kā likums, netiek nodrošināta. Turklāt manuāla kontrollera izvēle no saraksta izskatās dīvaini, ņemot vērā, ka programmētājs daudzos gadījumos pats var noteikt MK veidu. Tas viss teikts nevis tādēļ, lai apmētātu esošos produktus, bet gan lai izskaidrotu šajā rakstā aprakstītā Perpetuum M programmas skripta parādīšanās iemeslu. Problēma patiešām pastāv, un tā galvenokārt attiecas uz iesācējiem, kuriem ne vienmēr izdodas pārvarēt šo “sienu”, lai spertu pirmo soli mikrokontrolleru pasaulē. Piedāvātajā skriptā ir ņemti vērā citās programmās konstatētie trūkumi. Ir ieviesta algoritma darbības maksimālā “caurredzamība”, ārkārtīgi vienkāršs lietotāja interfeiss, kas neprasa mācīšanos un neatstāj iespēju apjukt un “noklikšķināt uz nepareizās lietas”. Ja nepieciešamais MK nav atbalstīto, varat pats pievienot tā aprakstu, ņemot nepieciešamos datus no dokumentācijas, kas lejupielādēta no MK izstrādātāja vietnes. Un, pats galvenais, skripts ir atvērts izpētei un modificēšanai. Ikviens var to atvērt teksta redaktorā, izpētīt un rediģēt pēc saviem ieskatiem, mainot esošās funkcijas pēc savas gaumes un pievienojot trūkstošās.

Pirmā skripta versija tika izveidota 2015. gada jūnijā. Šī versija nodrošina atbalstu tikai Atmel ATtiny un ATmega sērijas mikrokontrolleriem ar zibatmiņas rakstīšanas/lasīšanas, konfigurācijas bitu iestatīšanas un kontroliera tipa automātiskas noteikšanas funkcijām.EEPROM rakstīšana un lasīšana nav ieviesta.Bija plāns papildināt skripta funkcionalitāti : pievienot rakstīšanu un lasīšanu EEPROM, ieviešot atbalstu PIC kontrolieriem utt.. Šī iemesla dēļ skripts vēl nav publicēts.Bet laika trūkuma dēļ plāna realizācija aizkavējās un lai nekļūst labākais labā ienaidnieks, tika nolemts publicēt esošo versiju.Ja jau ar ieviestajām funkcijām nepietiks,lūdzu nebēdāties.Šajā gadījumā varat mēģināt pats pievienot vēlamo funkciju.Neslēpšu: šī skripta izveides idejai sākotnēji ir arī izglītojoša nozīme. Izprotot algoritmu un pievienojot tam kaut ko savu, varēsiet labāk izprast MK darbību programmēšanas režīmā, lai Nākotnē jūs neatradīsit sevi kā meitenes stāvoklī salūzušas automašīnas priekšā, domīgi aplūkojot tās iekšpusi un nesaprotot, kāpēc tā “nestrādā”.

2. MK interfeiss programmēšanas režīmā

Ir vairāki dažādi veidi, kā pārslēgt kontrolieri programmēšanas režīmā un strādāt ar to šajā režīmā. Visvieglāk ieviest ATtiny un ATmega sērijas kontrolieriem, iespējams, ir SPI. Mēs to izmantosim.

Bet, pirms sākam apsvērt signālus, kas nepieciešami SPI ģenerēšanai, mēs izdarīsim vairākas atrunas. Mikrokontrolleram ir konfigurācijas biti. Tie ir kaut kas līdzīgs pārslēgšanas slēdžiem, kas ļauj mainīt dažas mikroshēmas īpašības atbilstoši projekta vajadzībām. Fiziski tās ir nepastāvīgas atmiņas šūnas, piemēram, tās, kurās ir ierakstīta programma. Atšķirība ir tāda, ka to ir ļoti maz (līdz trim baitiem ATmega), un tie neietilpst nevienas atmiņas adrešu telpā. Konfigurācijas datu rakstīšana un nolasīšana tiek veikta ar atsevišķām komandām MK programmēšanas režīmā. Tagad ir svarīgi atzīmēt, ka daži konfigurācijas biti ietekmē pašu spēju izmantot SPI. Ar dažām to vērtībām var izrādīties, ka SPI nevar izmantot. Ja jūs saskaraties ar šādu mikrokontrolleri, šajā rakstā piedāvātā metode nepalīdzēs. Šajā gadījumā jums būs vai nu jāmaina konfigurācijas bitu iestatījumi programmētājā, kas atbalsta citu programmēšanas režīmu, vai arī jāizmanto cits mikrokontrolleris. Bet šī problēma attiecas tikai uz lietotiem MK vai tiem, ar kuriem kāds jau ir neveiksmīgi “paspēlējies”. Fakts ir tāds, ka jaunajiem MCU ir konfigurācijas bitu iestatījumi, kas neliedz izmantot SPI. To apstiprina Perpetuum M programmas programmētāja skripta testa rezultāti, kuru laikā veiksmīgi tika uzplaiksnīti četri dažādi MK (ATmega8, ATmega128, ATtiny13, ATtiny44). Viņi visi bija jauni. Sākotnējais konfigurācijas bitu iestatījums atbilda dokumentācijai un netraucēja SPI izmantošanu.

Ņemot vērā iepriekš minēto, jums vajadzētu pievērst uzmanību šādiem elementiem. SPIEN bits skaidri atļauj vai atspējo SPI izmantošanu, tāpēc mūsu gadījumā tā vērtībai ir jābūt iespējošai. RSTDISBL bits spēj pārvērst vienu no mikroshēmas izejām (iepriekš noteiktais) par “atiestatīšanas” signāla ieeju vai nepagriezt to (atkarībā no šim bitam rakstītās vērtības). Mūsu gadījumā ir nepieciešama “atiestatīšanas” ieeja (ja tās nav, MK nebūs iespējams pārslēgt uz programmēšanas režīmu, izmantojot SPI). Ir arī CKSEL grupas biti, kas norāda pulksteņa signāla avotu. Tie neliedz izmantot SPI, taču arī tie ir jāpatur prātā, jo, ja pulksteņa impulsu nav vispār vai arī to frekvence ir zemāka par pieļaujamo pie noteikta SPI ātruma, arī nekas labs nenotiks. Parasti jauniem MCU, kuriem ir iekšējais RC oscilators, ir konfigurēti CKSEL grupas biti tā lietošanai. Tas mums der diezgan labi – pulksteņa rādīšana tiek nodrošināta bez papildu piepūles no mūsu puses. Nav nepieciešams lodēt kvarca rezonatoru vai pievienot ārēju ģeneratoru. Ja norādītie biti satur citu iestatījumu, jums būs jārūpējas par pulksteņa iestatīšanu atbilstoši iestatījumam. Šādā gadījumā MCU var būt nepieciešams pievienot kvarca rezonatoru vai ārēju pulksteņa ģeneratoru. Bet šajā rakstā mēs neapsvērsim, kā tas tiek darīts. Šajā rakstā ietvertie piemēri par MK pievienošanu programmēšanai ir paredzēti vienkāršākajam gadījumam.

Rīsi. 1. Datu apmaiņa caur SPI programmēšanas režīmā

Tagad pievērsīsimies 1. attēlam, kas ņemts no ATmega128A MK dokumentācijas. Tas parāda viena baita pārsūtīšanas procesu uz MK un vienlaikus viena baita saņemšanu no MK. Abi šie procesi, kā redzam, izmanto vienus un tos pašus pulksteņa impulsus, kas tiek piegādāti no programmētāja uz mikrokontrolleru tā SCK ieejā - vienā no mikroshēmas tapām, kurai šāda loma tiek piešķirta SPI programmēšanas režīmā. Vēl divas signāla līnijas nodrošina datu saņemšanu un pārraidi vienu bitu katrā pulksteņa ciklā. Caur MOSI ieeju dati nonāk mikrokontrollerī, un nolasītie dati tiek ņemti no MISO izejas. Ievērojiet divas punktētas līnijas, kas novilktas no SCK uz MISO un MOSI. Tie parāda, kurā brīdī mikrokontrolleris “norij” MOSI ieejā iestatīto datu bitu, un kurā brīdī pats MISO izejā uzstāda savu datu bitu. Viss ir pavisam vienkārši. Bet, lai ievadītu MK programmēšanas režīmā, mums joprojām ir nepieciešams RESET signāls. Neaizmirsīsim arī par kopējo GND vadu un VCC barošanas bloku. Kopumā izrādās, ka mikrokontrollerim ir jāpievieno tikai 6 vadi, lai mirgotu tā programmaparatūra, izmantojot SPI. Tālāk mēs to analizēsim sīkāk, bet pagaidām piebildīsim, ka datu apmaiņa ar MK programmēšanas režīmā caur SPI tiek veikta 4 baitu paketēs. Katras paketes pirmais baits būtībā ir pilnībā veltīts instrukciju kodēšanai. Otrais baits, atkarībā no pirmā, var būt komandas koda turpinājums vai adreses daļa, vai arī tam var būt patvaļīga vērtība. Trešais baits galvenokārt tiek izmantots adrešu pārsūtīšanai, taču daudzās instrukcijās tam var būt patvaļīga vērtība. Ceturtais baits parasti pārsūta datus vai tam ir patvaļīga vērtība. Vienlaikus ar ceturtā baita pārraidi dažas komandas saņem datus, kas nāk no mikrokontrollera. Sīkāka informācija par katru komandu ir atrodama kontrollera dokumentācijā tabulā ar nosaukumu "SPI Serial Programming Instruction Set". Pagaidām mēs tikai atzīmējam, ka visa apmaiņa ar kontrolieri ir veidota no 32 bitu pakešu secības, no kurām katrā tiek pārsūtīts ne vairāk kā viens baits noderīgas informācijas. Tas nav ļoti optimāls, bet kopumā tas darbojas labi.

3. MK pievienošana programmēšanai

Lai nodrošinātu, ka mikrokontrollera ieejām tiek piegādāti visi nepieciešamie signāli, lai organizētu SPI interfeisu un nolasītu datus no tā MISO izejas, nav nepieciešams izveidot programmētāju. To var viegli izdarīt, izmantojot visizplatītāko USB-RS232TTL pārveidotāju.

Internetā bieži var atrast informāciju, ka šādi pārveidotāji ir zemāki un ar tiem neko nopietnu nevar izdarīt. Bet attiecībā uz lielāko daļu pārveidotāju modeļu šis viedoklis ir nepareizs. Jā, pārdošanā ir pārveidotāji, kuriem nav pieejamas visas ieejas un izejas, salīdzinot ar standarta COM pieslēgvietu (piemēram, tikai TXD un RXD), bet tiem ir neatdalāms dizains (mikroshēma ir piepildīta ar plastmasu - tas ir nav iespējams sasniegt tās tapas). Bet tādus nav vērts pirkt. Dažos gadījumos trūkstošās portu ieejas un izejas var iegūt, pielodējot vadu tieši mikroshēmā. Šāda “uzlabota” pārveidotāja piemērs ir parādīts 2. attēlā (mikroshēma PL-2303 - sīkāka informācija par tā tapu mērķi atrodama rakstā “”). Šis ir viens no lētākajiem modeļiem, taču tam ir savas priekšrocības, ja to izmanto pašdarinātos dizainos. Plaši izplatīti ir arī pilnvērtīgi adaptera vadi ar standarta deviņu kontaktu savienotāju galā, piemēram, COM portu. No parastā COM porta tie atšķiras tikai ar TTL līmeņiem un nesaderību ar mantoto programmatūru un kādu vecāku aparatūru. Var arī atzīmēt, ka CH34x mikroshēmas vadi ir daudz uzticamāki un stabilāki dažādos ekstremālos testos, salīdzinot ar pārveidotājiem uz PL-2303. Tomēr parastas lietošanas laikā atšķirība nav pamanāma.

Izvēloties USB-RS232TTL pārveidotāju, jāpievērš uzmanība arī tā draivera saderībai ar izmantotās operētājsistēmas versiju.

Sīkāk aplūkosim mikrokontrollera un USB-RS232TTL pārveidotāja savienošanas principu, izmantojot četru dažādu MK modeļu piemēru: ATtiny13, ATtiny44, ATmega8 un ATmega128. 3. attēlā parādīta šāda savienojuma vispārējā shēma. Jūs varētu pārsteigt, uzzinot, ka RS232 signāli (RTS, TXD, DTR un CTS) tiek izmantoti nepareizi. Bet neuztraucieties par to: programma Perpetuum M spēj strādāt ar tiem tieši - iestatīt izvades vērtības un lasīt ievades stāvokļus. Jebkurā gadījumā plaši izmantotie USB-RS232TTL pārveidotāji uz CH34x un PL-2303 mikroshēmām nodrošina šo iespēju - tas ir pārbaudīts. Arī ar citiem populāriem pārveidotājiem nevajadzētu rasties problēmām, jo, lai piekļūtu portam, tiek izmantotas standarta Windows funkcijas.

Vispārīgajā diagrammā redzamos rezistorus principā var neuzstādīt, bet tomēr labāk tos uzstādīt. Kāds ir viņu mērķis? Izmantojot pārveidotāja TTL ieejas un izejas un mikrokontrollera piecu voltu barošanas avotu, mēs tādējādi atbrīvojamies no nepieciešamības saskaņot loģiskos līmeņus - viss jau ir diezgan pareizi. Tas nozīmē, ka savienojumi var būt tieši. Bet eksperimentu laikā , viss var gadīties.Piemēram, saskaņā ar nelietības likumu, skrūvgriezis var nokrist tieši tajā vietā, kur tas nekādā gadījumā nevarētu nokrist, un īssavienot kaut ko, ko nekādā gadījumā nevajadzētu īsslēgt.Protams, viss var izrādās "skrūvgriezis". Rezistori šajā gadījumā dažkārt samazina sekas. viens no to mērķiem ir novērst iespējamu izejas konfliktu. Fakts ir tāds, ka pēc programmēšanas pabeigšanas mikrokontrolleris pāriet normālā darbības režīmā, un tas var gadās, ka tā tapa, kas savienota ar pārveidotāja izeju (RTS, TXD vai DTR), arī kļūst par izeju, saskaņā ar tikko MK ierakstīto programmu. Šajā gadījumā būs ļoti slikti, ja divas tieši savienotas izejas "cīnīsies" - mēģiniet iestatīt dažādus loģiskos līmeņus. Šādā "cīņā" kāds var "zaudēt", bet mēs to nevēlamies.

Trīs rezistoru vērtības tiek izvēlētas 4,3 KOhm līmenī. Tas attiecas uz savienojumiem starp pārveidotāja izeju un mikrokontrollera ieeju. Rezistoru precizitātei nav nozīmes: jūs varat samazināt to pretestību līdz 1 KOhm vai palielināt līdz 10 KOhm (bet otrajā gadījumā traucējumu risks palielinās, izmantojot garus vadus ceļā uz MK). Attiecībā uz savienojumu starp pārveidotāja ieeju (CTS) un mikrokontrollera izeju (MISO), šeit tiek izmantots 100 omu rezistors. Tas izskaidrojams ar izmantotā pārveidotāja ievades īpatnībām. Pārbaužu laikā mikroshēmā PL-2303 tika izmantots pārveidotājs, kura ieejas, acīmredzot, ir savienotas ar barošanas avotu ar salīdzinoši zemu pretestību (vairāku simtu omu). Lai “izjauktu pievilkšanos”, man bija jāuzstāda rezistors ar tik mazu pretestību. Tomēr jums tas vispār nav jāinstalē. Pārveidotājam tā vienmēr ir ievade. Tas nevar kļūt par izeju, kas nozīmē, ka notikumu attīstībā nebūs izeju konfliktu.

Ja mikroshēmai ir atsevišķs AVCC kontakts analogā-digitālā pārveidotāja (piemēram, ATmega8 vai ATmega128) barošanai, tas jāpievieno kopējam VCC barošanas kontaktam. Dažiem IC ir vairāk nekā viena VCC barošanas tapa vai vairāk nekā viena GND. Piemēram, ATmega128 ir 3 GND tapas un 2 VCC tapas. Pastāvīgā dizainā labāk ir savienot viena ar otru tapas ar tādu pašu nosaukumu. Mūsu gadījumā programmēšanas laikā varat izmantot vienu VCC un GND tapu.

Un lūk, kā izskatās ATtiny13 savienojums. Attēlā parādīti tapu piešķīrumi, kas tiek izmantoti, programmējot, izmantojot SPI. Blakus fotoattēlam ir redzams, kā īslaicīgs savienojums izskatās patiesībā.


Daži var teikt, ka tas nav nopietni - savienojumi uz vadu. Bet jūs un es esam saprātīgi cilvēki. Mūsu mērķis ir programmēt mikrokontrolleri, tērējot tam minimālu laiku un citus resursus, nevis dižoties kāda priekšā. Kvalitāte necieš. Metode “uz vadiem” šajā gadījumā ir diezgan efektīva un pamatota. Kontroliera programmaparatūras mirgošana ir vienreizēja procedūra, tāpēc nav jēgas to pārklāt ar rhinestones. Ja nākotnē ir paredzēts mainīt programmaparatūru, nenoņemot kontrolieri no ķēdes (gatavā produktā), tas tiek ņemts vērā uzstādīšanas laikā ierīces ražošanas laikā. Parasti šim nolūkam tiek uzstādīts savienotājs (RESET, SCK, MOSI, MISO, GND), un MK var mirgot pat pēc uzstādīšanas uz plates. Bet tie ir radoši prieki. Mēs apsveram vienkāršāko gadījumu.

Tagad pāriesim pie ATtiny44 MK. Šeit viss ir gandrīz vienāds. Pamatojoties uz zīmējumu un fotoattēlu, pat iesācējam nebūs nekādu grūtību izdomāt savienojumu. Tāpat kā ATtiny44, jūs varat savienot mikrokontrollerus ATtiny24 un ATtiny84 — šiem trim kontaktu piešķīrumi ir vienādi.


Vēl viens kontroliera pagaidu pievienošanas piemērs tā programmēšanai ir ATmega8. Šeit ir vairāk tapu, bet princips ir vienāds - daži vadi, un tagad kontrolieris ir gatavs tajā “iepildīt” informāciju. Papildu melnais vads fotoattēlā, kas nāk no 13. tapas, nepiedalās programmēšanā. Tas ir paredzēts, lai no tā noņemtu skaņas signālu pēc tam, kad MK iziet no programmēšanas režīma. Tas ir saistīts ar faktu, ka "Perpetuum M" skripta atkļūdošanas laikā mūzikas kastes programma tika lejupielādēta MK.


Bieži viens kontrolieris ir pieejams dažādos korpusos. Šajā gadījumā tapu piešķiršana katram gadījumam tiek sadalīta atšķirīgi. Ja jūsu kontrollera korpuss nav līdzīgs attēlā redzamajam, pārbaudiet tapu mērķi tehniskajā dokumentācijā, kuru var lejupielādēt no MK izstrādātāja vietnes.

Lai pabeigtu attēlu, apskatīsim MK mikroshēmas pievienošanu ar lielu skaitu "kāju". Papildu melnā vada mērķis fotoattēlā, kas nāk no 15. tapas, ir tieši tāds pats kā ATmega8 gadījumā.


Jūs droši vien jau esat pārliecināts, ka viss ir pavisam vienkārši. Ikviens, kurš zina, kā saskaitīt mikroshēmu tapas (no atzīmes aplī pretēji pulksteņrādītāja virzienam), to izdomās. Un neaizmirstiet par precizitāti. Mikroshēmas mīl kārtīgus cilvēkus un nepiedod neuzmanīgu izturēšanos.

Pirms pāriet uz programmatūras daļu, pārliecinieties, vai USB-RS232TTL pārveidotāja draiveris ir instalēts pareizi (pārbaudiet Windows ierīču pārvaldnieku). Atcerieties vai pierakstiet virtuālā COM porta numuru, kas parādās, pievienojot pārveidotāju. Šis numurs būs jāievada skripta tekstā, par kuru varat lasīt tālāk.

4. Skripts - programmētājs "Perpetuum M"

Mēs izdomājām “programmētāja” aparatūras daļu. Tā jau ir puse no kaujas. Tagad atliek risināt programmatūras daļu. Tās lomu skripta vadībā pildīs programma Perpetuum M, kas realizē visas nepieciešamās funkcijas mijiedarbībai ar mikrokontrolleri.

Arhīvs ar skriptu ir jāizsaiņo tajā pašā mapē, kurā atrodas programma perpetuum.exe. Šajā gadījumā, palaižot failu perpetuum.exe, ekrānā tiks parādīta izvēlne ar instalēto skriptu sarakstu, starp kuriem būs rinda “AVR MK Programmer” (tā var būt vienīgā). Šī ir līnija, kas mums ir vajadzīga.

Skripts atrodas PMS mapē failā "MK Programmer AVR.pms". Šo failu var skatīt, izpētīt un vajadzības gadījumā rediģēt parastā teksta redaktorā, piemēram, Windows Notepad. Pirms skripta izmantošanas, visticamāk, būs jāveic izmaiņas tekstā, kas saistīts ar porta iestatījumiem. Lai to izdarītu, pārbaudiet Windows ierīču pārvaldniekā izmantotā porta nosaukumu un, ja nepieciešams, veiciet atbilstošus grozījumus rindā "PortName="COM4";" - skaitļa 4 vietā var būt cits skaitlis. Turklāt, izmantojot citu USB-RS232TTL pārveidotāja modeli, iespējams, būs jāmaina signāla inversijas iestatījumi (skriptu rindas sākas ar vārdu “Augsta”). Varat pārbaudīt USB-RS232TTL pārveidotāja signālu inversiju, izmantojot vienu no piemēriem, kas ietverti programmas Perpetuum M instrukcijās (funkciju sadaļa darbam ar portu).

Apakšmapē MK_AVR ir faili ar atbalstīto kontrolleru aprakstiem. Ja jums vajadzīgā kontrollera nav starp tiem, varat pievienot sev nepieciešamo, izmantojot analoģiju. Paņemiet vienu no failiem kā paraugu un, izmantojot teksta redaktoru, ievadiet nepieciešamos datus, ņemot tos no sava mikrokontrollera dokumentācijas. Galvenais ir būt uzmanīgiem, ievadīt datus bez kļūdām, pretējā gadījumā MK netiks ieprogrammēts, vai arī tiks ieprogrammēts nepareizi. Sākotnējā versija atbalsta 6 mikrokontrollerus: ATtiny13, ATtiny24, ATtiny44, ATtiny84, ATmega8 un ATmega128. Skripts ievieš pievienotā kontrollera automātisku atpazīšanu - nav nepieciešams to norādīt manuāli. Ja no MK nolasītā identifikatora nav pieejamajos aprakstos, tiek parādīts ziņojums, ka kontrolleri nevarēja atpazīt.

Arhīvā ar skriptu ir arī papildu informācija. AVR kontrollera inc failu mapē ir ļoti noderīga un plaša kontroliera definīciju failu kolekcija. Šie faili tiek izmantoti, rakstot savas programmas MK. Vēl četrās mapēs "MusicBox_..." ir faili ar programmu montāžas valodā un programmaparatūra, kas ir gatava lejupielādei MK atsevišķi ATtiny13, ATtiny44, ATmega8 un ATmega128. Ja esat jau pievienojis kādu no šiem MK programmēšanai, kā ieteikts šajā rakstā, tad varat to mirgot tūlīt - jūs iegūsit mūzikas kastīti. Vairāk par to zemāk.

Kad skripta izvēlnē atlasāt rindu “MK AVR Programmer”, skripts tiek izpildīts. Tajā pašā laikā tas atver portu, nosūta komandu MK pārslēgties uz programmēšanas režīmu, saņem apstiprinājumu no MK par veiksmīgu pāreju, pieprasa MK identifikatoru un meklē šī MK aprakstu pēc tā identifikatora starp pieejamajiem. faili ar aprakstiem. Ja tas neatrod vajadzīgo aprakstu, tas parāda atbilstošu ziņojumu. Ja tiek atrasts apraksts, tiek atvērta programmētāja galvenā izvēlne. Jūs varat redzēt tās ekrānuzņēmumu 8. attēlā. Tālāka izpratne nav grūta - izvēlne ir ļoti vienkārša.

Pirmajā skripta versijā dažas pilnvērtīga programmētāja funkcijas nav ieviestas. Piemēram, nav iespējas lasīt un rakstīt EEPROM. Bet, ja atverat skriptu teksta redaktorā, jūs redzēsit, ka tas ir ļoti mazs, neskatoties uz to, ka galvenais tajā jau ir ieviests. Tas liek domāt, ka trūkstošo funkciju pievienošana nemaz nav tik grūta – valoda ir ļoti elastīga, ļauj īstenot bagātīgu funkcionalitāti nelielā programmā. Bet vairumam gadījumu pietiek pat ar esošajām funkcijām.

Daži funkcionalitātes ierobežojumi ir aprakstīti tieši skripta tekstā:
//ieviesta ierakstīšana tikai no nulles adreses (paplašinātā segmenta adreses ieraksts tiek ignorēts, arī LOAD OFFSET)
// ierakstu secība un nepārtrauktība HEX failā netiek pārbaudīta
//kontrolsumma nav pārbaudīta
Tas attiecas uz darbu ar HEX failu, no kura tiek ņemts MK programmaparatūras kods. Ja šis fails nav bojāts, kontrolsummas pārbaudei nebūs nekādas ietekmes. Ja tas ir izkropļots, to nevarēs noteikt, izmantojot skriptu. Vairumā gadījumu atlikušie ierobežojumi nekaitēs, taču jums tie joprojām ir jāpatur prātā.

5. Mūzikas kaste - vienkāršs amats iesācējiem

Ja jums ir kāds no šiem mikrokontrolleriem: ATtiny13, ATtiny44, ATmega8 vai ATmega128, varat to viegli pārvērst par mūzikas kastīti vai mūzikas karti. Lai to izdarītu, pietiek ar atbilstošās programmaparatūras ierakstīšanu MK — vienā no četrām, kas atrodas mapēs "MusicBox_..." tajā pašā arhīvā ar skriptu. Programmaparatūras kodi tiek glabāti failos ar paplašinājumu ".hex". ATmega128 izmantošana šādam amatam, protams, ir “taukaini”, tāpat kā ATmega8. Bet tas var būt noderīgi testēšanai vai eksperimentēšanai, citiem vārdiem sakot, izglītības nolūkos. Pielikumā pievienoti arī programmu teksti programmā Assembler. Programmas netika izveidotas no nulles - par pamatu tika ņemta mūzikas kastes programma no A. V. Belova grāmatas “AVR mikrokontrolleri radioamatieru praksē”. Sākotnējā programmā ir veiktas vairākas būtiskas izmaiņas:
1. pielāgots katram no četriem MK: ATtiny13, ATtiny44, ATmega8 un ATmega128
2. likvidētas pogas - kontrolierim nekas nav jāpievieno, izņemot strāvu un skaņas emitētāju (melodijas tiek atskaņotas viena pēc otras bezgalīgā cilpā)
3. katras nots ilgums tiek samazināts par pauzes ilgumu starp notīm, lai novērstu mūzikas ritma traucējumus
4. astotā melodija ir pieslēgta, nav lietota grāmatas versijā
5. no subjektīvā: daži “uzlabojumi”, lai optimizētu un padarītu algoritmu saprotamāku

Dažās melodijās var dzirdēt nepatiesību un pat rupjas kļūdas, īpaši “Smaidā” – vidū. Zvana signālu kodi tika ņemti no grāmatas (vai drīzāk, lejupielādēti no grāmatas autora vietnes kopā ar oriģinālo asm failu) un nav mainīti. Acīmredzot melodiju kodējumā ir kļūdas. Bet tā nav problēma - ikviens, kurš ir “draudzīgs” ar mūziku, var to viegli izdomāt un visu salabot.

Programmā ATtiny13 16 bitu skaitītāja trūkuma dēļ piezīmju reproducēšanai bija jāizmanto 8 bitu skaitītājs, kas izraisīja nelielu piezīmju precizitātes samazināšanos. Bet ar ausīm to gandrīz nevar pamanīt.

Par konfigurācijas bitiem. To iestatījumiem jāatbilst jaunā mikrokontrollera stāvoklim. Ja jūsu MK kaut kur jau ir izmantots, jums jāpārbauda tā konfigurācijas bitu stāvoklis un, ja nepieciešams, tie jāsaskaņo ar jaunā mikrokontrollera iestatījumiem. Jaunā mikrokontrollera konfigurācijas bitu stāvokli varat uzzināt šī MK dokumentācijā (sadaļa "Drošinātāju biti"). Izņēmums ir ATmega128. Šim MCU ir M103C bits, kas nodrošina saderības režīmu ar vecāku ATmega103. M103C bita aktivizēšana ievērojami samazina ATmega128 iespējas, un šis bits ir aktīvs jaunajā MK. M103C ir jāatiestata neaktīvā stāvoklī. Lai manipulētu ar konfigurācijas bitiem, izmantojiet atbilstošo programmētāja skripta izvēlnes sadaļu.

Nav jēgas sniegt mūzikas kastes diagrammu: tajā ir tikai mikrokontrolleris, barošanas avots un pjezo skaņas izstarotājs. Strāva tiek piegādāta tieši tādā pašā veidā, kā mēs to darījām, programmējot MK. Skaņas izstarotājs ir savienots starp kopējo vadu (kontrollera GND tapu) un vienu no MK tapām, kuras numuru var atrast failā ar programmas montāžas kodu (*.asm). Programmas teksta sākumā katram MK komentāros ir rindiņa: "skaņas signāls tiek ģenerēts pie XX tapas." Kad programmētāja skripts ir pabeigts, mikrokontrolleris iziet no programmēšanas režīma un pāriet normālā darbībā. Melodiju atskaņošana sākas nekavējoties. Pieslēdzot skaņas emitētāju, varat to pārbaudīt. Skaņas emitētāju var atstāt pieslēgtu kristāla programmēšanas laikā tikai tad, ja skaņa tiek ņemta no tapas, kas netiek izmantota SPI, pretējā gadījumā kontakta papildu kapacitāte var traucēt programmēšanu.