Postupak programiranja avr mikrokontrolera. Savjeti za programere mikrokontrolera početnike. Potreban skup programa

Dakle, riješili smo rad kernela u vezi s prijelazima i adresiranjem. Vrijeme je da pozornost usmjerimo na još jedno područje – pamćenje.

Postoje dvije vrste (EEPROM se ne računa jer je općenito periferni, ali o tome kasnije):

  • RAM - RAM
  • ROM - ROM, aka flash, aka programska memorija

Kako je naša arhitektura harvardska, operativa ima svoje adresiranje, a flash svoje. U podatkovnoj tablici možete vidjeti strukturu adresiranja RAM-a.

Odmah obratite pažnju na adrese! RON i periferni registri, kao i RAM nalaze se u istom adresnom prostoru. Oni. adrese od 0000 do 001F zauzimaju naše registre, zatim do adrese 005F nalaze se I/O ćelije – portovi. Kroz portove se konfigurira sve što se nalazi na ploči kontrolera. I tek tada, s adrese 0060 dolazi naš RAM, koji možemo koristiti za namjeravanu svrhu.

Štoviše, imajte na umu da I/O registri također imaju vlastito adresiranje - adresni prostor I/O registara (od 00 do 3F), naznačeno je na lijevoj strani slike. IO/Register Block Ovo adresiranje radi SAMO u OUT i IN instrukcijama. To dovodi do zanimljive značajke.

Perifernim registrima može se pristupiti na dva različita načina:

  • Putem IN/OUT naredbi na kratkoj adresi u I/O adresnom prostoru
  • Kroz grupu naredbi LOAD/STORE na punu adresu u RAM adresnom prostoru

Primjer. Uzmimo ulazni registar asinkronog primopredajnika UDR; on ima adresu 0x0C (0x2C); adresa u općem adresnom prostoru navedena je u zagradama.

LDI R18.10; U registar R18 učitali smo broj 10. Upravo tako OUT UDR,R18 ; Deduciran na prvi način, sam kompilator; Zamjenjuje vrijednost 0x0C umjesto UDR STS 0x2C,R18 ; Izveli su me drugim putem. Putem naredbe Store; Izravnim unosom adrese.

Obje metode daju identične rezultate. ALI! Oni koji rade adresiranjem u ulazno/izlaznom prostoru (OUT/IN) dva su bajta kraći. To je razumljivo - ne trebaju pohranjivati ​​dvobajtnu adresu proizvoljne memorijske ćelije, a kratka adresa ulazno-izlaznog prostora uklapa se u dvobajtni kod instrukcije.

Istina, ima tu još jedna šala. Činjenica je da se svake godine pojavljuje sve više kamenčića iz AVR-a i u njima ima sve više mesa. A svako pucketanje treba svoje periferne I/O registre. I sada smo došli do zaključka da ATMega88 (koji je zamijenio Mega8) već ima toliko perifernih uređaja da se njegovi I/O registri više ne uklapaju u ograničenje 3F adresnog prostora.

Ups, stigli su. I tu počinju izražavati zbunjenost oni koji prelaze sa starih kamenja na nove - zašto naredbe OUT/IN rade na nekim perifernim registrima, a na drugima ne?

I jednostavno je - nije bilo dovoljno bitnog kapaciteta.

Ali jezgra je jedna, ne može se više prepraviti. I tu su ATMEL-ovci postupili lukavo - uveli su takozvane memorijsko mapirane registre. Oni. svi oni registri koji nisu ušli u 3F limit sada su dostupni samo na jedan način - kroz Load/Store.

Koja šala. Ako otvorite neki m88def.inc, tada možete vidjeti koji su od I/O registara "ispravni", a koji su memorijski mapirani.

Bit će nešto poput ovoga:

; ***** DEFINICIJE I/O REGISTRA **************************************** ******** * ; BILJEŠKA: ; Definicije označene s "MEMORY MAPPED" su prošireni I/O portovi; i ne može se koristiti s IN/OUT instrukcijama .equ UDR0 = 0xc6 ; MEMORIJA MAPIRANA .equ UBRR0L = 0xc4 ; MEMORIJA MAPIRANA .equ UBRR0H = 0xc5 ; MEMORIJA MAPIRANA .equ UCSR0C = 0xc2 ; MEMORIJA MAPIRANA .equ UCSR0B = 0xc1 ; MEMORIJA MAPIRANA .equ UCSR0A = 0xc0 ; MAPIRANJE MEMORIJE bla bla bla, i još mnogo toga.equ OSCCAL = 0x66 ; MAPIRANJE MEMORIJE .equ PRR = 0x64 ; MAPIRANJE MEMORIJE .equ CLKPR = 0x61 ; MAPIRANJE MEMORIJE .equ WDTCSR = 0x60 ; MEMORIJA MAPIRANA .equ SREG = 0x3f ;<------ А тут пошли обычные.equ SPL = 0x3d .equ SPH = 0x3e .equ SPMCSR = 0x37 .equ MCUCR = 0x35 .equ MCUSR = 0x34 .equ SMCR = 0x33 .equ ACSR = 0x30

Ovo su pite.

I u ovom polju shvaćate da veliki krzneni organ leti prema kompatibilnosti s više modela sklopovskog koda s ciljem da ga čvrsto prekrije. Uostalom, jedno je ispravljati kojekakve makro definicije i definicije koje opisuju registre, a drugo sjediti i poput Pepeljuge odvajati prave portove od pogrešnih.

Međutim, postoji rješenje. Makrojezik! Ne sviđa vam se komandni sustav? Napravite svoje uz blackjack i kurve!
Izgradimo vlastiti tim UOUT, poput univerzalnog OUT-a

Slično za naredbu IN. Općenito, s takvim makronaredbama možete VRLO uvelike diverzificirati asembler, pretvarajući ga u moćan programski jezik koji može raskomadati sve vrste C-a i Pascala kao krpu.

Pa o čemu ja pričam...o RAM-u.

Dakle, riješili smo adresiranje. Sada znate gdje tražiti memorijske adrese na kojima počinju korisničke RAM ćelije - u podatkovnoj tablici, odjeljak Mapa memorije. Ali postoji za referencu da znam.

A u našem kodu RAM počinje s direktivom.DSEG Sjećate li se našeg predloška?

Uključi "m16def.inc" ; Koristimo ATMega16 ;= Start macro.inc ================================ ; Makronaredbe ovdje;= Kraj macro.inc =================================== ; RAM =================================================== ============ .DSEG ; RAM segment; FLASH =================================================== ========== .CSEG ; Segment koda; EEPROM =================================================== ======== .ESEG ; EEPROM segment

Nakon .DSEG možemo postaviti naše varijable. A ovdje jednostavno imamo nalet stanica - zauzmite bilo koju. Unesite adresu i budite sretni. Ali zašto brojati adrese ručno? Neka kompilator ovdje razmisli.

Stoga ćemo uzeti i postaviti oznaku

0x0060 ## ;Varijable 0x0061 ## 0x0062 ## 0x0063 ## ;Varijable2 0x0064 ## 0x0065 ## ;Varijable4 mogu početi ovdje

Kao ## bilo koji bajt. Prema zadanim postavkama FF. Naravno, o bilo kakvom upisivanju varijabli, inicijalnoj inicijalizaciji, kontroli preljeva i ostalim buržoaskim radostima, ne treba ni govoriti. Ovo je Sparta! Mislim, asembler. Sve ručno.
Ako povučemo analogiju s C-om, onda je to kao da radimo s memorijom samo kroz void pokazivače. Šišnici će razumjeti. Oni će shvatiti i biti užasnuti. Jer ovaj svijet je okrutan i podmukao. Malo sam pogrešno izračunao indeks i izgubio druge podatke. I dovraga, uhvatit ćete ovu pogrešku ako se odmah ne pojavi.

Dakle pažnja, pažnja i opet pažnja. Sve memorijske operacije izvodimo kroz praćenje i ništa neće uspjeti ili se preliti.

.ORG direktiva također radi u podatkovnom segmentu, i to na potpuno isti način - prenosi adrese, u ovom slučaju oznake, odavde do kraja memorije. Samo jedna suptilnost - ORG 0000 će nam dati sam početak RAM-a, a to su R0 i drugi registri. A nula kilometara RAM-a koristeći Mega16 kao primjer dat će ORG 0x0060. I u drugim kontrolerima postoji neka druga vrijednost. Lijeno je svaki put prolaziti kroz podatkovnu tablicu, tako da postoji takva makro definicija kao SRAM_START, koja označava početak RAM-a za određeni MK.

Dakle, ako želimo da početak RAM-a, recimo 100 bajtova, ostane pod nekom vrstom međuspremnika za smeće, onda ćemo napraviti ovaj trik.

1 2 3 4 .DSEG .ORG SRAM_START+100 varijabli: .bajt 3

DSEG .ORG SRAM_START+100 varijabli: .bajt 3

Gotovo, očistili smo tampon zonu od početka do 100.

U redu, riješili smo adresiranje. Kako raditi s memorijskim ćelijama? I za te svrhe postoje dvije skupine naredbi. LOAD i STORE su najveća skupina naredbi.

Činjenica je da se ništa ne može učiniti s RAM ćelijom osim učitavanja bajta u nju iz RON-a ili pražnjenja bajta iz nje u RON.

Naredbe Store (ST**) zapisuju se u RAM, a naredbe Load (LD**) se čitaju.

Čitanje ide u registar R16…R31, a adresa ćelije navedena je ili izravno u naredbi. Evo jednostavnog primjera. Postoji trobajtna varijabla Variables, mora se povećati za 1. To je. izvrši operaciju Variables++

