Postup programovania mikrokontrolérov avr. Rady pre začínajúcich programátorov mikrokontrolérov. Požadovaná sada programov

Takže sme vyriešili prácu jadra ohľadom prechodov a adresovania. Je čas obrátiť našu pozornosť na inú oblasť – pamäť.

Existujú dva typy (EEPROM sa nepočíta, pretože ide vo všeobecnosti o periférne zariadenie, ale o tom neskôr):

  • RAM - RAM
  • ROM - ROM, aka flash, aka programová pamäť

Keďže naša architektúra je Harvard, operátor má svoje vlastné adresovanie a flash má svoje vlastné. V údajovom liste môžete vidieť štruktúru adresovania RAM.

Okamžite si všímajte adresy! RON a periférne registre, ako aj RAM sú umiestnené v rovnakom adresnom priestore. Tie. adresy od 0000 do 001F zaberajú naše registre, potom až po adresu 005F sú I/O bunky - porty. Cez porty sa konfiguruje všetko, čo je na doske ovládača. A až potom z adresy 0060 prichádza naša RAM, ktorú môžeme použiť na určený účel.

Okrem toho si uvedomte, že I/O registre majú tiež svoje vlastné adresovanie - adresný priestor I/O registrov (od 00 do 3F), je uvedený na ľavej strane obrázku. IO/Register Block Toto adresovanie funguje LEN v inštrukciách OUT a IN.To vedie k zaujímavej funkcii.

K periférnym registrom je možné pristupovať dvoma rôznymi spôsobmi:

  • Cez IN/OUT príkazy na krátkej adrese v I/O adresnom priestore
  • Prostredníctvom skupiny príkazov LOAD/STORE na plnej adrese v adresnom priestore RAM

Príklad. Zoberme si vstupný register asynchrónneho transceivera UDR, má adresu 0x0C (0x2C), adresa vo všeobecnom adresnom priestore je uvedená v zátvorkách.

LDI R18,10; Do registra R18 sme nahrali číslo 10. Len tak OUT UDR,R18 ; Odvodené prvým spôsobom, samotný kompilátor; Nahradí hodnotu 0x0C namiesto UDR STS 0x2C,R18 ; Vyviezli ma druhou cestou. cez príkaz Store; Priamym zadaním adresy.

Obe metódy poskytujú rovnaké výsledky. ALE! Tie, ktoré fungujú pomocou adresovania vo vstupno/výstupnom priestore (OUT/IN), sú o dva bajty kratšie. Je to pochopiteľné – nepotrebujú ukladať dvojbajtovú adresu ľubovoľnej pamäťovej bunky a krátka adresa vstupno-výstupného priestoru sa zmestí do dvojbajtového kódu inštrukcie.

Pravda, je tu ďalší vtip. Faktom je, že každým rokom pribúdajú kamene z AVR a je v nich stále viac a viac mäsa. A každé praskanie potrebuje svoje periférne I/O registre. A teraz sme sa dostali do bodu, keď ATMega88 (ktorý nahradil Mega8) už má toľko periférií, že jeho I/O registre sa už nezmestia do limitu 3F adresného priestoru.

Ups, dorazili. A to je miesto, kde tí, ktorí prechádzajú zo starých kameňov na nové, začínajú vyjadrovať nechápavé výrazy - prečo príkazy OUT/IN na niektorých periférnych registroch fungujú, ale na iných nie?

A je to jednoduché - nebola dostatočná bitová hĺbka.

Ale jadro je jedno, to sa už prerobiť nedá. A tu ATMELčania konali prefíkane – zaviedli takzvané pamäťovo mapované registre. Tie. všetky tie registre, ktoré sa nezmestili do limitu 3F, sú teraz dostupné iba jedným spôsobom - cez Load/Store.

Aký vtip. Ak otvoríte nejaký m88def.inc, potom môžete vidieť, ktoré z I/O registrov sú „správne“ a ktoré sú namapované na pamäť.

Bude tam niečo takéto:

; ***** DEFINÍCIE V/V REGISTRÁCIE ********************************************* ******** * ; POZNÁMKA: ; Definície označené "MEMORY MAPPED" sú rozšírené I/O porty; a nedá sa použiť s inštrukciami IN/OUT .equ UDR0 = 0xc6 ; MEMORY MAPPED .equ UBRR0L = 0xc4 ; MAPOVANÁ PAMÄŤ .eq UBRR0H = 0xc5 ; MEMORY MAPPED .equ UCSR0C = 0xc2 ; MEMORY MAPPED .equ UCSR0B = 0xc1 ; MEMORY MAPPED .equ UCSR0A = 0xc0 ; MAPOVANÁ PAMÄŤ bla bla bla a oveľa viac.equ OSCCAL = 0x66 ; MEMORY MAPPED .equ PRR = 0x64 ; MEMORY MAPPED .equ CLKPR = 0x61 ; MEMORY MAPPED .equ WDTCSR = 0x60 ; MEMORY MAPPED .equ SREG = 0x3f ;<------ А тут пошли обычные.equ SPL = 0x3d .equ SPH = 0x3e .equ SPMCSR = 0x37 .equ MCUCR = 0x35 .equ MCUSR = 0x34 .equ SMCR = 0x33 .equ ACSR = 0x30

Toto sú koláče.

A v tejto oblasti chápete, že veľký chlpatý orgán letí smerom k krížovej modelovej kompatibilite kódu montáže s cieľom tesne ho zakryť. Koniec koncov, jedna vec je opraviť všetky druhy definícií makier a definícií, ktoré popisujú registre, a druhá vec je sedieť a ako Popoluška oddeliť správne porty od tých nesprávnych.

Existuje však riešenie. Makrojazyk! Nepáči sa vám systém príkazov? Vytvorte si svoj vlastný s blackjackom a kurvami!
Postavme si vlastný tím UOUT, ako univerzálny OUT

Podobne pre príkaz IN Vo všeobecnosti môžete pomocou takýchto makier VEĽMI výrazne diverzifikovať assembler a premeniť ho na výkonný programovací jazyk, ktorý dokáže roztrhať všetky druhy C a Pascalu ako handru.

No, o čom hovorím... o RAM.

Takže sme vyriešili oslovovanie. Teraz už viete, kde hľadať adresy pamäte, kde začínajú bunky používateľskej pamäte RAM - v údajovom liste, časť Mapa pamäte. Ale tam pre referenciu vedieť.

A v našom kóde RAM začína direktívou.DSEG Pamätáte si našu šablónu?

Zahrnúť "m16def.inc" ; Používame ATMega16 ;= Start macro.inc =============================== ; Makrá tu;= Koniec macro.inc ================================== ; RAM =================================================== ============ .DSEG ; segment RAM; FLASH =================================================== ========== .CSEG ; Segment kódu; EEPROM ================================================== ======== .ESEG ; Segment EEPROM

Po .DSEG môžeme nastaviť naše premenné. A tu máme jednoducho prasknutie buniek – obsaďte ktorúkoľvek. Zadajte adresu a buďte šťastní. Ale prečo počítať adresy ručne? Tu nech sa zamyslí kompilátor.

Preto vezmeme a nastavíme štítok

0x0060 ## ;Premenné 0x0061 ## 0x0062 ## 0x0063 ## ;Premenné2 0x0064 ## 0x0065 ## ;Premenné4 by mohli začať tu

Ako ## ľubovoľný bajt. Štandardne FF. O nejakom typovaní premenných, prvotnej inicializácii, ovládaní pretečenia a iných buržoáznych radostiach sa samozrejme baviť netreba. Toto je Sparta! Teda assembler. Všetko ručne.
Ak nakreslíme analógiu s C, potom je to ako práca s pamäťou iba pomocou ukazovateľov prázdnoty. Šišnici pochopia. Pochopia a budú zhrození. Pretože tento svet je krutý a zradný. Trochu som zle vypočítal index a stratil som ďalšie údaje. A sakra, zachytíte túto chybu, ak sa okamžite nezobrazí.

Takže pozornosť, pozornosť a ešte raz pozornosť. Všetky operácie s pamäťou spúšťame prostredníctvom sledovania a nič nezlyhá ani nepretečie.

V dátovom segmente funguje aj direktíva .ORG, ktorá funguje úplne rovnako – prenáša adresy, v tomto prípade značky, odtiaľto na koniec pamäte. Len jedna jemnosť - ORG 0000 nám poskytne úplný začiatok pamäte RAM, a to je R0 a ďalšie registre. A nula kilometra pamäte RAM s použitím Mega16 ako príkladu poskytne ORG 0x0060. A v iných ovládačoch je nejaká iná hodnota. Je lenivé zakaždým prejsť datasheet, takže existuje taká definícia makra ako SRAM_START, ktorá označuje začiatok pamäte RAM pre konkrétny MK.

Ak teda chceme, aby začiatok pamäte RAM, povedzme 100 bajtov, zostal pod nejakou vyrovnávacou pamäťou na odpadky, potom urobíme tento trik.

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

DSEG .ORG SRAM_START+100 Premenné: .byte 3

Hotovo, vyčistili sme našu nárazníkovú zónu zo začiatku na 100.

Dobre, vyriešili sme adresu. Ako pracovať s pamäťovými bunkami? A na tieto účely existujú dve skupiny príkazov. LOAD a STORE sú najväčšou skupinou príkazov.

Faktom je, že s bunkou RAM sa nedá robiť nič iné, ako nahrať do nej bajt z RON, alebo z nej vyložiť bajt do RON.

Príkazy Store (ST**) sa zapisujú do pamäte RAM a príkazy Load (LD**) sa čítajú.

Čítanie prechádza do registra R16…R31 a adresa bunky je špecifikovaná buď priamo v príkaze. Tu je jednoduchý príklad. Existuje trojbajtová premenná Variables, treba ju zvýšiť o 1. To znamená. vykonať operáciu Variables++

