Postopek programiranja avr mikrokontrolerjev. Nasvet za programerje mikrokrmilnikov začetnike. Potreben nabor programov

Tako smo uredili delo jedra glede prehodov in naslavljanja. Čas je, da se posvetimo še enemu področju – spominu.

Obstajata dve vrsti (EEPROM ne šteje, ker je na splošno periferna naprava, a več o tem kasneje):

  • RAM - RAM
  • ROM - ROM, alias flash, alias programski pomnilnik

Ker je naša arhitektura harvardska, ima operativa svoje naslavljanje, flash pa svoje. V podatkovnem listu si lahko ogledate strukturo naslavljanja RAM-a.

Takoj bodite pozorni na naslove! RON in periferni registri ter RAM se nahajajo v istem naslovnem prostoru. Tisti. naslovi od 0000 do 001F zasedajo naše registre, nato do naslova 005F so I/O celice - vrata. Skozi vrata je konfigurirano vse, kar je na krovu krmilnika. In šele nato z naslova 0060 pride naš RAM, ki ga lahko uporabimo za predvideni namen.

Poleg tega upoštevajte, da imajo V/I registri tudi svoje naslavljanje - naslovni prostor V/I registrov (od 00 do 3F), označen je na levi strani slike. IO/Register Block To naslavljanje deluje SAMO v navodilih OUT in IN. To vodi do zanimive funkcije.

Do perifernih registrov lahko dostopate na dva različna načina:

  • Preko ukazov IN/OUT na kratkem naslovu v I/O naslovnem prostoru
  • Prek skupine ukazov LOAD/STORE na polnem naslovu v naslovnem prostoru RAM

Primer. Vzemimo vhodni register asinhronega oddajnika-sprejemnika UDR, ima naslov 0x0C (0x2C), naslov v splošnem naslovnem prostoru je naveden v oklepajih.

LDI R18.10; V register R18 smo naložili številko 10. Takole OUT UDR,R18 ; Izpeljano na prvi način, prevajalnik sam; Nadomesti vrednost 0x0C namesto UDR STS 0x2C,R18 ; Odpeljali so me po drugi poti. Preko ukaza Store; Z neposrednim vnosom naslova.

Obe metodi dajeta enake rezultate. AMPAK! Tisti, ki delujejo z naslavljanjem v vhodno/izhodnem prostoru (OUT/IN), so dva bajta krajši. To je razumljivo - ni jim treba shraniti dvobajtnega naslova poljubne pomnilniške celice, kratek naslov vhodno-izhodnega prostora pa se prilega dvobajtni kodi ukazov.

Res je, tukaj je še ena šala. Dejstvo je, da se vsako leto pojavi vedno več kamnov iz AVR in v njih je vedno več mesa. Vsako prasketanje potrebuje svoje periferne I/O registre. In zdaj smo prišli do zaključka, da ima ATMega88 (ki je nadomestil Mega8) že toliko perifernih naprav, da njegovi V/I registri ne ustrezajo več omejitvi naslovnega prostora 3F.

Ups, prispeli so. In tu začnejo tisti, ki prehajajo s starih kamnov na nove, izražati začudene izraze - zakaj ukazi OUT/IN delujejo na nekaterih perifernih registrih, na drugih pa ne?

In to je preprosto - ni bilo dovolj bitne zmogljivosti.

A jedro je eno, ne da se ga več predelati. In tukaj so ATMEL-ovci ravnali zvito - uvedli so tako imenovane spominsko preslikane registre. Tisti. vsi tisti registri, ki niso sodili v omejitev 3F, so zdaj na voljo samo na en način - preko Load/Store.

Kakšna šala. Če odprete nekaj m88def.inc, potem lahko vidite, kateri V/I registri so "pravilni" in kateri so preslikani v pomnilnik.

Nekaj ​​takega bo:

; ***** DEFINICIJE V/I REGISTRA **************************************** ******** * ; OPOMBA: ; Definicije z oznako "MEMORY MAPPED" so razširjena V/I vrata; in ga ni mogoče uporabiti z navodili IN/OUT .equ UDR0 = 0xc6 ; PREslikaV POMNILNIKA .equ UBRR0L = 0xc4 ; PREslikaV POMNILNIKA .equ UBRR0H = 0xc5 ; PRESLIKOV POMNILNIKA .equ UCSR0C = 0xc2 ; PREslikaV POMNILNIKA .equ UCSR0B = 0xc1 ; PREslikaV POMNILNIKA .equ UCSR0A = 0xc0 ; MAPIRANJE POMNILNIKA bla bla bla in še veliko več.equ OSCCAL = 0x66 ; PREslikaV POMNILNIKA .equ PRR = 0x64 ; PREslikaV POMNILNIKA .equ CLKPR = 0x61; PREslikaV POMNILNIKA .equ WDTCSR = 0x60 ; PREslikaV POMNILNIKA .equ SREG = 0x3f ;<------ А тут пошли обычные.equ SPL = 0x3d .equ SPH = 0x3e .equ SPMCSR = 0x37 .equ MCUCR = 0x35 .equ MCUSR = 0x34 .equ SMCR = 0x33 .equ ACSR = 0x30

To so pite.

In na tem področju razumete, da velik kosmati organ leti proti navzkrižni združljivosti kode sestavljanja s ciljem, da jo tesno pokrije. Navsezadnje je ena stvar popravljati vse vrste makro definicij in definicij, ki opisujejo registre, druga pa je sedeti in kot Pepelka ločevati prava vrata od napačnih.

Vendar obstaja rešitev. Makrojezik! Vam ni všeč ukazni sistem? Domislite se svojega z blackjackom in kurbami!
Zgradimo lastno ekipo UOUT, kot univerzalni OUT

Podobno velja za ukaz IN. Na splošno lahko s takšnimi makri ZELO zelo popestrite asembler in ga spremenite v zmogljiv programski jezik, ki lahko raztrga vse vrste C in Pascala kot krpo.

No, o čem govorim ... o RAM-u.

Tako smo uredili naslavljanje. Zdaj veste, kje iskati pomnilniške naslove, kjer se začnejo uporabniške celice RAM - v podatkovnem listu, razdelek Memory Map. Ampak tam za referenco vedeti.

In v naši kodi se RAM začne z direktivo.DSEG Se spomnite naše predloge?

Vključi "m16def.inc" ; Uporabljamo ATMega16 ;= Start macro.inc ================================ ; Makri tukaj;= Konec macro.inc =================================== ; RAM =================================================== ============ .DSEG ; segment RAM; FLASH =================================================== ========== .CSEG ; Segment kode; EEPROM =================================================== ======== .ESEG ; EEPROM segment

Po .DSEG lahko nastavimo svoje spremenljivke. In tukaj imamo preprosto izbruh celic - zasedite katero koli. Vnesite naslov in bodite srečni. Ampak zakaj ročno šteti naslove? Tu naj razmišlja prevajalnik.

Zato bomo vzeli in postavili oznako

0x0060 ## ;Spremenljivke 0x0061 ## 0x0062 ## 0x0063 ## ;Spremenljivke2 0x0064 ## 0x0065 ## ;Spremenljivke4 se lahko začnejo tukaj

Kot ## kateri koli bajt. Privzeto FF. O kakršnem koli tipkanju spremenljivk, začetni inicializaciji, nadzoru prelivanja in drugih meščanskih radostih seveda ni treba govoriti. To je Šparta! Mislim, sestavljalec. Vse ročno.
Če potegnemo analogijo s C-jem, potem je to tako, kot bi delali s pomnilnikom samo prek kazalcev praznine. Šišniki bodo razumeli. Razumeli bodo in se zgrozili. Ker ta svet je krut in zahrbten. Malo sem napačno izračunal indeks in izgubil druge podatke. In prekleto, to napako boste ujeli, če se ne pojavi takoj.

Torej pozornost, pozornost in še enkrat pozornost. Vse pomnilniške operacije izvajamo s sledenjem in nič ne bo spodletelo ali prelilo.

V podatkovnem segmentu deluje tudi direktiva .ORG, ki deluje popolnoma enako - prenaša naslove, v tem primeru oznake, od tu do konca pomnilnika. Samo ena subtilnost - ORG 0000 nam bo dal sam začetek RAM-a, to pa je R0 in drugi registri. In nič kilometrov RAM-a z uporabo Mega16 kot primera bo dalo ORG 0x0060. In v drugih krmilnikih je še kakšna druga vrednost. Vsakič je leno pregledati podatkovni list, zato obstaja takšna definicija makra, kot je SRAM_START, ki označuje začetek RAM-a za določen MK.

Torej, če želimo, da začetek RAM-a, recimo 100 bajtov, ostane pod nekakšnim medpomnilnikom smeti, naredimo ta trik.

1 2 3 4 .DSEG .ORG SRAM_START+100 spremenljivk: .byte 3

DSEG .ORG SRAM_START+100 spremenljivk: .byte 3

Končano, naše varovalno območje smo očistili od začetka do 100.

V redu, uredili smo naslavljanje. Kako delati s spominskimi celicami? In za te namene obstajata dve skupini ukazov. LOAD in STORE sta največji skupini ukazov.

Dejstvo je, da s celico RAM ni mogoče storiti ničesar drugega kot naložiti bajt vanjo iz RON ali razložiti bajt iz nje v RON.

Ukazi za shranjevanje (ST**) se zapišejo v RAM, ukazi za nalaganje (LD**) pa se preberejo.

Branje gre v register R16…R31, naslov celice pa je določen neposredno v ukazu. Tukaj je preprost primer. Obstaja tribajtna spremenljivka Variables, povečati jo je treba za 1. To je. izvedite operacijo spremenljivk++