Varijable DSEG: .byte 3 Variables2: .byte 1 .CSEG ; Varijabla je u memoriji; prvo je morate dobiti. LDS R16, Varijable ; Pročitajte prvi bajt varijabli u R16 LDS R17, varijable+1 ; Pročitajte drugi bajt varijabli u R17 LDS R18, varijable+2 ; Pa, treći bajt u R18; Sada mu dodajmo 1, jer AVR ne može dodati samo s konstantom; oduzeti, morate iskriviti. Međutim, to ne uzrokuje posebne probleme. SUBI R16,(-1) ; općenito, SUBI je oduzimanje, ali -(- daje + SBCI R17,(-1) ; I ovdje se prijenos uzima u obzir. Ali više o tome kasnije. SBCI R18,(-1) ; Matematika u asembleru je drugačija priča STS varijable, R16; Sačuvajte sve kako je bilo. STS varijable+1,R17 STS varijable+2,R18

Ili možete koristiti drugu metodu. Neizravni zapis preko indeksnog registra.

Varijable DSEG: .byte 3 Variables2: .byte 1 .CSEG ; Uzmite adresu naše varijable LDI YL,low(Varijable) LDI YH,High(Varijable) ; Varijabla je u memoriji; prvo je morate dobiti. LD R16, Y+; Pročitajte prvi bajt varijabli u R16 LD R17, Y+ ; Pročitajte drugi bajt varijabli u R17 LD R18, Y+ ; Pa, treći bajt u R18; Sada mu dodajmo 1, jer AVR ne može dodati samo s konstantom; oduzeti, morate iskriviti. Međutim, to ne uzrokuje posebne probleme. SUBI R16,(-1) ; zapravo SUBI je oduzimanje, ali -(- daje + SBCI R17,(-1) ; I ovdje je prijenos uzet u obzir. Ali više o tome kasnije. SBCI R18,(-1) ; Matematika u asembleru je druga priča ST -Y,R18 ; Zadržavamo sve kako je bilo. ST -Y,R17 ; Ali obrnutim redoslijedom ST -Y,R16

Ovdje se već koriste operacije s postinkrementom i preddekrementom. U prvom prvo čitamo, pa adresi dodajemo 1. U drugom prvo oduzimamo 1 od adrese, a zatim spremamo.

Pogodno je koristiti takve inkrementalne naredbe za ponavljanje nizova u memoriji ili tablicama.
A tu je i neizravno relativno pisanje/čitanje LDD/STD i druge opcije za sve tri vrste indeksa (X,Y,Z). Općenito, popušite podatkovnu tablicu i sustav naredbi.

Stog
Oh, stog je super stvar. Ono što mi se sviđa kod njega je to što poremećaj stoga pretvara radni program u potpuni nered. Zato što operacije snopa zahtijevaju povećanu pozornost, jer ako je snop negdje pokvaren i ne možete ga odmah pratiti, uhvatit ćete ga kasnije... Općenito, to je ljepota, a ne gizmo.

Zašto te volim? Pa, ako je C glupa vještina, brza i učinkovita, onda je Montaža filigranska umjetnost. Kako manijaci poput Jima zakivaju remek-djela od papira i samo od papira, iako se čini da možete kupiti gotovu montažnu maketu i zalijepiti za vlastiti užitak. Tako je i ovdje - sam proces je porazan. Uključujući i gnjavažu otklanjanja pogrešaka :))))

Dakle, o hrpi. Što je? A ovo je područje memorije. Radi na principu hrpe. Oni. Zadnju koju je spustio, uzeo je prvu.

Stog ima pokazivač koji pokazuje na vrh stoga. Za pokazivač steka odgovoran je poseban registar SP, odnosno to je par registara SPL i SPH. Ali u mikrokontrolerima s malom količinom RAM-a, na primjer u Tini2313, postoji samo SPL

Kada se kontroler pokrene, obično prva stvar koju rade je inicijalizirati stog, upisujući u SP adresu njegovog dna, odakle će rasti. Obično je to kraj RAM-a, a on raste prema početku.

To se radi ovako, na samom početku programa:

1 2 3 4 5 LDI R16,Niski(RAMEND) IZLAZ SPL,R16 LDI R16,Visoki(RAMEND) IZLAZ SPH,R16

LDI R16,Niski(RAMEND) IZLAZ SPL,R16 LDI R16,Visoki(RAMEND) IZLAZ SPH,R16

Gdje je RAMEND makro definicija koja označava kraj RAM-a u trenutnom MK-u.

To je to, hrpa je spremna za rad. Podaci se guraju na stog pomoću naredbe PUSH Rn i dohvaćaju putem POP Rn.
Rn je bilo koji od RON.

Naredbe CALL, RCALL, ICALL, RET, RETI i pozivanje prekida također rade sa stogom, ali o tome kasnije.

Igrajmo se sa snopom da osjetimo kako radi, da shvatimo kako i gdje se kreće.

Unesite sljedeći kod u studio:

CSEG; LDI segment koda R16, Niski (RAMEND) ; Inicijalizacija stoga OUT SPL,R16 LDI R16,High(RAMEND) OUT SPH,R16 LDI R17,0 ; Vrijednosti učitavanja 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 ; Stavljamo vrijednosti na stog PUSH R18 PUSH R19 PUSH R20 PUSH R21 PUSH R22 PUSH R23 PUSH R24 PUSH R25 PUSH R26 POP R0 ; Izbacivanje vrijednosti iz hrpe POP R1 POP R2 POP R3 POP R4 POP R5 POP R6 POP R7 POP R8 POP R9

Sada pokrenite studio korak po korak i gledajte kako se SP mijenja. Stack Pointer se može vidjeti u studiju na istom mjestu gdje se nalazi Program Counter.

Prvo inicijaliziramo stog i učitavamo podatke u registre. Rezultat će biti sljedeća slika:

Zatim, koristeći naredbu POP, dohvaćamo podatke sa stoga. Napominjemo da nam nije važno gdje stavljamo podatke na stog i gdje ih učitavamo. Glavna stvar je redoslijed instalacije! Stavili smo ga iz viših registara, a dobit ćemo ga u niže. Ovo će povećati pokazivač stoga.

PUSH R16 PUSH R17 POP R16 POP R17

Na primjer, već sam govorio o ograničenju nižih RON-ova - oni vam ne dopuštaju da upišete broj izravno u sebe. Samo kroz matične knjige starije grupe. Ali ovo je nezgodno!

Problem se rješava pomoću makronaredbe. Nazvao sam ga LDIL - LDI low

MAKRO LDIL PUSH R17; Spremimo vrijednost jednog od viših registara na stog. LDI R17,1; Učitajmo našu neposrednu vrijednost MOV @0,R17 u nju; Prenesimo vrijednost u registar niske skupine. POP R17; Vratimo vrijednost najvišeg registra sa steka. .ENDM

Sada možete jednostavno koristiti našu domaću naredbu.

1 LDIL R0,18

S vremenom datoteka s makronaredbama dobiva takve domaće naredbe i rad postaje lak i ugodan.

Pogreške snopa
Stog raste prema podacima, a sada zamislite da imamo State varijablu u memoriji i ona se nalazi na adresi npr. 0x0450. Opasno blizu vrhu hrpe. Varijabla pohranjuje npr. stanje konačnog automata o kojem ovisi daljnja logika programa. Recimo, ako ima 3, onda idemo raditi jednu stvar, ako ima 4 onda nešto drugo, ako ima 5 onda nešto drugo i tako dalje do 255 stanja. I po logici rada, nakon 3 bi trebalo biti 4re, ali ne 10

A onda je bilo 3. I onda, u jednom užasnom trenutku, uvjeti su se toliko poklopili da je hrpa narasla i njen vrh dosegao ovu varijablu, unoseći tamo vrijednost, recimo 20, a onda je hrt pao natrag. Ostavljanje blata iza sebe klasičan je primjer prelijevanja stoga. I logika programa se zbog toga potpuno urušila.

Ili suprotan primjer - stog je gurnut do varijabli, ali su u tom trenutku varijable ažurirane i prebrisale podatke stoga. Kao rezultat toga, nešto pogrešno uklonjeno je sa stoga (obično krive povratne adrese) i program se srušio. Ova je opcija, usput, mnogo bezopasnija, jer... u ovom slučaju se dovratnik vidi odmah i ne iskače NAGLO nakon bogzna koliko vremena.

Štoviše, ova se pogreška može pojaviti i nestati. Ovisno o tome kako program radi i koliko duboko učitava stog. Međutim, takav problem je češći kada pišete u C-u, gdje ne možete vidjeti koliko se aktivno odvija rad sa stogom. Na ASMA je sve puno transparentnije. A ovdje se to može dogoditi zbog iskreno krivog algoritma.

Asembleri se često susreću s drugim pogreškama snopa. Prije svega zaboravnost. Stavio sam nešto i zaboravio to izvaditi. Ako je problem bio u potprogramu ili prekidu, tada je povratna adresa iskrivljena (više o tome malo kasnije), stog je otrgnut i program se trenutno urušava. Ili nepažnja - spremio sam podatke jednim redoslijedom, a dohvatio ih drugim. Ups, sadržaji registara su razmijenjeni.

Da biste izbjegli takve pogreške, morate, prije svega, pratiti stog, a drugo, pravilno planirati smještaj varijabli u memoriji. Držanje najkritičnijih područja i varijabli (kao što su strojevi stanja ili programske logičke zastavice) dalje od vrha stoga, bliže početku memorije.