Premenné DSEG: .byte 3 Premenné2: .byte 1 .CSEG ; Premenná je v pamäti; najprv ju musíte získať. LDS R16, premenné ; Prečítajte si prvý bajt premenných v R16 LDS R17, premenné+1; Prečítajte si druhý bajt premenných v R17 LDS R18, premenné+2; No, tretí bajt v R18; Teraz k tomu pridajme 1, pretože AVR nemôže sčítať s konštantou, iba; na odčítanie, musíte skresliť. Nespôsobuje však žiadne zvláštne problémy. SUBI R16,(-1); vo všeobecnosti je SUBI odčítanie, ale -(- dáva + SBCI R17,(-1) ; A tu sa berie do úvahy prevod. Ale o tom neskôr. SBCI R18,(-1) ; Matematika v assembleri je iný príbeh Premenné STS, R16 ; Uložte všetko tak, ako bolo. Premenné STS+1,R17 Premenné STS+2,R18

Alebo môžete použiť inú metódu. Nepriamy záznam cez indexový register.

Premenné DSEG: .byte 3 Premenné2: .byte 1 .CSEG ; Vezmite adresu našej premennej LDI YL,nízka(premenné) LDI YH,vysoká(premenné) ; Premenná je v pamäti; najprv ju musíte získať. LD R16, Y+; Prečítajte si prvý bajt premenných v R16 LD R17, Y+ ; Prečítajte si druhý bajt premenných v R17 LD R18, Y+ ; No, tretí bajt v R18; Teraz k tomu pridajme 1, pretože AVR nemôže sčítať s konštantou, iba; na odčítanie, musíte skresliť. Nespôsobuje však žiadne zvláštne problémy. SUBI R16,(-1); vlastne SUBI je odčítanie, ale -(- dáva + SBCI R17,(-1) ; A tu sa berie do úvahy prevod. Ale o tom neskôr. SBCI R18,(-1) ; Matematika v assembleri je iný príbeh ST -Y,R18 ; Všetko ponecháme tak, ako bolo. ST -Y,R17 ; Ale v opačnom poradí ST -Y,R16

Tu sa už používajú operácie s následným prírastkom a predbežným znížením. V prvom si najprv prečítame, potom k adrese pridáme 1. V druhom najprv od adresy odčítame 1 a potom uložíme.

Je vhodné použiť takéto inkrementálne príkazy na iteráciu cez polia v pamäti alebo tabuľkách.
A je tu aj nepriamy relatívny zápis/čítanie LDD/STD a ďalšie možnosti pre všetky tri typy indexov (X,Y,Z). Vo všeobecnosti fajčite údajový list a príkazový systém.

Stoh
Oh, zásobník je skvelá vec. Čo sa mi na tom páči, je, že prerušenie zásobníka zmení pracovný program na úplný chaos. Operácie so zásobníkom si totiž vyžadujú zvýšenú pozornosť, pretože ak sa zásobník niekde rozbije a nemôžete ho hneď sledovať, chytíte ho neskôr... Vo všeobecnosti je to krása, nie gýč.

Prečo ťa ľúbim? No, ak je C hlúpe remeslo, rýchle a efektívne, potom montáž je filigránskym umením. Ako maniaci ako Jim nitujú majstrovské diela z papiera a iba z papiera, hoci by sa zdalo, že si môžete kúpiť hotový prefabrikovaný model a lepidlo pre svoje vlastné potešenie. Takže aj tu - samotný proces je ohromujúci. Vrátane problémov s ladením :))))

Takže o stohu. Čo to je? A toto je oblasť pamäte. Funguje na princípe zásobníka. Tie. Poslednú, ktorú položil, zobral prvú.

Zásobník má ukazovateľ, ktorý ukazuje na vrch zásobníka. Za ukazovateľ zásobníka je zodpovedný špeciálny register SP, respektíve je to pár registrov SPL a SPH. Ale v mikrokontroléroch s malým množstvom pamäte RAM, napríklad v Tini2313, je iba SPL

Keď sa ovládač spustí, zvyčajne prvá vec, ktorú urobia, je inicializácia zásobníka, pričom do SP napíšu adresu jeho dna, odkiaľ bude rásť. Zvyčajne je to koniec pamäte RAM a rastie smerom k začiatku.

Toto sa robí takto, na samom začiatku programu:

1 2 3 4 5 LDI R16,Nízky (RAMEND) OUT SPL,R16 LDI R16,Vysoký (RAMEND) OUT SPH,R16

LDI R16,Nízky (RAMEND) OUT SPL,R16 LDI R16,Vysoký (RAMEND) OUT SPH,R16

Kde RAMEND je definícia makra označujúca koniec RAM v aktuálnom MK.

To je všetko, zásobník je pripravený na použitie. Údaje sa vložia do zásobníka pomocou príkazu PUSH Rn a získajú sa cez POP Rn.
Rn je ktorékoľvek z RON.

So zásobníkom fungujú aj príkazy CALL, RCALL, ICALL, RET, RETI a volanie prerušenia, ale o tom neskôr.

Poďme sa hrať so zásobníkom, aby sme cítili, ako funguje, aby sme pochopili, ako a kam sa pohybuje.

Zadajte nasledujúci kód do štúdia:

CSEG; Segment kódu LDI R16,Low(RAMEND) ; Inicializácia zásobníka OUT SPL,R16 LDI R16,High(RAMEND) OUT SPH,R16 LDI R17,0 ; Hodnoty načítania 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 ; Hodnoty vložíme na zásobník PUSH R18 PUSH R19 PUSH R20 PUSH R21 PUSH R22 PUSH R23 PUSH R24 PUSH R25 PUSH R26 POP R0 ; Pop hodnoty zo zásobníka POP R1 POP R2 POP R3 POP R4 POP R5 POP R6 POP R7 POP R8 POP R9

Teraz spustite štúdio krok za krokom a sledujte, ako sa SP mení. Stack Pointer môžete vidieť v štúdiu na rovnakom mieste ako Program Counter.

Najprv inicializujeme zásobník a načítame údaje do registrov. Výsledkom bude nasledujúci obrázok:

Ďalej pomocou príkazu POP načítame údaje zo zásobníka. Upozorňujeme, že nám nezáleží na tom, kam vložíme údaje do zásobníka a kde ich načítame. Hlavná vec je poradie inštalácie! Vložíme ho z vyšších registrov a dostaneme ho do nižších. Tým sa zvýši ukazovateľ zásobníka.

PUSH R16 PUSH R17 POP R16 POP R17

Napríklad o obmedzení nižších RON som už hovoril – neumožňujú vám napísať číslo priamo do seba. Len cez matriky seniorskej skupiny. Ale toto je nepohodlné!

Problém je vyriešený pomocou makra. Nazval som to LDIL - LDI low

MACRO LDIL PUSH R17; Uložme hodnotu jedného z vyšších registrov do zásobníka. LDI R17,1; Načítajme do nej našu okamžitú hodnotu MOV @0,R17; Prenesme hodnotu do registra nízkej skupiny. POP R17; Obnovme hodnotu najvyššieho registra zo zásobníka. .ENDM

Teraz môžete ľahko použiť náš domáci príkaz.

1 LDIL R0,18

Postupom času súbor s makrami získava takéto domáce príkazy a práca sa stáva jednoduchou a príjemnou.

Chyby zásobníka
Zásobník rastie smerom k dátam a teraz si predstavte, že máme v pamäti stavovú premennú a tá sa nachádza na adrese napríklad 0x0450. Nebezpečne blízko hornej časti zásobníka. Premenná ukladá napríklad stav konečného automatu, od ktorého závisí ďalšia logika programu. Povedzme, že ak sú 3, potom ideme robiť jednu vec, ak sú 4, potom niečo iné, ak je 5, potom niečo iné a tak ďalej až do 255 stavov. A podľa logiky práce by po 3 malo byť 4re, ale nie 10

A potom tam boli 3. A potom, v jednom hroznom momente, sa podmienky natoľko zhodovali, že stack narástol a jeho vrchol dosiahol túto premennú, zadal tam hodnotu, povedzme 20, a potom chrt spadol späť. Klasickým príkladom pretečenia zásobníka je zanechanie bahna. A logika programu sa kvôli tomu úplne zrútila.

Alebo opačný príklad - zásobník bol posunutý až k premenným, no v tom momente sa premenné aktualizovali a prepísali dáta zásobníka. V dôsledku toho sa zo zásobníka odstránilo niečo nesprávne (zvyčajne krivé návratové adresy) a program spadol. Táto možnosť je mimochodom oveľa neškodnejšia, pretože... v tomto prípade je zárubňa viditeľná okamžite a nevyskočí ZRAZ po bohvie ako dlho.

Okrem toho sa táto chyba môže objaviť a zmiznúť. V závislosti od toho, ako program funguje a ako hlboko načíta zásobník. Takýto problém je však bežnejší, keď píšete v C, kde nevidíte, ako aktívne prebieha práca so zásobníkom. Na ASMA je všetko oveľa transparentnejšie. A tu to môže vzniknúť v dôsledku úprimne pokriveného algoritmu.

Assembleri sa často stretávajú s inými chybami zásobníka. V prvom rade zábudlivosť. Niečo som vložil a zabudol som to vybrať. Ak bol problém v podprograme alebo prerušení, návratová adresa je skreslená (o tom trochu neskôr), zásobník sa odtrhne a program sa okamžite zrúti. Alebo nepozornosť – v jednej objednávke som údaje uložil a v inej som ich získal. Ojoj, obsah registrov bol vymenený.

Aby ste sa vyhli takýmto chybám, musíte v prvom rade monitorovať zásobník a po druhé správne naplánovať umiestnenie premenných v pamäti. Udržiavanie najkritickejších oblastí a premenných (ako sú stavové stroje alebo príznaky programovej logiky) ďalej od vrcholu zásobníka, bližšie k začiatku pamäte.

Niektorí ľudia si budú myslieť, že môžu vziať zásobník a umiestniť ho nie na samý koniec pamäte RAM, ale niekde bližšie, pričom za ním nechajú vrecko na kritické dáta. Nie je to dobrý nápad. Faktom je, že zásobník je možné tlačiť nadol pomocou príkazu PUSH a nahor pomocou príkazov POP. Druhý, aj keď sa to stáva oveľa menej často, pretože... Je to skôr hriech krivých rúk ako ťažkopádny algoritmus, ale aj to sa stáva.
Ale hlavná vec je, že samotný stoh je veľmi dôležitá štruktúra. Na ňom spočíva celý mechanizmus podprogramov a funkcií. Takže zlyhanie zásobníka je v každom prípade núdzová situácia.