Spremenljivke DSEG: .byte 3 Spremenljivke2: .byte 1 .CSEG ; Spremenljivka je v pomnilniku; najprej jo morate dobiti. LDS R16, Spremenljivke ; Preberite prvi bajt spremenljivk v R16 LDS R17, spremenljivke+1 ; Preberite drugi bajt spremenljivk v R17 LDS R18, spremenljivke+2 ; No, tretji bajt v R18; Zdaj mu prištejmo 1, ker AVR ne more dodati samo s konstanto; odšteti, moraš popačiti. Vendar ne povzroča posebnih težav. SUBI R16,(-1) ; na splošno je SUBI odštevanje, vendar -(- daje + SBCI R17,(-1) ; In tukaj se upošteva prenos. Toda več o tem pozneje. SBCI R18,(-1) ; Matematika v asemblerju je druga zgodba STS spremenljivke, R16; Shrani vse, kar je bilo. STS spremenljivke+1,R17 STS spremenljivke+2,R18

Lahko pa uporabite drugo metodo. Posredni zapis prek indeksnega registra.

Spremenljivke DSEG: .byte 3 Spremenljivke2: .byte 1 .CSEG ; Vzemite naslov naše spremenljivke LDI YL,low(Variables) LDI YH,High(Variables) ; Spremenljivka je v pomnilniku; najprej jo morate dobiti. LD R16, Y+; Preberi prvi bajt spremenljivk v R16 LD R17, Y+ ; Preberite drugi bajt spremenljivk v R17 LD R18, Y+ ; No, tretji bajt v R18; Zdaj mu prištejmo 1, ker AVR ne more dodati samo s konstanto; odšteti, moraš popačiti. Vendar ne povzroča posebnih težav. SUBI R16,(-1) ; dejansko je SUBI odštevanje, toda -(- daje + SBCI R17,(-1) ; In tukaj se upošteva prenos. A več o tem kasneje. SBCI R18,(-1) ; Matematika v asemblerju je druga zgodba ST -Y,R18 ; Ohranimo vse, kot je bilo. ST -Y,R17 ; Vendar v obratnem vrstnem redu ST -Y,R16

Tu se že uporabljajo operacije s postinkrementom in preddekrementom. Pri prvem najprej preberemo, nato naslovu dodamo 1. Pri drugem naslovu najprej odštejemo 1 in nato shranimo.

Takšne inkrementalne ukaze je priročno uporabljati za ponavljanje nizov v pomnilniku ali tabelah.
Obstaja tudi posredno relativno pisanje/branje LDD/STD in druge možnosti za vse tri vrste indeksov (X,Y,Z). Na splošno pokadite podatkovni list in sistem ukazov.

Stack
Oh, kup je super stvar. Kar mi je všeč pri tem, je, da motnje sklada spremenijo delujoč program v popolno zmešnjavo. Ker operacije skladov zahtevajo večjo pozornost, ker če je sklad nekje pokvarjen in ga ne morete takoj izslediti, ga boste ujeli kasneje ... Na splošno je to lepota, ne gizmo.

Zakaj te ljubim? No, če je C neumna obrt, hitra in učinkovita, potem je sestavljanje filigranska umetnost. Kako manijaki, kot je Jim, kovičijo mojstrovine iz papirja in samo iz papirja, čeprav se zdi, da bi lahko kupili že pripravljen montažni model in lepilo za lastno veselje. Tako tudi tukaj - sam proces je porazen. Vključno s težavami pri odpravljanju napak :))))

Torej, glede sklada. Kaj je to? In to je območje pomnilnika. Deluje na principu sklada. Tisti. Zadnjega, ki ga je odložil, je vzel prvega.

Sklad ima kazalec, ki kaže na vrh sklada. Za kazalec sklada je odgovoren poseben register SP, oziroma je to registrski par SPL in SPH. Toda v mikrokontrolerjih z majhno količino RAM-a, na primer v Tini2313, obstaja samo SPL

Ko se krmilnik zažene, je običajno prva stvar, ki jo naredi, inicializira sklad, tako da v SP zapiše naslov njegovega dna, od koder bo rasel. Običajno je to konec RAM-a in raste proti začetku.

To se naredi tako, na samem začetku programa:

1 2 3 4 5 LDI R16, nizek (RAMEND) IZHOD SPL, R16 LDI R16, visok (RAMEND) IZHOD SPH, R16

LDI R16, nizek (RAMEND) IZHOD SPL, R16 LDI R16, visok (RAMEND) IZHOD SPH, R16

Kjer je RAMEND definicija makra, ki označuje konec RAM-a v trenutnem MK.

To je to, sklad je pripravljen za uporabo. Podatki so potisnjeni na sklad z ukazom PUSH Rn in pridobljeni prek POP Rn.
Rn je kateri koli od RON.

Ukazi CALL, RCALL, ICALL, RET, RETI in klicanje prekinitve prav tako delujejo s skladom, vendar o tem kasneje.

Igrajmo se s skladom, da začutimo, kako deluje, da razumemo, kako in kje se premika.

V studio vnesite naslednjo kodo:

CSEG; kodni segment LDI R16, nizek (RAMEND); Inicializacija sklada OUT SPL,R16 LDI R16,High(RAMEND) OUT SPH,R16 LDI R17,0 ; Nalaganje vrednosti 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 ; Vrednosti postavimo na sklad PUSH R18 PUSH R19 PUSH R20 PUSH R21 PUSH R22 PUSH R23 PUSH R24 PUSH R25 PUSH R26 POP R0 ; Pop vrednosti iz sklada POP R1 POP R2 POP R3 POP R4 POP R5 POP R6 POP R7 POP R8 POP R9

Zdaj zaženite studio korak za korakom in opazujte, kako se spreminja SP. Stack Pointer si lahko ogledate v studiu na istem mestu kot Program Counter.

Najprej inicializiramo sklad in naložimo registre s podatki. Rezultat bo naslednja slika:

Nato z ukazom POP pridobimo podatke iz sklada. Upoštevajte, da nam ni pomembno, kam na sklad postavimo podatke in kam jih naložimo. Glavna stvar je vrstni red namestitve! Vnašamo ga iz višjih registrov, dobili pa ga bomo v nižje. To bo povečalo kazalec sklada.

PUSH R16 PUSH R17 POP R16 POP R17

Na primer, o omejitvi nižjih RON-jev sem že govoril - ne dovolijo vam, da vpišete številko neposredno vase. Samo prek registrov starejše skupine. Ampak to je neprijetno!

Problem je rešen z uporabo makra. Imenoval sem ga LDIL - LDI low

MAKRO LDIL PUSH R17; Shranimo vrednost enega od višjih registrov na sklad. LDI R17,@1; Vanj naložimo našo takojšnjo vrednost MOV @0,R17; Prenesimo vrednost v register nizke skupine. POP R17; Obnovimo vrednost najvišjega registra iz sklada. .ENDM

Zdaj lahko preprosto uporabite naš domači ukaz.

1 LDIL R0,18

Sčasoma datoteka z makri pridobi takšne domače ukaze in delo postane enostavno in prijetno.

Napake sklada
Sklad raste proti podatkom, zdaj pa si predstavljajte, da imamo spremenljivko State v pomnilniku in se nahaja na naslovu, na primer 0x0450. Nevarno blizu vrha sklada. Spremenljivka hrani na primer stanje končnega avtomata, od katerega je odvisna nadaljnja logika programa. Recimo, če so 3, potem gremo narediti eno stvar, če so 4, potem nekaj drugega, če je 5, potem nekaj drugega in tako naprej do 255 držav. In po logiki dela bi po 3 moralo biti 4re, ne pa 10

In potem je bil 3. In potem so se v nekem strašnem trenutku pogoji toliko ujemali, da je sklad narasel in je njegov vrh dosegel to spremenljivko, tja je vnesel vrednost, recimo 20, nato pa je hrt padel nazaj. Puščanje blata za sabo je klasičen primer prelivanja sklada. In logika programa se je zaradi tega popolnoma sesula.

Ali nasprotni primer - sklad je bil potisnjen do spremenljivk, vendar so bile v tistem trenutku spremenljivke posodobljene in prepisale podatke sklada. Posledično je bilo nekaj napačnega odstranjeno iz sklada (običajno ukrivljeni povratni naslovi) in program se je zrušil. Mimogrede, ta možnost je veliko bolj neškodljiva, ker ... v tem primeru je podboj viden takoj in ne izskoči NENOTO po bog ve koliko časa.

Poleg tega se lahko ta napaka pojavi in ​​izgine. Odvisno od tega, kako program deluje in kako globoko naloži sklad. Vendar pa je taka težava pogostejša, ko pišete v C, kjer ne vidite, kako aktivno poteka delo s skladom. Na ASMA je vse veliko bolj pregledno. In tukaj se to lahko pojavi zaradi odkrito ukrivljenega algoritma.

Sestavljalci pogosto naletijo na druge napake sklada. Najprej pozabljivost. Nekaj ​​sem vstavil in pozabil vzeti ven. Če je bila težava v podprogramu ali prekinitvi, je povratni naslov popačen (več o tem malo kasneje), sklad se odtrga in program se takoj zruši. Ali pa nepazljivost - podatke sem shranil v enem vrstnem redu in jih priklical v drugem. Ups, vsebina registrov je bila izmenjana.

Da bi se izognili takšnim napakam, morate najprej spremljati sklad in drugič pravilno načrtovati postavitev spremenljivk v pomnilnik. Ohranjanje najbolj kritičnih območij in spremenljivk (kot so stanje stroji ali programske logične zastavice) stran od vrha sklada, bližje začetku pomnilnika.