Neki će ljudi misliti da mogu uzeti hrpu i smjestiti je ne na sam kraj RAM-a, već negdje bliže, ostavljajući iza sebe džep za kritične podatke. Nije baš dobra ideja. Činjenica je da se stog može gurnuti i prema dolje pomoću naredbe PUSH i prema gore pomoću naredbi POP. Drugo, iako se događa puno rjeđe, jer... Ovo je više grijeh krivih ruku nego glomazan algoritam, ali događa se i to.
Ali glavna stvar je da je sam stog vrlo važna struktura. Cijeli mehanizam potprograma i funkcija počiva na njemu. Dakle, neuspjeh steka je hitan slučaj u svakom slučaju.

Stack perverzije
Moja omiljena tema. =)))) Unatoč činjenici da se sam pokazivač steka izračunava tijekom naredbi PUSH i POP, nitko nas ne sprječava da ga izaberemo iz SP-a i koristimo njegove vrijednosti za ručno izračunavanje adrese podataka koji leže na stog. Ili ispravite podatke o skupu kako želimo.
Za što? Pa, možete pronaći puno primjena ako napregnete mozak i počnete razmišljati izvan okvira :))))

Osim toga, parametri se prosljeđuju kroz stog u klasičnom C i Pascalu na x86 arhitekturi i lokalne varijable rade. Oni. Prije poziva funkcije prvo se sve varijable guraju na stog, a zatim se nakon poziva funkcije bajtovi budućih lokalnih varijabli guraju na stog.

Zatim, koristeći SP kao referentnu točku, možemo tretirati ove varijable kako želimo. A kada se stog oslobodi naredbom POP, oni se poništavaju, oslobađajući memoriju.

U AVR-u je sve nešto drugačije (očigledno zbog male količine memorije, gdje se zapravo ne možete gurati u stog, ali ima puno RON-a), ali također možete pokušati koristiti ovaj mehanizam.

Istina, ovo već sliči na neurokirurgiju. Malo sam pogriješio i pacijent je mrtav.

Zahvaljujući stogu i RAM-u, možete se snaći sa samo dva ili tri registra, bez puno stresa zbog njihovog nedostatka.

Brza memorija

EEPROM memorija je mala, svega nekoliko bajtova, a ponekad je potrebno spremiti puno podataka, na primjer, poruku vanzemaljcima ili tablicu sinusa, kako ne biste gubili vrijeme na izračunavanje. Nikad se ne zna što treba unaprijed pohraniti u memoriju. Stoga se podaci mogu pohraniti u programsku memoriju, u istim kilobajtima flasha koje kontroler ima na ploči.

Zapisat ćemo to, ali kako to dobiti? Da biste to učinili, prvo morate tamo nešto staviti.
Stoga na kraju programa, unutar .CSEG segmenta, dodajte labelu, npr. data, a nakon nje, koristeći .db operator, unesite svoje podatke.

DB operator znači da koristimo bajt za svaku konstantu. Također postoje operatori koji specificiraju dvobajtne konstante DW (kao i DD i DQ).

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

podaci: .db 12,34,45,23

Sada, oznaka podataka pokazuje na adresu prvog bajta niza, preostali bajtovi se nalaze po pomaku, jednostavno dodavanjem jedan adresi.

Jedna suptilnost je da kompajler zamjenjuje adresu oznake i smatra je adresom skoka za programski brojač. I on se, ako se sjećate, obraća dvobajtnim riječima - uostalom, duljina naredbe može biti 2 ili 4 bajta.

A naši podaci su bajt po bajt i kada im pristupa, kontroler ih također adresira bajt po bajt. Adresa u riječima dvostruko je manja od adrese u bajtovima i to treba uzeti u obzir pri množenju adrese s dva.

Za učitavanje podataka iz programske memorije koristite naredbu iz grupe Load Program Memory

Na primjer, LPM Rn,Z

U registar Rn upisuje broj iz ćelije na koju pokazuje par registara Z. Podsjećam da su Z dva registra, R30 (ZL) i R31 (ZH). Niži bajt adrese upisuje se u R30, a visoki bajt u R31.

U kodu to izgleda ovako:

LDI ZL,low(podaci*2) ; U registarski par Z LDI ZH,high(data*2) unosimo niži bajt adrese; U registarski par Z upisujemo visoki bajt adrese; množenje s dva je zbog činjenice da je adresa navedena u; u dvobajtnim riječima, ali trebamo ih u bajtovima. ; Stoga množimo s dva; Nakon učitavanja adrese, možete učitati broj iz memorije LPM R16, Z; u registru R16 iza ove naredbe će biti broj 12, ; preuzeti iz memorije programa. ; negdje na kraju programa, ali u segmentu podataka .CSEG: .db 12,34,45,23

Sada kada smo već upoznati s nekim mogućnostima i funkcijama mikrokontrolera, nameće se logično pitanje: što je potrebno za programiranje mikrokontrolera? Koji programi i uređaji su potrebni i gdje ih mogu nabaviti?


Da bi mikrokontroler mogao rješavati probleme i obavljati određene funkcije, potrebno ga je programirati, odnosno u njega upisati program ili programski kod.

Struktura i redoslijed pisanja programa

Prije svega, prije nego počnete pisati bilo koji program, odnosno programski kod, trebali biste jasno razumjeti koje će funkcije mikrokontroler obavljati. Stoga prvo trebate odrediti krajnji cilj programa. Kada je definiran i potpuno shvaćen, tada se sastavlja algoritam za program. Algoritam je slijed izvršavanja naredbi. Korištenje algoritama omogućuje vam jasnije strukturiranje procesa pisanja koda, a pri pisanju složenih programa često vam omogućuje smanjenje vremena utrošenog na njihov razvoj i uklanjanje pogrešaka.

Sljedeći korak nakon kompajliranja algoritma je izravno pisanje programskog koda. Programi za mikrokontrolere napisani su na jeziku Si ili asembler . Samo Assembly je više skup instrukcija nego programski jezik i jezik je niske razine.


Programe ćemo pisati u C-u, koji je jezik visoke razine. Programi u C-u pišu se puno brže u usporedbi sa sličnim programima u Assemblyju. Osim toga, svi složeni programi napisani su prvenstveno u C-u.

Ovdje nećemo uspoređivati ​​prednosti i nedostatke pisanja programa u Assembly i C. S vremenom, stekavši određeno iskustvo u programiranju MK, izvući ćete korisne zaključke za sebe.

Sam programski kod može se napisati u bilo kojem standardnom uređivaču teksta, na primjer, Notepad. Međutim, u praksi koriste prikladnije urednike, o čemu će biti riječi u nastavku.

Sastavljanje programa

C kod koji smo napisali još nije razumljiv mikrokontroleru, budući da MK razumije naredbe samo u binarnom (ili heksadecimalnom) sustavu, koji je skup nula i jedinica. Stoga C kod treba pretvoriti u nule i jedinice. U tu svrhu koristi se poseban program tzv sastavljač, i sam proces transformacija koda naziva se kompilacija.

Da biste bljeskali MK firmware, uređaj je pozvan programer. Ovisno o vrsti programatora, njegov ulaz je spojen na COM ili USB priključak, a izlaz na određene pinove mikrokontrolera.


Postoji širok izbor programatora i razvojnih ploča, ali mi smo sasvim zadovoljni onim najjednostavnijim programer, koji u Kini ne košta više od 3 dolara.


Nakon što se mikrokontroler bljesne, program se otklanja i testira na stvarnom uređaju ili, kako se također kaže, na hardveru.

Sada rezimiramo korake programiranja mikrokontrolera.


Kada pišete jednostavne programe, možete bez druge točke, tj. bez sastavljanja algoritma na papiru, dovoljno ga je držati u glavi.

Treba napomenuti da se ispravljanje pogrešaka i testiranje programa također provodi prije treptanja MK firmware-a.

Potreban skup programa

Postoji mnogo korisnih i praktičnih programa za programiranje MK. Oni su i plaćeni i besplatni. Među njima su tri glavna:

1) Atmel Studio

2) CodeVisionAVR

3) WinAVR

Svi ovi programi povezani su s IDEja integriran D razvoj E nvironment – ​​integrirano razvojno okruženje. U njih možete pisati kod, kompajlirati ga i ispravljati pogreške.

Treba obratiti pozornost na Code Vision AVR. Ovaj IDE čini pisanje koda lakšim i bržim. Međutim, program se plaća.

U početnoj fazi programiranja bolje je sve programe pisati ručno, bez ikakvih pojednostavljenja. To će vam pomoći da brzo steknete potrebne vještine, au budućnosti ćete moći dobro razumjeti i uređivati ​​kodove koje je napisao netko drugi kako bi odgovarali vašim potrebama. Stoga preporučujem korištenje Atmel Studio. Prvo, potpuno je besplatan i stalno se ažurira, a drugo, razvila ga je tvrtka koja proizvodi mikrokontrolere na kojima ćemo učiti programirati.

Otklanjanje pogrešaka firmvera i programa

Mikrokontrolere ćemo flashati pomoću dodatnog programa.

Ako mikrokontroler nije dostupan, tada se njegov rad može emulirati pomoću programa. To uvelike pojednostavljuje proces otklanjanja pogrešaka u programu čak i ako imate mikrokontroler, tako da ga ne morate često ponovno flashati, jer svaki mikrokontroler ima konačan broj prepisivanja, iako je taj broj prilično velik.

Prilikom treptanja i otklanjanja pogrešaka MK-a, prikladno ga je postaviti na matičnu ploču, ali to uopće nije potrebno. Stoga je za veću udobnost korisna i matična ploča. Veliki je izbor breadboarda, ali preporučam da uzmete onaj koji ima što više rupa. Jednom kada počnemo spajati zaslone sa sedam segmenata, počet ćete cijeniti prednosti većih matičnih ploča.

Drugi važan element koji će nam biti od koristi je tehnička dokumentacija za MK, tzv podatkovna tablica. Općenito, trebate preuzeti podatkovna tablica za ATmega8 mikrokontroler.