Hromadné zvrátenosti
Moja obľúbená téma. =)))) Napriek tomu, že samotný ukazovateľ zásobníka sa počíta počas príkazov PUSH a POP, nikto nám nebráni v tom, aby sme ho vybrali z SP a použili jeho hodnoty na manuálny výpočet adresy ležiacich dát. zásobníka. Alebo opravte údaje zásobníka, ako chceme.
Prečo? No, veľa aplikácií nájdete, ak si napnete mozog a začnete myslieť mimo :))))

Okrem toho sa parametre prenášajú cez zásobník v klasickom jazyku C a Pascal na architektúre x86 a fungujú lokálne premenné. Tie. Pred volaním funkcie sa najprv všetky premenné vložia do zásobníka a potom, po zavolaní funkcie, sa do zásobníka vložia bajty budúcich lokálnych premenných.

Potom pomocou SP ako referenčného bodu môžeme s týmito premennými zaobchádzať, ako chceme. A keď sa zásobník uvoľní pomocou príkazu POP, budú zničené, čím sa uvoľní pamäť.

V AVR je všetko trochu iné (zrejme kvôli malému množstvu pamäte, kde sa nemôžete skutočne hrabať do zásobníka, ale je tam veľa RON), ale môžete tiež skúsiť použiť tento mechanizmus.

Pravda, toto už pripomína neurochirurgiu. Urobil som malú chybu a pacient je mŕtvy.

Vďaka stacku a RAM si vystačíte len s dvomi alebo tromi registrami, bez veľkého stresu z ich nedostatku.

Flash pamäť

Pamäť EEPROM je malá, len niekoľko bajtov a niekedy je potrebné uložiť veľa údajov, napríklad správu pre mimozemšťanov alebo tabuľku sínusov, aby ste nestrácali čas jej výpočtom. Nikdy neviete, čo je potrebné vopred uložiť do pamäte. Dáta teda môžu byť uložené v pamäti programu, v rovnakých kilobajtoch flash, aké má ovládač na doske.

Napíšeme si to, ale ako to môžeme získať? Ak to chcete urobiť, musíte tam najskôr niečo vložiť.
Pridajte preto na koniec programu v rámci segmentu .CSEG napríklad údaje štítok a za ním pomocou operátora .db zadajte svoje údaje.

Operátor DB znamená, že pre každú konštantu použijeme bajt. Existujú aj operátory, ktoré špecifikujú dvojbajtové konštanty DW (rovnako ako DD a DQ).

1 údaje: .db 12,34,45,23

údaje: .db 12,34,45,23

Teraz štítok s údajmi ukazuje na adresu prvého bajtu poľa, zostávajúce bajty sú umiestnené podľa posunu, jednoducho pripočítame jeden k adrese.

Jednou jemnosťou je, že kompilátor nahradí adresu značky a považuje ju za skokovú adresu pre počítadlo programu. A ak si pamätáte, adresuje dvojbajtové slová - koniec koncov, dĺžka príkazu môže byť 2 alebo 4 bajty.

A naše dáta sú bajt po byte a pri prístupe k nim ich radič rieši aj bajt po byte. Adresa v slovách je dvakrát menšia ako adresa v bajtoch a to treba brať do úvahy pri násobení adresy dvomi.

Na načítanie dát z programovej pamäte použite príkaz zo skupiny Načítať programovú pamäť

Napríklad LPM Rn,Z

Do registra Rn zapíše číslo z bunky, na ktorú ukazuje dvojica registrov Z. Pripomínam, že Z sú dva registre, R30 (ZL) a R31 (ZH). Dolný bajt adresy sa zadá do R30 a vysoký bajt do R31.

V kóde to vyzerá takto:

LDI ZL,low(data*2) ; Dolný bajt adresy zadáme do páru registrov Z LDI ZH,high(data*2) ; Vysoký bajt adresy zadáme do páru registrov Z; násobenie dvoma je spôsobené tým, že adresa je uvedená v; v dvojbajtových slovách, ale potrebujeme ich v bajtoch. ; Preto násobíme dvoma; Po načítaní adresy môžete načítať číslo z pamäte LPM R16, Z; v registri R16 po tomto príkaze bude číslo 12, ; prevzaté z pamäte programu. ; niekde na konci programu, ale v segmente údajov .CSEG: .db 12,34,45,23

Teraz, keď sme už oboznámení s niektorými možnosťami a funkciami mikrokontrolérov, prirodzene vyvstáva logická otázka: čo je potrebné na programovanie mikrokontrolérov? Aké programy a zariadenia sú potrebné a kde ich môžem získať?


Aby mikrokontrolér mohol riešiť problémy a vykonávať určité funkcie, musí byť naprogramovaný, to znamená, že musí byť do neho zapísaný program alebo programový kód.

Štruktúra a poradie písania programu

Po prvé, skôr ako začnete písať akýkoľvek program, alebo skôr programový kód, mali by ste jasne pochopiť, aké funkcie bude mikrokontrolér vykonávať. Preto musíte najprv určiť konečný cieľ programu. Keď je definovaný a úplne pochopený, potom je zostavený algoritmus pre program. Algoritmus je postupnosť vykonávania príkazov. Použitie algoritmov vám umožňuje jasnejšie štruktúrovať proces písania kódu a pri písaní zložitých programov vám často umožňuje skrátiť čas strávený ich vývojom a ladením.

Ďalším krokom po kompilácii algoritmu je priame písanie programového kódu. Programy pre mikrokontroléry sú napísané v jazyku Si alebo assembler . Only Assembly je skôr súbor inštrukcií ako programovací jazyk a je to nízkoúrovňový jazyk.


Programy budeme písať v C, čo je jazyk vysokej úrovne. Programy v C sa píšu oveľa rýchlejšie v porovnaní s podobnými programami v Assembly. Okrem toho sú všetky zložité programy napísané primárne v C.

Tu nebudeme porovnávať výhody a nevýhody písania programov v Assembly a C. Postupom času, keď ste získali nejaké skúsenosti s programovaním MK, vyvodíte pre seba užitočné závery.

Samotný programový kód je možné napísať v akomkoľvek štandardnom textovom editore, napríklad v programe Poznámkový blok. V praxi však používajú pohodlnejšie editory, o ktorých bude reč nižšie.

Kompilácia programu

C kód, ktorý sme napísali, ešte nie je pre mikrokontrolér zrozumiteľný, keďže MK rozumie príkazom iba v binárnom (alebo hexadecimálnom) systéme, čo je množina núl a jednotiek. Preto je potrebné kód C previesť na nuly a jednotky. Na tento účel sa používa špeciálny program, tzv kompilátor a samotný proces transformácia kódu sa nazýva kompilácia.

Na flashovanie firmvéru MK zariadenie tzv programátor. V závislosti od typu programátora je jeho vstup pripojený na COM alebo USB port a jeho výstup je pripojený k určitým pinom mikrokontroléra.


Existuje široký výber programátorov a vývojových dosiek, ale my sme celkom spokojní s tým najjednoduchším programátor, ktorý v Číne nestojí viac ako 3 doláre.


Po flashnutí mikrokontroléra sa program odladí a otestuje na reálnom zariadení alebo, ako sa tiež hovorí, na hardvéri.

Teraz si zhrňme kroky programovania mikrokontrolérov.


Pri písaní jednoduchých programov sa zaobídete bez druhého bodu, teda bez zostavovania algoritmu na papier, stačí si ho nechať v hlave.

Treba si uvedomiť, že ladenie a testovanie programu sa vykonáva aj pred flashovaním firmvéru MK.

Požadovaná sada programov

Existuje veľa užitočných a pohodlných programov na programovanie MK. Sú platené aj bezplatné. Medzi nimi sú tri hlavné:

1) Atmel Studio

2) CodeVisionAVR

3) WinAVR

Všetky tieto programy súvisia s IDEja integrovaný D rozvoj E nvironment – ​​integrované vývojové prostredie. Môžete v nich písať kód, kompilovať ho a ladiť.

Mali by ste venovať pozornosť Code Vision AVR. Toto IDE uľahčuje a zrýchľuje písanie kódu. Program je však platený.

V počiatočnej fáze programovania je lepšie písať všetky programy ručne, bez akýchkoľvek zjednodušení. To vám pomôže rýchlo získať potrebné zručnosti a v budúcnosti môžete dobre pochopiť a upraviť kódy napísané niekým iným tak, aby vyhovovali vašim potrebám. Preto odporúčam používať Atmel Studio. Po prvé je úplne zadarmo a neustále sa aktualizuje a po druhé ho vyvinula spoločnosť vyrábajúca mikrokontroléry, na ktorých sa naučíme programovať.

Ladenie firmvéru a programov

Budeme flashovať mikrokontroléry pomocou dodatočného programu.

Ak nie je k dispozícii mikrokontrolér, jeho činnosť je možné emulovať pomocou programu. Výrazne to zjednodušuje proces ladenia programu, aj keď máte mikrokontrolér, takže ho nemusíte často obnovovať, pretože každý mikrokontrolér má konečný počet prepisov, hoci tento počet je dosť veľký.

Pri blikaní a ladení MK je vhodné umiestniť ho na doštičku, nie je to však vôbec potrebné. Preto je pre väčšie pohodlie užitočná aj doska na chlieb. Dosky na chlieb je veľký výber, ale odporúčam zobrať tú, ktorá má čo najviac dier. Akonáhle začneme pripájať sedemsegmentové displeje, začnete oceňovať výhody väčších doštičiek.

Ďalším dôležitým prvkom, ktorý sa nám bude hodiť, je technická dokumentácia k MK, tzv dátový hárok. Vo všeobecnosti musíte stiahnuť údajový list pre mikrokontrolér ATmega8.