Nekateri ljudje bodo mislili, da lahko vzamejo sklad in ga ne postavijo na sam konec RAM-a, ampak nekje bližje, za njim pa pustijo žep za kritične podatke. Ni ravno dobra ideja. Dejstvo je, da je sklad mogoče potisniti tako navzdol z ukazom PUSH kot navzgor z ukazi POP. Drugo, čeprav se zgodi veliko redkeje, ker... To je bolj greh krivih rok kot pa okoren algoritem, a se tudi to zgodi.
Toda glavna stvar je, da je sam sklad zelo pomembna struktura. Na njem sloni celoten mehanizem podprogramov in funkcij. Torej je okvara sklada v vsakem primeru nujna.

Stack perverzije
Moja najljubša tema. =)))) Kljub dejstvu, da se sam kazalec sklada izračuna med ukazoma PUSH in POP, nam nihče ne preprečuje, da bi ga izbrali iz SP in uporabili njegove vrednosti za ročni izračun naslova podatkov, ki ležijo na kup. Ali popravite podatke sklada, kot želimo.
Za kaj? No, aplikacij lahko najdeš veliko, če napneš možgane in začneš razmišljati izven okvirjev :))))

Poleg tega se parametri posredujejo skozi sklad v klasičnem C in Pascalu na arhitekturi x86 in lokalne spremenljivke delujejo. Tisti. Pred klicem funkcije se najprej vse spremenljivke potisnejo na sklad, nato pa se po klicu funkcije na sklad potisnejo bajti bodočih lokalnih spremenljivk.

Nato lahko z uporabo SP kot referenčne točke obravnavamo te spremenljivke, kot želimo. In ko je sklad osvobojen z ukazom POP, se izničijo in sprostijo pomnilnik.

V AVR je vse nekoliko drugače (očitno zaradi majhne količine pomnilnika, kjer se res ne morete potisniti v sklad, vendar je veliko RON), vendar lahko poskusite uporabiti tudi ta mehanizem.

Res je, to že spominja na nevrokirurgijo. Naredil sem majhno napako in pacient je mrtev.

Zahvaljujoč skladu in RAM-u lahko preživite le z dvema ali tremi registri, ne da bi se obremenjevali z njihovim pomanjkanjem.

Flash pomnilnik

Pomnilnik EEPROM je majhen, le nekaj bajtov, in včasih morate shraniti veliko podatkov, na primer sporočilo vesoljcem ali tabelo sinusov, da ne izgubljate časa z izračunom. Nikoli ne veš, kaj je treba vnaprej shraniti v spomin. Zato se lahko podatki shranijo v programski pomnilnik, v enakih kilobajtih flash, kot jih ima krmilnik na krovu.

Zapisali ga bomo, ampak kako ga lahko dobimo? Če želite to narediti, morate najprej nekaj postaviti tja.
Zato na koncu programa znotraj segmenta .CSEG dodajte oznako, na primer data, in za njo z operatorjem .db vnesite svoje podatke.

Operator DB pomeni, da za vsako konstanto uporabimo bajt. Obstajajo tudi operatorji, ki določajo dvobajtne konstante DW (kot tudi DD in DQ).

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

podatki: .db 12,34,45,23

Zdaj podatkovna oznaka kaže na naslov prvega bajta matrike, preostali bajti so locirani z odmikom, tako da se naslovu preprosto doda ena.

Ena subtilnost je, da prevajalnik nadomesti naslov oznake in ga obravnava kot naslov skoka za programski števec. In on, če se spomnite, obravnava dvobajtne besede - navsezadnje je lahko dolžina ukaza 2 ali 4 bajte.

In naši podatki so bajt za bajtom in pri dostopu do njih jih krmilnik bajt za bajtom tudi naslovi. Naslov v besedah ​​je dvakrat manjši od naslova v bajtih, kar je treba upoštevati pri množenju naslova z dva.

Za nalaganje podatkov iz programskega pomnilnika uporabite ukaz iz skupine Naloži programski pomnilnik

Na primer, LPM Rn,Z

V register Rn vnese številko iz celice, na katero kaže registrski par Z. Naj vas spomnim, da sta Z dva registra, R30 (ZL) in R31 (ZH). Nizki bajt naslova se vnese v R30, visoki bajt pa v R31.

V kodi je videti takole:

LDI ZL,low(data*2) ; Nizki bajt naslova vnesemo v registrski par Z LDI ZH,high(data*2) ; V registrski par Z vnesemo visoki bajt naslova; množenje z dvema je posledica dejstva, da je naslov naveden v; v dvobajtnih besedah, vendar jih potrebujemo v bajtih. ; Zato pomnožimo z dva; Po nalaganju naslova lahko naložite številko iz pomnilnika LPM R16, Z; v registru R16 bo za tem ukazom številka 12, ; vzet iz programskega pomnilnika. ; nekje na koncu programa, vendar v podatkovnem segmentu .CSEG: .db 12,34,45,23

Zdaj, ko smo že seznanjeni z nekaterimi zmožnostmi in funkcijami mikrokontrolerjev, se seveda pojavi logično vprašanje: kaj je potrebno za programiranje mikrokrmilnikov? Kateri programi in naprave so potrebni in kje jih lahko dobim?


Da lahko mikrokrmilnik rešuje probleme in opravlja določene funkcije, ga je treba sprogramirati, to pomeni, da je treba vanj zapisati program oziroma programsko kodo.

Zgradba in vrstni red pisanja programa

Najprej, preden začnete pisati kateri koli program, ali bolje rečeno programsko kodo, morate jasno razumeti, katere funkcije bo mikrokrmilnik opravljal. Zato morate najprej določiti končni cilj programa. Ko je definiran in popolnoma razumljen, se sestavi algoritem za program. Algoritem je zaporedje izvajanja ukazov. Uporaba algoritmov vam omogoča jasnejšo strukturo procesa pisanja kode, pri pisanju kompleksnih programov pa vam pogosto omogoča zmanjšanje časa, porabljenega za njihov razvoj in odpravljanje napak.

Naslednji korak po prevajanju algoritma je neposredno pisanje programske kode. Programi za mikrokontrolerje so napisani v jeziku Si oz sestavljalec . Samo Assembly je bolj nabor navodil kot programski jezik in je jezik nizke ravni.


Programe bomo pisali v C, ki je visokonivojski jezik. Programi v C so napisani veliko hitreje v primerjavi s podobnimi programi v Assembly. Poleg tega so vsi kompleksni programi napisani predvsem v C.

Tukaj ne bomo primerjali prednosti in slabosti pisanja programov v Assembly in C. Sčasoma, ko boste pridobili nekaj izkušenj pri programiranju MK, boste sami naredili koristne zaključke.

Samo programsko kodo lahko napišete v katerem koli standardnem urejevalniku besedil, na primer Beležnici. Vendar pa v praksi uporabljajo bolj priročne urejevalnike, o katerih bomo razpravljali spodaj.

Sestavljanje programa

Koda C, ki smo jo napisali, mikrokrmilniku še ni razumljiva, saj MK razume ukaze samo v binarnem (ali šestnajstiškem) sistemu, ki je niz ničel in enic. Zato je treba kodo C pretvoriti v ničle in enice. V ta namen se uporablja poseben program, imenovan prevajalnik, in sam postopek transformacija kode se imenuje prevajanje.

Za bliskavico vdelane programske opreme MK je poklicana naprava programer. Odvisno od tipa programatorja je njegov vhod priključen na COM ali USB priključek, izhod pa na določene pine mikrokontrolerja.


Izbira programatorjev in razvojnih plošč je široka, vendar smo kar zadovoljni z najpreprostejšim programer, ki na Kitajskem ne stane več kot 3 dolarje.


Po flashanju mikrokontrolerja se program razhrošči in preizkusi na pravi napravi ali, kot pravijo, na strojni opremi.

Zdaj pa povzamemo korake programiranja mikrokontrolerjev.


Pri pisanju preprostih programov lahko storite brez druge točke, to je brez sestavljanja algoritma na papirju, dovolj je, da ga imate v glavi.

Upoštevati je treba, da se odpravljanje napak in testiranje programa izvajata tudi pred utripanjem vdelane programske opreme MK.

Potreben nabor programov

Obstaja veliko uporabnih in priročnih programov za programiranje MK. Oba sta plačljiva in brezplačna. Med njimi so tri glavne:

1) Atmel Studio

2) CodeVisionAVR

3) WinAVR

Vsi ti programi so povezani z IDEjaz integrirano D razvoj E nvironment – ​​​​integrirano razvojno okolje. V njih lahko napišete kodo, jo prevedete in odpravite napake.

Bodite pozorni na Code Vision AVR. Ta IDE omogoča lažje in hitrejše pisanje kode. Vendar je program plačan.

Na začetni stopnji programiranja je bolje, da vse programe napišete ročno, brez kakršnih koli poenostavitev. To vam bo pomagalo hitro pridobiti potrebna znanja, v prihodnosti pa boste lahko dobro razumeli in urejali kode, ki jih je napisal nekdo drug, da bodo ustrezale vašim potrebam. Zato priporočam uporabo Atmel Studio. Prvič, je popolnoma brezplačen in se nenehno posodablja, in drugič, razvilo ga je podjetje, ki proizvaja mikrokontrolerje, na katerih se bomo naučili programirati.

Odpravljanje napak vdelane programske opreme in programov

Mikrokontrolerje bomo flashali z dodatnim programom.

Če mikrokrmilnik ni na voljo, lahko njegovo delovanje emuliramo s programom. Močno poenostavi postopek odpravljanja napak v programu, tudi če imate mikrokrmilnik, tako da vam ga ni treba pogosto znova zagnati, ker ima vsak mikrokrmilnik končno število prepisov, čeprav je to število precej veliko.

Pri utripanju in odpravljanju napak MK je priročno, da ga postavite na mizo, vendar to sploh ni potrebno. Zato je za večjo priročnost uporabna tudi miza. Izbira kruhov je velika, vendar ti priporočam, da vzameš tistega, ki ima čim več lukenj. Ko bomo začeli povezovati sedemsegmentne zaslone, boste začeli ceniti prednosti večjih miznih plošč.