Kiselev Roman, svibanj 2007 Članak ažuriran 26. svibnja 2014

Dakle, što je mikrokontroler (u daljnjem tekstu MK)? Ovo je, relativno govoreći, malo računalo smješteno u jednom integriranom krugu. Ima procesor (aritmetičko-logičku jedinicu ili ALU), flash memoriju, EEPROM memoriju, mnoge registre, I/O portove, kao i dodatna zvona i zviždaljke kao što su mjerači vremena, brojači, komparatori, USART-ovi itd. Nakon što se uključi napajanje , mikrokontroler se podiže i počinje izvršavati program pohranjen u njegovoj flash memoriji. Istodobno, može kontrolirati veliki izbor vanjskih uređaja putem I/O priključaka.

Što to znači? To znači da u MK možete implementirati bilo koji logički sklop koji će obavljati određene funkcije. To znači da je MK mikro krug, čiji unutarnji sadržaj, zapravo, sami stvaramo. To omogućuje, kupnjom nekoliko potpuno identičnih MK-ova, sastavljanje potpuno različitih sklopova i uređaja na njima. Ako želite napraviti bilo kakve promjene u radu elektroničkog uređaja, nećete morati koristiti lemilo, samo ćete morati reprogramirati MK. U ovom slučaju, ne morate ga čak ni uklanjati sa svog uređaja ako koristite AVR, budući da ovi MK podržavaju programiranje unutar kruga. Dakle, mikrokontroleri premošćuju jaz između programiranja i elektronike.

AVR su 8-bitni mikrokontroleri, tj. njihov ALU može izvoditi jednostavne operacije sa samo 8-bitnim brojevima u jednom taktu. Sada je vrijeme da razgovaramo o tome koji MK ćemo koristiti. Radim s ATMega16 MK. Vrlo je uobičajen i može se kupiti u gotovo svakoj trgovini radio dijelova za oko 100 rubalja. Ako ga ne pronađete, možete kupiti bilo koji drugi MK serije MEGA, ali u ovom slučaju morat ćete potražiti dokumentaciju za to, budući da iste "noge" različitih MK mogu obavljati različite funkcije, a po povezivanjem, čini se, Ako su svi zaključci točni, možda ćete dobiti uređaj koji radi, ili možda samo oblak smrdljivog dima. Pri kupnji ATMega16 vodite računa da dolazi u velikom 40-pinskom DIP pakiranju, a uz to kupite i utičnicu za njega u koju se može umetnuti. Za rad s njim trebat će vam i dodatni uređaji: LED diode, gumbi, priključci itd.

ATMega16 ima vrlo velik broj različitih funkcija. Evo nekih njegovih karakteristika:

  • Maksimalna frekvencija takta – 16 MHz (8 MHz za ATMega16L)
  • Većina naredbi se izvršava u jednom taktu
  • 32 8-bitna radna registra
  • 4 puna 8-bitna I/O porta
  • dva 8-bitna mjerača vremena/brojača i jedan 16-bitni
  • 10-bitni analogno-digitalni pretvarač (ADC)
  • interni generator takta na 1 MHz
  • analogni komparator
  • sučelja SPI, I2C, TWI, RS-232, JTAG
  • programiranje unutar kruga i samoprogramiranje
  • modul širine impulsa (PWM).

Potpune karakteristike ovog uređaja, kao i upute za njihovu uporabu, mogu se naći u priručniku (Datasheet) za ovaj MK. Istina, na engleskom je. Ako znate engleski, svakako preuzmite ovu podatkovnu tablicu, sadrži puno korisnih informacija.

Ajmo napokon na posao. Preporučujem izradu posebne ploče za razvoj i otklanjanje pogrešaka za mikrokontroler, na kojoj možete sastaviti bilo koji električni krug s mikrokontrolerom bez lemilice (ili gotovo bez njega). Korištenje takve ploče uvelike će olakšati rad s MK i ubrzati proces učenja njegovog programiranja. Ovako izgleda:

Što će vam trebati za ovo?

Prvo, trebat će vam sama ploča. Kupio sam gotovu u trgovini radio dijelova za 115 rubalja. Zatim sam na njega zalemio sve potrebne dijelove. Rezultat je nevjerojatno praktična stvar na kojoj možete sastaviti bilo koji električni krug u nekoliko minuta spajanjem kabela i instaliranjem mikro krugova i indikatora.

Za spajanje elemenata kruga vrlo je prikladno koristiti kabele s konektorima na krajevima. Ovi konektori se stavljaju na "noge" koje strše pored svakog priključka MK. Mikrokontroler bi trebao biti instaliran u utičnicu, a ne zalemljen na ploču, inače će ga biti vrlo teško ukloniti ako ga slučajno spalite. Ispod je pinout ATMEGA16 MK:

Objasnimo koje noge nas sada zanimaju.

  • VCC - ovdje se napaja (4,5 - 5,5 V) iz stabiliziranog izvora
  • GND – uzemljenje
  • RESET – reset (na niskoj razini napona)
  • XTAL1, XTAL2 – ovdje je spojen kvarcni rezonator
  • PA, PB, PC, PD – ulazno/izlazni portovi (A, B, C i D, respektivno).

Sve što proizvodi 7-11 V DC može se koristiti kao izvor napajanja. Za stabilan rad MK-a potrebno je stabilizirano napajanje. Kao stabilizator možete koristiti mikro krugove serije 7805. To su linearni integrirani stabilizatori, čiji se ulaz napaja s 7-11 V istosmjerne nestabilizirane struje, a izlaz je 5 V stabilizirane struje. Prije i poslije 7805 potrebno je ugraditi filter kondenzatore (elektrolitske za filtriranje niskofrekventnih smetnji i keramičke za visokofrekventne). Ako ne možete pronaći stabilizator, tada kao izvor napajanja možete koristiti bateriju od 4,5 V. MK se mora napajati izravno iz njega.

Ispod je dijagram MK veze:

Hajde sada shvatiti što je što ovdje.

BQ1 je kvarcni rezonator koji postavlja radnu frekvenciju MK. Možete postaviti bilo koji do 16 MHz, ali budući da u budućnosti planiramo raditi s COM priključkom, preporučujem korištenje rezonatora za sljedeće frekvencije: 14,7456 MHz, 11,0592 MHz, 7,3725 MHz, 3,6864 MHz ili 1,8432 MHz (kasnije postat će jasno zašto). Koristio sam 11,0592 MHz. Jasno je da što je veća frekvencija, to je veća brzina uređaja.

R1 je pull-up otpornik koji održava napon od 5 V na RESET ulazu. Niska razina napona na ovom ulazu označava resetiranje. Nakon resetiranja, MK se podiže (10 - 15 ms) i ponovno počinje izvršavati program. Budući da je ovo ulaz visoke impedancije, ne možete ga ostaviti da "visi u zraku" - mali udar na njemu dovest će do neočekivanog resetiranja MK. Upravo tome služi R1. Za pouzdanost također preporučujem instaliranje kondenzatora C6 (ne više od 20 µF).

SB1 – tipka za resetiranje.

Kvarcni rezonator i kondenzator filtera C3 trebaju biti smješteni što je moguće bliže MK (ne dalje od 5-7 cm), jer u suprotnom može doći do smetnji u žicama, što dovodi do kvara MK.

Plavi pravokutnik na dijagramu ocrtava sam programator. Prikladno je napraviti u obliku žice, čiji je jedan kraj priključen u LPT priključak, a drugi u određeni konektor pored MK. Žica ne smije biti predugačka. Ako se pojave problemi s ovim kabelom (obično ne, ali svašta se može dogoditi), morat ćete zalemiti Altera ByteBlaster adapter. Kako to učiniti je napisano u opisu AVReal programatora.

Sada kada smo se pozabavili hardverom, vrijeme je da prijeđemo na softver.

Postoji nekoliko razvojnih okruženja za AVR programiranje. Prvo, ovo je AVR Studio - službeni programski sustav tvrtke Atmel. Omogućuje vam pisanje u asembleru i debug programe napisane u asembleru, C i C++. IAR je komercijalni programski sustav u C, C++ i asemblerskom jeziku. WinAVR je prevoditelj otvorenog koda. AtmanAVR je sustav za programiranje za AVR sa sučeljem gotovo potpuno istim kao Visual C++ 6. AtmanAVR vam također omogućuje debugiranje programa i sadrži mnoge pomoćne funkcije koje olakšavaju pisanje koda. Ovaj programski sustav je komercijalan, ali ga, prema licenci, možete besplatno koristiti mjesec dana.

Predlažem početak rada s IAR-om kao najtransparentnijim razvojnim okruženjem. U IAR-u se projekt u potpunosti kreira ručno; stoga, nakon što ste dovršili nekoliko projekata, već ćete jasno znati što svaki red koda znači i što će se dogoditi ako ga promijenite. Kada radite s AtmanAVR-om, ili ćete morati koristiti unaprijed izrađeni predložak, koji je vrlo glomazan i teško razumljiv za osobu bez iskustva, ili ćete imati puno problema s datotekama zaglavlja kada sastavljate projekt od nule. Nakon što smo se pozabavili IAR-om, kasnije ćemo pogledati druge kompajlere.

Dakle, prvo nabavite IAR. Vrlo je čest i pronaći ga ne bi trebao biti problem. Nakon što odnekud preuzmete IAR 3.20, instalirajte kompajler/radno okruženje i pokrenite ga. Nakon ovoga možete početi raditi.

Nakon pokretanja IAR-a odaberite datoteka/novo/radni prostor, odaberite put do našeg projekta i stvorite mapu za njega i dajte mu naziv, na primjer, “Prog1”. Kreirajmo sada projekt: Projekt / Kreiraj novi projekt… Nazovimo ga i “Prog1”. Desnom tipkom miša kliknite naslov projekta u stablu projekta i odaberite "Opcije"