Kiselev Roman, máj 2007 Článok aktualizovaný 26. mája 2014

Čo je teda mikrokontrolér (ďalej len MK)? Relatívne povedané, ide o malý počítač umiestnený v jedinom integrovanom obvode. Má procesor (aritmetickú logickú jednotku alebo ALU), pamäť flash, pamäť EEPROM, množstvo registrov, vstupno-výstupné porty, ako aj ďalšie zvončeky a píšťalky, ako sú časovače, počítadlá, komparátory, USART atď. Po pripojení napájania , mikrokontrolér sa spustí a začne vykonávať program uložený v jeho flash pamäti. Zároveň dokáže ovládať širokú škálu externých zariadení cez I/O porty.

Čo to znamená? To znamená, že v MK môžete implementovať akýkoľvek logický obvod, ktorý bude vykonávať určité funkcie. To znamená, že MK je mikroobvod, ktorého vnútorný obsah si v skutočnosti vytvárame my sami. To umožňuje po zakúpení niekoľkých úplne identických MK zostaviť na nich úplne odlišné obvody a zariadenia. Ak chcete vykonať akékoľvek zmeny v prevádzke elektronického zariadenia, nebudete musieť použiť spájkovačku, budete musieť iba preprogramovať MK. V tomto prípade ho ani nemusíte odstraňovať zo svojho zariadenia, ak používate AVR, pretože tieto MK podporujú programovanie v obvode. Mikrokontroléry tak premosťujú priepasť medzi programovaním a elektronikou.

AVR sú 8-bitové mikrokontroléry, t.j. ich ALU dokáže vykonávať jednoduché operácie iba s 8-bitovými číslami v jednom hodinovom cykle. Teraz je čas povedať si, ktorý MK použijeme. Pracujem s ATMega16 MK. Je to veľmi bežné a dá sa kúpiť takmer v každom obchode s rádiovými súčiastkami za približne 100 rubľov. Ak ho nenájdete, môžete si kúpiť akýkoľvek iný MK zo série MEGA, ale v tomto prípade budete musieť k nemu hľadať dokumentáciu, pretože rovnaké „nohy“ rôznych MK môžu vykonávať rôzne funkcie a zdá sa, že ak sú všetky závery správne, môžete získať funkčné zariadenie alebo možno len oblak páchnuceho dymu. Pri kúpe ATMega16 si dajte pozor na to, aby bol vo veľkom 40-pinovom DIP balení a dokúpte si k nemu aj zásuvku, do ktorej sa dá zasunúť. Na prácu s ním budete potrebovať aj ďalšie zariadenia: LED diódy, tlačidlá, konektory atď.

ATMega16 má veľmi veľké množstvo rôznych funkcií. Tu sú niektoré z jeho charakteristík:

  • Maximálna hodinová frekvencia – 16 MHz (8 MHz pre ATMega16L)
  • Väčšina príkazov sa vykonáva v jednom hodinovom cykle
  • 32 8-bitových pracovných registrov
  • 4 plné 8-bitové I/O porty
  • dva 8-bitové časovače/počítače a jeden 16-bitový
  • 10-bitový analógovo-digitálny prevodník (ADC)
  • generátor vnútorných hodín na 1 MHz
  • analógový komparátor
  • rozhrania SPI, I2C, TWI, RS-232, JTAG
  • programovanie v obvode a samoprogramovanie
  • modul pulznej šírkovej modulácie (PWM).

Úplnú charakteristiku tohto zariadenia, ako aj návod na jeho použitie nájdete v referenčnej knihe (Datasheet) pre tento MK. Pravda, je v angličtine. Ak viete po anglicky, určite si stiahnite tento Datasheet, obsahuje množstvo užitočných informácií.

Poďme konečne k veci. K mikrokontroléru odporúčam vyrobiť špeciálnu vývojovú a ladiacu dosku, na ktorej bez spájkovačky (alebo takmer bez nej) zostavíte akýkoľvek elektrický obvod s mikrokontrolérom. Použitie takejto dosky výrazne uľahčí prácu s MK a urýchli proces učenia sa jej programovania. Vyzerá to takto:

Čo k tomu budete potrebovať?

Najprv budete potrebovať samotnú dosku. Kúpil som si hotový v obchode s rádiovými súčiastkami za 115 rubľov. Potom som naň priletoval všetky potrebné diely. Výsledkom je neuveriteľne pohodlná vec, na ktorú môžete zostaviť akýkoľvek elektrický obvod v priebehu niekoľkých minút pripojením káblov a inštaláciou mikroobvodov a indikátorov.

Na pripojenie prvkov obvodu je veľmi vhodné použiť káble s konektormi na koncoch. Tieto konektory sú umiestnené na „nohách“ vyčnievajúcich vedľa každého portu MK. Mikrokontrolér by mal byť nainštalovaný v zásuvke a nemal by byť pripájaný k doske, inak bude veľmi ťažké ho odstrániť, ak ho náhodou spálite. Nižšie je pinout ATMEGA16 MK:

Poďme si vysvetliť, ktoré nohy nás teraz zaujímajú.

  • VCC - napájanie je tu napájané (4,5 - 5,5 V) zo stabilizovaného zdroja
  • GND – zem
  • RESET – reset (pri nízkom napätí)
  • XTAL1, XTAL2 – je tu zapojený kremenný rezonátor
  • PA, PB, PC, PD – vstupné/výstupné porty (A, B, C a D).

Čokoľvek, čo produkuje 7-11 V DC, môže byť použité ako zdroj energie. Pre stabilnú prevádzku MK je potrebný stabilizovaný napájací zdroj. Ako stabilizátor môžete použiť mikroobvody série 7805. Jedná sa o lineárne integrované stabilizátory, ktorých vstup je napájaný 7-11 V jednosmerného nestabilizovaného prúdu a výstup je 5 V stabilizovaného prúdu. Pred a po 7805 je potrebné nainštalovať filtračné kondenzátory (elektrolytické na filtrovanie nízkofrekvenčného rušenia a keramické na vysokofrekvenčné). Ak nenájdete stabilizátor, potom môžete ako zdroj energie použiť batériu 4,5 V. MK musí byť napájaný priamo z nej.

Nižšie je schéma zapojenia MK:

Poďme teraz zistiť, čo je tu.

BQ1 je kremenný rezonátor, ktorý nastavuje pracovnú frekvenciu MK. Môžete si nastaviť ľubovoľné až do 16 MHz, ale keďže v budúcnosti plánujeme pracovať s COM portom, odporúčam použiť rezonátory pre frekvencie: 14,7456 MHz, 11,0592 MHz, 7,3725 MHz, 3,6864 MHz alebo 1 ,8432 MHz (neskôr bude jasné prečo). Použil som 11,0592 MHz. Je jasné, že čím vyššia frekvencia, tým vyššia rýchlosť zariadenia.

R1 je pull-up rezistor, ktorý udržuje napätie 5 V na vstupe RESET. Nízka úroveň napätia na tomto vstupe indikuje reset. Po resete sa MK nabootuje (10 - 15 ms) a znova spustí program. Keďže ide o vysokoimpedančný vstup, nemôžete ho nechať „visieť vo vzduchu“ - malý snímač na ňom povedie k neočakávanému resetu MK. Presne na to slúži R1. Pre spoľahlivosť tiež odporúčam nainštalovať kondenzátor C6 (nie viac ako 20 µF).

SB1 – tlačidlo reset.

Kremenný rezonátor a filtračný kondenzátor C3 by mali byť umiestnené čo najbližšie k MK (nie ďalej ako 5-7 cm), pretože inak môže dôjsť k rušeniu v drôtoch, čo vedie k poruchám MK.

Modrý obdĺžnik v diagrame znázorňuje samotný programátor. Je vhodné ho vyrobiť vo forme drôtu, ktorého jeden koniec je zapojený do portu LPT a druhý do určitého konektora vedľa MK. Drôt by nemal byť príliš dlhý. Ak sa vyskytnú problémy s týmto káblom (zvyčajne nie, ale môže sa stať čokoľvek), budete musieť prispájkovať adaptér Altera ByteBlaster. Ako to urobiť, je napísané v popise programátora AVReal.

Teraz, keď sme sa zaoberali hardvérom, je čas prejsť na softvér.

Existuje niekoľko vývojových prostredí pre programovanie AVR. Po prvé, toto je AVR Studio - oficiálny programovací systém od Atmel. Umožňuje vám písať v assembleri a ladiť programy napísané v assembleri, C a C++. IAR je komerčný programovací systém v C, C++ a assembleri. WinAVR je kompilátor s otvoreným zdrojom. AtmanAVR je programovací systém pre AVR s rozhraním takmer úplne rovnakým ako Visual C++ 6. AtmanAVR umožňuje aj ladenie programov a obsahuje mnoho pomocných funkcií, ktoré uľahčujú písanie kódu. Tento programovací systém je komerčný, ale podľa licencie ho môžete mesiac používať zadarmo.

Navrhujem začať pracovať s IAR ako s najtransparentnejším vývojovým prostredím. V IAR je projekt vytvorený výlučne ručne, preto po dokončení niekoľkých projektov už budete jasne vedieť, čo každý riadok kódu znamená a čo sa stane, ak ho zmeníte. Pri práci s AtmanAVR budete musieť buď použiť vopred vytvorenú šablónu, ktorá je pre človeka bez skúseností veľmi ťažkopádna a ťažko pochopiteľná, alebo budete mať veľa problémov s hlavičkovými súbormi pri zostavovaní projektu od začiatku. Keď sme sa zaoberali IAR, následne sa pozrieme na ďalšie kompilátory.

Najprv si teda zožeňte IAR. Je to veľmi bežné a nájsť ho by nemal byť problém. Po stiahnutí IAR 3.20 odniekiaľ nainštalujte kompilátor/pracovné prostredie a spustite ho. Po tomto môžete začať pracovať.