Drug pomemben element, ki nam bo koristen, je tehnična dokumentacija za MK, imenovana podatkovni list. Na splošno morate prenesti podatkovni list za mikrokrmilnik ATmega8.

Kiselev Roman, maj 2007 Članek posodobljen 26. maja 2014

Torej, kaj je mikrokrmilnik (v nadaljnjem besedilu MK)? To je, relativno gledano, majhen računalnik, nameščen v enem samem integriranem vezju. Ima procesor (aritmetično logično enoto ali ALU), bliskovni pomnilnik, pomnilnik EEPROM, številne registre, V/I vrata, kot tudi dodatne dodatke, kot so časovniki, števci, primerjalniki, USART-ji itd. Po priključitvi napajanja , se mikrokrmilnik zažene in začne izvajati program, shranjen v njegovem bliskovnem pomnilniku. Hkrati lahko prek V/I vrat krmili najrazličnejše zunanje naprave.

Kaj to pomeni? To pomeni, da lahko v MK implementirate katero koli logično vezje, ki bo opravljalo določene funkcije. To pomeni, da je MK mikrovezje, katerega notranjo vsebino pravzaprav ustvarimo sami. To omogoča, da po nakupu več popolnoma enakih MK na njih sestavite popolnoma različna vezja in naprave. Če želite narediti kakršne koli spremembe v delovanju elektronske naprave, vam ne bo treba uporabiti spajkalnika, temveč boste morali le ponovno programirati MK. V tem primeru vam ga sploh ni treba odstraniti iz naprave, če uporabljate AVR, saj ti MK podpirajo programiranje v vezju. Tako mikrokontrolerji premostijo vrzel med programiranjem in elektroniko.

AVR so 8-bitni mikrokontrolerji, kar pomeni, da lahko njihova ALU izvaja preproste operacije samo z 8-bitnimi številkami v enem taktu. Zdaj je čas, da se pogovorimo o tem, kateri MK bomo uporabili. Delam z ATMega16 MK. Je zelo pogost in ga je mogoče kupiti v skoraj vseh trgovinah z radijskimi deli za približno 100 rubljev. Če ga ne najdete, potem lahko kupite katero koli drugo MK serije MEGA, vendar boste v tem primeru morali poiskati dokumentacijo za to, saj lahko iste "noge" različnih MK opravljajo različne funkcije in povezovanje, se zdi, če so vsi sklepi pravilni, lahko dobite delujočo napravo ali morda le oblak smrdljivega dima. Ko kupujete ATMega16, se prepričajte, da je v velikem 40-pinskem DIP ohišju in kupite zanj tudi vtičnico, v katero ga lahko vstavite. Za delo z njim boste potrebovali tudi dodatne naprave: LED, gumbe, priključke itd.

ATMega16 ima zelo veliko različnih funkcij. Tukaj je nekaj njegovih značilnosti:

  • Največja taktna frekvenca – 16 MHz (8 MHz za ATMega16L)
  • Večina ukazov se izvede v enem taktu
  • 32 8-bitnih delovnih registrov
  • 4 polna 8-bitna V/I vrata
  • dva 8-bitna časovnika/števca in en 16-bitni
  • 10-bitni analogno-digitalni pretvornik (ADC)
  • notranji taktni generator na 1 MHz
  • analogni primerjalnik
  • vmesniki SPI, I2C, TWI, RS-232, JTAG
  • programiranje v vezju in samoprogramiranje
  • modul impulzne širinske modulacije (PWM).

Celotne značilnosti te naprave in navodila za njihovo uporabo najdete v priročniku (Podatkovni list) za to MK. Res je, v angleščini je. Če znate angleško, obvezno prenesite ta podatkovni list, saj vsebuje veliko koristnih informacij.

Pa se končno lotimo posla. Priporočam izdelavo posebne razvojne in razhroščevalne plošče za mikrokrmilnik, na kateri lahko brez spajkalnika (ali skoraj brez njega) sestavite poljubno električno vezje z mikrokrmilnikom. Uporaba takšne plošče bo močno olajšala delo z MK in pospešila proces učenja njegovega programiranja. Videti je takole:

Kaj boste potrebovali za to?

Najprej boste potrebovali samo ploščo. Kupil sem že pripravljenega v trgovini z radijskimi deli za 115 rubljev. Nato sem nanj spajkal vse potrebne dele. Rezultat je neverjetno priročna stvar, na kateri lahko v nekaj minutah sestavite katero koli električno vezje s povezovanjem kablov in namestitvijo mikrovezij in indikatorjev.

Za povezovanje elementov vezja je zelo priročno uporabljati kable s konektorji na koncih. Ti konektorji so nameščeni na "nogah", ki štrlijo poleg vsakega priključka MK. Mikrokrmilnik je treba namestiti v vtičnico in ne spajkati na ploščo, sicer ga bo zelo težko odstraniti, če ga pomotoma zažgete. Spodaj je pinout ATMEGA16 MK:

Naj pojasnimo, katere noge nas zdaj zanimajo.

  • VCC - tukaj se napaja (4,5 - 5,5 V) iz stabiliziranega vira
  • GND – ozemljitev
  • RESET – ponastavitev (pri nizki napetosti)
  • XTAL1, XTAL2 – tukaj je priključen kvarčni resonator
  • PA, PB, PC, PD – vhodno/izhodna vrata (A, B, C oziroma D).

Vse, kar proizvaja 7-11 V DC, se lahko uporablja kot vir energije. Za stabilno delovanje MK je potrebno stabilizirano napajanje. Kot stabilizator lahko uporabite mikrovezja serije 7805. To so linearni integrirani stabilizatorji, katerih vhod je napajan s 7-11 V enosmernega nestabiliziranega toka, izhod pa je 5 V stabiliziranega toka. Pred in po 7805 morate namestiti filtrske kondenzatorje (elektrolitske za filtriranje nizkofrekvenčnih motenj in keramične za visokofrekvenčne). Če ne najdete stabilizatorja, lahko kot vir napajanja uporabite baterijo 4,5 V. MK je treba napajati neposredno iz nje.

Spodaj je diagram povezave MK:

Zdaj pa ugotovimo, kaj je kaj tukaj.

BQ1 je kvarčni resonator, ki nastavi delovno frekvenco MK. Nastavite lahko poljubno do 16 MHz, a ker nameravamo v prihodnosti delati s COM vrati, priporočam uporabo resonatorjev za naslednje frekvence: 14,7456 MHz, 11,0592 MHz, 7,3725 MHz, 3,6864 MHz ali 1,8432 MHz (kasneje postalo bo jasno zakaj). Uporabil sem 11,0592 MHz. Jasno je, da višja kot je frekvenca, višja je hitrost naprave.

R1 je pull-up upor, ki vzdržuje napetost 5 V na vhodu RESET. Nizka napetost na tem vhodu pomeni ponastavitev. Po ponastavitvi se MK zažene (10 - 15 ms) in ponovno začne izvajati program. Ker je to vhod z visoko impedanco, ga ne morete pustiti, da "visi v zraku" - majhen dvig na njem bo povzročil nepričakovano ponastavitev MK. R1 je ravno temu namenjen. Za zanesljivost priporočam tudi namestitev kondenzatorja C6 (ne več kot 20 µF).

SB1 – gumb za ponastavitev.

Kvarčni resonator in filtrirni kondenzator C3 morata biti nameščena čim bližje MK (ne več kot 5-7 cm), saj lahko v nasprotnem primeru pride do motenj v žicah, kar vodi do motenj v delovanju MK.

Modri ​​pravokotnik v diagramu označuje sam programator. Primerno je narediti v obliki žice, katere en konec je priključen na vrata LPT, drugi pa v določen priključek poleg MK. Žica ne sme biti predolga. Če pride do težav s tem kablom (ponavadi se ne, lahko pa se zgodi kar koli), boste morali spajkati adapter Altera ByteBlaster. Kako to storiti je zapisano v opisu programatorja AVReal.

Zdaj, ko smo se ukvarjali s strojno opremo, je čas, da preidemo na programsko opremo.

Obstaja več razvojnih okolij za programiranje AVR. Prvič, to je AVR Studio - uradni programski sistem podjetja Atmel. Omogoča vam pisanje v asemblerju in odpravljanje napak v programih, napisanih v asembleru, C in C++. IAR je komercialni programski sistem v C, C++ in zbirnem jeziku. WinAVR je odprtokodni prevajalnik. AtmanAVR je programski sistem za AVR z vmesnikom, ki je skoraj popolnoma enak Visual C++ 6. AtmanAVR vam omogoča tudi odpravljanje napak v programih in vsebuje številne pomožne funkcije, ki olajšajo pisanje kode. Ta programski sistem je komercialen, vendar ga lahko v skladu z licenco uporabljate brezplačno en mesec.

Predlagam, da začnete delati z IAR kot najbolj preglednim razvojnim okoljem. V IAR je projekt v celoti ustvarjen ročno, zato boste po dokončanih več projektih že jasno vedeli, kaj vsaka vrstica kode pomeni in kaj se bo zgodilo, če jo spremenite. Pri delu z AtmanAVR boste morali uporabiti vnaprej ustvarjeno predlogo, ki je zelo okorna in težko razumljiva za osebo brez izkušenj, ali pa boste imeli veliko težav z datotekami glave pri sestavljanju projekta iz nič. Ko smo obravnavali IAR, si bomo kasneje ogledali še druge prevajalnike.

Torej, najprej vzemite nekaj IAR. Je zelo pogost in najti ga ne bi smelo biti težav. Ko od nekje prenesete IAR 3.20, namestite prevajalnik/delovno okolje in ga zaženite. Po tem lahko začnete delati.