Ovdje ćemo konfigurirati kompajler za određeni MK. Najprije trebate odabrati vrstu procesora ATMega16 na kartici Target, potvrditi okvir Enable bit definitions in I/O-include files na kartici Library Configuration (tako da možete koristiti nazive bitova raznih MK registara u programskom kodu ), i tamo odaberite tip C biblioteke /EU++. U kategoriji ICCAVR potrebno je označiti kućicu Omogući višebajtnu podršku na kartici Jezik, a isključiti optimizaciju na kartici Optimizacija (inače će uništiti naš prvi program).

Zatim odaberite kategoriju XLINK. Ovdje morate odrediti format kompajlirane datoteke. Budući da sada postavljamo opcije za Debug mod, kao što je opisano u naslovu, trebamo dobiti debug datoteku kao izlaz. Kasnije ćemo ga otvoriti u AVR Studiju. Da biste to učinili, morate odabrati ekstenziju.cof, a tip datoteke je ubrof 7.

Sada kliknite OK, zatim promijenite Debug u Release.

Ponovno idite na Opcije, gdje su svi parametri osim XLINK-a postavljeni na iste. U XLINK-u promijenite ekstenziju u .hex i format datoteke u intel-standard.

To je sve. Sada možete početi pisati svoj prvi program. Napravite novi izvor/tekst i unesite sljedeći kod u njega:

#uključi"iom16.h" short unsigned int i; poništiti glavni( poništiti) (DDRB = 255; PORTB = 0; dok(1) { ako(PORTB == 255) PORTB = 0; drugo PORTB++; za(i=0; i

Datoteka "iom16.h" nalazi se u mapi (C:\Program Files)\IAR Systems\Embedded Workbench 3.2\avr\inc. Ako koristite drugi MK, na primjer, ATMega64, odaberite datoteku "iom64.h". Ove datoteke zaglavlja pohranjuju informacije o MK: nazive registara, bitove u registrima i nazive prekida. Svaki pojedinačni pin priključka A, B, C ili D može djelovati ili kao ulaz ili kao izlaz. To određuje Data Direction Register (DDR). 1 čini nogu izlazom, 0 ulazom. Dakle, postavljanjem, na primjer, DDRA = 13, pravimo "noge" PB0, PB2, PB3 izlazi, ostatak - ulazi, jer 13 u binarnom obliku je 00001101.

PORTB je registar koji određuje stanje pinova porta. Nakon što smo tamo napisali 0, postavili smo napon na svim izlazima na 0 V. Zatim postoji beskonačna petlja. Kod programiranja MK uvijek naprave beskonačnu petlju u kojoj MK izvodi neku radnju dok se ne resetira ili dok ne dođe do prekida. U ovom ciklusu oni pišu, takoreći, "pozadinski kod", koji MK izvršava kao posljednju stvar. To može biti, na primjer, prikaz informacija na zaslonu. U našem slučaju, sadržaj PORTB registra se povećava dok se ne napuni. Nakon toga sve kreće ispočetka. Konačno, deset tisuća ciklusa za petlju. Potrebno je formirati vidljivo kašnjenje u prebacivanju stanja porta B.



Sada spremamo ovu datoteku u mapu projekta kao Prog1.c, kopiramo datoteku iom16.h u mapu projekta, odabiremo Project/Add Files i dodajemo “iom16.h” i “Prog1.c”. Odaberite Otpuštanje, pritisnite F7, program se kompajlira i trebala bi se pojaviti poruka:


Ukupan broj grešaka: 0
Ukupan broj upozorenja: 0

Evo fotografije mog programera:

Preuzmite programator AVReal. Kopirajte ga (AVReal32.exe) u mapu Release/exe, gdje bi se trebala nalaziti datoteka Prog1.hex. Napajamo MK, spajamo kabel za programiranje. Otvorite Far Manager (najprikladnije je bljeskati MK), idite u ovu mapu, pritisnite Ctrl + O. Budući da imamo potpuno novi MK, mi stvari

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

Ne zaboravite unijeti točnu frekvenciju ako ne koristite 11059200 Hz! Istovremeno, tzv osigurači – registri koji kontroliraju njegov rad (korištenje internog generatora, Jtag i sl.). Nakon toga je spreman za primanje prvog programa. Programeru se kao parametri daju korišteni LPT port, frekvencija, naziv datoteke i drugi (svi su navedeni u opisu AVReala). Biramo:

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

Ako je veza ispravna, programator će prijaviti uspješno programiranje. Nema jamstva da će ovo raditi prvi put (prvi put kada pozovete program). I sam se ponekad programiram drugi put. Možda je LPT priključak neispravan ili postoji smetnja u kabelu. Ako dođe do problema, pažljivo provjerite kabel. Iz vlastitog iskustva znam da je 60% kvarova povezano s nedostatkom kontakta na pravom mjestu, 20% s prisutnošću nepotrebnog, a još 15% s pogrešnim lemljenjem pogrešne stvari na pogrešnu stvar. Ako ništa drugo ne uspije, pročitajte opis programatora i pokušajte izgraditi Byte Blaster.

Pretpostavimo da sve radi za vas. Ako sada spojite osam LED dioda na priključak B MK (učinite to dok je MK isključen, a preporučljivo je uključiti otpornike od 300-400 Ohma u seriju s LED diodama) i uključite napajanje, dogodit će se malo čudo - “ val” će proći kroz njih!

© Kiselev Roman
svibnja 2007

prosinca 2015

1. Prednosti predložene metode

Sklopovi uređaja koji se temelje na mikrokontrolerima (MCU) obično se odlikuju kombinacijom dviju kvaliteta koje je teško kombinirati: maksimalne jednostavnosti i visoke funkcionalnosti. Osim toga, funkcionalnost se može mijenjati i proširivati ​​u budućnosti bez ikakvih promjena u sklopu - samo zamjenom programa (flashing). Ove se značajke objašnjavaju činjenicom da su tvorci modernih mikrokontrolera pokušali smjestiti na jedan čip sve što bi programer elektroničkog uređaja mogao trebati - barem onoliko koliko je to moguće. Kao rezultat toga, došlo je do pomaka naglaska sa sklopova i instalacije na softver. Korištenjem MK sada je manje potrebno "opterećivati" strujni krug dijelovima, a manje je i spojeva između komponenti. To, naravno, čini sklop privlačnijim za ponavljanje i iskusnim i početnicima u elektronici. Ali, kao i obično, sve morate platiti. Ni ovo nije prošlo bez poteškoća. Ako kupite novi MK, instalirate ga u strujni krug ispravno sastavljen od dijelova koji se mogu servisirati i uključite napajanje, tada ništa neće raditi - uređaj neće raditi. Mikrokontroler treba program.

Čini se da je i s ovim sve jednostavno - na Internetu možete pronaći mnoge sheme s besplatnim firmware-om. Ali ovdje postoji jedna začkoljica: firmware se mora nekako "uploadati" u mikrokontroler. Za nekoga tko to nikada prije nije učinio, takav zadatak često postaje problem i glavni faktor odbijanja, često ih prisiljavajući da napuste užitke korištenja MK-a i potraže sheme temeljene na "labavoj" i krutoj logici. Ali sve nije tako komplicirano kao što se na prvi pogled čini.

Nakon analize publikacija na Internetu, možete vidjeti da se ovaj problem najčešće rješava na jedan od dva načina: kupnjom gotovog programera ili izradom domaćeg. U isto vrijeme, objavljeni sklopovi domaćih programera vrlo su često nerazumno složeni - mnogo složeniji nego što je stvarno potrebno. Naravno, ako planirate bljeskati MK svaki dan, bolje je imati "cool" programera. Ali ako se potreba za takvim postupkom pojavljuje rijetko, s vremena na vrijeme, tada možete potpuno bez programera. Ne, naravno, ne govorimo o učenju kako to raditi snagom misli. To znači da razumijevanjem načina na koji programator komunicira s mikrokontrolerom prilikom pisanja i čitanja informacija u njegovom načinu programiranja, možemo se zadovoljiti dostupnim alatima za širu svrhu. Ovi alati će morati zamijeniti i softverske i hardverske dijelove programatora. Hardver mora osigurati fizičku vezu s MK mikro krugom, mogućnost primjene logičkih razina na njegove ulaze i čitanje podataka s njegovih izlaza. Programski dio mora osigurati rad algoritma koji upravlja svim potrebnim procesima. Također napominjemo da kvaliteta snimanja informacija u MK ne ovisi o tome koliko je vaš programer "cool". Ne postoji “bolje snimljeno” ili “lošije”. Postoje samo dvije opcije: "registriran" i "neregistriran". To se objašnjava činjenicom da proces snimanja unutar kristala izravno kontrolira sam MK. Vi samo trebate osigurati visokokvalitetno napajanje (bez smetnji ili valovitosti) i pravilno organizirati sučelje. Ako rezultati testnog očitanja ne otkrivaju pogreške, onda je sve u redu - možete koristiti regulator za namjeravanu svrhu.

Da bismo napisali program u MK bez programatora, potreban nam je pretvarač USB-RS232TTL porta i, također. Pretvarač USB-RS232TTL omogućuje korištenje USB priključka za stvaranje COM priključka koji se razlikuje od "pravog" samo po tome što njegovi ulazi i izlazi koriste TTL logičke razine, odnosno napon u rasponu od 0 do 5 volti ( više možete pročitati u članku " "). U svakom slučaju, ovakav pretvarač korisno je imati u svom “kućanstvu”, pa ako ga već nemate, svakako ga se isplati kupiti. Što se tiče logičkih razina, u našem slučaju TTL je čak i prednost u odnosu na obični COM port, jer se ulazi i izlazi takvog porta mogu izravno spojiti na bilo koji mikrokontroler napajan na 5 V, uključujući ATtiny i ATmega. Ali nemojte pokušavati koristiti obični COM port - oni koriste napone u rasponu od -12 do +12 V (ili -15...+15V). U ovom slučaju, izravno spajanje na mikrokontroler je neprihvatljivo!!!