Po spustení IAR vyberte súbor/nový/pracovný priestor, vyberte cestu k nášmu projektu a vytvorte preň priečinok a pomenujte ho, napríklad „Prog1“. Teraz vytvoríme projekt: Projekt / Vytvoriť nový projekt… Nazvime to aj „Prog1“. Kliknite pravým tlačidlom myši na názov projektu v strome projektu a vyberte „Možnosti“

Tu nakonfigurujeme kompilátor pre konkrétny MK. Najprv je potrebné vybrať typ procesora ATMega16 na záložke Target, zaškrtnúť políčko Enable bit definitions in I/O-include files na záložke Library Configuration (aby ste mohli v kóde programu použiť názvy bitov rôznych registrov MK ) a vyberte tam typ knižnice C /EU++. V kategórii ICCAVR je potrebné zaškrtnúť políčko Povoliť viacbajtovú podporu na karte Jazyk a vypnúť optimalizáciu na karte Optimalizácia (inak to zničí náš prvý program).

Ďalej vyberte kategóriu XLINK. Tu musíte určiť formát kompilovaného súboru. Keďže teraz nastavujeme možnosti pre režim ladenia, ako je popísané v nadpise, potrebujeme získať ladiaci súbor ako výstup. Neskôr ho otvoríme v AVR Studio. Ak to chcete urobiť, musíte vybrať príponu.cof a typ súboru je ubrof 7.

Teraz kliknite na tlačidlo OK a potom zmeňte možnosť Debug na Release.

Znova prejdite na Možnosti, kde sú všetky parametre okrem XLINK nastavené na rovnaké. V XLINK zmeňte príponu na .hex a formát súboru na intel-standart.

To je všetko. Teraz môžete začať písať svoj prvý program. Vytvorte nový zdroj/text a zadajte doň nasledujúci kód:

#include"iom16.h" skratka unsigned int i; neplatné Hlavná( neplatné) (DDRB = 255; PORTB = 0; zatiaľ čo(1) { ak(PORTB == 255) PORTB = 0; inak PORTB++; pre(i=0; i

V priečinku sa nachádza súbor „iom16.h“. (C:\Program Files)\IAR Systems\Embedded Workbench 3.2\avr\inc. Ak používate iný MK, napríklad ATMega64, vyberte súbor „iom64.h“. Tieto hlavičkové súbory uchovávajú informácie o MK: názvy registrov, bity v registroch a názvy prerušení. Každý jednotlivý kolík portu A, B, C alebo D môže fungovať buď ako vstup, alebo ako výstup. To určuje register smerovania údajov (DDR). 1 robí nohu výstupom, 0 vstupom. Takže nastavením napríklad DDRA = 13 vytvoríme „nohy“ PB0, PB2, PB3 výstupy, zvyšok - vstupy, pretože 13 v binárnom systéme je 00001101.

PORTB je register, ktorý určuje stav pinov portu. Keď tam napíšeme 0, nastavíme napätie na všetkých výstupoch na 0 V. Potom je tu nekonečná slučka. Pri programovaní MK vždy robia nekonečnú slučku, v ktorej MK vykonáva nejakú akciu, kým sa neresetuje alebo kým nedôjde k prerušeniu. V tomto cykle píšu akoby „kód na pozadí“, ktorý MK vykoná ako poslednú vec. Môže to byť napríklad zobrazovanie informácií na displeji. V našom prípade sa obsah registra PORTB zväčšuje až do jeho naplnenia. Potom sa všetko začína odznova. Nakoniec desaťtisíc cyklov za slučku. Je potrebné vytvoriť viditeľné oneskorenie pri prepínaní stavu portu B.



Teraz tento súbor uložíme do priečinka projektu ako Prog1.c, skopírujeme súbor iom16.h do priečinka projektu, vyberieme Project/Add Files a pridáme „iom16.h“ a „Prog1.c“. Vyberte Release, stlačte F7, program sa skompiluje a mala by sa zobraziť správa:


Celkový počet chýb: 0
Celkový počet upozornení: 0

Tu je fotka môjho programátora:

Stiahnite si programátor AVReal. Skopírujte ho (AVReal32.exe) do priečinka Release/exe, kde by sa mal nachádzať súbor Prog1.hex. Napájame MK, pripojíme programovací kábel. Otvorte Far Manager (najpohodlnejšie je flashovať MK), prejdite do tohto priečinka, stlačte Ctrl+O. Kedze mame uplne novu MK, napchame

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

Ak nepoužívate 11059200 Hz, nezabudnite zadať správnu frekvenciu! Zároveň tzv poistky – registre, ktoré riadia jeho činnosť (použitie interného generátora, Jtag a pod.). Potom je pripravený na príjem prvého programu. Programátor dostane ako parametre použitý LPT port, frekvenciu, názov súboru a iné (všetky sú uvedené v popise AVReal). Voláme:

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

Ak je pripojenie správne, programátor oznámi úspešné naprogramovanie. Neexistuje žiadna záruka, že to bude fungovať prvýkrát (pri prvom zavolaní programu). Ja sám sa niekedy nechám naprogramovať druhýkrát. Možno je port LPT chybný alebo je v kábli rušenie. Ak sa vyskytnú problémy, dôkladne skontrolujte kábel. Z vlastnej skúsenosti viem, že 60% porúch je spojených s nedostatkom kontaktu na správnom mieste, 20% s prítomnosťou zbytočného a ďalších 15% s chybným prispájkovaním nesprávnej veci na nesprávnu vec. Ak všetko ostatné zlyhá, prečítajte si popis programátora a skúste zostaviť Byte Blaster.

Predpokladajme, že všetko funguje pre vás. Ak teraz pripojíte osem LED k portu B MK (urobte to s vypnutým MK a je vhodné zapojiť 300-400 Ohm odpory do série s LED) a pripojíte napájanie, stane sa malý zázrak – „ vlna“ prebehne cez ne!

© Kiselev Roman
máj 2007

decembra 2015

1. Výhody navrhovanej metódy

Obvody zariadení založené na mikrokontroléroch (MCU) sa zvyčajne vyznačujú kombináciou dvoch ťažko kombinovateľných vlastností: maximálnej jednoduchosti a vysokej funkčnosti. Funkcionalitu je navyše možné v budúcnosti meniť a rozširovať bez akýchkoľvek zmien v obvode – len výmenou programu (blikaním). Tieto vlastnosti sú vysvetlené skutočnosťou, že tvorcovia moderných mikrokontrolérov sa snažili umiestniť na jeden čip všetko, čo by vývojár elektronického zariadenia mohol potrebovať - ​​aspoň čo najviac. V dôsledku toho došlo k presunu dôrazu od obvodov a inštalácie k softvéru. S použitím MK je teraz menej potrebné „zaťažovať“ obvod časťami a existuje menej spojení medzi komponentmi. To samozrejme robí obvod atraktívnejším pre opakovanie skúsenými aj začínajúcimi elektrotechnikmi. Ale ako to už býva, za všetko treba platiť. Ani toto sa nezaobišlo bez ťažkostí. Ak si kúpite nový MK, nainštalujete ho do obvodu správne zostaveného z opraviteľných častí a použijete napájanie, potom nič nebude fungovať - ​​zariadenie nebude fungovať. Mikrokontrolér potrebuje program.

Zdá sa, že aj s tým je všetko jednoduché - na internete nájdete veľa schém s bezplatným firmvérom. Ale je tu jeden háčik: firmvér musí byť nejakým spôsobom „nahraný“ do mikrokontroléra. Pre niekoho, kto to nikdy predtým nerobil, sa takáto úloha často stáva problémom a hlavným odpudzujúcim faktorom, ktorý ich často núti opustiť potešenie z používania MK a hľadať schémy založené na „voľnej“ a rigidnej logike. Všetko ale nie je také zložité, ako by sa na prvý pohľad mohlo zdať.

Po analýze publikácií na internete môžete vidieť, že tento problém sa najčastejšie rieši jedným z dvoch spôsobov: nákupom hotového programátora alebo výrobou domáceho. Zároveň sú publikované obvody domácich programátorov veľmi často neprimerane zložité - oveľa zložitejšie, ako je skutočne potrebné. Samozrejme, ak plánujete flashovať MK každý deň, je lepšie mať „cool“ programátora. Ak sa však potreba takéhoto postupu z času na čas vyskytne len zriedka, môžete sa úplne zaobísť bez programátora. Nie, samozrejme, nehovoríme o tom, že by sme sa to mali naučiť so silou myšlienky. To znamená, že ak pochopíme, ako programátor interaguje s mikrokontrolérom pri zapisovaní a čítaní informácií v jeho programovacom režime, vystačíme si s dostupnými nástrojmi na širší účel. Tieto nástroje budú musieť nahradiť softvérové ​​aj hardvérové ​​časti programátora. Hardvér musí zabezpečiť fyzické pripojenie k mikroobvodu MK, možnosť aplikovať logické úrovne na jeho vstupy a čítať dáta z jeho výstupov. Softvérová časť musí zabezpečiť fungovanie algoritmu, ktorý riadi všetky potrebné procesy. Upozorňujeme tiež, že kvalita zaznamenávania informácií v MK nezávisí od toho, aký je váš programátor „v pohode“. Neexistuje nič také ako „lepšie zaznamenané“ alebo „horšie“. Existujú iba dve možnosti: „registrovaný“ a „neregistrovaný“. Vysvetľuje to skutočnosť, že proces nahrávania vo vnútri kryštálu je priamo riadený samotným MK. Stačí mu poskytnúť vysokokvalitné napájanie (bez rušenia alebo zvlnenia) a správne usporiadať rozhranie. Ak výsledky testovacieho čítania neodhalia žiadne chyby, potom je všetko v poriadku - ovládač môžete použiť na určený účel.