Ko zaženete IAR, izberite datoteka/novo/delovni prostor, izberite pot do našega projekta in ustvarite mapo zanj ter jo poimenujte, na primer »Prog1«. Sedaj pa ustvarimo projekt: Projekt / Ustvari nov projekt … Imenujmo ga tudi “Prog1”. Z desno tipko miške kliknite naslov projekta v drevesu projekta in izberite »Možnosti«

Tukaj bomo konfigurirali prevajalnik za določen MK. Najprej morate izbrati tip procesorja ATMega16 na zavihku Target, označiti potrditveno polje Enable bit definitions in I/O-include files na zavihku Library Configuration (tako da lahko uporabite bitna imena različnih registrov MK v programski kodi ) in tam izberite vrsto knjižnice C /EU++. V kategoriji ICCAVR morate potrditi potrditveno polje Omogoči večbajtno podporo na zavihku Jezik in izklopiti optimizacijo na zavihku Optimizacija (sicer bo uničil naš prvi program).

Nato izberite kategorijo XLINK. Tukaj morate določiti obliko prevedene datoteke. Ker zdaj nastavljamo možnosti za način odpravljanja napak, kot je opisano v naslovu, moramo kot izhod dobiti datoteko za odpravljanje napak. Kasneje ga bomo odprli v AVR Studiu. Če želite to narediti, morate izbrati razširitev.cof, vrsta datoteke pa je ubrof 7.

Zdaj kliknite V redu, nato spremenite Debug v Release.

Ponovno pojdite na Možnosti, kjer so vsi parametri razen XLINK nastavljeni na enake vrednosti. V XLINK spremenite pripono v .hex in format datoteke v intel-standard.

To je vse. Zdaj lahko začnete pisati svoj prvi program. Ustvarite nov vir/besedilo in vanj vnesite naslednjo kodo:

#vključi"iom16.h" short unsigned int i; praznina glavni( praznina) (DDRB = 255; PORTB = 0; medtem(1) { če(PORTB == 255) PORTB = 0; drugače PORTB++; za(i=0; i

Datoteka "iom16.h" se nahaja v mapi (C:\Programske datoteke)\IAR Systems\Embedded Workbench 3.2\avr\inc. Če uporabljate drug MK, na primer ATMega64, izberite datoteko "iom64.h". Te datoteke glave shranjujejo informacije o MK: imena registrov, biti v registrih in imena prekinitev. Vsak posamezen zatič vrat A, B, C ali D lahko deluje kot vhod ali izhod. To določa Data Direction Register (DDR). 1 naredi nogo izhod, 0 pa vhod. Tako z nastavitvijo, na primer, DDRA = 13, naredimo "noge" PB0, PB2, PB3 izhode, ostalo - vhode, ker 13 v dvojiški obliki je 00001101.

PORTB je register, ki določa stanje pinov vrat. Ko smo tam zapisali 0, nastavimo napetost na vseh izhodih na 0 V. Nato sledi neskončna zanka. Pri programiranju MK vedno naredijo neskončno zanko, v kateri MK izvaja neko akcijo, dokler se ne ponastavi ali dokler ne pride do prekinitve. V tem ciklu napišejo tako rekoč »kodo ozadja«, ki jo MK izvede kot zadnjo stvar. To je lahko na primer prikaz informacij na zaslonu. V našem primeru se vsebina registra PORTB povečuje, dokler ni poln. Po tem se vse začne znova. Končno deset tisoč ciklov for zanke. Potreben je za oblikovanje vidne zakasnitve pri preklopu stanja vrat B.



Zdaj to datoteko shranimo v mapo projekta kot Prog1.c, kopiramo datoteko iom16.h v mapo projekta, izberemo Project/Add Files in dodamo »iom16.h« in »Prog1.c«. Izberite Release, pritisnite F7, program se prevede in sporočilo bi se moralo prikazati:


Skupno število napak: 0
Skupno število opozoril: 0

Tukaj je fotografija mojega programerja:

Prenesite programator AVRel. Kopirajte jo (AVReal32.exe) v mapo Release/exe, kjer naj bo datoteka Prog1.hex. Napajamo MK, priključimo kabel za programiranje. Odprite Far Manager (najbolj priročno je bliskati MK), pojdite v to mapo, pritisnite Ctrl + O. Ker imamo popolnoma nov MK, smo stvari

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

Ne pozabite vnesti pravilne frekvence, če ne uporabljate 11059200 Hz! Obenem pa t.i varovalke – registri, ki nadzirajo njegovo delovanje (uporaba internega generatorja, Jtag ipd.). Po tem je pripravljen za sprejem prvega programa. Programerju so kot parametri podana uporabljena vrata LPT, frekvenca, ime datoteke in drugi (vsi so navedeni v opisu AVReal). Kličemo:

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

Če je povezava pravilna, programator sporoči uspešno programiranje. Nobenega zagotovila ni, da bo to delovalo prvič (prvi klic programa). Sam sem včasih programiran drugič. Morda so vrata LPT okvarjena ali pa pride do motenj v kablu. Če pride do težav, skrbno preverite kabel. Iz lastnih izkušenj vem, da je 60% okvar povezanih s pomanjkanjem kontakta na pravem mestu, 20% s prisotnostjo nepotrebnega in še 15% z napačnim spajkanjem napačne stvari na napačno stvar. Če nič drugega ne uspe, preberite opis programatorja in poskusite zgraditi Byte Blaster.

Predpostavimo, da vam vse deluje. Če zdaj priključite osem LED na vrata B MK (to naredite z izklopljenim MK in priporočljivo je, da z LED diodami zaporedno vključite upore 300-400 Ohmov) in vključite napajanje, se bo zgodil majhen čudež - " val" bo tekel skozi njih!

© Kiselev Roman
maj 2007

december 2015

1. Prednosti predlagane metode

Vezja naprav, ki temeljijo na mikrokontrolerjih (MCU), se običajno odlikujejo po kombinaciji dveh lastnosti, ki jih je težko združiti: maksimalne preprostosti in visoke funkcionalnosti. Poleg tega je mogoče funkcionalnost spremeniti in razširiti v prihodnosti brez kakršnih koli sprememb v vezju - samo z zamenjavo programa (flashing). Te lastnosti so razložene z dejstvom, da so ustvarjalci sodobnih mikrokontrolerjev poskušali na enem čipu postaviti vse, kar bi lahko potreboval razvijalec elektronske naprave - vsaj kolikor je mogoče. Posledično je prišlo do premika poudarka z vezja in namestitve na programsko opremo. Z uporabo MK je zdaj manj potrebe po "obremenitvi" vezja z deli, manj je povezav med komponentami. To seveda naredi vezje bolj privlačno za ponavljanje tako za izkušene elektronike kot za začetnike. Ampak, kot običajno, morate plačati za vse. Tudi to ni šlo brez težav. Če kupite nov MK, ga namestite v pravilno sestavljeno vezje iz popravljivih delov in priključite napajanje, potem nič ne bo delovalo - naprava ne bo delovala. Mikrokrmilnik potrebuje program.

Zdi se, da je tudi s tem vse preprosto - na internetu lahko najdete veliko shem z brezplačno vdelano programsko opremo. A tu je ena zanka: vdelano programsko opremo je treba nekako »naložiti« v mikrokontroler. Za nekoga, ki tega še nikoli ni storil, taka naloga pogosto postane problem in glavni dejavnik odbijanja, ki jih pogosto prisili, da opustijo užitke uporabe MK in iščejo sheme, ki temeljijo na "ohlapni" in togi logiki. Vendar vse ni tako zapleteno, kot se morda zdi na prvi pogled.

Po analizi publikacij na internetu lahko vidite, da se ta težava najpogosteje reši na enega od dveh načinov: nakup že pripravljenega programerja ali izdelava domačega. Hkrati so objavljena vezja domačih programerjev zelo pogosto nerazumno zapletena - veliko bolj zapletena, kot je v resnici potrebno. Seveda, če nameravate vsak dan utripati MK, je bolje imeti "kul" programer. Če pa se potreba po takem postopku pojavlja redko, občasno, potem lahko popolnoma storite brez programerja. Ne, seveda ne govorimo o tem, da bi se tega naučili z močjo misli. To pomeni, da lahko z razumevanjem interakcije programatorja z mikrokrmilnikom pri pisanju in branju informacij v njegovem programskem načinu zadovoljimo z razpoložljivimi orodji za širši namen. Ta orodja bodo morala nadomestiti tako programski kot strojni del programatorja. Strojna oprema mora zagotavljati fizično povezavo z mikrovezjem MK, možnost uporabe logičnih ravni na njegovih vhodih in branje podatkov iz njegovih izhodov. Programski del mora zagotavljati delovanje algoritma, ki nadzoruje vse potrebne procese. Ugotavljamo tudi, da kakovost snemanja informacij v MK ni odvisna od tega, kako "kul" je vaš programer. Ne obstaja "boljše posneto" ali "slabše". Obstajata samo dve možnosti: "registriran" in "neregistriran". To je razloženo z dejstvom, da proces snemanja znotraj kristala neposredno nadzoruje sam MK. Zagotoviti mu morate le kakovostno napajanje (brez motenj ali valovanja) in pravilno organizirati vmesnik. Če rezultati testnega odčitka ne pokažejo nobenih napak, potem je vse v redu - krmilnik lahko uporabljate za predvideni namen.