Ideja o izradi skripte za program Perpetuum M, koji implementira funkcije programera, nastala je nakon čitanja niza publikacija na Internetu koje nude određena rješenja za MK firmware. U svakom slučaju otkriveni su ozbiljni nedostaci ili pretjerane poteškoće. Često sam nailazio na sklopove programatora koji su sadržavali mikrokontroler, au isto vrijeme davali su se vrlo ozbiljni savjeti tipa: “...a za programiranje mikrokontrolera za ovaj programator trebat će nam... tako je - drugi programator!” Zatim je predloženo da odete do prijatelja, potražite plaćenu uslugu itd. Kvaliteta softvera distribuiranog na mreži u te svrhe također nije bila impresivna - uočeni su mnogi problemi kako s funkcionalnošću tako i s "zamućenošću" korisničkog sučelja. Često je potrebno puno vremena da se shvati kako se koristi program - mora se proučavati čak i za izvođenje najjednostavnijih radnji. Drugi program može raditi nešto dugo i marljivo, ali korisnik sazna da se ništa ne upisuje u MK tek nakon što je cijeli firmware potpuno dovršen i naknadno probno očitavanje. Također se pojavljuje sljedeći problem: korisnik pokušava odabrati svoj MK s popisa podržanih kristala, ali ga nema na popisu. U tom slučaju nećete moći koristiti program - uključivanje u popis nestalih MK-ova u pravilu nije predviđeno. Osim toga, ručni odabir kontrolera s popisa izgleda čudno, s obzirom da programer u mnogim slučajevima može sam odrediti vrstu MK. Sve ovo je rečeno ne kako bi se bacalo blato na postojeće proizvode, već kako bi se objasnio razlog pojave skripte za program Perpetuum M, opisan u ovom članku. Problem doista postoji, a tiče se prvenstveno početnika koji ne uspijevaju uvijek savladati ovaj “zid” kako bi napravili prvi korak u svijet mikrokontrolera. Predložena skripta uzima u obzir nedostatke pronađene u drugim programima. Implementirana je maksimalna “transparentnost” rada algoritma, izuzetno jednostavno korisničko sučelje koje ne zahtijeva učenje i ne ostavlja nikakvu šansu da se zbunite i “kliknete krivo”. Ako traženi MK nije među podržanim, možete sami dodati njegov opis, uzimajući potrebne podatke iz dokumentacije preuzete s web stranice programera MK. I, što je najvažnije, scenarij je otvoren za proučavanje i izmjene. Svatko ga može otvoriti u uređivaču teksta, proučavati i uređivati ​​po vlastitom nahođenju, mijenjajući postojeće funkcije po svom ukusu i dodajući one koje nedostaju.

Prva verzija scenarija nastala je u lipnju 2015. Ova verzija pruža podršku samo za mikrokontrolere serije Atmel ATtiny i ATmega s funkcijama za pisanje/čitanje flash memorije, postavljanje konfiguracijskih bitova i automatsko otkrivanje vrste kontrolera. Zapisivanje i čitanje EEPROM-a nije implementirano. Bilo je planova za dopunu funkcionalnosti skripte : dodati pisanje i čitanje EEPROM-a, implementirati podršku za PIC kontrolere, itd. Iz tog razloga skripta još nije objavljena. Ali zbog nedostatka vremena, implementacija plana je odgođena, a kako ne bi postao najbolji neprijatelja dobrog, odlučeno je objaviti postojeću verziju. Ako već implementirane funkcije neće biti dovoljne, nemojte se uzrujavati. U ovom slučaju možete sami pokušati dodati željenu funkciju. Neću skrivati: ideja o stvaranju ove skripte u početku ima i edukativno značenje. Nakon što ste razumjeli algoritam i dodali mu nešto svoje, moći ćete bolje razumjeti rad MK-a u programskom načinu rada, tako da u budućnosti se nećete naći u poziciji djevojke ispred pokvarenog auta, zamišljeno gledajući njegovu unutrašnjost i ne shvaćajući zašto “ne radi”.

2. MK sučelje u načinu programiranja

Postoji nekoliko različitih načina za stavljanje kontrolera u način rada za programiranje i rad s njim u ovom načinu rada. Najlakši za implementaciju za kontrolere serije ATtiny i ATmega je možda SPI. Iskoristit ćemo ga.

No, prije nego što počnemo razmatrati signale potrebne za generiranje SPI, napravit ćemo nekoliko rezervi. Mikrokontroler ima konfiguracijske bitove. To su nešto poput prekidača, prebacivanje koje vam omogućuje promjenu nekih svojstava mikro kruga u skladu s potrebama projekta. Fizički, to su trajne memorijske ćelije, poput onih u koje se upisuje program. Razlika je u tome što ih ima vrlo malo (do tri bajta za ATmega), i nisu dio adresnog prostora bilo koje memorije. Zapisivanje i čitanje konfiguracijskih podataka izvodi se zasebnim naredbama u modu za programiranje MK. Sada je važno napomenuti da neki konfiguracijski bitovi utječu na samu mogućnost korištenja SPI-ja. S nekim njihovim vrijednostima može se pokazati da se SPI ne može koristiti. Ako naiđete na takav mikrokontroler, metoda predložena u ovom članku neće pomoći. U tom slučaju morat ćete promijeniti postavke konfiguracijskih bitova u programatoru koji podržava drugačiji način programiranja ili koristiti drugi mikrokontroler. Ali ovaj se problem odnosi samo na rabljene MK-ove ili one s kojima se netko već neuspješno "igrao". Činjenica je da novi MCU dolaze s postavkama konfiguracijskih bitova koje ne sprječavaju korištenje SPI-ja. To potvrđuju i rezultati testiranja programerske skripte za program Perpetuum M, pri čemu su četiri različita MK-a (ATmega8, ATmega128, ATtiny13, ATtiny44) uspješno flashirana. Svi su bili novi. Početna postavka konfiguracijskih bitova bila je u skladu s dokumentacijom i nije ometala korištenje SPI-ja.

S obzirom na gore navedeno, trebali biste obratiti pozornost na sljedeće bitove. Bit SPIEN eksplicitno dopušta ili odbija upotrebu SPI, stoga u našem slučaju njegova vrijednost mora biti omogućavanje. Bit RSTDISBL može pretvoriti jedan od izlaza mikrosklopa (unaprijed određen) u ulaz signala "resetiranja" ili ga ne okrenuti (ovisno o vrijednosti upisanoj u ovaj bit). U našem slučaju neophodan je ulaz "reset" (ako ga nema, neće biti moguće prebaciti MK u način programiranja putem SPI). Također postoje bitovi grupe CKSEL koji specificiraju izvor taktnog signala. Oni ne sprječavaju korištenje SPI-a, ali ih također treba imati na umu, jer ako taktnih impulsa uopće nema ili ako je njihova frekvencija niža od prihvatljive za određenu SPI brzinu, također se neće dogoditi ništa dobro. Tipično, novi MCU-ovi koji imaju interni RC oscilator imaju bitove grupe CKSEL konfigurirane za njegovu upotrebu. Ovo nam sasvim odgovara - taktiranje je osigurano bez ikakvih dodatnih napora s naše strane. Nema potrebe za lemljenjem kvarcnog rezonatora ili spajanjem vanjskog generatora. Ako navedeni bitovi sadrže drugačiju postavku, morat ćete se pobrinuti za taktiranje u skladu s postavkom. U tom slučaju, možda će biti potrebno spojiti kvarcni rezonator ili vanjski generator takta na MCU. Ali u ovom članku nećemo razmatrati kako se to radi. Primjeri povezivanja MK za programiranje sadržani u ovom članku dizajnirani su za najjednostavniji slučaj.

Riža. 1. Razmjena podataka preko SPI u modu za programiranje

Sada se okrenimo slici 1, preuzetoj iz dokumentacije za ATmega128A MK. Prikazuje proces prijenosa jednog bajta u MK i istovremenog primanja jednog bajta od MK. Oba ova procesa, kao što vidimo, koriste iste impulse takta koji se isporučuju od programatora do mikrokontrolera na njegovom SCK ulazu - jednom od pinova mikro kruga, za koje je takva uloga dodijeljena u SPI načinu programiranja. Još dvije signalne linije omogućuju prijem i prijenos podataka jedan bit po taktu. Preko MOSI ulaza podaci ulaze u mikrokontroler, a očitani podaci se preuzimaju s MISO izlaza. Obratite pažnju na dvije isprekidane linije povučene od SCK do MISO i MOSI. One pokazuju u kojem trenutku mikrokontroler “guta” bit podataka postavljen na MOSI ulazu, a u kojem trenutku sam postavlja svoj bit podataka na MISO izlaz. Sve je vrlo jednostavno. Ali da bismo MK ušli u način programiranja, još uvijek trebamo signal RESET. Ne zaboravimo također na zajedničku GND žicu i VCC napajanje. Ukupno se ispostavlja da je samo 6 žica potrebno spojiti na mikrokontroler da bi se njegov firmware flashirao preko SPI. U nastavku ćemo to detaljnije analizirati, ali za sada ćemo dodati da se razmjena podataka s MK u programskom načinu rada putem SPI-a vrši u paketima od 4 bajta. Prvi bajt svakog paketa u osnovi je u potpunosti posvećen kodiranju instrukcija. Drugi bajt, ovisno o prvom, može biti nastavak koda naredbe, ili dio adrese, ili može imati proizvoljnu vrijednost. Treći bajt se prvenstveno koristi za prijenos adresa, ali može imati proizvoljnu vrijednost u mnogim uputama. Četvrti bajt obično prenosi podatke ili ima proizvoljnu vrijednost. Istovremeno s prijenosom četvrtog bajta, neke naredbe primaju podatke koji dolaze iz mikrokontrolera. Pojedinosti za svaku naredbu mogu se pronaći u dokumentaciji kontrolera u tablici pod nazivom "Skup uputa za serijsko programiranje SPI". Za sada samo napominjemo da je cijela razmjena s kontrolerom izgrađena od niza 32-bitnih paketa, u svakom od kojih se ne prenosi više od jednog bajta korisnih informacija. Ovo nije baš optimalno, ali općenito dobro funkcionira.