Aby sme mohli napísať program do MK bez programátora, potrebujeme prevodník portov USB-RS232TTL a tiež. Prevodník USB-RS232TTL umožňuje použiť port USB na vytvorenie portu COM, ktorý sa od „skutočného“ líši len tým, že jeho vstupy a výstupy používajú logické úrovne TTL, teda napätie v rozsahu od 0 do 5 voltov ( viac si môžete prečítať v článku " "). V každom prípade je vhodné mať takýto prevodník vo vašej „domácnosti“, takže ak ho ešte nemáte, určite sa oplatí kúpiť. Čo sa týka logických úrovní, v našom prípade je TTL dokonca výhodou oproti bežnému COM portu, pretože na vstupy a výstupy takéhoto portu je možné priamo pripojiť akýkoľvek mikrokontrolér napájaný 5 V vrátane ATtiny a ATmega. Ale neskúšajte použiť bežný COM port - používajú napätie v rozsahu od -12 do +12 V (alebo -15...+15V). V tomto prípade je priame pripojenie k mikrokontroléru neprípustné!!!

Myšlienka vytvorenia skriptu pre program Perpetuum M, ktorý implementuje funkcie programátora, vznikla po prečítaní množstva publikácií na internete ponúkajúcich určité riešenia pre firmvér MK. V každom prípade boli zistené závažné nedostatky alebo nadmerné ťažkosti. Často som sa stretol s programátorskými obvodmi, ktoré obsahovali mikrokontrolér, a zároveň sa dávali celkom vážne rady ako: „...a na naprogramovanie mikrokontroléra pre tohto programátora budeme potrebovať... je to tak – iného programátora!“ Ďalej bolo navrhnuté ísť za priateľom, hľadať platenú službu atď. Kvalita softvéru distribuovaného v sieti na tieto účely tiež nebola pôsobivá - bolo zaznamenaných veľa problémov s funkčnosťou aj s „zakalením“ používateľského rozhrania. Často trvá veľa času, kým pochopíte, ako používať program - musíte ho študovať aj na vykonávanie najjednoduchších akcií. Iný program dokáže niečo robiť dlho a usilovne, ale že sa do MK nič nezapisuje, sa používateľ dozvie až po kompletnom dokončení celého firmvéru a následnom testovacom načítaní. Vyskytuje sa aj nasledujúci problém: používateľ sa pokúša vybrať svoj MK zo zoznamu podporovaných kryštálov, ale v zozname sa nenachádza. V tomto prípade nebudete môcť program používať - ​​zaradenie do zoznamu chýbajúcich MK sa spravidla neposkytuje. Ručný výber ovládača zo zoznamu navyše vyzerá zvláštne, ak vezmeme do úvahy, že programátor v mnohých prípadoch dokáže sám určiť typ MK. To všetko nie je povedané, aby sme hádzali blato na existujúce produkty, ale aby vysvetlili dôvod vzhľadu skriptu pre program Perpetuum M, ktorý je opísaný v tomto článku. Problém skutočne existuje a týka sa predovšetkým začiatočníkov, ktorým sa nie vždy podarí prekonať túto „stenu“, aby urobili prvý krok do sveta mikrokontrolérov. Navrhovaný skript zohľadňuje nedostatky zistené v iných programoch. Bola implementovaná maximálna „transparentnosť“ fungovania algoritmu, extrémne jednoduché používateľské rozhranie, ktoré nevyžaduje učenie a nenecháva žiadnu šancu zmiasť sa a „kliknúť na nesprávnu vec“. Ak požadovaný MK nie je medzi podporovanými, môžete jeho popis pridať sami, pričom potrebné údaje prevezmete z dokumentácie stiahnutej z webovej stránky vývojára MK. A čo je najdôležitejšie, scenár je otvorený na štúdium a úpravu. Ktokoľvek si ho môže otvoriť v textovom editore, študovať a upravovať podľa vlastného uváženia, meniť existujúce funkcie podľa svojho vkusu a dopĺňať chýbajúce.

Prvá verzia scenára vznikla v júni 2015. Táto verzia poskytuje podporu len pre mikrokontroléry radu ATtiny a ATmega od Atmel s funkciami pre zápis/čítanie flash pamäte, nastavenie konfiguračných bitov a automatickú detekciu typu radiča Zápis a čítanie EEPROM nie je implementované Plánovalo sa doplniť funkcionalitu skriptu : pridanie zápisu a čítania EEPROM, implementácia podpory pre PIC radiče atď. Z tohto dôvodu skript ešte nebol zverejnený, ale kvôli nedostatku času sa implementácia plánu oneskorila a tak sa nestalo, nepriateľa dobra, bolo rozhodnuté zverejniť existujúcu verziu. Ak vám už implementované funkcie nebudú stačiť, neznepokojujte sa. V takom prípade sa môžete pokúsiť pridať požadovanú funkciu sami. Nebudem skrývať: Myšlienka vytvorenia tohto skriptu má spočiatku aj vzdelávací význam. Po pochopení algoritmu a pridaní niečoho vlastného k nemu budete môcť lepšie pochopiť fungovanie MK v programovacom režime, takže v v budúcnosti sa neocitnete v pozícii dievčaťa pred pokazeným autom, ktoré sa zamyslene pozerá do jeho vnútra a nechápe, prečo to „nefunguje“.

2. Rozhranie MK v režime programovania

Existuje niekoľko rôznych spôsobov, ako uviesť regulátor do programovacieho režimu a pracovať s ním v tomto režime. Najjednoduchšie implementovateľné pre ovládače série ATtiny a ATmega je možno SPI. My to využijeme.

Ale predtým, ako začneme zvažovať signály potrebné na generovanie SPI, urobíme niekoľko výhrad. Mikrokontrolér má konfiguračné bity. Sú to niečo ako prepínacie spínače, ktoré umožňujú meniť niektoré vlastnosti mikroobvodu v súlade s potrebami projektu. Fyzicky ide o energeticky nezávislé pamäťové bunky, ako sú tie, do ktorých je zapísaný program. Rozdiel je v tom, že je ich veľmi málo (do troch bajtov pre ATmega) a nie sú súčasťou adresného priestoru žiadnej pamäte. Zápis a čítanie konfiguračných údajov sa vykonáva samostatnými príkazmi v režime programovania MK. Teraz je dôležité poznamenať, že niektoré konfiguračné bity ovplyvňujú samotnú schopnosť používať SPI. Pri niektorých ich hodnotách sa môže ukázať, že SPI nemožno použiť. Ak narazíte na takýto mikrokontrolér, metóda navrhovaná v tomto článku vám nepomôže. V tomto prípade budete musieť buď zmeniť nastavenia konfiguračných bitov v programátore, ktorý podporuje iný programovací režim, alebo použiť iný mikrokontrolér. Tento problém sa však týka len použitých MK, prípadne tých, s ktorými sa už niekto neúspešne „pohral“. Faktom je, že nové MCU prichádzajú s nastaveniami konfiguračných bitov, ktoré nebránia použitiu SPI. Potvrdzujú to výsledky testovania skriptu programátora pre program Perpetuum M, počas ktorého boli úspešne flashované štyri rôzne MK (ATmega8, ATmega128, ATtiny13, ATtiny44). Všetky boli nové. Počiatočné nastavenie konfiguračných bitov bolo v súlade s dokumentáciou a nezasahovalo do používania SPI.

Vzhľadom na vyššie uvedené by ste mali venovať pozornosť nasledujúcim častiam. Bit SPIEN explicitne povoľuje alebo zakazuje použitie SPI, preto v našom prípade musí byť jeho hodnota povolená. Bit RSTDISBL je schopný zmeniť jeden z výstupov mikroobvodu (vopred určený) na vstup signálu „reset“, alebo ho nezapnúť (v závislosti od hodnoty zapísanej do tohto bitu). V našom prípade je nutný vstup „reset“ (ak chýba, nebude možné prepnúť MK do programovacieho režimu cez SPI). Existujú aj bity skupiny CKSEL, ktoré špecifikujú zdroj hodinového signálu. Nebránia použitiu SPI, ale treba ich mať aj na zreteli, pretože ak nebudú vôbec žiadne hodinové impulzy, alebo bude ich frekvencia nižšia ako prijateľná pre danú rýchlosť SPI, tiež sa nič dobré nestane. Nové MCU, ktoré majú interný RC oscilátor, majú zvyčajne bity skupiny CKSEL nakonfigurované tak, aby ho používali. To nám celkom vyhovuje – taktovanie je zabezpečené bez akejkoľvek ďalšej námahy z našej strany. Nie je potrebné spájkovať kremenný rezonátor ani pripájať externý generátor. Ak uvedené bity obsahujú iné nastavenie, budete sa musieť postarať o taktovanie v súlade s nastavením. V tomto prípade môže byť potrebné pripojiť k MCU kremenný rezonátor alebo externý generátor hodín. Ale v tomto článku nebudeme uvažovať o tom, ako sa to robí. Príklady pripojenia MK na programovanie uvedené v tomto článku sú navrhnuté pre najjednoduchší prípad.

Ryža. 1. Výmena dát cez SPI v programovacom režime

Teraz prejdime na obrázok 1, prevzatý z dokumentácie pre ATmega128A MK. Zobrazuje proces prenosu jedného bajtu do MK a súčasného príjmu jedného bajtu z MK. Oba tieto procesy, ako vidíme, používajú rovnaké hodinové impulzy dodávané z programátora do mikrokontroléra na jeho vstupe SCK - jeden z kolíkov mikroobvodu, ktorému je takáto úloha priradená v režime programovania SPI. Ďalšie dve signálové linky zabezpečujú príjem a prenos dát jeden bit za cyklus hodín. Cez vstup MOSI dáta vstupujú do mikrokontroléra a načítané dáta sa preberajú z MISO výstupu. Všimnite si dve bodkované čiary nakreslené od SCK po MISO a MOSI. Ukazujú, v akom momente mikrokontrolér „zhltne“ dátový bit nastavený na MOSI vstupe a v ktorom momente sám nastaví svoj vlastný dátový bit na MISO výstup. Všetko je celkom jednoduché. Ale aby sme vstúpili do MK do programovacieho režimu, potrebujeme ešte signál RESET. Nezabudnime ani na bežný vodič GND a napájanie VCC. Celkovo sa ukazuje, že k mikrokontroléru je potrebné pripojiť iba 6 vodičov na flashovanie jeho firmvéru cez SPI. Nižšie to rozoberieme podrobnejšie, zatiaľ však dodáme, že výmena dát s MK v programovacom režime cez SPI prebieha v paketoch po 4 bajtoch. Prvý bajt každého paketu je v podstate celý venovaný kódovaniu inštrukcie. Druhý bajt, v závislosti od prvého, môže byť pokračovaním kódu príkazu alebo časťou adresy, alebo môže mať ľubovoľnú hodnotu. Tretí bajt sa používa predovšetkým na prenos adries, ale v mnohých inštrukciách môže mať ľubovoľnú hodnotu. Štvrtý bajt zvyčajne prenáša dáta alebo má ľubovoľnú hodnotu. Súčasne s prenosom štvrtého bajtu prijímajú niektoré príkazy dáta prichádzajúce z mikrokontroléra. Podrobnosti o každom príkaze nájdete v dokumentácii kontroléra v tabuľke s názvom "SPI Serial Programming Instruction Set". Zatiaľ len poznamenávame, že celá výmena s radičom je postavená zo sekvencie 32-bitových paketov, v každom z nich sa neprenáša viac ako jeden bajt užitočných informácií. To nie je veľmi optimálne, ale celkovo to funguje dobre.