Za pisanje programa v MK brez programatorja potrebujemo pretvornik vrat USB-RS232TTL in tudi. Pretvornik USB-RS232TTL vam omogoča uporabo vrat USB za ustvarjanje vrat COM, ki se od "pravega" razlikujejo le po tem, da njegovi vhodi in izhodi uporabljajo logične ravni TTL, to je napetost v območju od 0 do 5 voltov ( več si lahko preberete v članku " "). Vsekakor pa je takšen pretvornik koristno imeti v »gospodinjstvu«, tako da se ga, če ga še nimate, vsekakor splača kupiti. Kar zadeva logične nivoje, je v našem primeru TTL celo prednost pred običajnimi COM vrati, saj lahko vhode in izhode takšnih vrat neposredno povežemo s katerim koli mikrokontrolerjem, ki se napaja na 5 V, vključno z ATtiny in ATmega. Vendar ne poskušajte uporabiti običajnih vrat COM - uporabljajo napetosti v območju od -12 do +12 V (ali -15 ... + 15 V). V tem primeru je neposredna povezava z mikrokontrolerjem nesprejemljiva!!!

Ideja o ustvarjanju skripta za program Perpetuum M, ki izvaja funkcije programerja, se je pojavila po branju številnih publikacij na internetu, ki ponujajo določene rešitve za strojno programsko opremo MK. V vsakem primeru so bile odkrite resne pomanjkljivosti ali prevelike težave. Pogosto sem naletel na programatorska vezja, ki so vsebovala mikrokrmilnik, hkrati pa so bili zelo resni nasveti: "... in za programiranje mikrokrmilnika za ta programator bomo potrebovali ... tako je - drug programator!" Nato je bilo predlagano, da greste k prijatelju, poiščete plačano storitev itd. Kakovost programske opreme, distribuirane v omrežju za te namene, prav tako ni bila navdušujoča - opazili smo veliko težav tako pri funkcionalnosti kot pri "motnosti" uporabniškega vmesnika. Pogosto potrebujemo veliko časa, da razumemo, kako uporabljati program - treba ga je preučiti tudi za izvajanje najpreprostejših dejanj. Drug program lahko nekaj počne dolgo in pridno, vendar uporabnik izve, da se v MK nič ne piše šele po popolnem dokončanju celotne strojne opreme in kasnejšem testnem branju. Pojavi se tudi naslednja težava: uporabnik poskuša izbrati svoj MK s seznama podprtih kristalov, vendar ga ni na seznamu. V tem primeru ne boste mogli uporabljati programa - vključitev na seznam manjkajočih MK praviloma ni zagotovljena. Poleg tega je ročna izbira krmilnika s seznama videti čudna, saj lahko programer v mnogih primerih sam določi vrsto MK. Vse to je rečeno ne zato, da bi blatili obstoječe izdelke, ampak zato, da bi pojasnili razlog za pojav skripta za program Perpetuum M, opisan v tem članku. Težava res obstaja in zadeva predvsem začetnike, ki jim tega »zida« ne uspe vedno premagati, da bi naredili prvi korak v svet mikrokontrolerjev. Predlagani scenarij upošteva pomanjkljivosti drugih programov. Implementirana je maksimalna »transparentnost« delovanja algoritma, izjemno preprost uporabniški vmesnik, ki ne zahteva učenja in ne pušča nobene možnosti, da bi se zmedli in »kliknili narobe«. Če zahtevani MK ni med podprtimi, lahko sami dodate njegov opis, pri čemer vzamete potrebne podatke iz dokumentacije, ki ste jo prenesli s spletnega mesta razvijalca MK. In kar je najpomembnejše, scenarij je odprt za študij in spreminjanje. Vsakdo ga lahko odpre v urejevalniku besedil, ga preučuje in ureja po lastni presoji, spreminja obstoječe funkcije po svojem okusu in dodaja manjkajoče.

Prva različica scenarija je bila ustvarjena junija 2015. Ta različica podpira le mikrokontrolerje serije Atmel ATtiny in ATmega s funkcijami za zapisovanje/branje bliskovnega pomnilnika, nastavitev konfiguracijskih bitov in samodejno zaznavanje tipa krmilnika. Zapisovanje in branje EEPROM ni implementirano. Obstajali so načrti za dopolnitev funkcionalnosti skripta : dodajanje pisanja in branja EEPROM-a, implementacija podpore za krmilnike PIC itd.Zaradi tega skripta še ni bila objavljena.A zaradi pomanjkanja časa je bila izvedba načrta zamaknjena in da najboljši ne postane sovražnik dobrega, je bilo odločeno, da se objavi obstoječa različica. Če že implementirane funkcije ne bodo dovolj, prosim, ne bodite razburjeni. V tem primeru lahko poskusite sami dodati želeno funkcijo. Ne bom skrival: ideja o ustvarjanju tega skripta ima na začetku tudi izobraževalni pomen.Ko boste razumeli algoritem in mu dodali nekaj svojega, boste lahko bolje razumeli delovanje MK v programskem načinu, tako da v v prihodnosti se ne boste znašli v položaju dekleta pred pokvarjenim avtomobilom, ki si zamišljeno ogleduje njegovo notranjost in ne razume, zakaj »ne gre«.

2. MK vmesnik v programskem načinu

Obstaja več različnih načinov za preklop krmilnika v programski način in delo z njim v tem načinu. Najlažji za implementacijo krmilnikov serije ATtiny in ATmega je morda SPI. Uporabili ga bomo.

Toda preden začnemo obravnavati signale, potrebne za ustvarjanje SPI, bomo naredili nekaj pridržkov. Mikrokrmilnik ima konfiguracijske bite. To so nekaj podobnega preklopnim stikalom, preklapljanje, ki vam omogoča spreminjanje nekaterih lastnosti mikrovezja v skladu s potrebami projekta. Fizično so to obstojne pomnilniške celice, kot tiste, v katere je zapisan program. Razlika je v tem, da jih je zelo malo (do tri bajte za ATmega) in niso del naslovnega prostora nobenega pomnilnika. Zapisovanje in branje konfiguracijskih podatkov se izvaja z ločenimi ukazi v načinu programiranja MK. Zdaj je pomembno omeniti, da nekateri konfiguracijski bitji vplivajo na samo zmožnost uporabe SPI. Pri nekaterih njihovih vrednostih se lahko izkaže, da SPI ni mogoče uporabiti. Če naletite na takšen mikrokrmilnik, metoda, predlagana v tem članku, ne bo pomagala. V tem primeru boste morali bodisi spremeniti nastavitve konfiguracijskih bitov v programatorju, ki podpira drugačen način programiranja, bodisi uporabiti drug mikrokrmilnik. Toda ta težava velja samo za rabljene MK ali tiste, s katerimi se je nekdo že neuspešno "igral". Dejstvo je, da novi mikrokontrolerji prihajajo z nastavitvami konfiguracijskih bitov, ki ne preprečujejo uporabe SPI. To potrjujejo rezultati testiranja programske skripte za program Perpetuum M, med katero so bili uspešno utripani štirje različni MK (ATmega8, ATmega128, ATtiny13, ATtiny44). Vsi so bili novi. Začetna nastavitev konfiguracijskih bitov je bila skladna z dokumentacijo in ni ovirala uporabe SPI.

Glede na zgoraj navedeno morate biti pozorni na naslednje bite. Bit SPIEN izrecno dovoljuje ali zavrača uporabo SPI, zato mora biti v našem primeru njegova vrednost dovoljena. Bit RSTDISBL je sposoben obrniti enega od izhodov mikrovezja (vnaprej določen) v vhod signala "ponastavitve" ali ga ne obrniti (odvisno od vrednosti, zapisane v ta bit). V našem primeru je potreben vhod "ponastavitev" (če ga ni, MK ne bo mogoče preklopiti v način programiranja prek SPI). Obstajajo tudi biti skupine CKSEL, ki določajo vir signala ure. Ne preprečujejo uporabe SPI, vendar jih je treba tudi upoštevati, saj če taktnih impulzov sploh ni ali če je njihova frekvenca nižja od sprejemljive za določeno hitrost SPI, se tudi ne bo zgodilo nič dobrega. Običajno imajo novi mikrokontrolerji, ki imajo notranji RC oscilator, skupinske bite CKSEL konfigurirane za njegovo uporabo. To nam zelo ustreza - takt je zagotovljen brez kakršnega koli dodatnega napora z naše strani. Kvarčnega resonatorja ni treba spajkati ali priključiti zunanjega generatorja. Če navedeni biti vsebujejo drugačno nastavitev, boste morali poskrbeti za taktiranje v skladu z nastavitvijo. V tem primeru bo morda treba na MCU priključiti kvarčni resonator ali zunanji taktni generator. Toda v tem članku ne bomo razmišljali o tem, kako se to naredi. Primeri povezovanja MK za programiranje v tem članku so zasnovani za najpreprostejši primer.

riž. 1. Izmenjava podatkov preko SPI v programskem načinu

Zdaj pa poglejmo sliko 1, vzeto iz dokumentacije za ATmega128A MK. Prikazuje postopek oddajanja enega bajta v MK in hkratnega sprejema enega bajta od MK. Oba procesa, kot vidimo, uporabljata iste taktne impulze, ki jih programator dovaja mikrokrmilniku na njegovem vhodu SCK - enem od zatičev mikrovezja, ki mu je taka vloga dodeljena v načinu programiranja SPI. Še dve signalni liniji zagotavljata sprejem in prenos podatkov en bit na takt. Prek vhoda MOSI pridejo podatki v mikrokontroler, prebrani podatki pa se vzamejo iz izhoda MISO. Opazite dve pikčasti črti, narisani od SCK do MISO in MOSI. Prikazujejo, v katerem trenutku mikrokrmilnik »pogoltne« podatkovni bit, nastavljen na vhodu MOSI, in v katerem trenutku sam nastavi svoj podatkovni bit na MISO izhod. Vse je zelo preprosto. Toda za vstop MK v način programiranja še vedno potrebujemo signal RESET. Ne pozabimo tudi na skupno GND žico in napajalnik VCC. Skupno se izkaže, da je treba na mikrokrmilnik priključiti le 6 žic, da bi utripal svojo strojno programsko opremo prek SPI. Spodaj bomo to podrobneje analizirali, za zdaj pa dodamo, da se izmenjava podatkov z MK v programskem načinu prek SPI izvaja v paketih po 4 bajtov. Prvi bajt vsakega paketa je v bistvu v celoti namenjen kodiranju navodil. Drugi bajt, odvisno od prvega, je lahko nadaljevanje kode ukaza ali del naslova ali pa ima poljubno vrednost. Tretji bajt se uporablja predvsem za prenos naslovov, vendar ima lahko v mnogih navodilih poljubno vrednost. Četrti bajt običajno prenaša podatke ali ima poljubno vrednost. Hkrati s prenosom četrtega bajta nekateri ukazi prejmejo podatke, ki prihajajo iz mikrokontrolerja. Podrobnosti za vsak ukaz najdete v dokumentaciji krmilnika v tabeli z naslovom "SPI Serial Programming Instruction Set". Zaenkrat ugotavljamo le, da je celotna izmenjava s krmilnikom zgrajena iz zaporedja 32-bitnih paketov, v vsakem izmed njih pa se ne prenaša več kot en bajt uporabnih informacij. To ni najbolj optimalno, vendar na splošno deluje dobro.