3. Spajanje MK za programiranje

Kako bi se osiguralo da se svi potrebni signali dovode na ulaze mikrokontrolera za organiziranje SPI sučelja i čitanje podataka s njegovog MISO izlaza, nije potrebno izraditi programator. To se lako može učiniti korištenjem najčešćeg USB-RS232TTL pretvarača.

Na internetu se često mogu naći informacije da su takvi pretvarači inferiorni i da se s njima ništa ozbiljno ne može učiniti. Ali s obzirom na većinu modela pretvarača, ovo je mišljenje pogrešno. Da, u prodaji postoje pretvarači koji nemaju sve ulaze i izlaze dostupne u usporedbi sa standardnim COM priključkom (na primjer, samo TXD i RXD), dok imaju dizajn koji se ne može odvojiti (mikrokrug je ispunjen plastikom - to je nemoguće dosegnuti njegove igle). Ali ove se ne isplati kupovati. U nekim slučajevima ulaze i izlaze ulaza koji nedostaju možete dobiti lemljenjem ožičenja izravno na čip. Primjer takvog "poboljšanog" pretvarača prikazan je na slici 2 (čip PL-2303 - više detalja o namjeni njegovih pinova u članku ""). Ovo je jedan od najjeftinijih modela, ali ima svoje prednosti kada se koristi u domaćim dizajnima. Punofunkcionalni adapterski kabeli sa standardnim devet-pinskim konektorom na kraju, poput COM priključka, također su široko rasprostranjeni. Razlikuju se od običnog COM porta samo u TTL razinama i nekompatibilnosti s naslijeđenim softverom i nekim starijim hardverom. Također se može primijetiti da se kabeli na CH34x čipu pokazuju mnogo pouzdanijim i stabilnijim u raznim ekstremnim testovima u usporedbi s pretvaračima na PL-2303. Međutim, tijekom normalne uporabe razlika nije primjetna.

Prilikom odabira USB-RS232TTL konvertera također treba obratiti pozornost na kompatibilnost njegovog upravljačkog programa s verzijom operativnog sustava koji koristite.

Pogledajmo pobliže princip povezivanja mikrokontrolera i USB-RS232TTL pretvarača na primjeru četiri različita MK modela: ATtiny13, ATtiny44, ATmega8 i ATmega128. Slika 3 prikazuje opći dijagram takve veze. Možda će vas iznenaditi da se RS232 signali (RTS, TXD, DTR i CTS) koriste neprikladno. Ali ne brinite o tome: program Perpetuum M može izravno raditi s njima - postavljati izlazne vrijednosti i čitati ulazna stanja. U svakom slučaju, naširoko korišteni USB-RS232TTL pretvarači na CH34x i PL-2303 čipovima pružaju ovu mogućnost - to je provjereno. Također ne bi trebalo biti problema s drugim popularnim pretvaračima, jer se za pristup priključku koriste standardne Windows funkcije.

Otpornici prikazani na općem dijagramu u načelu se ne mogu instalirati, ali ih je ipak bolje instalirati. Koja je njihova svrha? Koristeći TTL ulaze i izlaze pretvarača i pet voltnog napajanja mikrokontrolera, oslobađamo se potrebe za koordinacijom logičkih razina - sve je već sasvim ispravno. To znači da veze mogu biti izravne. Ali tijekom eksperimenata Svašta se može dogoditi. Primjerice, po zakonu podlosti, odvijač može pasti baš na mjesto gdje nikako nije mogao pasti i napraviti kratki spoj na nečemu što nikako ne bi smjelo biti kratkog spoja. Naravno, sve može ispadne „šrafciger". Otpornici u ovom slučaju ponekad umanjuju posljedice. jedna od njihovih svrha je eliminirati mogući konflikt izlaza. Činjenica je da nakon završetka programiranja mikrokontroler prelazi u normalan način rada, a može dogoditi da njegov pin spojen na izlaz pretvarača (RTS, TXD ili DTR) također postane izlaz, prema programu koji je upravo snimljen u MK. U tom slučaju, bit će jako loše ako se dva izravno povezana izlaza "potuku" - pokušati postaviti različite logičke razine. U takvoj “borbi” netko može “izgubiti”, ali mi to ne želimo.

Vrijednosti triju otpornika odabrane su na razini od 4,3 KOhm. Ovo se odnosi na veze između izlaza pretvarača i ulaza mikrokontrolera. Točnost otpornika nije bitna: možete smanjiti njihov otpor na 1 KOhm ili ga povećati na 10 KOhm (ali u drugom slučaju, rizik od smetnji se povećava kada koristite duge žice na putu do MK). Što se tiče veze između ulaza pretvarača (CTS) i izlaza mikrokontrolera (MISO), ovdje se koristi otpornik od 100 Ohma. To se objašnjava osobitostima ulaza korištenog pretvarača. Tijekom testova korišten je pretvarač na mikro krugu PL-2303, čiji su ulazi, očito, povezani s pozitivnim izvorom napajanja s relativno niskim otporom (reda nekoliko stotina Ohma). Da bih "prekinuo povlačenje", morao sam ugraditi otpornik s tako malim otporom. Međutim, uopće ga ne morate instalirati. Na pretvaraču je to uvijek ulaz. Ne može postati izlaz, što znači da u bilo kojem razvoju događaja neće biti sukoba izlaza.

Ako čip ima zaseban AVCC pin za napajanje analogno-digitalnog pretvarača (na primjer, ATmega8 ili ATmega128), treba ga spojiti na zajednički VCC naponski pin. Neki IC-ovi imaju više od jednog VCC pina za napajanje ili više od jednog GND-a. Na primjer, ATmega128 ima 3 pina GND i 2 pina VCC. U trajnom dizajnu, bolje je spojiti igle istog imena jedan s drugim. U našem slučaju, tijekom programiranja, možete koristiti po jedan VCC i GND pin.

A evo kako izgleda ATtiny13 veza. Na slici su prikazani rasporedi pinova koji se koriste pri programiranju preko SPI. Uz fotografiju je kako privremena veza izgleda u stvarnosti.


Neki bi mogli reći da ovo nije ozbiljno - veze na ožičenju. Ali ti i ja smo razumni ljudi. Cilj nam je isprogramirati mikrokontroler, utrošivši na to minimalno vremena i drugih resursa, a ne pokazivati ​​se pred nekim. Kvaliteta ne trpi. Metoda "na žicama" u ovom je slučaju prilično učinkovita i opravdana. Flashiranje firmvera kontrolera je jednokratni postupak, tako da nema smisla pokrivati ​​ga kamenčićima. Ako se u budućnosti namjerava promijeniti firmware bez uklanjanja kontrolera iz kruga (u gotovom proizvodu), to se uzima u obzir tijekom instalacije tijekom proizvodnje uređaja. Obično se u tu svrhu instalira konektor (RESET, SCK, MOSI, MISO, GND), a MK se može bljeskati čak i nakon instalacije na ploči. Ali to su kreativni užici. Razmatramo najjednostavniji slučaj.

Sada prijeđimo na ATtiny44 MK. Ovdje je sve uglavnom isto. Na temelju crteža i fotografije, čak i početnik neće imati poteškoća u pronalaženju veze. Kao i ATtiny44, možete spojiti mikrokontrolere ATtiny24 i ATtiny84 - dodjela pinova za ova tri je ista.


Drugi primjer privremenog povezivanja kontrolera za programiranje je ATmega8. Ovdje ima više pinova, ali princip je isti - nekoliko žica, a sada je kontroler spreman "ispuniti" informacije u njega. Dodatna crna žica na fotografiji koja dolazi od pina 13 ne sudjeluje u programiranju. Dizajniran je za uklanjanje zvučnog signala s njega nakon što MK izađe iz načina programiranja. To je zbog činjenice da je tijekom otklanjanja pogrešaka scenarija za "Perpetuum M" program glazbene kutije preuzet na MK.


Često je jedan regulator dostupan u različitim kućištima. U ovom slučaju, dodjela pinova za svaki slučaj je drugačije raspoređena. Ako kućište vašeg kontrolera nije slično onome prikazanom na slici, provjerite namjenu pinova u tehničkoj dokumentaciji koja se može preuzeti na web stranici programera MK.

Da bismo dovršili sliku, pogledajmo povezivanje MK mikro kruga s velikim brojem "nogu". Svrha dodatne crne žice na fotografiji koja dolazi od pina 15 potpuno je ista kao u slučaju ATmega8.


Vjerojatno ste se već uvjerili da je sve vrlo jednostavno. Svatko tko zna brojati pinove mikro krugova (od oznake u krugu suprotno od kazaljke na satu) shvatit će to. I ne zaboravite na točnost. Mikrokrugovi vole uredne ljude i ne opraštaju nemaran tretman.