3. Pripojenie MK pre programovanie

Aby sa zabezpečilo, že všetky potrebné signály sú dodávané na vstupy mikrokontroléra na organizáciu rozhrania SPI a čítanie údajov z jeho výstupu MISO, nie je potrebné vytvárať programátor. To sa dá jednoducho urobiť pomocou najbežnejšieho prevodníka USB-RS232TTL.

Na internete často nájdete informácie, že takéto prevodníky sú podradné a že sa s nimi nedá nič vážne robiť. Ale vzhľadom na väčšinu modelov konvertorov je tento názor nesprávny. Áno, v predaji sú prevodníky, ktoré nemajú k dispozícii všetky vstupy a výstupy v porovnaní so štandardným COM portom (napríklad len TXD a RXD), pričom majú neoddeliteľnú konštrukciu (mikroobvod je vyplnený plastom - je nemožno dosiahnuť jeho kolíky). Ale tieto sa neoplatí kupovať. V niektorých prípadoch môžete získať chýbajúce vstupy a výstupy portov prispájkovaním vodičov priamo na čip. Príklad takéhoto „vylepšeného“ prevodníka je znázornený na obrázku 2 (čip PL-2303 - viac podrobností o účele jeho kolíkov v článku „“). Jedná sa o jeden z najlacnejších modelov, ale pri použití v domácich dizajnoch má svoje vlastné výhody. Rozšírené sú aj plnohodnotné adaptérové ​​káble so štandardným deväťkolíkovým konektorom na konci ako COM port. Od bežného COM portu sa líšia iba úrovňami TTL a nekompatibilitou so starším softvérom a niektorým starším hardvérom. Dá sa tiež poznamenať, že šnúry na čipe CH34x sa v rôznych extrémnych testoch ukazujú ako oveľa spoľahlivejšie a stabilnejšie v porovnaní s prevodníkmi na PL-2303. Pri bežnom používaní však rozdiel nie je badateľný.

Pri výbere prevodníka USB-RS232TTL by ste mali venovať pozornosť aj kompatibilite jeho ovládača s verziou operačného systému, ktorý používate.

Pozrime sa bližšie na princíp prepojenia mikrokontroléra a prevodníka USB-RS232TTL na príklade štyroch rôznych modelov MK: ATtiny13, ATtiny44, ATmega8 a ATmega128. Obrázok 3 zobrazuje všeobecný diagram takéhoto spojenia. Možno vás prekvapí, že signály RS232 (RTS, TXD, DTR a CTS) sa používajú nevhodne. Ale nebojte sa: program Perpetuum M s nimi dokáže pracovať priamo - nastavovať výstupné hodnoty a čítať stavy vstupov. Každopádne, široko používané prevodníky USB-RS232TTL na čipoch CH34x a PL-2303 túto schopnosť poskytujú – je to overené. Problémy by nemali byť ani s inými populárnymi prevodníkmi, keďže na prístup k portu sa používajú štandardné funkcie Windows.

Rezistory zobrazené vo všeobecnom diagrame sa v zásade nedajú nainštalovať, ale stále je lepšie ich nainštalovať. Aký je ich účel? Použitím TTL vstupov a výstupov prevodníka a päťvoltového napájania mikrokontroléra sa tým zbavíme potreby koordinovať logické úrovne - všetko je už celkom správne. To znamená, že prepojenia môžu byť priame. Ale pri experimentoch , stať sa môže všeličo.Napríklad podľa zákona podlosti môže skrutkovač spadnúť práve na miesto,kde spadnúť nemohol a skratovať niečo,čo v žiadnom prípade skratovať nesmie.Samozrejme,čokoľvek sa ukáže ako „skrutkovač". Rezistory v tomto prípade niekedy znižujú následky. jedným z ich účelov je eliminovať možný konflikt výstupov. Faktom je, že po dokončení programovania prejde mikrokontrolér do normálneho prevádzkového režimu a môže sa stane, že jeho pin pripojený na výstup prevodníka (RTS, TXD alebo DTR) sa podľa programu práve zaznamenaného v MK stane aj výstupom, v tomto prípade bude veľmi zlé, ak sa dva priamo spojené výstupy „pobijú“ - skúste nastaviť rôzne logické úrovne. V takomto „boji“ môže niekto „prehrať“, ale to nechceme.

Hodnoty troch rezistorov sú zvolené na úrovni 4,3 KOhm. To platí pre spojenia medzi výstupom prevodníka a vstupom mikrokontroléra. Na presnosti rezistorov nezáleží: ich odpor môžete znížiť na 1 KOhm alebo zvýšiť na 10 KOhm (ale v druhom prípade sa riziko rušenia zvyšuje pri použití dlhých drôtov na ceste k MK). Čo sa týka prepojenia medzi vstupom prevodníka (CTS) a výstupom mikrokontroléra (MISO), tu je použitý 100 Ohmový odpor. To sa vysvetľuje zvláštnosťami vstupu použitého meniča. Počas testov bol na mikroobvode PL-2303 použitý prevodník, ktorého vstupy sú zjavne pripojené k kladnému napájaciemu zdroju s relatívne nízkym odporom (rádovo niekoľko stoviek ohmov). Aby som „prelomil pull-up“, musel som nainštalovať odpor s takým malým odporom. Nemusíte ho však vôbec inštalovať. Na prevodníku je to vždy vstup. Nemôže sa stať východiskom, čo znamená, že v žiadnom vývoji udalostí nedôjde ku konfliktu východov.

Ak má čip samostatný kolík AVCC na napájanie analógovo-digitálneho prevodníka (napríklad ATmega8 alebo ATmega128), mal by byť pripojený k spoločnému napájaciemu kolíku VCC. Niektoré integrované obvody majú viac ako jeden napájací kolík VCC alebo viac ako jeden GND. Napríklad ATmega128 má 3 piny GND a 2 piny VCC. V trvalom prevedení je lepšie navzájom spájať kolíky s rovnakým názvom. V našom prípade môžete pri programovaní použiť každý jeden pin VCC a GND.

A takto vyzerá pripojenie ATtiny13. Obrázok ukazuje priradenia pinov používané pri programovaní cez SPI. Vedľa fotky je ako vyzerá dočasné spojenie v skutočnosti.


Niekto môže povedať, že to nie je vážne - pripojenia na kabeláž. Ale ty a ja sme rozumní ľudia. Naším cieľom je naprogramovať mikrokontrolér, venovať mu minimum času a iných prostriedkov a nie sa pred niekým predvádzať. Kvalita tým neutrpí. Metóda „na drôtoch“ je v tomto prípade celkom efektívna a opodstatnená. Flashovanie firmvéru ovládača je jednorazový postup, takže nemá zmysel ho prekrývať kamienkami. Ak sa v budúcnosti plánuje zmeniť firmvér bez odstránenia ovládača z okruhu (v hotovom výrobku), berie sa to do úvahy pri inštalácii pri výrobe zariadenia. Väčšinou sa na tento účel inštaluje konektor (RESET, SCK, MOSI, MISO, GND) a MK je možné flashovať aj po inštalácii na dosku. Ale to sú kreatívne potešenia. Zvažujeme najjednoduchší prípad.

Teraz prejdime k ATtiny44 MK. Všetko je tu takmer rovnaké. Na základe nákresu a fotografie nebude mať ani začiatočník problém zistiť spojenie. Rovnako ako ATtiny44, môžete pripojiť mikrokontroléry ATtiny24 a ATtiny84 - priradenie pinov pre tieto tri je rovnaké.


Ďalším príkladom dočasného pripojenia ovládača na jeho programovanie je ATmega8. Je tu viac kolíkov, ale princíp je rovnaký - niekoľko drôtov a teraz je ovládač pripravený do neho „vyplniť“ informácie. Extra čierny drôt na fotografii pochádzajúci z kolíka 13 sa nezúčastňuje programovania. Je navrhnutý tak, aby z neho odstránil zvukový signál potom, čo MK opustí programovací režim. Dôvodom je skutočnosť, že počas ladenia skriptu pre "Perpetuum M" bol program hudobnej skrinky stiahnutý do MK.


Jeden ovládač je často dostupný v rôznych krytoch. V tomto prípade je priradenie kolíkov pre každý prípad rozdelené inak. Ak kryt vášho ovládača nie je podobný tomu, ktorý je znázornený na obrázku, skontrolujte účel kolíkov v technickej dokumentácii, ktorú si môžete stiahnuť z webovej stránky vývojára MK.

Na dokončenie obrázku sa pozrime na pripojenie mikroobvodu MK s veľkým počtom "nohičiek". Účel extra čierneho drôtu na fotografii vychádzajúceho z kolíka 15 je presne rovnaký ako v prípade ATmega8.


Pravdepodobne ste už presvedčení, že všetko je celkom jednoduché. Každý, kto vie, ako spočítať kolíky mikroobvodov (od značky v kruhu proti smeru hodinových ručičiek), príde na to. A nezabudnite na presnosť. Mikroobvody milujú úhľadných ľudí a neodpúšťajú neopatrné zaobchádzanie.