3. Priključitev MK za programiranje

Za zagotovitev, da so vsi potrebni signali dobavljeni na vhode mikrokrmilnika za organizacijo vmesnika SPI in branje podatkov iz njegovega MISO izhoda, ni treba ustvariti programatorja. To lahko preprosto storite z najpogostejšim pretvornikom USB-RS232TTL.

Na internetu lahko pogosto najdete informacije, da so takšni pretvorniki slabši in da z njimi ni mogoče narediti nič resnega. Toda v zvezi z večino modelov pretvornikov je to mnenje napačno. Da, v prodaji so pretvorniki, ki nimajo na voljo vseh vhodov in izhodov v primerjavi s standardnimi vrati COM (na primer samo TXD in RXD), medtem ko imajo neločljivo zasnovo (mikrovezje je napolnjeno s plastiko - je nemogoče doseči njegove nožice). Teh pa ni vredno kupovati. V nekaterih primerih lahko manjkajoče vhode in izhode dobite tako, da prispajkate ožičenje neposredno na čip. Primer takšnega "izboljšanega" pretvornika je prikazan na sliki 2 (čip PL-2303 - več podrobnosti o namenu njegovih zatičev v članku ""). To je eden najcenejših modelov, vendar ima svoje prednosti pri uporabi v domačih modelih. Razširjeni so tudi polno opremljeni adapterski kabli s standardnim devet-polnim priključkom na koncu, kot so vrata COM. Od običajnih vrat COM se razlikujejo le po ravneh TTL in nezdružljivosti s podedovano programsko opremo in nekaj starejše strojne opreme. Prav tako je mogoče opaziti, da so se kabli na čipu CH34x izkazali za veliko bolj zanesljive in stabilne v različnih ekstremnih testih v primerjavi s pretvorniki na PL-2303. Vendar pri normalni uporabi razlika ni opazna.

Pri izbiri pretvornika USB-RS232TTL bodite pozorni tudi na združljivost njegovega gonilnika z različico operacijskega sistema, ki ga uporabljate.

Oglejmo si podrobneje princip povezave mikrokontrolerja in pretvornika USB-RS232TTL na primeru štirih različnih modelov MK: ATtiny13, ATtiny44, ATmega8 in ATmega128. Slika 3 prikazuje splošni diagram takšne povezave. Morda vas bo presenetilo, da se signali RS232 (RTS, TXD, DTR in CTS) uporabljajo neustrezno. Vendar naj vas to ne skrbi: program Perpetuum M lahko neposredno dela z njimi - nastavi izhodne vrednosti in prebere vhodna stanja. Vsekakor široko uporabljeni pretvorniki USB-RS232TTL na čipih CH34x in PL-2303 zagotavljajo to zmožnost - to je bilo preverjeno. Tudi z drugimi priljubljenimi pretvorniki ne bi smelo biti težav, saj se za dostop do vrat uporabljajo standardne funkcije sistema Windows.

Upori, prikazani na splošnem diagramu, načeloma ni mogoče namestiti, vendar jih je vseeno bolje namestiti. Kakšen je njihov namen? Z uporabo TTL vhodov in izhodov pretvornika ter petvoltnega napajanja mikrokrmilnika se s tem znebimo potrebe po usklajevanju logičnih ravni - vse je že čisto pravilno. To pomeni, da so povezave lahko neposredne. Toda med poskusi , lahko se zgodi karkoli. Na primer, po zakonu zlobnosti lahko izvijač pade ravno na mesto, kjer nikakor ne bi mogel pasti, in povzroči kratek stik na nečem, kar v nobenem primeru ne bi smelo biti. Seveda lahko vse izkažejo za "izvijač". Upori v tem primeru včasih zmanjšajo posledice. Eden od njihovih namenov je odpraviti morebiten izhodni konflikt. Dejstvo je, da po končanem programiranju mikrokrmilnik preide v normalen način delovanja in lahko zgodi, da njegov pin, povezan z izhodom pretvornika (RTS, TXD ali DTR), postane tudi izhod, glede na program, ki je bil pravkar posnet v MK. V tem primeru bo zelo slabo, če se bosta dva neposredno povezana izhoda "sprla" - poskusite nastaviti različne logične ravni. V takšnem »boju« lahko kdo »izgubi«, a tega si ne želimo.

Vrednosti treh uporov so izbrane na ravni 4,3 KOhm. To velja za povezave med izhodom pretvornika in vhodom mikrokrmilnika. Natančnost uporov ni pomembna: njihov upor lahko zmanjšate na 1 KOhm ali povečate na 10 KOhm (vendar se v drugem primeru tveganje motenj poveča pri uporabi dolgih žic na poti do MK). Kar zadeva povezavo med vhodom pretvornika (CTS) in izhodom mikrokontrolerja (MISO), je tukaj uporabljen upor 100 Ohm. To je razloženo s posebnostmi vnosa uporabljenega pretvornika. Med preskusi je bil na mikrovezju PL-2303 uporabljen pretvornik, katerega vhodi so očitno povezani z napajalnikom pozitivno z relativno nizkim uporom (reda nekaj sto Ohmov). Za "prekinitev vlečenja" sem moral namestiti upor s tako majhnim uporom. Vendar vam ga sploh ni treba namestiti. Na pretvorniku je to vedno vhod. Ne more postati izhod, kar pomeni, da v nobenem razvoju dogodkov ne bo konflikta izhodov.

Če ima čip ločen zatič AVCC za napajanje analogno-digitalnega pretvornika (na primer ATmega8 ali ATmega128), ga je treba povezati s skupnim napajalnim zatičem VCC. Nekateri IC-ji imajo več kot en napajalni pin VCC ali več kot en GND. Na primer, ATmega128 ima 3 zatiče GND in 2 zatiča VCC. V trajni zasnovi je bolje med seboj povezati istoimenske nožice. V našem primeru lahko med programiranjem uporabite po en VCC in GND pin.

In tukaj je videti povezava ATtiny13. Slika prikazuje dodelitve pinov, ki se uporabljajo pri programiranju prek SPI. Ob fotografiji je prikazano, kako začasna zveza izgleda v resnici.


Nekateri bodo morda rekli, da to ni resno - povezave na ožičenju. Ampak ti in jaz sva razumna človeka. Naš cilj je sprogramirati mikrokrmilnik, pri tem pa porabiti čim manj časa in drugih sredstev, ne pa se bahati pred nekom. Kakovost ne trpi. Metoda "na žicah" je v tem primeru precej učinkovita in upravičena. Utripanje vdelane programske opreme krmilnika je enkraten postopek, zato ga nima smisla pokrivati ​​z kamenčki. Če nameravate v prihodnosti spremeniti vdelano programsko opremo, ne da bi odstranili krmilnik iz vezja (v končnem izdelku), se to upošteva pri namestitvi med izdelavo naprave. Običajno je v ta namen nameščen konektor (RESET, SCK, MOSI, MISO, GND), MK pa lahko utripa tudi po namestitvi na ploščo. Ampak to so ustvarjalni užitki. Razmišljamo o najpreprostejšem primeru.

Zdaj pa preidimo na ATtiny44 MK. Tukaj je vse približno enako. Na podlagi risbe in fotografije tudi začetnik ne bo imel težav pri odkrivanju povezave. Tako kot ATtiny44 lahko povežete mikrokontrolerja ATtiny24 in ATtiny84 - dodelitve pinov za te tri so enake.


Drug primer začasne povezave krmilnika za njegovo programiranje je ATmega8. Tu je več zatičev, vendar je načelo enako - nekaj žic in zdaj je krmilnik pripravljen, da vanj "napolni" informacije. Dodatna črna žica na fotografiji, ki prihaja iz nožice 13, ne sodeluje pri programiranju. Namenjen je odstranitvi zvočnega signala iz njega, ko MK zapusti način programiranja. To je posledica dejstva, da je bil med odpravljanjem napak skripta za "Perpetuum M" program glasbene skrinjice prenesen v MK.


En krmilnik je pogosto na voljo v različnih ohišjih. V tem primeru se dodelitev zatičev za vsak primer porazdeli drugače. Če ohišje vašega krmilnika ni podobno prikazanemu na sliki, preverite namembnost pinov v tehnični dokumentaciji, ki jo lahko prenesete s spletne strani razvijalca MK.

Za popolno sliko si poglejmo povezavo MK mikrovezja z velikim številom "nog". Namen dodatne črne žice na fotografiji, ki prihaja iz nožice 15, je popolnoma enak kot v primeru ATmega8.