Prije nego prijeđete na softverski dio, provjerite je li USB-RS232TTL upravljački program pretvarača ispravno instaliran (provjerite Windows Device Manager). Zapamtite ili zapišite broj virtualnog COM porta koji se pojavljuje kada spojite pretvarač. Ovaj broj će biti potrebno unijeti u tekst skripte, o čemu možete pročitati u nastavku.

4. Skripta - programer za "Perpetuum M"

Shvatili smo hardverski dio "programera". Ovo je već pola uspjeha. Sada ostaje pozabaviti se softverskim dijelom. Njegovu će ulogu obavljati program Perpetuum M pod kontrolom skripte, koji implementira sve potrebne funkcije za interakciju s mikrokontrolerom.

Arhivu sa skriptom treba raspakirati u istu mapu u kojoj se nalazi program perpetuum.exe. U tom slučaju, kada pokrenete datoteku perpetuum.exe, na zaslonu će se prikazati izbornik s popisom instaliranih skripti, među kojima će biti redak "AVR MK Programmer" (može biti jedini). Ovo je linija koja nam treba.

Skripta se nalazi u mapi PMS u datoteci "MK Programmer AVR.pms". Ovu datoteku možete pregledavati, proučavati i uređivati ​​ako je potrebno u običnom uređivaču teksta kao što je Windows Notepad. Prije korištenja skripte, najvjerojatnije ćete morati unijeti izmjene u tekst koji se odnosi na postavke priključka. Da biste to učinili, provjerite naziv priključka koji se koristi u Windows upravitelju uređaja i, ako je potrebno, napravite odgovarajuću izmjenu u retku "PortName="COM4";" - umjesto broja 4 može stajati neki drugi broj. Također, kada koristite drugi model USB-RS232TTL pretvarača, možda ćete morati promijeniti postavke inverzije signala (redovi skripte koji počinju s riječju "High"). Inverziju signala USB-RS232TTL pretvarača možete provjeriti koristeći jedan od primjera sadržanih u uputama za program Perpetuum M (odjeljak funkcija za rad s portom).

Podmapa MK_AVR sadrži datoteke s opisima podržanih kontrolera. Ako kontroler koji vam je potreban nije među njima, možete sami dodati onaj koji vam je potreban, slijedeći analogiju. Uzmite jednu od datoteka kao uzorak i pomoću uređivača teksta unesite potrebne podatke, preuzimajući ih iz dokumentacije vašeg mikrokontrolera. Glavna stvar je biti oprezan, unijeti podatke bez pogrešaka, inače MK neće biti programiran ili će biti pogrešno programiran. Izvorna verzija podržava 6 mikrokontrolera: ATtiny13, ATtiny24, ATtiny44, ATtiny84, ATmega8 i ATmega128. Skripta implementira automatsko prepoznavanje spojenog kontrolera - nema potrebe za navođenjem ručno. Ako identifikator očitan iz MK nije među dostupnim opisima, prikazuje se poruka da kontroler nije moguće prepoznati.

Arhiva sa skriptom također sadrži dodatne informacije. Mapa s datotekama AVR kontrolera sadrži vrlo korisnu i opsežnu kolekciju datoteka s definicijom kontrolera. Ove se datoteke koriste pri pisanju vlastitih programa za MK. Još četiri mape "MusicBox_..." sadrže datoteke s programom na asemblerskom jeziku i firmver spremnim za preuzimanje u MK zasebno za ATtiny13, ATtiny44, ATmega8 i ATmega128. Ako ste već povezali jedan od ovih MK-ova za programiranje, kao što je predloženo u ovom članku, tada ga možete odmah bljeskati - dobit ćete glazbenu kutiju. Više o tome u nastavku.

Kada odaberete redak "MK AVR Programmer" u izborniku skripti, skripta se počinje izvršavati. Istodobno otvara port, šalje naredbu MK-u za prebacivanje u mod programiranja, prima potvrdu od MK-a o uspješnom prijelazu, traži identifikator MK-a i traži opis ovog MK-a po njegovom identifikatoru među dostupnim datoteke s opisima. Ako ne pronađe traženi opis, prikazuje odgovarajuću poruku. Ako se pronađe opis, otvara se glavni izbornik programatora. Snimku zaslona možete vidjeti na slici 8. Daljnje razumijevanje nije teško - izbornik je vrlo jednostavan.

U prvoj verziji skripte neke funkcije punopravnog programera nisu implementirane. Na primjer, ne postoji način čitanja i pisanja u EEPROM. Ali ako otvorite skriptu u uređivaču teksta, vidjet ćete da je vrlo male veličine, unatoč činjenici da je glavna stvar već implementirana u njoj. Ovo sugerira da dodavanje funkcija koje nedostaju nije tako teško - jezik je vrlo fleksibilan, omogućuje implementaciju bogate funkcionalnosti u malom programu. Ali u većini slučajeva dovoljne su i postojeće funkcije.

Neka ograničenja funkcionalnosti opisana su izravno u tekstu skripte:
//implementirano snimanje samo s nulte adrese (Extended Segment Address Record se zanemaruje, LOAD OFFSET - također)
//redoslijed i kontinuitet zapisa u HEX datoteci se ne provjeravaju
//kontrolni zbroj se ne provjerava
Ovo se odnosi na rad s HEX datotekom, iz koje se preuzima firmware kod za MK. Ako ova datoteka nije oštećena, provjera kontrolnog zbroja neće imati učinka. Ako je iskrivljen, neće ga biti moguće otkriti pomoću skripte. U većini slučajeva, preostala ograničenja neće škoditi, ali ipak ih morate imati na umu.

5. Glazbena kutija - jednostavan zanat za početnike

Ako imate jedan od ovih mikrokontrolera: ATtiny13, ATtiny44, ATmega8 ili ATmega128, lako ga možete pretvoriti u glazbenu kutiju ili glazbenu karticu. Da biste to učinili, dovoljno je upisati odgovarajući firmware u MK - jedan od ona četiri koja se nalaze u mapama "MusicBox_..." u istoj arhivi sa skriptom. Kodovi firmvera pohranjeni su u datotekama s nastavkom ".hex". Korištenje ATmega128 za takvo plovilo, naravno, je "masno", baš kao i ATmega8. Ali ovo može biti korisno za testiranje ili eksperimentiranje, drugim riječima, u obrazovne svrhe. U prilogu su i tekstovi programa u Assembleru. Programi nisu stvoreni od nule - kao osnova je uzet program glazbene kutije iz knjige A.V. Belova "AVR mikrokontroleri u amaterskoj radio praksi". Izvorni program doživio je niz značajnih promjena:
1. prilagođen za svaki od četiri MK-a: ATtiny13, ATtiny44, ATmega8 i ATmega128
2. gumbi su eliminirani - ništa se ne mora spajati na kontroler osim napajanja i emitera zvuka (melodije se sviraju jedna za drugom u beskonačnoj petlji)
3. trajanje svake note smanjuje se za trajanje pauze između nota kako bi se uklonile smetnje u glazbenom ritmu
4. osma melodija je povezana, nije korištena u knjižnoj verziji
5. subjektivno: neka "poboljšanja" za optimizaciju i lakše razumijevanje algoritma

U nekim se melodijama može čuti neistina, pa čak i grube pogreške, posebno u "Smile" - u sredini. Kodovi zvona preuzeti su iz knjige (ili bolje rečeno, preuzeti s web stranice autora knjige zajedno s izvornom asm datotekom) i nisu mijenjani. Očigledno postoje pogreške u kodiranju melodija. Ali to nije problem - svatko tko je "prijatelj" glazbe može to lako shvatiti i popraviti sve.

U ATtiny13, zbog nedostatka 16-bitnog brojača, morao se koristiti 8-bitni brojač za reprodukciju bilješki, što je dovelo do blagog smanjenja točnosti bilješki. Ali to se jedva primjećuje na uho.

O konfiguracijskim bitovima. Njihove postavke moraju odgovarati stanju novog mikrokontrolera. Ako je vaš MK već negdje korišten, potrebno je provjeriti stanje njegovih konfiguracijskih bitova i po potrebi ih uskladiti s postavkama novog mikrokontrolera. Možete saznati stanje konfiguracijskih bitova novog mikrokontrolera iz dokumentacije za ovaj MK (odjeljak "Bitovi osigurača"). Iznimka je ATmega128. Ovaj MCU ima M103C bit, koji omogućuje način kompatibilnosti sa starijim ATmega103. Aktiviranje bita M103C uvelike smanjuje mogućnosti ATmega128, a ovaj bit je aktivan na novom MK. Morate resetirati M103C u neaktivno stanje. Za manipuliranje bitovima konfiguracije koristite odgovarajući odjeljak izbornika skripte programera.

Nema smisla davati dijagram glazbene kutije: ona sadrži samo mikrokontroler, napajanje i piezo-zvučni emiter. Napajanje se napaja na potpuno isti način kao što smo radili prilikom programiranja MK. Odašiljač zvuka je spojen između zajedničke žice (GND pin kontrolera) i jednog od MK pinova, čiji se broj nalazi u datoteci s programskim sklopovskim kodom (*.asm). Na početku teksta programa za svaki MK u komentarima nalazi se redak: "zvučni signal se generira na pinu XX." Kada se skripta programatora završi, mikrokontroler izlazi iz moda programiranja i prelazi u normalan rad. Reprodukcija melodija počinje odmah. To možete provjeriti spajanjem emitera zvuka. Odašiljač zvuka možete ostaviti spojenim tijekom programiranja kristala samo ako se zvuk uzima s pina koji se ne koristi u SPI, inače bi dodatni kapacitet na pinu mogao ometati programiranje.