Pred prechodom na softvérovú časť sa uistite, že je správne nainštalovaný ovládač prevodníka USB-RS232TTL (skontrolujte Správcu zariadení Windows). Zapamätajte si alebo si zapíšte číslo virtuálneho COM portu, ktorý sa objaví po pripojení prevodníka. Toto číslo bude potrebné zadať do textu skriptu, o ktorom si môžete prečítať nižšie.

4. Skript - programátor pre "Perpetuum M"

Zistili sme hardvérovú časť „programátora“. Toto je už polovica úspechu. Teraz zostáva zaoberať sa softvérovou časťou. Jeho úlohu bude plniť program Perpetuum M pod kontrolou skriptu, ktorý implementuje všetky potrebné funkcie pre interakciu s mikrokontrolérom.

Archív so skriptom by sa mal rozbaliť do rovnakého priečinka, kde sa nachádza program perpetuum.exe. V tomto prípade, keď spustíte súbor perpetuum.exe, na obrazovke sa zobrazí ponuka so zoznamom nainštalovaných skriptov, medzi ktorými bude riadok „AVR MK Programmer“ (môže byť jediný). Toto je riadok, ktorý potrebujeme.

Skript sa nachádza v priečinku PMS v súbore „MK Programmer AVR.pms“. Tento súbor je možné prezerať, študovať a v prípade potreby upravovať v bežnom textovom editore, akým je napríklad Windows Poznámkový blok. Pred použitím skriptu budete s najväčšou pravdepodobnosťou musieť vykonať zmeny v texte súvisiaceho s nastaveniami portu. Ak to chcete urobiť, skontrolujte názov portu používaného v Správcovi zariadení Windows av prípade potreby vykonajte príslušnú úpravu riadku "PortName="COM4";" - namiesto čísla 4 môže byť iné číslo. Ak používate iný model prevodníka USB-RS232TTL, možno budete musieť zmeniť nastavenia inverzie signálu (riadky skriptu začínajúce slovom „High“). Inverziu signálov prevodníkom USB-RS232TTL môžete skontrolovať pomocou jedného z príkladov obsiahnutých v návode k programu Perpetuum M (časť funkcií pre prácu s portom).

Podpriečinok MK_AVR obsahuje súbory s popismi podporovaných ovládačov. Ak ovládač, ktorý potrebujete, medzi nimi nie je, môžete si podľa analógie pridať ten, ktorý potrebujete. Vezmite jeden zo súborov ako vzorku a pomocou textového editora zadajte potrebné údaje z dokumentácie pre váš mikrokontrolér. Hlavná vec je byť opatrný, zadať údaje bez chýb, inak MK nebude naprogramovaný, alebo bude naprogramovaný nesprávne. Pôvodná verzia podporuje 6 mikrokontrolérov: ATtiny13, ATtiny24, ATtiny44, ATtiny84, ATmega8 a ATmega128. Skript implementuje automatické rozpoznávanie pripojeného ovládača - nie je potrebné ho špecifikovať ručne. Ak sa identifikátor načítaný z MK nenachádza medzi dostupnými popismi, zobrazí sa hlásenie, že ovládač sa nepodarilo rozpoznať.

Archív so skriptom obsahuje aj ďalšie informácie. Zložka AVR controller inc files obsahuje veľmi užitočnú a rozsiahlu zbierku definičných súborov kontroléra. Tieto súbory sa používajú pri písaní vlastných programov pre MK. Štyri ďalšie priečinky „MusicBox_...“ obsahujú súbory s programom v jazyku Assembly a firmvér pripravený na stiahnutie do MK samostatne pre ATtiny13, ATtiny44, ATmega8 a ATmega128. Ak ste už pripojili jeden z týchto MK na programovanie, ako je navrhnuté v tomto článku, môžete ho okamžite flashovať - ​​získate hudobnú skrinku. Viac o tom nižšie.

Keď v menu skriptu vyberiete riadok „MK AVR Programmer“, skript sa začne vykonávať. Zároveň otvorí port, odošle MK príkaz na prepnutie do programovacieho režimu, dostane potvrdenie od MK o úspešnom prechode, vyžiada si identifikátor MK a vyhľadá popis tohto MK podľa jeho identifikátora medzi dostupnými súbory s popismi. Ak nenájde požadovaný popis, zobrazí zodpovedajúcu správu. Ak sa nájde popis, otvorí sa hlavné menu programátora. Jeho screenshot môžete vidieť na obrázku 8. Ďalšie pochopenie nie je ťažké – menu je veľmi jednoduché.

V prvej verzii skriptu nie sú implementované niektoré funkcie plnohodnotného programátora. Napríklad neexistuje spôsob, ako čítať a zapisovať do EEPROM. Ale ak otvoríte skript v textovom editore, uvidíte, že je veľmi malý, napriek tomu, že to hlavné je už v ňom implementované. To naznačuje, že pridávanie chýbajúcich funkcií nie je také ťažké - jazyk je veľmi flexibilný, umožňuje implementovať bohatú funkčnosť v malom programe. Vo väčšine prípadov však stačia aj existujúce funkcie.

Niektoré obmedzenia funkčnosti sú popísané priamo v texte skriptu:
//implementované nahrávanie len z nulovej adresy (Extended Segment Address Record je ignorovaný, LOAD OFFSET - tiež)
//nie je kontrolované poradie a nadväznosť záznamov v HEX súbore
//kontrolný súčet nie je zaškrtnutý
Týka sa to práce s HEX súborom, z ktorého sa preberá firmvérový kód pre MK. Ak tento súbor nie je poškodený, kontrola kontrolného súčtu nebude mať žiadny účinok. Ak je skreslený, nebude ho možné pomocou skriptu zistiť. Vo väčšine prípadov zostávajúce obmedzenia neublížia, ale stále ich musíte mať na pamäti.

5. Hudobná skrinka - jednoduché remeslo pre začiatočníkov

Ak máte jeden z týchto mikrokontrolérov: ATtiny13, ATtiny44, ATmega8 alebo ATmega128, ľahko ho premeníte na hudobnú skrinku alebo hudobnú kartu. Na to stačí napísať zodpovedajúci firmvér do MK - jeden z tých štyroch, ktoré sa nachádzajú v priečinkoch "MusicBox_..." v rovnakom archíve so skriptom. Firmvérové ​​kódy sú uložené v súboroch s príponou „.hex“. Použitie ATmega128 pre takéto remeslo je samozrejme „mastné“, rovnako ako ATmega8. To však môže byť užitočné na testovanie alebo experimentovanie, inými slovami, na vzdelávacie účely. Priložené sú aj texty programov v Assembleri. Programy neboli vytvorené od nuly - ako základ bol vzatý program hudobných boxov z knihy A.V. Belova „AVR Microcontrollers in Amateur Radio Practice“. Pôvodný program prešiel niekoľkými významnými zmenami:
1. prispôsobené pre každú zo štyroch MK: ATtiny13, ATtiny44, ATmega8 a ATmega128
2. boli odstránené tlačidlá - k ovládaču nie je potrebné pripájať nič okrem napájania a zvukového vysielača (melódie sa prehrávajú jedna za druhou v nekonečnej slučke)
3. trvanie každej noty sa skracuje o trvanie pauzy medzi notami, aby sa eliminovali poruchy hudobného rytmu
4. je spojená ôsma melódia, v knižnej verzii sa nepoužíva
5. od subjektívneho: niektoré „vylepšenia“ na optimalizáciu a uľahčenie pochopenia algoritmu

V niektorých melódiách je počuť klamstvo a dokonca aj hrubé chyby, najmä v „Smile“ - v strede. Kódy vyzváňacích tónov boli prevzaté z knihy (alebo skôr stiahnuté z webovej stránky autora knihy spolu s pôvodným súborom asm) a neboli upravené. Zjavne sú chyby v kódovaní melódií. Ale to nie je problém - každý, kto je „priateľský“ k hudbe, to môže ľahko zistiť a všetko opraviť.

V ATtiny13 sa kvôli chýbajúcemu 16-bitovému počítadlu muselo na reprodukciu nôt použiť 8-bitové počítadlo, čo viedlo k miernemu zníženiu presnosti nôt. Ale to je sotva postrehnuteľné sluchom.

O konfiguračných bitoch. Ich nastavenie musí zodpovedať stavu nového mikrokontroléra. Ak bol váš MK niekde predtým používaný, musíte skontrolovať stav jeho konfiguračných bitov a v prípade potreby ich zosúladiť s nastaveniami nového mikrokontroléra. Stav konfiguračných bitov nového mikrokontroléra zistíte z dokumentácie k tomuto MK (časť "Poistkové bity"). Výnimkou je ATmega128. Tento MCU má bit M103C, ktorý umožňuje režim kompatibility so starším ATmega103. Aktivácia bitu M103C výrazne znižuje možnosti ATmega128 a tento bit je aktívny na novom MK. Musíte resetovať M103C do neaktívneho stavu. Na manipuláciu s konfiguračnými bitmi použite príslušnú časť ponuky skriptu programátora.

Nemá zmysel uvádzať schému hudobnej skrinky: obsahuje iba mikrokontrolér, napájací zdroj a piezoelektrický vysielač. Napájanie je dodávané presne rovnakým spôsobom ako pri programovaní MK. Zvukový vysielač je zapojený medzi spoločný vodič (GND pin ovládača) a jeden z pinov MK, ktorých číslo nájdete v súbore s kódom zostavy programu (*.asm). Na začiatku textu programu pre každý MK v komentároch je riadok: „zvukový signál sa generuje na kolíku XX“. Po dokončení skriptu programátora mikrokontrolér opustí režim programovania a prejde do normálnej prevádzky. Prehrávanie melódií začne okamžite. Môžete to skontrolovať pripojením vysielača zvuku. Počas programovania kryštálu môžete nechať zvukový vysielač pripojený iba vtedy, ak je zvuk prevzatý z kolíka, ktorý sa nepoužíva v SPI, inak môže dodatočná kapacita na kolíku prekážať pri programovaní.