Verjetno ste že prepričani, da je vse povsem preprosto. Kdor ve, kako šteti nožice mikrovezja (od oznake v krogu v nasprotni smeri urinega kazalca), bo to ugotovil. In ne pozabite na natančnost. Mikrovezja ljubijo urejene ljudi in ne odpuščajo neprevidnega ravnanja.

Preden preidete na programski del, se prepričajte, da je gonilnik pretvornika USB-RS232TTL pravilno nameščen (preverite upravitelja naprav Windows). Zapomnite si ali zapišite številko navideznega COM porta, ki se prikaže, ko priključite pretvornik. To številko bo treba vnesti v besedilo skripte, o čemer lahko preberete spodaj.

4. Skript - programer za "Perpetuum M"

Ugotovili smo strojni del "programerja". To je že pol uspeha. Zdaj se je treba ukvarjati s programskim delom. Njegovo vlogo bo opravljal program Perpetuum M pod nadzorom skripte, ki izvaja vse potrebne funkcije za interakcijo z mikrokontrolerjem.

Arhiv s skriptom je treba razpakirati v isto mapo, kjer se nahaja program perpetuum.exe. V tem primeru, ko zaženete datoteko perpetuum.exe, se na zaslonu prikaže meni s seznamom nameščenih skriptov, med katerimi bo vrstica »AVR MK Programmer« (morda je edina). To je linija, ki jo potrebujemo.

Skripta se nahaja v mapi PMS v datoteki "MK Programmer AVR.pms". To datoteko si lahko ogledate, preučujete in po potrebi urejate v običajnem urejevalniku besedil, kot je Windows Notepad. Pred uporabo skripta boste najverjetneje morali spremeniti besedilo v zvezi z nastavitvami vrat. Če želite to narediti, preverite ime uporabljenih vrat v upravitelju naprav Windows in po potrebi ustrezno spremenite vrstico "PortName="COM4";" - namesto številke 4 je lahko druga številka. Tudi pri uporabi drugega modela pretvornika USB-RS232TTL boste morda morali spremeniti nastavitve inverzije signala (skriptne vrstice, ki se začnejo z besedo »High«). Inverzijo signalov s pretvornikom USB-RS232TTL lahko preverite z enim od primerov v navodilih za program Perpetuum M (razdelek funkcij za delo z vrati).

Podmapa MK_AVR vsebuje datoteke z opisi podprtih krmilnikov. Če krmilnika, ki ga potrebujete, ni med njimi, lahko po analogiji dodate tistega, ki ga potrebujete. Vzemite eno od datotek za vzorec in z urejevalnikom besedila vnesite potrebne podatke iz dokumentacije za vaš mikrokrmilnik. Glavna stvar je, da bodite previdni, vnesite podatke brez napak, sicer MK ne bo programiran ali pa bo programiran nepravilno. Originalna različica podpira 6 mikrokontrolerjev: ATtiny13, ATtiny24, ATtiny44, ATtiny84, ATmega8 in ATmega128. Skript izvaja samodejno prepoznavanje priključenega krmilnika - ni ga treba ročno določiti. Če prebranega identifikatorja iz MK ni med razpoložljivimi opisi, se izpiše sporočilo, da krmilnika ni bilo mogoče prepoznati.

Arhiv s skriptom vsebuje tudi dodatne informacije. Mapa AVR controller inc files vsebuje zelo uporabno in obsežno zbirko datotek z definicijami krmilnikov. Te datoteke se uporabljajo pri pisanju lastnih programov za MK. Še štiri mape "MusicBox_..." vsebujejo datoteke s programom v jeziku Assembly in vdelano programsko opremo, pripravljeno za prenos v MK ločeno za ATtiny13, ATtiny44, ATmega8 in ATmega128. Če ste že povezali enega od teh MK za programiranje, kot je predlagano v tem članku, ga lahko takoj utripate - dobili boste glasbeno skrinjico. Več o tem spodaj.

Ko v meniju skript izberete vrstico "MK AVR Programmer", se skript začne izvajati. Hkrati odpre vrata, pošlje MK ukaz za preklop v programski način, od MK prejme potrditev o uspešnem prehodu, zahteva identifikator MK in med razpoložljivimi poišče opis tega MK po njegovem identifikatorju. datoteke z opisi. Če zahtevanega opisa ne najde, prikaže ustrezno sporočilo. Če najdete opis, se odpre glavni meni programerja. Posnetek zaslona si lahko ogledate na sliki 8. Nadaljnje razumevanje ni težko – meni je zelo preprost.

V prvi različici skripta nekatere funkcije polnega programerja niso implementirane. Na primer, ni načina za branje in pisanje v EEPROM. Če pa skript odprete v urejevalniku besedil, boste videli, da je zelo majhen, kljub dejstvu, da je glavna stvar v njem že implementirana. To nakazuje, da dodajanje manjkajočih funkcij ni tako težko - jezik je zelo prilagodljiv, omogoča vam implementacijo bogate funkcionalnosti v majhnem programu. Toda v večini primerov zadostujejo že obstoječe funkcije.

Nekatere omejitve funkcionalnosti so opisane neposredno v besedilu skripta:
//implementirano snemanje samo z ničelnega naslova (zapis naslova razširjenega segmenta je prezrt, tudi LOAD OFFSET)
//vrstni red in kontinuiteta zapisov v HEX datoteki nista preverjena
//kontrolna vsota ni preverjena
To velja za delo s HEX datoteko, iz katere je vzeta koda vdelane programske opreme za MK. Če ta datoteka ni poškodovana, preverjanje kontrolne vsote ne bo imelo učinka. Če je popačen, ga s skriptom ne bo mogoče zaznati. V večini primerov preostale omejitve ne bodo škodile, vendar jih morate vseeno upoštevati.

5. Glasbena skrinjica - preprosta obrt za začetnike

Če imate enega od teh mikrokontrolerjev: ATtiny13, ATtiny44, ATmega8 ali ATmega128, ga lahko preprosto spremenite v glasbeno skrinjico ali glasbeno kartico. Če želite to narediti, je dovolj, da v MK zapišete ustrezno strojno programsko opremo - eno od tistih štirih, ki se nahajajo v mapah "MusicBox_..." v istem arhivu s skriptom. Kode vdelane programske opreme so shranjene v datotekah s pripono ".hex". Uporaba ATmega128 za takšno plovilo je seveda "mastna", tako kot ATmega8. Toda to je lahko koristno za testiranje ali eksperimentiranje, z drugimi besedami, za izobraževalne namene. Priložena so tudi besedila programov v Assemblerju. Programi niso bili ustvarjeni iz nič - za osnovo je bil vzet program glasbene skrinjice iz knjige A. V. Belova "Mikrokontrolerji AVR v amaterski radijski praksi". Prvotni program je bil deležen številnih pomembnih sprememb:
1. prilagojeno za vsakega od štirih MK: ATtiny13, ATtiny44, ATmega8 in ATmega128
2. gumbi so odstranjeni - na krmilnik ni treba priklopiti ničesar razen napajanja in oddajnika zvoka (melodije se predvajajo ena za drugo v neskončni zanki)
3. trajanje vsake note se zmanjša za trajanje premora med notami, da se odpravijo motnje v glasbenem ritmu
4. osma melodija je vezana, v knjižni različici ni uporabljena
5. subjektivno: nekaj "izboljšav" za optimizacijo in lažje razumevanje algoritma

V nekaterih melodijah je mogoče slišati laž in celo hude napake, zlasti v "Smile" - na sredini. Kode zvonjenja so bile vzete iz knjige (ali bolje rečeno, prenesene s spletnega mesta avtorja knjige skupaj z izvirno datoteko asm) in niso bile spremenjene. Očitno so napake v kodiranju melodij. Ampak to ni problem - kdor je "prijazen" z glasbo, lahko zlahka ugotovi in ​​vse popravi.

V ATtiny13 je bilo treba zaradi pomanjkanja 16-bitnega števca za reprodukcijo zapiskov uporabiti 8-bitni števec, kar je povzročilo rahlo zmanjšanje natančnosti zapiskov. Toda to je na uho komaj opazno.

O konfiguracijskih delih. Njihove nastavitve morajo ustrezati stanju novega mikrokontrolerja. Če je bil vaš MK že nekje uporabljen, morate preveriti stanje njegovih konfiguracijskih bitov in jih po potrebi uskladiti z nastavitvami novega mikrokrmilnika. Stanje konfiguracijskih bitov novega mikrokrmilnika lahko ugotovite iz dokumentacije za ta MK (razdelek "Biti varovalk"). Izjema je ATmega128. Ta MCU ima bit M103C, ki omogoča način združljivosti s starejšim ATmega103. Aktivacija bita M103C močno zmanjša zmogljivosti ATmega128 in ta bit je aktiven na novem MK. M103C morate ponastaviti v neaktivno stanje. Za manipulacijo konfiguracijskih bitov uporabite ustrezen razdelek menija skripta programerja.

Nima smisla navajati diagrama glasbene skrinjice: vsebuje le mikrokrmilnik, napajalnik in piezozvočni oddajnik. Napajanje se napaja na popolnoma enak način, kot smo to storili pri programiranju MK. Oddajnik zvoka je povezan med skupno žico (GND pin krmilnika) in enim od MK pinov, katerega številko najdete v datoteki s programsko kodo (*.asm). Na začetku besedila programa za vsak MK v komentarjih je vrstica: "zvočni signal se ustvari na zatiču XX." Ko je skript programatorja končan, mikrokrmilnik zapusti način programiranja in preide v normalno delovanje. Predvajanje melodij se začne takoj. To lahko preverite s priključitvijo oddajnika zvoka. Oddajnik zvoka lahko med programiranjem kristala pustite priključen le, če je zvok vzet iz zatiča, ki se ne uporablja v SPI, sicer lahko dodatna kapacitivnost na zatiču moti programiranje.