itthon / Vélemények / Az AVR mikrokontrollerek programozása az első lépés. Mi szükséges a mikrokontrollerek programozásához? Az AVR megtanulásának legegyszerűbb módja

Az AVR mikrokontrollerek programozása az első lépés. Mi szükséges a mikrokontrollerek programozásához? Az AVR megtanulásának legegyszerűbb módja

Tehát rendeztük a kernel munkáját az átmenetekkel és a címzéssel kapcsolatban. Itt az ideje, hogy figyelmünket egy másik területre fordítsuk – az emlékezetre.

Két típusa van (az EEPROM nem számít, mivel általában periféria, de erről majd később):

  • RAM – RAM
  • ROM - ROM, más néven flash, más néven programmemória

Mivel a mi architektúránk a Harvard, az ügyintézőnek saját címe van, és a vakunak is megvan a maga címe. Az adatlapon a RAM címzési struktúrája látható.

Azonnal figyeljen a címekre! A RON és a periféria regiszterek, valamint a RAM ugyanabban a címtérben találhatók. Azok. a 0000-től 001F-ig terjedő címek foglalják el a regisztereinket, majd a 005F címig vannak bemeneti-kimeneti cellák - portok. A portokon keresztül minden, ami a vezérlő fedélzetén van, konfigurálva van. És csak ezután jön a 0060-as címről a RAM-unk, amit rendeltetésszerűen használhatunk.

Továbbá kérjük, vegye figyelembe, hogy az I/O regisztereknek is van saját címzésük - az I/O regiszterek címtere (00-tól 3F-ig), ez az ábra bal oldalán látható. IO/Register Block Ez a címzés CSAK OUT és IN utasításokban működik. Ebből egy érdekes tulajdonság következik.

A perifériás regiszterekhez kétféle módon lehet hozzáférni:

  • IN/OUT parancsokon keresztül egy rövid címen az I/O címtérben
  • LOAD/STORE parancsok csoportján keresztül a RAM címterében lévő teljes címen

Példa. Vegyük az aszinkron adó-vevő UDR bemeneti regiszterét, amelynek a címe 0x0C (0x2C az általános címtérben zárójelben van feltüntetve);

LDI R18.10; A 10-es számot betöltöttük az R18 regiszterbe, csakúgy, mint az OUT UDR,R18 ; Az első módon levezethető, maga a fordító; Helyettesíti a 0x0C értéket az UDR STS 0x2C,R18 helyett; A második úton vittek ki. A Store paranccsal; A cím közvetlen megadásával.

Mindkét módszer azonos eredményt ad. DE! Azok, amelyek a bemeneti/kimeneti térben (OUT/IN) címezve működnek, két bájttal rövidebbek. Ez érthető – nem kell egy tetszőleges memóriacella duplabájtos címét tárolniuk, a bemeneti-kimeneti tér rövid címe pedig belefér a duplabájtos utasításkódba.

Igaz, van itt egy másik vicc is. A helyzet az, hogy évről évre egyre több kő jelenik meg az AVR-ből, és egyre több hús van bennük. És minden recsegésnek szüksége van saját perifériás I/O regiszterekre. És most elérkeztünk odáig, hogy az ATMega88-nak (amely a Mega8-at felváltotta) már annyi perifériája van, hogy az I/O regiszterei már nem férnek bele a 3F címtér korlátjába.

Hoppá, megérkeztek. És ez az a pont, ahol azok, akik a régi kövekről az újakra váltanak, zavart kifejezéseket kezdenek kifejezni - miért működnek az OUT/IN parancsok egyes perifériás regisztereken, míg másokon nem?

És ez egyszerű – nem volt elég kis kapacitás.

De a mag egy, azt már nem lehet újra elkészíteni. És itt az ATMEL emberei ravaszul jártak el - bevezették az úgynevezett memóriatérképes regisztereket. Azok. mindazok a regiszterek, amelyek nem fértek bele a 3F korlátba, mostantól csak egy módon érhetők el - a Load/Store-on keresztül.

Micsoda vicc. Ha megnyitunk néhány m88def.inc-et, akkor láthatjuk, hogy az I/O regiszterek közül melyik „helyes” és melyek memórialeképezve.

Valami ilyesmi lesz:

; ***** I/O REGISZTRÁCIÓS MEGHATÁROZÁSOK ******************************************** ******** * ; JEGYZET: ; A "MEMORY MAPPED" jelzésű definíciók kiterjesztett I/O portok; és nem használható IN/OUT utasításokkal .equ UDR0 = 0xc6 ; MEMORY MAPPED .equ UBRR0L = 0xc4 ; MEMORY MAPPED .equ UBRR0H = 0xc5 ; MEMORY MAPPED .equ UCSR0C = 0xc2 ; MEMORY MAPPED .equ UCSR0B = 0xc1 ; MEMORY MAPPED .equ UCSR0A = 0xc0 ; MEMORY MAPPED bla bla bla, és még sok más.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

Ezek a piték.

És ezen a téren érthető, hogy egy nagy szőrös orgona repül az összeállítási kód modellek közötti kompatibilitása felé azzal a céllal, hogy szorosan lefedje. Végül is egy dolog mindenféle makródefiníciót és regisztereket leíró definíciót kijavítani, és egy másik dolog ülni, és Hamupipőkéhez hasonlóan elválasztani a megfelelő portokat a rosszaktól.

Van azonban megoldás. Makronyelv! Nem tetszik a parancsrendszer? Készítsd el magad blackjack-kel és kurvákkal!
Építsük fel saját csapatunkat UOUT, mint egy univerzális OUT

Hasonlóan az IN parancshoz is. Általában az ilyen makrók segítségével NAGYON diverzifikálható az assembler, ami egy erőteljes programozási nyelvvé varázsolja, ami mindenféle C-t és Pascalt széttép.

Nos, miről beszélek... a RAM-ról.

Szóval rendeztük a címzést. Most már tudja, hol keresse azokat a memóriacímeket, ahol a felhasználói RAM cellák kezdődnek - az adatlap Memóriatérkép szakaszában. De ott a hivatkozás miatt.

A kódunkban pedig a RAM a direktívával kezdődik.DSEG Emlékszel a sablonunkra?

Tartalmazza "m16def.inc" ; Az ATMega16-ot használjuk ;= Start macro.inc ========================================== ==== ; Makrók itt;= End macro.inc ================================= ; RAM ================================================== ============ .DSEG ; RAM szegmens; VAKU ================================================== ========== .CSEG ; Kód szegmens; EEPROM ================================================== ======== .ESEG ; EEPROM szegmens

A .DSEG után beállíthatjuk a változóinkat. És itt egyszerűen csak sejtrobbanás vár ránk – bármelyiket elfoglaljuk. Írd be a címet és légy boldog. De miért kell manuálisan számolni a címeket? Gondolkodjon itt a fordító.

Ezért fogunk és felhelyezünk egy címkét

0x0060 ## ;Variables 0x0061 ## 0x0062 ## 0x0063 ## ;Variables2 0x0064 ## 0x0065 ## ;A változók4 itt kezdődhet

Mint ## bármely bájt. Alapértelmezés szerint FF. Természetesen nem kell beszélni a változók bármiféle beírásáról, kezdeti inicializálásról, túlcsordulás-szabályozásról és egyéb burzsoá örömökről. Ez itt Spárta! Mármint összeszerelő. Mindezt kézzel.
Ha analógiát vonunk a C-vel, akkor az olyan, mintha csak üres mutatókon keresztül dolgoznánk a memóriával. A sishnik megérti. Meg fogják érteni és elborzadnak. Mert ez a világ kegyetlen és alattomos. Kicsit rosszul számoltam az indexet, és más adatokat is elvesztettem. És a fenébe, elkapja ezt a hibát, ha nem jelenik meg azonnal.

Szóval figyelem, figyelem és még egyszer figyelem. Az összes memóriaműveletet nyomkövetéssel futtatjuk, és semmi sem fog meghibásodni vagy túlcsordulni.

Az .ORG direktíva az adatszegmensben is működik Pontosan ugyanígy működik - innen a memória végére továbbítja a címeket, jelen esetben a címkéket. Csak egy finomság - az ORG 0000 megadja nekünk a RAM legelejét, ez pedig az R0 és más regiszterek. A Mega16 példaként használt nulla kilométeres RAM pedig ORG 0x0060-at ad. És más vezérlőkben van valami más érték is. Lusta minden alkalommal átnézni az adatlapot, ezért van egy olyan makródefiníció, mint az SRAM_START, amely egy adott MK RAM kezdetét jelzi.

Tehát ha azt akarjuk, hogy a RAM eleje, mondjuk 100 bájt, valami szemétpuffer alatt maradjon, akkor ezt a trükköt tesszük.

1 2 3 4 .DSEG .ORG SRAM_START+100 Változók: .byte 3

DSEG .ORG SRAM_START+100 Változó: .byte 3

Kész, a pufferzónánkat az elejétől 100-ra töröltük.

Rendben, megoldottuk a címzést. Hogyan dolgozzunk memóriacellákkal? És ezekre a célokra két parancscsoport létezik. A LOAD és a STORE a parancsok legnagyobb csoportja.

Az a helyzet, hogy egy RAM cellával nem lehet mást tenni, mint egy bájtot betölteni a RON-ból, vagy kirakni belőle egy bájtot a RON-ba.

A tárolás (ST**) parancsok a RAM-ba íródnak, a Betöltés (LD**) parancsok pedig beolvasásra kerülnek.

Az olvasás az R16…R31 regiszterre megy, és a cella címe vagy közvetlenül a parancsban van megadva. Íme egy egyszerű példa. Van egy három bájtos Variables változó, azt 1-gyel kell növelni. Azaz. hajtsa végre a Variables++ műveletet

DSEG Változók: .byte 3 Variables2: .byte 1 .CSEG ; A változó a memóriában van, először meg kell szerezni. LDS R16, Változók ; Olvassa be az első Variables bájtot az R16-ban LDS R17, Variables+1 ; Olvassa be a második Variables bájtot az R17-ben LDS R18, Variables+2 ; Nos, a harmadik bájt az R18-ban; Most adjunk hozzá 1-et, mert Az AVR nem tud hozzáadni konstanssal, csak; kivonni, torzítani kell. Ez azonban nem okoz különösebb problémát. SUBI R16,(-1); általában a SUBI egy kivonás, de a -(- + SBCI R17,(-1) ; És itt az átvitelt veszik figyelembe. De erről később. SBCI R18,(-1) ; A matematika az assemblerben egy Különböző történet STS Variables, R16 Mentés mindent úgy, ahogy volt, STS Variables+1,R17 STS Variables+2,R18

Vagy használhat más módszert is. Indirekt rögzítés indexregiszteren keresztül.

DSEG Változók: .byte 3 Variables2: .byte 1 .CSEG ; Vegyük az LDI YL,low(Variables) LDI YH,High(Variables) változónk címét; A változó a memóriában van, először meg kell szerezni. LD R16, Y+; Olvassa be az első Variables bájtot az R16-ban LD R17, Y+ ; Olvassa be a második Variables bájtot az R17-ben LD R18, Y+ ; Nos, a harmadik bájt az R18-ban; Most adjunk hozzá 1-et, mert Az AVR nem tud hozzáadni konstanssal, csak; kivonni, torzítani kell. Ez azonban nem okoz különösebb problémát. SUBI R16,(-1); valójában a SUBI egy kivonás, de a -(- + SBCI R17,(-1) ; És itt az átvitelt veszik figyelembe. De erről később. SBCI R18,(-1) ; A matematika az assemblerben egy másik történet ST -Y,R18 Mindent úgy tartunk, ahogy volt, de fordított sorrendben ST -Y,R16

Itt már használatosak az utólagos növeléssel és az előcsökkentéssel végzett műveletek. Az elsőben először beolvasunk, majd hozzáadunk 1-et a címhez. A másodikban először kivonunk 1-et a címből, majd mentünk.

Kényelmes az ilyen növekményes parancsok használata a memóriában vagy a táblákban lévő tömbök áthaladásához.
És van egy közvetett relatív írási/olvasási LDD/STD és több lehetőség is mindhárom típusú indexhez (X,Y,Z). Általában füstölni kell az adatlapot és a parancsrendszert.

Kazal
Ó, a verem nagyszerű dolog. Amit szeretek benne, az az, hogy a verem meghibásodása egy működő programot teljes káoszba változtat. Mert a veremműveletek fokozott odafigyelést igényelnek, mert ha egy verem eltörik valahol, és nem tudod azonnal követni, akkor később elkapod... Általánosságban elmondható, hogy ez egy szépség, nem egy gizmo.

Miért szeretlek? Nos, ha a C egy hülye mesterség, gyors és hatékony, akkor az Assembly filigrán művészet. Hogy a mániákusok, mint Jim, szegecselnek remekműveket papírból és csak papírból, bár úgy tűnik, hogy vásárolhat egy kész előregyártott modellt és ragasztót a saját örömére. Tehát itt is – maga a folyamat elsöprő. Többek között a hibakeresési fáradságtól :))))

Szóval a veremről. Ami? És ez a memóriaterület. A verem elvén működik. Azok. Amit utoljára lerakott, azt elvette az elsőt.

A veremnek van egy mutatója, amely a verem tetejére mutat. A veremmutatóért egy speciális SP regiszter felel, vagy inkább egy SPL és SPH regiszterpár. De a kis RAM-mal rendelkező mikrokontrollerekben, például a Tini2313-ban, csak SPL van

Amikor a vezérlő elindul, általában az első dolguk, hogy inicializálják a veremet, és SP-ben beírják az aljának címét, ahonnan növekedni fog. Általában ez a RAM vége, és az eleje felé nő.

Ez így történik, a program legelején:

1 2 3 4 5 LDI R16, Alacsony (RAMEND) OUT SPL, R16 LDI R16, Magas (RAMEND) OUT SPH, R16

LDI R16, Alacsony (RAMEND) OUT SPL, R16 LDI R16, Magas (RAMEND) OUT SPH, R16

Ahol a RAMEND egy makródefiníció, amely a RAM végét jelzi az aktuális MK-ban.

Ez az, a verem készen áll. Az adatok a PUSH Rn paranccsal kerülnek a verembe, és a POP Rn-n keresztül kerülnek lekérésre.
Rn a RON bármelyike.

A CALL, RCALL, ICALL, RET, RETI és a megszakítás hívása parancsok is működnek a veremmel, de erről később.

Játsszunk a köteggel, hogy érezzük, hogyan működik, hogy megértsük, hogyan és merre mozog.

Írd be a következő kódot a stúdióba:

CSEG; LDI kódszegmens R16,Low(RAMEND) ; Stack inicializálás OUT SPL,R16 LDI R16,High(RAMEND) OUT SPH,R16 LDI R17,0 ; Terhelési értékek 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 ; Az értékeket a verembe helyezzük PUSH R18 PUSH R19 PUSH R20 PUSH R21 PUSH R22 PUSH R23 PUSH R24 PUSH R25 PUSH R26 POP R0 ; Pop értékek a veremből POP R1 POP R2 POP R3 POP R4 POP R5 POP R6 POP R7 POP R8 POP R9

Most lépésről lépésre futtassa a stúdiót, és figyelje meg, hogyan változik az SP. A Stack Pointer ugyanott látható a stúdióban, ahol a Program Counter.

Először inicializáljuk a veremet és betöltjük a regisztereket adatokkal. Az eredmény a következő kép lesz:

Ezután a POP paranccsal lekérjük az adatokat a veremből. Kérjük, vegye figyelembe, hogy számunkra nem mindegy, hogy hová helyezzük az adatokat a veremben, és hova töltjük be. A lényeg a telepítés sorrendje! A magasabb regiszterekből rakjuk be, és az alacsonyabbakba kapjuk. Ez növeli a veremmutatót.

PUSH R16 PUSH R17 POP R16 POP R17

Például már beszéltem az alacsonyabb RON-ok korlátozásáról - nem teszik lehetővé, hogy számot írjon közvetlenül magába. Csak az idősebb csoport anyakönyvein keresztül. De ez kényelmetlen!

A probléma makró segítségével megoldható. LDIL - LDI alacsonynak hívtam

MACRO LDIL PUSH R17; Mentsük el az egyik magasabb regiszter értékét a verembe. LDI R17,1; Töltsük bele az azonnali MOV @0,R17 értékünket; Vigyük át az értéket az alacsony csoport regiszterébe. POP R17; Állítsuk vissza a legmagasabb regiszter értékét a veremből. .ENDM

Most már könnyedén használhatja házi készítésű parancsunkat.

1 LDIL R0,18

Idővel a makrókat tartalmazó fájl ilyen házi parancsokat kap, és a munka egyszerűvé és kellemessé válik.

Veremhibák
A verem az adatok felé növekszik, és most képzeljük el, hogy van egy állapotváltozó a memóriában, és ez a címen található, például 0x0450. Veszélyesen közel a verem tetejéhez. A változó tárolja például a véges állapotú gép állapotát, amelytől a program további logikája függ. Mondjuk, ha 3 van, akkor csináljunk egy dolgot, ha 4, akkor valami mást, ha van 5, akkor valami mást, és így tovább 255 állapotig. És a munka logikája szerint 3 után legyen 4re, de nem 10

És akkor volt 3. És akkor egy szörnyű pillanatban annyira egybeestek a körülmények, hogy a verem nőtt, és a teteje elérte ezt a változót, beírt egy értéket, mondjuk 20-at, majd az agár visszaesett. A sár hátrahagyása a verem túlcsordulásának klasszikus példája. A program logikája pedig emiatt teljesen összeomlott.

Vagy az ellenkező példa - a verem fel lett tolva a változókhoz, de abban a pillanatban a változók frissültek, és felülírták a veremadatokat. Ennek eredményeként valami rosszat távolítottak el a veremből (általában görbe visszatérési címek), és a program összeomlott. Ez a lehetőség egyébként sokkal ártalmatlanabb, mert... ilyenkor az ízület azonnal látszik és nem bukkan fel HIRTELEN isten tudja meddig.

Ezenkívül ez a hiba megjelenhet és eltűnhet. A program működésétől és a verem mélységétől függően. Az ilyen balhé azonban gyakrabban fordul elő, ha C-ben írunk, ahol nem láthatjuk, hogy milyen aktívan folyik a munka a veremmel. Az ASMA-n minden sokkal átláthatóbb. És itt ez egy őszintén ferde algoritmus miatt merülhet fel.

Az összeszerelők gyakran találkoznak más veremhibákkal. Először is a feledékenység. Betettem valamit, és elfelejtettem kivenni. Ha a probléma egy szubrutinban vagy egy megszakításban volt, akkor a visszatérési cím torzul (erről kicsit később), a verem leszakad, és a program azonnal összeomlik. Vagy figyelmetlenség – az egyik sorrendben elmentettem az adatokat, a másikban visszakerestem. Hoppá, a regiszterek tartalma kicserélődött.

Az ilyen hibák elkerülése érdekében mindenekelőtt figyelnie kell a veremet, másodszor pedig meg kell terveznie a változók elhelyezését a memóriában. A legkritikusabb területek és változók (például állapotgépek vagy programlogikai jelzők) távoltartása a verem tetejétől, közelebb a memória elejéhez.

Vannak, akik azt gondolják, hogy a verem nem a RAM legvégére, hanem valahova közelebb kerülhet, így zsebet hagyva maga mögött a kritikus adatok számára. Nem igazán jó ötlet. A helyzet az, hogy a verem lefelé tolható a PUSH paranccsal, és felfelé a POP parancsokkal. A második, bár sokkal ritkábban fordul elő, mert... Ez inkább a ferde kezek bűne, mint egy nehézkes algoritmus, de ez is előfordul.
De a lényeg az, hogy maga a verem nagyon fontos szerkezet. Az alprogramok és funkciók teljes mechanizmusa ezen nyugszik. Tehát a verem meghibásodása mindenképpen vészhelyzet.

Verem a perverziókat
Kedvenc témám. =)))) Annak ellenére, hogy magát a veremmutatót a PUSH és POP parancsok során számítják ki, senki sem akadályoz meg minket abban, hogy kiszedjük az SP-ből, és értékei alapján kézzel kiszámoljuk a rajta lévő adatok címét. a verem. Vagy tetszés szerint javítsa ki a veremadatokat.
Miért? Nos, sok alkalmazást találhatsz, ha megfeszíted az agyad, és elkezdesz kívülről gondolkodni :))))

Ráadásul a paraméterek áthaladnak a veremen a klasszikus C-ben és Pascalban az x86 architektúrán, és a helyi változók működnek. Azok. Egy függvény hívása előtt először az összes változó a verembe kerül, majd a függvény meghívása után a jövőbeli lokális változók bájtjai a verembe kerülnek.

Ezután az SP-t referenciapontként használva tetszés szerint kezelhetjük ezeket a változókat. És amikor a verem felszabadul a POP paranccsal, megsemmisül, így memória szabadul fel.

Az AVR-ben minden kicsit más (nyilván a kis memória miatt, ahol nem nagyon lehet beletúrni a verembe, de sok a RON), de ezt a mechanizmust is meg lehet próbálni.

Igaz, ez már az idegsebészethez hasonlít. Elkövettem egy kis hibát, és a beteg meghalt.

A veremnek és a RAM-nak köszönhetően mindössze két-három regiszterrel meg lehet boldogulni, anélkül, hogy különösebb stresszt okozna a hiányuk miatt.

Flashmemória

Az EEPROM-memória kicsi, csak néhány bájt, és néha sok adatot kell mentenie, például egy üzenetet az idegeneknek vagy egy szinusztáblázatot, hogy ne pazarolja az időt a kiszámítására. Soha nem tudhatod, hogy mit kell előre tárolni a memóriában. Ezért az adatok a programmemóriában tárolhatók, ugyanolyan kilobájt flash-ben, mint a vezérlőben.

Leírjuk, de hogyan szerezhetjük meg? Ehhez először el kell helyeznie valamit.
Ezért adjon hozzá egy címkét a program végéhez, a .CSEG szegmensen belül, például adatot, és utána a .db operátor segítségével adja meg az adatait.

A DB operátor azt jelenti, hogy minden állandóhoz egy bájtot használunk. Vannak olyan operátorok is, amelyek megadják a kétbájtos DW konstansokat (valamint a DD és DQ).

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

adatok: .db 12,34,45,23

Most az adatcímke a tömb első bájtjának címére mutat, a fennmaradó bájtok eltolás szerint helyezkednek el, egyszerűen hozzáadva egyet a címhez.

Az egyik finomság, hogy a fordító a mark címet helyettesíti, és ezt tekinti a programszámláló ugráscímének. És ő, ha emlékszel, kétbájtos szavakat szólít meg - végül is a parancs hossza 2 vagy 4 bájt lehet.

Adataink pedig byte-byte-onként és elérésekor a vezérlő byte-byte-onként meg is címzi azokat. A szavakban kifejezett cím kétszer olyan kicsi, mint a bájtban kifejezett cím, és ezt figyelembe kell venni a cím kettővel való szorzásakor.

Adatok programmemóriából való betöltéséhez használja a Programmemória betöltése csoport parancsát

Például LPM Rn,Z

Beírja az Rn regiszterbe a Z regiszterpár által mutatott cellából származó számot. Hadd emlékeztessem önöket, hogy Z két regiszter, R30 (ZL) és R31 (ZH). A cím alsó bájtja az R30-ba, a magas bájtja pedig az R31-be kerül.

Kódban így néz ki:

LDI ZL,alacsony(adat*2) ; A cím alsó bájtját beírjuk a Z LDI ZH,high(data*2) regiszterpárba; A cím magas bájtját beírjuk a Z regiszterpárba; a kettővel való szorzás annak a ténynek köszönhető, hogy a cím feltüntetve; kétbájtos szavakban, de bájtban kell. ; Ezért szorozunk kettővel; A cím betöltése után betöltheti a számot a memóriából LPM R16, Z; az R16 regiszterben ez után a parancs után a 12, ; programmemóriából vettük. ; valahol a program végén, de a .CSEG adatszegmensben: .db 12,34,45,23


A modern rádióamatőr nem képzelhető el mikrokontrollerek nélkül, és ez nyilvánvaló. Az elmúlt évtizedekben a különböző gyártók mikrokontrollerei széles körben elterjedtek az emberi tevékenység különböző területein. Gyakran megtalálhatók a legváratlanabb eszközökben és kivitelekben. Ön és én a minket körülvevő folyamatok számítógépesítésének és automatizálásának vagyunk tanúi. Az igazság az, hogy a programozás alapjainak ismerete nélkül szinte lehetetlenné vált modern, versenyképes eszközök létrehozása...

Ha ezt a cikket olvassa, valószínűleg szeretné megérteni a mikrokontrollerek működését, és valószínűleg kérdései vannak:

4. Milyen irodalmat érdemes tanulmányoznom?

Próbáljunk meg válaszolni ezekre a kérdésekre.

1. Melyik mikrokontrollert válasszam a munkához?

A 8 bites mikrokontrollerek nagyon népszerűek a rádióamatőrök körében. PIC Mikrochip technológia és AVR Atmel, 16 bites MSP430 TI-től, valamint 32 bites mikrokontrollerek, architektúrák KAR.

Az iparban némileg eltérően az első helyet nagy különbséggel a Renesas Electronics a másodikon Freescale, a harmadikon Samsung, akkor menj MikrochipÉs T.I., majd az összes többit.
A népszerűséget a technikai információk elérhetősége és a szoftvertámogatás költsége határozza meg;

Tanulmányozzuk a 8 bites AVR mikrokontrollereket, családokat ATMEGA 8 és 16 sorozat. A választást ezúttal is az akadálymentesítés, a sok amatőr fejlesztés jelenléte és a rengeteg oktatási anyag határozta meg. A család számos beépített komponensének és funkcionalitásának jelenléte.

2. Melyik fejlesztői környezetet használjam a kiválasztott mikrokontroller programozásához?

Az AVR-hez különféle integrált fejlesztői környezetek (IDE, Integrated Development Environment) készültek.
IDE a programozók által szoftverfejlesztésre használt szoftverrendszer, amely a következőket tartalmazza:
szöveg szerkesztő,
fordító és/vagy tolmács,
összeszerelő automatizálási eszközök,
hibakereső

A leggyakoribbak AVRStudio, ATmelStudio, WINAVR, CodeVision, IAR Embedded Workbench.
A programok írásához az ingyenes IDE ATmelStudio 6-os verzióés magasabb.
Az Atmel Studio letölthető a hivatalos weboldalról regisztráció után (a regisztráció teljesen ingyenes, és semmire sem kötelezi!)

Az ATmelStudio lehetővé teszi projektek létrehozását és programok írását assemblerben és SI-ben egyaránt.

Kezdetben mindig az a kérdés: milyen programozási nyelvet válasszak, hogy hatékony programokat írjak?

A válaszom egyszerű: legalább két nyelven kell tudni írni: assembly és SI. Az Assembly nyelvre egyszerűen szükség van, ha gyors és kompakt szubrutinokat és makrókat, valamint különféle eszközillesztőket kell írni. De ha összetett algoritmusokra épített nagy projektet kell létrehoznia az SI ismerete nélkül, sok időt lehet eltölteni, különösen a hibakeresési folyamatban, és ha van vágy, hogy átvigye egy másik platformra, például PIC18-ra. , vagy STM, megoldhatatlan problémává válhat.
Emellett most megjelentek a hardveres számítási platformok is Arduino, amivel a munkavégzéshez SI++ nyelv ismerete szükséges.
Ezért a programokat assemblerben és SI-ben is fogjuk írni.

Ahhoz, hogy tisztán láthassa munkája eredményét forrasztópáka vagy kenyérsütőtábla használata nélkül, csak telepítse a programot Proteus.

3. Hogyan kell flashelni a vezérlőt, és milyen további eszközökre, kiegészítőkre van szükség a kényelmes munkához?

Datagorian-t használunk. Ezenkívül kenyérsütőtáblákat és 5 voltos kimeneti feszültségű tápegységet kell vásárolnia. 5 Voltos Zener dióda használatával alacsony hullámzású tápegységként használhatja.
Talán idővel Igor és én javaslatot teszünk egy hibakereső tábla összeállítására.

4. Milyen irodalmat érdemes tanulmányoznom?

De például:
Az AVR gyakorlati programozása assemblerben. Revich, 2011
1000 és egy mikrokontroller áramkör Vol. 1-2. Ryumik, 2010-2011
10 praktikus eszköz az AVR MK 1-2 könyvön. Kravcsenko, 2008-2009
Oktatóanyag az AVR MK eszközfejlesztőjének. Belov, 2008
A Tiny és Atmega családok MK AVR-je. Efstifeev, 2008
CodeVisionAVR. Útmutató kezdőknek. Lebegyev, 2008
Készülékek, tirisztorok, relék mikroprocesszoros vezérlése. Belov, 2008
MK analóg interfészek. Steward, Ball, 2007
Készítünk eszközöket az AVR MK-n. Belov, 2007
MK AVR rádióamatőr gyakorlatban. Az ATTINY2313 teljes elemzése. Belov, 2007
Hálózati és hálózati adatcsere az MK-val. Hajrá, 2007
MK AVR. workshop kezdőknek. Hartov, 2007
AVR Sémák, algoritmusok, programok alkalmazása. Baranov, 2006
AVR mikrokontrollerek. Bevezető tanfolyam. Morton, 2006
Mérés, vezérlés és szabályozás AVR segítségével. Trumpert, 2006
Programozás C nyelven AVR-hez és PIC MK-hoz. Shpak, 2006
Készülékek tervezése MK-n. Belov, 2005
MK - ez egyszerű, 1-3 kötet. Frunze, 2002-2003
A C programozási nyelv, 2. kiadás. Kernighan, Ritchie, 2009
ATMEL mikrokontrollerek programozása S. Prokopenko nyelven, 2012

5. Hol lehet kérdéseket feltenni és konkrét válaszokat kapni az interneten?

Kérdéseit felteheti a mi vagy bármely más fórumunkon, ahol a mikrokontrollerekkel kapcsolatos témákat így vagy úgy érintik. A fórumokon a legfontosabb a kérdések helyes megfogalmazása, hogy egyértelmű válaszokat kapjunk. Az absztrakt kérdéseket nem fogadjuk szívesen, és valószínűleg válasz helyett kemény kritikát kapsz, vagy kérdésed megválaszolatlan marad!

Most pedig nézzük meg közelebbről kedvencünket, az ATMEGA 8 mikrokontrollert

8 bites, nagy teljesítményű, kis fogyasztású AVR mikrokontroller
Progresszív RISC architektúra
130 nagy teljesítményű utasítás, a legtöbb utasítás egy órajelben fut
32 db 8 bites általános célú működő regiszter
Teljesen statikus működés
Közelít a 16 MIPS-hez (16 MHz-en).
Beépített 2-ciklusos szorzó

Nem felejtő program- és adatmemória
8 KB rendszeren belüli önprogramozható Flash memória
1000 törlési/írási ciklust biztosít
További rendszerindító kód szektor független zárbitekkel
Egyidejű olvasási/írási módot biztosít (olvasás-írás közben)
512 bájt EEPROM
100 000 törlési/írási ciklust biztosít
1 KB chipes SRAM
Programozható zár a felhasználói szoftverek védelmére

Beágyazott perifériák
Két 8 bites időzítő/számláló külön előskálázóval, az egyik összehasonlítási móddal
Egy 16 bites időzítő/számláló külön előskálázóval és rögzítési és összehasonlítási módokkal
Valós idejű számláló külön generátorral
Három PWM csatorna
8 csatornás A/D konverter (TQFP és MLF)
6 csatorna 10 bites pontossággal
6 csatornás analóg-digitális átalakító (PDIP csomagban)
4 csatorna 10 bites pontossággal
2 csatorna 8 bites pontossággal
Bájtorientált 2 vezetékes soros interfész
Programozható soros USART
Soros interfész SPI (mester/szolga)
Programozható watchdog időzítő külön beépített oszcillátorral
Beépített analóg komparátor

Speciális mikrokontroller funkciók
Bekapcsolási alaphelyzetbe állítás és programozható barnulásérzékelés
Beépített kalibrált RC oszcillátor
Belső és külső megszakítási források
Öt alacsony fogyasztási mód: üresjárat, energiatakarékos, lekapcsolt, készenléti és ADC zajcsökkentés

I/O érintkezők és házak
23 programozható I/O vonal
28 tűs PDIP csomag, 32 tűs TQFP csomag és 32 tűs MLF csomag

Üzemi feszültségek
2,7–5,5 V (ATmega8L)
4,5–5,5 V (ATmega8)

Működési frekvencia
0-8 MHz (ATmega8L)
0–16 MHz (ATmega8)

különbségek az ATMEGA16 és 8 között
16 KB rendszeren belüli önprogramozható Flash memória

JTAG interfész (IEEE 1149.1 kompatibilis)
A JTAG szabványnak megfelelő perifériás szkennelési képesség
Bővített támogatás a beágyazott hibakereséshez
Programozás JTAG interfészen keresztül: Flash, EEPROM memória, jumperek és lock bitek

Négy csatorna PWM/PWM

8 csatornás 10 bites analóg-digitális átalakító
8 kiegyensúlyozatlan csatorna
7 differenciálcsatorna (csak TQFP csomag)
2 differenciálcsatorna 1x, 10x vagy 200x programozható erősítéssel (csak TQFP csomag)

Hat alacsony fogyasztású üzemmód: tétlen, energiatakarékos, lekapcsolt, készenléti, kiterjesztett készenléti és ADC zajcsökkentés

32 programozható I/O vonal

40 tűs PDIP csomag és 44 tűs TQFP csomag

AtmelStudio

Ha még csak most kezdi, akkor le kell töltenie és telepítenie kell az AtmelStudio programot az atmel.com hivatalos oldaláról
Az AtmelStudio telepítése után megkezdheti a projekt létrehozását.
Projekt- ez a te programod, amit fordítás után írsz, debuggolsz és flashelsz a mikrokontroller memóriájába.

Projekt létrehozásához meg kell nyitnia a programot, a következő képernyővédő jelenik meg:

és megnyílik a projekt létrehozási oldala

Új projekt létrehozásához kattintson a gombra "Új projekt..."
Ebben az esetben megnyílik egy új ablak, ahol kiválaszthatja a programozási nyelvet, a projekt nevét, helyét, a csomag nevét a projektfájlokkal és könyvtár létrehozásának lehetőségét, hogy további keresztprojektekben használható legyen. . Egy olyan projekt létrehozásához, ahol az assemblerben programozunk, ki kell választanunk - Szerelő, ezután megváltoztatjuk a projekt nevét, helyét, és kiválasztjuk RENDBEN.

A következő ablak jelenik meg

Választ "megaAVR, 8 bites"és megtaláljuk a szükséges mikrovezérlőt, választottuk ATmega8. A képernyővédő jobb oldalán megjelenik az ezzel a mikrokontrollerrel működő eszközök listája, amelyek közül egyet csatlakoztathatunk. Választ RENDBEN.

Megjelenik a szövegszerkesztő oldal, amely lehetővé teszi a program szerkesztését és hibakeresését. Amíg az oldal üres, megjelenik a létrehozás időpontja és dátuma, valamint a projektfájl neve és a felhasználónév. További I/O eszközök ablak és program-összeállítási jelentés ablak található. most mi


Assemblerben tudunk programozni.
Ugyanígy jön létre egy SI nyelvű programozási projekt.

Az LPT port programozó vázlatos diagramja az ábrán látható. Buszvezetőként használja a 74AC 244 vagy 74HC244 (K1564AP5), 74LS244 (K555AP5) vagy 74ALS244 (K1533AP5) mikroáramkört.

A VD1 LED jelzi a mikrokontroller felvételi módját,

LED VD2 - olvasás,

LED VD3 - áramellátás jelenléte az áramkörben.

Az áramkör az ISP csatlakozóról veszi a tápellátáshoz szükséges feszültséget, pl. a programozható eszközről. Ez az áramkör egy újratervezett STK200/300 programozó áramkör (kiegészítő LED-ekkel a könnyebb kezelhetőség érdekében), így kompatibilis minden olyan PC programozó programmal, amely az STK200/300 áramkörrel működik. Ha ezzel a programozóval szeretne dolgozni, használja a programot CVAVR

A programozó nyomtatott áramköri lapra készíthető és az LPT csatlakozó házába helyezhető az ábrákon látható módon:




A programozóval való együttműködéshez kényelmesen használható egy LPT-port-bővítmény, amelyet könnyű saját kezűleg elkészíteni (például Centronix-kábelből egy nyomtatóhoz), a lényeg az, hogy ne kímélje meg a vezetőket a földhöz (18- 25 csatlakozó láb) vagy vásároljon. A programozó és a programozható chip közötti kábel nem haladhatja meg a 20-30 cm-t.

AVR a cég által gyártott népszerű mikrokontroller család neve Atmel. Az AVR mellett más architektúrákat is gyártanak ezzel a márkával, például az ARM-et és az i8051-et.

Milyen típusú AVR mikrokontrollerek léteznek?

Háromféle mikrokontroller létezik:

A 8 bites mikrokontrollercsalád több mint egy évtizede a legnépszerűbb. Sok rádióamatőr kezdett tőle tanulni mikrokontrollereket. Szinte mindannyian a programozható vezérlők világát fedezték fel saját, egyszerű kézműves mesterségekkel, például LED-villogóval, hőmérővel, órákkal, valamint egyszerű automatizálással, például világítási és fűtőberendezések vezérlésével.

Az AVR 8 bites mikrokontrollerek viszont két népszerű családra oszthatók:

    Attiny- a névből kiderül, hogy a legfiatalabbak (pici - fiatal, fiatal, fiatalabb) általában 8 vagy több tűvel rendelkeznek. Memóriakapacitásuk és funkcionalitásuk általában szerényebb az alábbiaknál;

    Atmega- a fejlettebb mikrokontrollerek több memóriával, érintkezőkkel és különféle funkcionális egységekkel rendelkeznek;

A mikrokontrollerek legerősebb alcsaládja az xMega - ezek a mikrokontrollerek hatalmas számú tűvel, 44-től 100-ig kaphatók. Erre a nagyszámú érzékelővel és működtetővel rendelkező projektekhez van szükség. Ezenkívül a megnövelt memóriakapacitás és a működési sebesség nagy teljesítményt tesz lehetővé.

Magyarázat: A pin (angolul pin - tű, tű) egy mikrokontroller kimenete, vagy ahogy az emberek mondják, egy láb. Innen a „pinout” szó – i.e. információkat az egyes lábak céljáról.

Mire van szükség a mikrokontrollerekre és mire képesek?

Mikrokontrollereket szinte mindenhol használnak! A 21. században szinte minden eszköz mikrokontrollerrel működik: mérőműszerek, szerszámok, háztartási gépek, órák, játékok, zenedobozok és kártyák és még sok minden más; A felsorolás önmagában több oldalnyi szöveget igényelne.

A fejlesztő analóg jelet használhat a mikrokontroller bemenetére való betáplálására és az értékével kapcsolatos adatok manipulálására. Ezt a munkát egy analóg-digitális átalakító (ADC) végzi. Ez a funkció lehetővé teszi a felhasználó számára, hogy kommunikáljon a mikrokontrollerrel, valamint érzékelje a környező világ különböző paramétereit érzékelők segítségével.

Az általános AVR mikrokontrollereknél pl. Atmega328, amely 2017-ben sok tábla szíve Arduino, de róluk később. 8 csatornát használnak ADC, bitmélységgel 10 bit. Ez azt jelenti, hogy 8 analóg érzékelőről tudja leolvasni az értéket. És a digitális érzékelők a digitális érintkezőkhöz vannak csatlakoztatva, ami nyilvánvaló lehet. A digitális jel azonban csak 1 (egy) vagy 0 (nulla) lehet, míg az analóg jel végtelen számú értéket vehet fel.

Magyarázat:

Bit mélység egy olyan érték, amely az analóg bemenet minőségét, pontosságát és érzékenységét jellemzi. Nem hangzik teljesen tisztán. Egy kis gyakorlás: 10 bites ADC, írjon analóg információt a portról 10 bit memóriába, vagyis egy egyenletesen változó digitális jelet a mikrokontroller 0 és 1024 közötti számértékként ismer fel.

A 12 bites ADC ugyanazt a jelet látja, de nagyobb pontossággal - 0 és 4096 között, ami azt jelenti, hogy a bemeneti jel mért értéke 4-szer pontosabb lesz. Ahhoz, hogy megértse, honnan származik az 1024 és a 4096, egyszerűen emelje fel a 2-t az ADC bitmérettel megegyező teljesítményre (2-t 10-re, 10 bitre stb.)

A terhelési teljesítmény szabályozásához PWM csatornák állnak az Ön rendelkezésére, például a fényerő, a hőmérséklet vagy a motor fordulatszámának beállítására. Ugyanabban a 328-as vezérlőben 6 db van.

Általában az AVR mikrokontroller felépítése a diagramon látható:

Minden csomópont alá van írva, de előfordulhat, hogy néhány név nem annyira egyértelmű. Nézzük a jelöléseiket.

    ALU- aritmetikai-logikai eszköz. A számítás elvégzéséhez szükséges.

    Általános célú nyilvántartások (RON)- újraindítás után törlődnek azok a regiszterek, amelyek képesek adatokat fogadni és tárolni, miközben a mikrokontroller árammal van csatlakoztatva. Ideiglenes cellákként szolgál az adatműveletekhez.

    Megszakítja- olyasmi, mint egy esemény, ami a mikrokontroller belső vagy külső behatása miatt következik be - időzítő túlcsordulás, külső megszakítás az MK tűről stb.

    JTAG- interfész az áramkörön belüli programozáshoz anélkül, hogy a mikrokontrollert levennénk a kártyáról.

    Flash, RAM, EEPROM- memória típusok - programok, ideiglenes munkaadatok, a mikrokontroller tápellátásától független hosszú távú tárolás, a megnevezésekben szereplő sorrend szerint.

    Időzítők és számlálók- a mikrokontroller legfontosabb komponensei egyes modellekben a számuk akár tíz is lehet. Ezekre azért van szükség, hogy jelezzék az órajelek számát, illetve az időintervallumokat, és a számlálók bármelyik eseménynek megfelelően növelik értéküket. Működésük és módjuk a programtól függ, de ezek a műveletek hardverben, pl. a program főszövegével párhuzamosan megszakítást okozhatnak (opcióként az időzítő túlcsordulása miatt) a kódvégrehajtás bármely szakaszában, bármely sorban.

    A/D (analóg/digitális)- ADC, a célját már korábban leírtuk.

    WatchDogTime- a mikrokontrollertől független RC generátor, sőt annak órajel-generátora, amely egy bizonyos időtartamot számol és visszaállítási jelet generál az MK-nak, ha működött, illetve ébresztőjelet, ha alvó üzemmódban volt (energiatakarékos) . Működése letiltható a WDTE bit 0-ra állításával.

A mikrokontrollerek kimenetei meglehetősen gyengék, vagyis általában 20-40 milliamperig terjed az áramerősség, ami elegendő a LED és a LED-jelzők begyújtásához. Erősebb terheléshez áram- vagy feszültségerősítőkre van szükség, például ugyanazokra a tranzisztorokra.

Mi kell a mikrokontrollerek tanulásához?

Először meg kell vásárolnia magát a mikrokontrollert. Az első mikrokontroller lehet bármilyen Attiny2313, Attiny85, Atmega328 és mások. Jobb, ha azt a modellt választja, amelyet a leckékben leírtak.

A következő dolog, amire szüksége van programozó. Szükséges a firmware betöltése az MK memóriába, ez a legolcsóbb és legnépszerűbb USBASP.

Kicsit drágább, de nem kevésbé elterjedt programozó AVRISP MKII, amelyet saját kezűleg is elkészíthet - egy rendes tábláról Arduino

Egy másik lehetőség az, hogy átvillantja őket USB-UART adapter, amely általában az egyik konverteren készül: FT232RL, CH340, PL2303 és CP2102.

Egyes esetekben az USB hardver támogatásával rendelkező AVR mikrovezérlőket használnak egy ilyen konverterhez, nincs túl sok ilyen modell. Itt van néhány:

Csak egy „de” van - először be kell töltenie az UART rendszerbetöltőt a mikrokontroller memóriájába. Persze ehhez még mindig kell egy programozó az AVR mikrokontrollerekhez.

Érdekesség: Bootloader- ez egy szokványos program egy mikrokontrollerhez, csak szokatlan feladattal - indítás után (tápfeszültségre csatlakoztatva) vár egy ideig, amíg a firmware betöltődik. A módszer előnye, hogy bármilyen USB-UART adapterrel flashelhető, ráadásul nagyon olcsók. Hátránya, hogy a firmware betöltése sokáig tart.

Munkához UART(RS-232) interfész az AVR mikrokontrollerekben, egy teljes UDR regiszter van lefoglalva (UART adatnyilvántartás). UCSRA (adó-vevő bitbeállítások RX, TX), UCSRB és UCSRC - az interfész egészének beállításaiért felelős regiszterkészlet.

Mibe lehet programokat írni?

A program írásához és letöltéséhez a programozón kívül szükség van egy IDE-re - egy fejlesztői környezetre. Természetesen a kódot beírhatja a Jegyzettömbbe, futtathatja a fordítókon, stb. Miért van erre szükség, ha vannak kiváló kész lehetőségek. Talán az egyik legerősebb az IAR, de fizetős.

Az Atmel hivatalos IDE-je az AVR Studio, amelyet a 6-os verzióban átneveztek Atmel stúdióra. Támogatja az összes AVR mikrovezérlőt (8, 32, xMega), automatikusan felismeri a parancsokat és segít a bevitelben, kiemeli a helyes szintaxist és még sok más. Segítségével villoghat MK.

A legelterjedtebb a C AVR, úgyhogy keress rá egy oktatóanyagot, rengeteg orosz nyelvű lehetőség van, és az egyik a V.Ya. „AVR mikrokontrollerek. Workshop kezdőknek."

Lásd még Maxim Selivanov részletes oktatóvideóját a mikrokontrollerek programozásáról kezdőknek:.

Az AVR megtanulásának legegyszerűbb módja

Vedd meg vagy készítsd el magad. Az Arduino projektet kifejezetten oktatási célokra tervezték. Több tucat különböző formájú és érintkezőszámú táblával rendelkezik. Az Arduino-nál az a legfontosabb, hogy nem csak egy mikrokontrollert veszünk, hanem egy teljes értékű hibakereső kártyát, kiváló minőségű textolit nyomtatott áramköri lapra forrasztva, maszkkal letakarva, és SMD alkatrészeket szerelünk.

A leggyakoribb az Arduino Nano és az Arduino UNO, ezek lényegében azonosak, kivéve, hogy a „Nano” körülbelül 3-szor kisebb, mint az „Uno”.

Néhány tény:

    Az Arduino szabványos nyelven programozható - „C AVR”;

    saját - vezetékek;

    szabványos fejlesztői környezet - Arduino IDE;

    A számítógéphez való csatlakozáshoz csak csatlakoztatni kell az USB kábelt az Arduino nano kártya mikro-USB aljzatához, telepíteni kell az illesztőprogramokat (valószínűleg ez automatikusan megtörténik, kivéve ha a konverter a CH340-en van, nekem nem volt illesztőprogramok Win 8.1-en, le kellett töltenem, de ez nem tartott sok időt.) utána feltöltheti a „vázlatokat”;

    "Sketches" az Arduino programjainak neve.

következtetéseket

A rádióamatőr gyakorlásban kiváló segítséget nyújtanak a mikrokontrollerek, melyek segítségével felfedezheti a digitális elektronika világát és megtervezheti saját mérőműszereit, háztartási automatizálási berendezéseit.  

A programok és az adatok el vannak választva (a klasszikus architektúrától eltérően
von Neumann hagyományos számítógépeken, ahol a memória meg van osztva). Külön gumik hozzá
ezek a memóriaterületek jelentősen felgyorsítják a programvégrehajtást: adatok és
csapatok egyidejűleg is kiválaszthatók.

32 általános célú regiszter (RON). Az Atmel volt az első cég messze
eltért a számítási mag klasszikus modelljétől, amelyben
parancsátvitel magában foglalja az ALU és a tároló közötti adatcserét
cellák a megosztott memóriában. A RON bevezetése ilyen mennyiségben (ne feledje, hogy
építészet x 86 csak négy ilyen regiszter van, és in x 51 RON fogalma, mint olyan,
hiányzik) bizonyos esetekben lehetővé teszi a globális helyének teljes elhagyását
labda és helyi változók a RAM-ban és a verem használatából, műveletek vele
amelyek bonyolítják és összezavarják a programot. Ennek eredményeként az ak-
A mintaprogram közelebb áll a magas szintű nyelvű programokhoz.
Igaz, ez a parancsrendszer, a nómenklatúra némi bonyodalmához vezetett
amelyekből több van az AVR számára, mint más RISC családokban (bár jelentős
egyes utasítások álnevek).

Flash program memória(10 000 törlési/írási ciklus) azzal a képességgel
rendszeren belüli újraprogramozás és letöltés soros úton
csatorna közvetlenül a kész áramkörben. Ennek a megközelítésnek az előnyeiről, amely mára vált
általánosan elfogadott, részletesen le van írva a beadni.

A nem felejtő memória külön területe(EEPROM, 100 000 ciklus
törlés/írás) adattároláshoz, szoftveres írás lehetőségével
által, vagy külső letöltés SPI interfészen keresztül.

Beépített analóg jelfeldolgozás: analóg
összehasonlító és többcsatornás 10 bites ADC.

Watchdog időzítő, amely lehetővé teszi az automatikus újraindítást
vezérlő bizonyos időközönként (például kilépéshez
"alvó mód).

Soros SPI interfészek, TWI (én

C) És UART (USART), Megengedem-

képes kommunikálni a legtöbb szabványos érzékelővel és
egyéb külső eszközök (beleértve a személyi számítógépeket is)
hardver.

Időzítők-számlálók előre beállított értékkel és a számlálási forrás kiválasztásának lehetőségével
nal impulzusok: általában egy vagy két 8 bites és legalább egy
16 bites, beleértve azokat is, amelyek többcsatornás 8-, 9-,
10-, 16-bites impulzusszélesség-moduláció (PWM).

Képes órajelen működni 0 Hz-től 16-20 MHz-ig.

A tápfeszültség tartománya 2,7-5,5 V(egyes esetekben 1,8-tól ill
6,0 V-ig).

Számos energiatakarékos módok, amelyek a csomópontok számában különböznek,
csatlakoztatva marad. Kilépés az "alvó" üzemmódból a watchdog segítségével
időzítő vagy külső megszakítások.

Beépített teljesítmény monitor- Feszültségesés-érzékelő (barnás
Érzékelés).

Itt nincs felsorolva az egyes modellekre jellemző összes jellemző.
AVR. Másokat később, illetve a gyakorlatban is megismerünk.
Nézzük meg részletesebben a fentieket. De először adjunk egy általános leírást
különböző AVR családok elsődleges célját tekintve.

AVR családok

2002-ben az Atmel elkezdte kiadni a 8 bites MK-k új alcsaládjait, amelyek
AVR magok. Azóta ennek a családnak az összes MK-ja három csoportra oszlik (alcsalád
va): Classic, Tiny és Mega. A Classic család MK-ja (AT90S xxxx) már nem gyártják;
amelyik a legtovább maradt gyártásban, az nagyon sikeres volt (egyszerű, kompakt és
nagy sebességű modell) AT90S2313, de 2005-ben ezt is lecserélték
ATtiny2313. Az összes "klasszikus" AVR a név első 2-es és 8-as számával
modellek (ami a programmemória mennyiségét jelenti kilobájtban) tartalmaznak analógokat
családok Tiny és Mega. A Megához a programozás során lehetőség van speciális telepítésre
cial kompatibilitási bit, amely lehetővé teszi a változtatás nélküli használatot
a Classic család számára készült programokat használja. Ezért számos példa található benne
A bemutatás leegyszerűsítése érdekében ezt a könyvet a család számára készített változatban mutatjuk be
Klasszikus.
Példák különböző típusú esetekre, amelyekben AVR chipeket gyártanak,
ábrán láthatók. 1.1. A témával kapcsolatban további információk találhatók a
1. függelék(A1.2 táblázat), valamint az eszközök műszaki dokumentációjában.
Vegye figyelembe, hogy rádióamatőr igényekhez és prototípus-készítéshez mikro-
áramkörök PDIP csomagokban, de nem minden MK modellt gyártanak ilyen csomagokban.
Minden családnak két módosítása lehet: az "L" betű a megnevezésben azt mondja
a kiterjesztett teljesítménytartományról 2,7–5,5 V, az ilyen betű hiánya a
teljesítmény tartomány 4,5–5,5 V. Egy adott típusú mikroáramkör kiválasztásakor meg kell tenni
óvatosan, mivel az L-változatok kevésbé gyors hatásúak is,
Legtöbbjük maximális órajele 8 MHz.
A "normál" verzióknál a maximális frekvencia 16 vagy 20 MHz. Bár hogyan
Általános szabály, hogy L-chipek indításakor 5 V tápfeszültséggel 10-ig terjedő frekvencián
12 MHz-es problémákra nem kell számítani (hasonlóan az L betű nélküli változathoz, eléggé
3 V körüli tápfeszültségen működhet, persze nem extrémen
frekvencia értékek), azonban a rendkívül megbízható eszközök tervezésekor
a vállalatoknak figyelembe kell venniük ezt a követelményt.
Az apró chipek 1–8 kbyte kapacitású Flash ROM-mal rendelkeznek, és benne találhatók
főként 8-20 tűs kiszerelésben (kivéve ATtiny28), azaz általában rendeltetésszerű
egyszerűbb és olcsóbb készülékekhez készültek. Ez nem jelenti azt, hogy lehetségesek -
A tulajdonságok minden esetben korlátozottabbak, mint a Mega családé. Például,
2 dollár alatt az ATtiny26 nagy sebességű PWM időzítőt tartalmaz
módban (más modellek nem rendelkeznek ilyennel), valamint egy 11 csatornás ADC lehetőséggel
Lehetőség differenciál üzemmódban, állítható bemeneti erősítővel

I. rész. Az Atmel AVR tervezésének és működésének általános elvei

és egy beépített referencia feszültségforrás, ami a nagy teljesítményre jellemző
Ossza meg. Az ATtiny2313 chip, mint már említettük, továbbfejlesztett
az egyik legsokoldalúbb és legkényelmesebb "klasszikus" AVR új verziója
AT90S2313.

Rizs. 1.1. Példák különböző típusú AVR MCU-k házaira

A Mega alcsalád 8-256 KB kapacitású Flash ROM-mal és házzal rendelkezik.
magukat 28–100 tűvel. Általában az ebbe a csoportba tartozó MK-k kifinomultabbak, mint
Kicsi, van egy kiterjedtebb rendszer a beágyazott eszközök fejlettebb
funkcionalitás.
Asztalok néhány Tiny és Mega modell főbb jellemzőivel
a legnépszerűbbek vannak felsorolva 1. függelék. Néhány általános technika is megtalálható ott.
az AVR család műszaki jellemzői. Részletesebb információ a címen kérhető
től és a weboldalon elérhető saját műszaki dokumentációt
Atmel minden modellhez.
Ezen a három családon kívül az AVR magon alapuló speciálisak is készülnek
mikroáramkörök az USB interfésszel való munkához (AT90USB xxxx), ipari in-
CAN interfész (AT90CAN xxx), LCD kijelzők vezérléséhez (ATmega329 stb.),
vezeték nélküli IEEE 802.15.4 (ZigBee) interfésszel a kereskedelem és
néhány másik. A közelmúltban néhány mikrokontroller a Tiny és
A Mega-t rendkívül alacsony fogyasztású változatokban kezdték gyártani (technológia
picoPower 1,8 V tápfeszültséggel, a sorozat MK nevének végén
"P" betű hozzáadva) és magas hőmérséklet autóipari használatra
ipar (autóipari változatok). Az XMega család feszültséggel jelent meg
tápegység 1,8-3,6 V, megnövelt sebesség (órajel frekvencia 32 MHz-ig),

1. fejezet Az Atmel AVR mikrokontrollerek áttekintése

12 bites 16 csatornás ADC és 2-4 csatornás DAC (még a szerkezetben
Az AVR hiányzott), több UART csatorna és egyéb sorozat
portok (és offline módban, leálláskor is működhet
kernel), beépített kriptográfiai támogatás, haladó mód
picoPower és egyéb harangok és sípok. Van egy külön 32-szeres család is
soros MK AVR32, nagy sebességű alkalmazásokhoz, mint pl
mint például a videofolyam-feldolgozás vagy a valós idejű képfelismerés.

Sajátosságok
az MK AVR gyakorlati használata

Az AVR használatakor számos gyakorlati probléma merül fel, figyelmen kívül hagyva
amelyek korrekciója esetenként a készülék működésképtelenségéhez vagy meghibásodásához vezethet.
rajok (és bizonyos esetekben - még a programozás lehetetlensége is).
Például az egyik ilyen probléma az EEPROM tartalmának elvesztésének lehetősége
az áramellátás kikapcsolásakor. Ezt és a hasonló problémákat részletesen megvizsgáljuk
vonatkozó fejezeteket. Itt néhány általános kérdésen fogunk kitérni
az AVR MK bekapcsolása.

A fogyasztásról

Az AVR MCU-k átlagosan 5-15 mA-t fogyasztanak (nem számítva a külső eszközök fogyasztását).
roy az MK következtetésein keresztül). Az aktuális fogyasztás nem csak a „navo-
A modell "kifejezése", hanem az órajel frekvenciájára és a tápfeszültségre is Az 1.2
az áramfelvétel tápfeszültségtől való függésének tipikus diagramját mutatja
a Mega család fiatalabb modelljeihez.
ábrából 1.2-ből különösen az következik, hogy a fogyasztás jelentősen csökkenthető
az órajel frekvenciájának csökkentése olyan esetekben, amikor a program végrehajtási ideje nem
kritikai. Ez lehetővé teszi a program egyszerűsítését az energiamódok megszüntetésével
megtakarítás: például 32 768 Hz-es „órajeles” kvarc beszerelésekor
tyrating MK fogyasztás 200-300 μA nagyságrendű lehet.

Z

MEGJEGYZÉSEK A MARGÁRON

1-2 mA vagy annál kisebb áramfelvételi érték feltételesen elfogadhatónak tekinthető
akkumulátoros eszközök, amelyeket hosszú távú folyamatos működésre terveztek
munka. Az AA méretű (lúgos típusú, azaz lúgos) elemek kapacitása
kb 2000 mAh töltés, azaz ezekből az elemekből a megadott fogyasztású készülék
legalább 1000 órát (valójában még egy kicsit többet is) vagy több mint 40 napig működik. Idő
körülbelül 15–18 000 mAh energiakapacitású D-méretű akkumulátorokkal működik
körülbelül egy évig tart, ami a legtöbb gyakorlati alkalmazáshoz elegendő.
Válassza ki az ilyen eszközök tápellátását (különösen azokat, amelyek rendszeresen bekapcsolnak)
rövid ideig) a lúgos elemeket kell használni, mivel ezek nagy
kapacitása, túltöltéskor nem szivárog, és ami a legfontosabb, lényegesen hosszabb élettartammal rendelkezik
tárolás (kb. 7 év) más típusú elemekhez képest.

De a probléma alapos mérlegelése azt mutatja, hogy pontosan ez az, ami leegyszerűsít
program – az esetek túlnyomó többségében az előnyök nagyobbak

I. rész. Az Atmel AVR tervezésének és működésének általános elvei

alacsony órajel, és korlátozottak. Grafikonok az ábrán. 1.2 lineáris, tehát
ebből következik, hogy az órajel frekvencia csökkenésével arányosan nő a végrehajtási idő
parancsokat. Így egy eljárás, amelynek végrehajtása órajel frekvencián
A 4 MHz 100 µs-ot vesz igénybe, 32 768 Hz-es órajelnél több mint 12 ms.
Könnyen kiszámítható, hogy mindkét esetben az elfogyasztott energia mennyisége per
ennek az eljárásnak a végrehajtása ugyanaz lesz.

Rizs. 1.2. Az áramfelvétel diagramja a tápfeszültség függvényében

és órajel frekvencia a Mega család fiatalabb modelljeihez

Ezért a következő általános következtetést vonhatjuk le: ha nem akar elmélyülni
az energiatakarékos módok finomságait, és ne alkalmazza őket a programban, akkor általánosságban
A fogyasztás csökkentése érdekében a lehető legalacsonyabb órafrekvenciát kell választania (a
A gyakorlatban általában elegendő az értéket 1 MHz-re korlátozni, mivel tovább
a csökkentésnek nagy valószínűséggel nem lesz hatása a többletfelhasználás miatt
ezek az áramkörök, elkerülhetetlenül minden áramkörben jelen vannak). Ha van figyelmeztetésed
Megnéztük az egyik „mély” energiatakarékos módot (lásd. 4. fejezet), majd az órát
A gyakoriság a teljes fogyasztás szempontjából gyakorlatilag lényegtelen.
Egy másik dolog a tápfeszültség megválasztása, amelyet célszerű megtenni, amennyire csak lehetséges
kevesebb, ha a külső eszközök ezt lehetővé teszik. Az áramfogyasztás függése a
ábra grafikonjaiból könnyen megérthető a tápfeszültség. 1.2, nemlineáris: növekvő
A feszültség növekedésével az áramfelvétel gyorsan növekszik. Ezért csökkentse
tápfeszültség, még a legtöbb esetben az órajel-frekvencia korlátozást is figyelembe véve
A VA AVR modellek (legfeljebb 8 MHz 2,7 V tápellátással) továbbra is nyereségesek. Például,
ábra szerinti 3 V-os tápellátású készülék 8 MHz órajelen. 1.2 lesz
fogyasztása körülbelül 3 mA, vagy teljesítményegységenként 9 mW; az eljáráshoz-

1. fejezet Az Atmel AVR mikrokontrollerek áttekintése

ru 100 μs időtartammal 0,9 μJ energiát igényel. 16 MHz-es frekvencián ugyanaz a pro-
Az eljárás 50 µs-ot vesz igénybe, de a fogyasztás a szükséges 5 V tápfeszültség mellett
körülbelül 14 mA, azaz 70 mW lesz; összességében energiát vesz igénybe az eljárás befejezése
3,5 µJ, majdnem 4-szer több.
Nagyon kevés kivételtől eltekintve minden külső digitális eszköz esetében megteheti
szerezzen be egy modern analógot, amely 2,7-es feszültségen működik
3,0 V (és még alacsonyabb is, ha a vezérlőmodell lehetővé teszi), tehát ezen az oldalon
korlátozások nélkül; hogy ebben a könyvben a legtöbb példa arra összpontosít
A tápfeszültség 5 V, csak tisztelgés a hagyományok előtt. Sőt, ezek a példák olyanok, mint
általában hálózati tápellátást jelent, ahol a fogyasztás nem túl jelentős
olvasmányok. A LED-jelzők korlátozhatják a tápfeszültség csökkenését
torokra (annak a ténynek köszönhető, hogy magában a LED-ekben a közvetlen feszültségesés az
körülbelül 2 V, a nagy kijelzőknél pedig akár 5 V az alul-
pontosan), de az ilyen készülékeknél a vezérlő fogyasztása már nem játszik nagy szerepet
szerepek: maga négy hétszegmenses számjegy nagyságrendű áramot fogyaszt
100 mA vagy több. Egy másik esetet az analóg áramkörök képviselnek, ahol a növekedés
tápfeszültség előnyös a jel-zaj arány növelése szempontjából.
Ne feledje, hogy az AVR tűi jelentős hosszú távra képesek
áram (20-40 mA-ig), de ne feledkezzünk meg az általános teljes korlátozásról
a kimenő teljesítmény szerinti fogyasztáshoz (lásd . asztal P1.3). Azt is meg kell jegyezni
ha analóg feszültséget kapcsolunk az ADC bemenetekre, a bemeneti digitális CMOS-
elem (a megfelelő port bemenete) nincs letiltva, és ennek értékével
az elem válaszküszöbéhez közeli feszültség, ez megnövekedéshez vezethet
fogyasztás a kimeneti fokozatokon átmenő átmenő áram miatt
CMOS (beleértve néha, amikor a mikroáramkör alvó módban van,
cm. 14. fejezet). A picoPower technológiás mikroáramköröknek nincs ilyen hátránya.

Az AVR áramkörökben való használatának néhány jellemzője

A legtöbb MK tűnek beépített „pull-up”-ja van.
(vagyis a tápsínre kötött) ellenállást, ami megoldaná az egyik
gyakori áramköri problémák, amikor ilyen ellenállásra van szükség
kéttűs gombok vagy "nyílt kollektoros" kimenetek csatlakoztatására.
Kritikus esetekben azonban egy külső ellenállás 2-
5 kOhm (fogyasztás-kritikus esetekben 10-30 kOhm-ig).
A felhúzó ellenállást nem csak a /RESET érintkezőhöz kell telepíteni
(amiről itt lesz szó 2. fejezet), hanem abban az esetben is, ha az SCK, MOSI és MISO érintkezők
a megfelelő portok a programozáshoz használatosak és csatlakoztatva vannak
ISP programozó csatlakozó (lásd 5. fejezet), valamint a külső megszakítások kimeneteiből
vaniya, ha érintettek. Ha ezeket a következtetéseket nem „húzzuk fel” a feszültségre
tápegység további ellenállásokkal (bár ez nincs megadva a műszaki leírásban
dokumentáció), akkor a külső megszakítások hamis kioldása nem zárható ki,
a rendszer újraindítása, és nagyon erős interferenciával - akár a program memóriájában is károsodva -
ezeket a programokat. Másrészt programozáskor a kimenetek is szolgálnak

I. rész. Az Atmel AVR tervezésének és működésének általános elvei

A legtöbb szokásos kimenet kimenetre konfigurálva, és az eszköz használja
energiatakarékos módok, a „felhúzó” ellenállások jelenléte vezethet
szükségtelen áramfelvételre (ha a kimenetet az ellenálláson keresztül logikai nullára állítjuk
oldalon az áram az áramforrástól az MK bemenetére fog folyni. Ha az egyik újra
Az energiatakarékos módok használatához gondosan elemeznie kell az áramkört
ide tartoznak azok a helyzetek is, amelyekben áram folyik át ezeken az ellenállásokon.
Mindig telepítsen külső ellenállásokat az MK érintkezők működtetésekor
közös busz, mint az I. interfészben

C (vagy egyszerűen az MK bemenet csatlakoztatásával

egy másik nyitott kollektoros eszköz, például tápegység-monitorok kimenete
pontjában leírt fejlesztések 3. fejezet), ha kéttűs gombokhoz csatlakozik (különösen
ha van külső megszakítás, lásd 4. fejezetÉs 5 ). Beépített ellenállás
ellenállás (természetesen térhatású tranzisztor)
ilyen esetekben túl nagy az elektromágneses interferenciához ("be-
vodka") gyakorlatilag „ültek" rá.
Az AVR chipek, mint minden CMOS logika, magas küszöbük miatt
A kötözőelemek hatékonyan védik a földbusz interferenciáját. Azonban viselkednek
sokkal rosszabb a tápbuszon való interferencia. Ezért ne feledkezzünk meg a feloldásról
teljesítménykondenzátorok, amelyeket közvetlenül a tápegység érintkezőire kell felszerelni
tania (kerámia 0,1–0,5 μF), valamint a hálózati egyenirányítók minőségéről, ill.
stabilizátorok.

C H A P T E R

Általános készülék
memória szervezés,
óra, reset

Az AVR MK belső szerkezetének általános felépítése az ábrán látható. 2.1. Ebben
a diagram az AVR összes fő összetevőjét mutatja (kivéve a JTAG modult);
egyes modelleknél előfordulhat, hogy egyes alkatrészek hiányoznak vagy eltérőek lehetnek -
jellemzői, csak a közös 8 bites processzor marad változatlan
új mag (GPU, General Processing Unit). Röviden ismertetjük a legfontosabb összetevőket
fészek, amelyek többségét később részletesen megvizsgáljuk.
Kezdjük a memóriával. Az AVR struktúrájában háromféle memória található: flash-
programmemória, RAM (SRAM) az ideiglenes adatokhoz és a nem felejtő memória
memória (EEPROM) az állandók és adatok hosszú távú tárolására. Tekintsük őket
külön.

Program memória

A programok beépített flash memóriájának mennyisége az AVR vezérlőkben tól
1 KB az ATtiny11-hez – 256 KB az ATmega2560-hoz. Az első szám a névben
osztás megfelel ennek a memória értékének a sorozatból: 1, 2, 4, 8, 16, 32, 64, 128 és
256 kbyte. A programmemóriának, mint minden más flash memóriának, van egy oldala
szervezettség (az oldal mérete modelltől függően 64-től
256 bájt). Az oldal csak egészében programozható. Ciklusok száma
átprogramozás eléri a 10 ezret.
A programozó szemszögéből a programmemória tekinthető abból, amiből felépült
külön cellák - egyenként két bájtos szavak. A programmemória eszköz (és csak
ez a memória) kétbájtos szavakkal – ez egy nagyon fontos pont, amelynek meg kell lennie
erősen fogja meg. Ez a szervezet annak a ténynek köszönhető, hogy bármely csapat az AVR-ben
pontosan két bájt hosszú. A kivétel a csapatok

és néhány

ry mások (pl.

), amelyek 16 bites és hosszabb verziókkal működnek

címeket, ezeknek a parancsoknak a hossza négy bájt, és csak használatosak
8 kbájtnál nagyobb programmemóriával rendelkező modellekben (további részletekért lásd 5. fejezet). Ban ben
Minden más esetben a parancsszámláló eltolódik a következő végrehajtásakor.

I. rész. Az Atmel AVR tervezésének és működésének általános elvei

parancsokat két bájtba (egy szó), így a szükséges memóriakapacitás egyszerű
számoljon, a használt parancsok számának ismeretében. Abszolút címek a memóriában
gramm (például megszakítási vektortáblázatokban jelezve a műszaki
MK leírása) szavakban is számítanak.

Rizs. 2.1. Az AVR mikrokontrollerek általános blokkvázlata

Z

MEGJEGYZÉSEK A MARGÁRON

Adjunk példát egy érdekes címzési esetre, amely reprezentálja
parancs konstansok olvasásához LPM-memóriából (valamint ELPM-ből az MK-ban programmemóriával
128

kbájt vagy több). Ez a parancs magában foglalja az olvasást byte feltüntetett cím -

nomu a két legmagasabb RON-ban (az úgynevezett Z regisztert alkotva, lásd alább). Azonban, hogy ne
a fejlesztők szerint megsértik a programmemória rendszerezési koncepciójának "tisztaságát".
összezavarta ezt az egyszerű kérdést azzal, hogy a leírásban jelezte, hogy az LPM parancs meghívásakor a régi
A Z regiszter címének következő 15 bitje szó a memóriában, és a legkisebb jelentőségű számjegy kiválasztódik
ennek alacsony vagy magas bájtja (ha a bit 0 vagy 1).

szavak. Könnyen észrevehető azonban, hogy a memória bájt- és szószervezése amikor
com megközelítés egyenértékű.

Egy adott modell meglévő programmemóriájának utolsó címe
állandóval jelöljük

Alapértelmezés szerint minden AVR vezérlő mindig

indítsa el a program végrehajtását a $0000 címen. Ha nincs fennakadás a programban
ny, akkor erről a címről indulhat az alkalmazó program. Másképp

tea ezen a címen az ún. asztal megszakítási vektorok, részletek
amiről majd beszélünk fejezetek 4És 5 . Itt csak azt emeljük ki, hogy az első
ez a táblázat (ugyanazon a $0000 címen) mindig tartalmaz egy visszaállítási vektort

amely jelzi az MK visszaállítása során végrehajtott eljárást (beleértve
az áramellátás bekapcsolásakor).

P

JEGYZET

Az AVR assemblerben a hexadecimális számokat "Pascal"-ban jelenítheti meg
stílus, előtte egy $ jel, míg a C nyelvi stílus (0x00) is érvényes, de
Az "Intel" módszer (00h) nem működik. Olvasson többet a különböző számok jelöléseiről
Számrendszerek az AVR assemblerben, lásd 5. fejezet.

A Mega család vezérlőinek utolsó programmemória címei tartalmazhatnak
hazugság ún rakodó- speciális program, amely a betöltést és
alkalmazási programok eltávolítása a fő memóriából. Ebben az esetben,
a visszaállítási vektor és a teljes megszakítási vektortábla helye (vagyis ténylegesen bekapcsolt
kezdőcím, ahonnan a program végrehajtása kezdődik) módosítható
speciális konfigurációs cellák telepítésével nem lehetséges (lásd. 5. fejezet).

Adatmemória (RAM, SRAM)

A programmemóriával ellentétben az adatmemória címterülete címzett
byte byte (nem szóról szóra). A címzés teljesen lineáris, minden megosztás nélkül
oldalakra, szegmensekre vagy tégelyekre, ahogy ez más rendszerekben is megszokott.
A Tiny család junior MK-jai (beleértve a Tiny1 xés Tiny28) adatmemória, mint pl
üvöltenek, nem, csak a regiszterfájlra (RON) és a bemeneti regiszterekre korlátozódnak
igen-kimenet (RVV). Más modellekben a beépített SRAM mennyisége tól
128 bájt az apró családtagokban (például ATtiny2313) 4–8 kbyte-ig
régebbi Mega modellekhez.
A statikus adatmemória (SRAM) címterét hagyományosan felosztják
ábrán látható több terület. 2.2. A rész a
magához a beépített SRAM-hoz kapcsolódik, előtte a címek sorrendjében találhatók
de a regiszterek címterét (az első 32 bájtot a RON foglalja el, a további 64 bájtot
RVV). Régebbi, összetett szerkezetű Mega modellekhez (például ATmega128)
Előfordulhat, hogy a 64 I/O regiszter nem elegendő, ezért további
A további RVV-k külön címteret kapnak (60 USD-tól max.
maximális lehetséges érték $FF bájtcímzésben, összesen ilyen regiszter képes
talán csak 160).

Z

MEGJEGYZÉSEK A MARGÁRON

Az AVR MK architektúrájában az „input-output” fogalmát két értelemben használják: először

Először is vannak „bemeneti/kimeneti portok” (I/O portok), amelyekben megvizsgáljuk 3. fejezet.
Másodszor, az AVR struktúrájában az „input-output regiszterek” (IO) a regiszterek
amelyek hozzáférést biztosítanak további külső alkatrészekhez

csatlakozás a GPU-hoz, kivéve a RAM-ot (beleértve az I/O portokat). Egy ilyen al-
Az elválasztás az AVR MK szerkezetét közelebb hozza a személyes konfigurációhoz
számítógép, ahol a központi processzoron kívül bármilyen hozzáférést biztosít
A memórián kívüli egyéb összetevők I/O portokon keresztül érhetők el.

I. rész. Az Atmel AVR tervezésének és működésének általános elvei

Egyes Mega modellekhez (ATmega8515, ATmega162, ATmega128, ATmega2560
stb.) lehetőség van külső memória csatlakoztatására akár
64 kB, ami bármilyen statikus lehet
fajta (SRAM, Flash vagy EEPROM) pa-
párhuzamos interfész.
Vegye figyelembe, hogy a RON és az RVV címei nem veszik el a
az adatRAM helye (kivéve a csatlakoztatott
várható külső memória a régebbi Mega modellekhez,
amelynek maximális címét az érték korlátozza
$FFFF): tehát, ha egy adott MK-modell rendelkezik
512 bájt SRAM, és a regiszterterületet foglalja el
először 96 bájt (legfeljebb 60 $ cím), majd SRAM címek
0060 USD és 025 F közötti címteret foglal el
(azaz a 96-ostól a 607-es celláig). Vége
a beépített adatmemóriát konstans jelzi

Rizs. 2.2. Címterület

statikus adatmemória (SRAM)

AVR mikrokontrollerek

A memória olvasási/írási műveletei ugyanúgy működnek a címből származó bármely címmel
tompa hely, és amikor SRAM-mal dolgozik, óvatosnak kell lennie: ahelyett
memóriába írva könnyen „bekerülhet” valamilyen regiszterbe. Például,
regiszter érték betöltése parancs

a nyilvántartásba

) egyenértékű

SRAM-ba ír a nulla címen (

). Cím a memóriában a RON sov-

számával esik. Ugyanakkor az RVV-be való közvetlen belépéshez az övé szerint
címet a memóriában hozzá kell adni 20 dollárt a regiszterszámhoz: így a zászló regiszter

amely a legtöbb modellnél az RVV táblázat végén található
$3F, a memóriában $5F cím van. Telepítse a RON-t és az RVV-t a pa- közvetlen címzésével
Kényelmetlen megjegyezni: egy ilyen felvételhez általában egy helyett két ütem kell
használja a legtöbb más parancsot, bár ez néha megkerülheti a korlátozásokat
hogy manipuláljon néhány RVV-t. De ha van egy kész program, akkor dolgozom -
SRAM-mal, akkor a processzormodellek régebbire cserélésekor ezt kell tenned
óvatos, mivel az alacsony SRAM-címek átfedhetik egymást
további RVV.

2. fejezet Általános felépítés, memóriaszervezés, órajel, reset

Nem felejtő adatmemória (EEPROM)

Minden AVR MK modell (kivéve a megszűnt ATtiny11) rendelkezik beépített
EEPROM az állandók és adatok tárolására kikapcsolt állapotban.
A különböző modellekben a térfogata 64 bájttól (ATtiny1x) 4 kbyte-ig (nagyobb)
Mega modellek). Az EEPROM végét konstans jelzi

(ez azt jelenti

Ez csak a későbbi AVR modelleknél kerül bevezetésre, ezért használatkor
néha magának kell meghatároznia ezt az állandót). Újraindítási ciklusok száma
Az EEPROM programozás elérheti a 100 ezret.
Emlékezzünk vissza, hogy az EEPROM különbözik a Flash-től a szelektív pro-
programozás byte byte (elvileg akár bitenként is, de ez a módszer nem elérhető
felhasználó). Azonban az EEPROM család régebbi modelljeiben, például a flash memóriában
programok, van oldalszervezése, azonban ezek az oldalak kicsik - legfeljebb
egyenként 4 bájt. A gyakorlatban, mint az EEPROM soros programozásakor
testcsatornán (azaz az SPI programozói felületén keresztül), valamint rögzítéskor ill
ha egy programból olvassa ki az EEPROM-ot, ez a szolgáltatás nem számít, a hozzáférés pedig igen
bájtonként jelenik meg.
Az EEPROM-ból való kiolvasás egy gépi cikluson belül megtörténik (bár
A gyakorlatban négy cikluson keresztül húzódik, de a programozónak ezt nyomon kell követnie.
nem szükséges). De az EEPROM-ra írás sokkal lassabb,
és ráadásul pontosan meghatározatlan sebességgel: egy bájtos írási ciklus képes
2–4 ms vagy több. A felvételi folyamatot a beépített szabályozza R.C.-
olyan generátor, amelynek frekvenciája instabil (alacsonyabb tápfeszültségen
hosszabb felvételi időre számíthat). Ilyen ideig normál körülmények között
Magas frekvenciákon az MK több ezer parancsot tud végrehajtani, így a program
A felvételi eljárás körültekintést igényel: például gondoskodnia kell arról
hogy a rögzítéskor a megszakítás ne „akadjon el” (erről bővebben lásd gla-
te 4
És 9 ).
Az EEPROM-mal való munka során a fő nehézség az összetevői károsodásának lehetősége.
akkor tart, ha a tápfeszültség pillanatnyilag nem csökken elég gyorsan
Leállitás Ez annak a ténynek köszönhető, hogy amikor a tápfeszültséget csökkentik
egy bizonyos küszöb (a stabil működés küszöbe alatt, de nem elegendő a teljes működéshez
kapcsolja ki) a feszültségingadozások miatt az MK önkényesen kezd működni
nary parancsok, beleértve az EEPROM-ra írási eljárás végrehajtásának képességét. Ha
vegye figyelembe, hogy egy tipikus AVR MK parancs tizedmikromásodperc alatt kerül végrehajtásra,
akkor egyértelmű, hogy egyetlen valódi áramforrás sem képes csökkenteni
feszültség nullára a szükséges idő alatt. A szerző tapasztalatai szerint, ha a szokásos
LM7805 típusú stabilizátor az ajánlott kapacitásértékekkel
a bemeneten és a kimeneten elkerülhetetlenül megsérül az EEPROM tartalma miatt
körülbelül az idő felében.
Ez a probléma nem állhat fenn, ha az állandók az EEPROM-ba vannak írva
az MK programozásakor, de nincs rögzítési eljárás a programban (kb
hogyan lehet adatfájlt generálni EEPROM-hoz, lásd "Irányelvek és funkciók" szakasz
5. fejezetében
). Az adatok nagyobb biztonságát ilyen esetekben megerősítik az em-

I. rész. Az Atmel AVR tervezésének és működésének általános elvei

fizikai megfigyelések, és az a tény, hogy az EEPROM-ba írás engedélyezése eljárási jellegű
ra kétlépcsős (lásd. 9. fejezet). Minden más esetben (és természetesen vannak
az abszolút többség - a felhasználói beállítások leggyakrabban EEPROM-ban vannak tárolva
új és aktuális konfigurációt az áramellátás kikapcsolásakor) el kell fogadni
különleges intézkedések. Közülük a legkardinálisabb és legegyetemesebb a statútum
Új külső tápellátás-figyelő, amely az MK-t alaphelyzetbe állítja, amikor
a tápfeszültség egy küszöbérték alá csökken. Ugyanazt a célt szolgálja
beépített feszültségesés-érzékelő (Brown-out Detection, BOD), elérhető
szinte minden Tiny és Mega modellben, de a műszaki dokumentáció nem zárja ki
Ugyanakkor biztosítani kell a külső teljesítményfigyelővel történő sokszorosítás megbízhatóságát.
A BOD-áramkörrel és az MK-visszaállítási módokkal kapcsolatos további információkért lásd: később ebben a fejezetbenés a programról
Az EEPROM telepítésével és a használat közbeni óvintézkedésekkel kapcsolatban lásd 9. fejezet.

Óra módszerek

Az MK órajelének kanonikus módszere egy kvarc rezonátor csatlakoztatása
megfelelő következtetéseket (2.3. ábra, A). A C1 és C2 kondenzátorok kapacitása egy tipikus
esetben 15-22 pF legyen (egyről 33-47 pF-re növelhető
átmeneti fogyasztásnövekedés). A legtöbb Tiny és Mega modell rendelkezik
Van egy speciális konfigurációs bit

amely lehetővé teszi a beállítást

fogyasztás. Ha ez a bit 1-re van állítva (programozatlan állapot)
csökken a generátor rezgési tartománya, de ugyanakkor a lehetséges
frekvenciatartomány és általános zajtűrés, ezért használja ezt a módot
Nem ajánlott. Alacsony frekvenciájú kvarc rezonátor is választható
(például „óránkénti” 32 768 Hz), míg a C1 és C2 kondenzátorok hiányozhatnak -
áfa, mert a telepítés során

a 0 értékbe beletartoznak a

MK belső kondenzátorok 36 pF kapacitással.
A kvarc rezonátor kerámiára cserélhető. E sorok írója sikerült
futtassa az MK-t nem szabványos frekvencián, kvarcot használva ugyanabban az al-
beleértve a miniatűr induktivitást (4,7 μH értékkel és a
91 pF-os kondenzátorok, a frekvencia körülbelül 10 MHz), ami ugyanakkor megenged egy kicsit
csökkentse az áramkör méreteit.
Az MC természetesen külső generátorról is órajelezhető (2.3. ábra, b). Oso-
Ez különösen akkor kényelmes, ha az MK-t külső komponensekkel kell szinkronizálnia
nents, vagy nagyon pontos órajel-frekvenciát kaphat a megfelelő kiválasztásával
fúvógenerátor (például Epson SG-8002 sorozat).
Éppen ellenkezőleg, ha nincs szükség a pontosságra, csatlakoztathat külső eszközt R.C.-lánc
(2.3. ábra, V). Ebben az áramkörben a C1 kapacitásnak legalább 22 pF-nak és az R1 ellenállásnak kell lennie
3,3-100 kOhm tartományban választható. A gyakoriságot a képlet határozza meg
F= 2/3 R.C.. Egyáltalán nem kell telepítenie a C1-et, ha leírja a naplót. 0 a konfigurációban-
sejt

Így csatlakoztatva a belső 36 pF-os kondenzátort.

Végül teljesen elhagyhatja a külső alkatrészeket, és beérheti a beépített elemeket
nom R.C.-egy generátor, amely körülbelül négy fokozaton képes működni

2. fejezet Általános felépítés, memóriaszervezés, órajel, reset

frekvencia értékek (1, 2, 4 és 8 MHz). Egyes modellek ezt a lehetőséget biztosítják
a generátor frekvenciájának beállítása (további részletekért lásd vagy a műszaki leírást
konkrét modellek). Ezt a lehetőséget a legjobban kihasználni
fiatalabb, 8 tűs kiszerelésben gyártott Tiny modellek – aztán a következtetések
rezonátor vagy külső generátor csatlakoztatására tervezték, megteheti
más célokra is használható, például normál I/O portokhoz.

Rizs. 2.3. Az AVR mikrokontroller órajelének módszerei: A- kvarc rezonátor;

b- külső generátor; V - R.C.- láncok

Klasszikus beépített család R.C.- nincs generátora, hanem speciális konfigurációja

Ezekben az MK-kban lényegesen kevesebb ionsejt található, és általában nem használhatók

figyelni. Más családoknál ez nem így van. Alapértelmezett MK családok

A Tiny és a Mega a beépített generátorral működik
frekvencia 1 MHz (

0001), így más módokhoz szükség van a megfelelőre

megfelelően telepítse a konfigurációs cellákat

(lásd a 2.1 táblázatot). Ahol

Figyelembe kell venni, hogy a sejtek állapota

0000 (tükrözve ehhez képest

a kvarcrezonátor 1111) leggyakrabban használt értéke a re-

külső generátorról óra üzemmódba állítja az MK-t, ugyanakkor nem tudja

akár programozzon külső frekvencia nélkül. Az ajánlott beállításokról

a konfigurációs cellákhoz és programozásuk jellemzőihez lásd még

5. fejezet.

2.1. táblázat. Konfigurációs cellák telepítése CKSEL

óra üzemmódoktól függően

CKSEL3...0

Óra forrás

Frekvencia

Külső frekvencia

Beépített R.C.-generátor

Beépített R.C.-generátor

Beépített R.C.-generátor

Beépített R.C.-generátor

Külső R.C.-lánc

I. rész. Az Atmel AVR tervezésének és működésének általános elvei

2.1. táblázat(befejező)

CKSEL3...0

Óra forrás

Frekvencia

Külső R.C.-lánc

0,9... 3,0 MHz

Külső R.C.-lánc

3,0...8,0 MHz

Külső R.C.-lánc

8,0... 12 MHz

Alacsony frekvenciájú rezonátor

Kvarc rezonátor

0,4... 0,9 MHz

Kvarc rezonátor

0,9... 3,0 MHz

Kvarc rezonátor

3,0...8,0 MHz

1xxx (CKPOT=0)

Kvarc rezonátor

Visszaállítás

A visszaállítás (RESET) az MK kezdeti üzemmódjának beállítása. Ahol
minden RVV az alapértelmezett állapotba van állítva - ezek általában nullák
minden kategória, néhány kivétellel (de a RON elfogadja a gyártást
szabad értékeket, így ha szükséges, kezdje egy adott értékkel
A változó értékeket a program elején kötelezően be kell állítani).
A visszaállítás után a program a kezdő címről indul el (alapértelmezés szerint
ez a cím 0000 USD).
Az alaphelyzetbe állítás mindig az áramellátás bekapcsolásakor történik. Ezenkívül a visszaállítás forrásai
A következő események fordulhatnak elő: hardver visszaállítása, azaz alacsony szintű tápellátás
feszültség a RESET bemenetre (helyesebb inverzióval jelölni: /RESET, mert
az aktív szint itt alacsony, és ragaszkodunk ehhez a szabályhoz); befejezett
a beállított watchdog időzítő intervallum visszaszámlálása; áramkör kioldása
BOD. Az állapotregiszter legkisebb jelentőségű négy bitjének jelentése

jeleznie kell

információkat arról a forrásról, ahonnan a visszaállítás előző alkalommal történt (telepítve
új 1 bithez 0 - bekapcsolási alaphelyzetbe állítás, 1. bit - hardver visszaállítása, 2. bit - innen
BOD áramkörök, 3. bit - a watchdog időzítőből). A gyakorlatban a szerző tapasztalatai szerint, szerint
Ennek a regiszternek az állapotai csak az államokban különböznek megbízhatóan az összes többitől
időzítő alaphelyzetbe állítása (egyidejűleg más jelzők is beállíthatók)
ideiglenesen). Ennek ellenére ezek az információk hasznosak lehetnek például az elemzés során
az éjjel-nappal működő készülékek működési zavarainak okainak elemzése (lásd. 12. fejezet).
A Tiny család junior MK-jai (kivéve az ATtiny28-at) nem rendelkeznek beépített „felhúzással”
th" ellenállás a /RESET érintkezőn, ezért a megbízható működés érdekében óvintézkedéseket kell tenni
lásd egy 2–5 kOhm-os külső ellenállás csatlakoztatását ettől a lábtól
tápfeszültség. A szerző a telepítést is erősen javasolja
megfelelő ellenállás bármely AVR modellhez, mivel a beépített ellenállás nagy
magas névleges érték (100-500 kOhm) és zaj keletkezhet rajta, ami
ty egy előre nem látható alaphelyzetbe állításhoz. Továbbá (bár a műszaki leírásokban ilyen

2. fejezet Általános felépítés, memóriaszervezés, órajel, reset

javítás és nincs benne) nem ártana 0,1–0,5 µF kondenzátort beépíteni
/RESET kimenet a földre - ez kisimítja az elkerülhetetlen feszültségpattanást és
a feszültség felfutó éle a /RESET érintkezőnél valamivel hosszabb, mint a
növekvő tápfeszültséggel: amikor elérjük az áramkör válaszküszöbét
reset, a teljes MK tápfeszültsége már létrejön.
A 8 tűs csomagban (ATtiny11–ATtiny15) gyártott apró modellekben
Ha nincs szükség külső alaphelyzetbe állításra, a /RESET érintkező megfelelően tudja ellátni a funkciókat
I/O port. Csak egy figyelmeztetéssel: ennek konfigurálásakor
érintkezik a kimenettel, nyitott kollektoros kimenetként működik, nem pedig hagyományos
nális logikai elem (a port lábak konfigurációját lásd 3. fejezet).
A bekapcsolási alaphelyzetbe állítás legelőnyösebb módja a következő:
már korábban említettük - külső tápellátás monitor telepítése. Például mikor
Az 5 voltos tápegységhez a népszerű MC34064 mikroáramkör alkalmas trigger küszöbértékkel.
4,6 V, és tipikus fogyasztása körülbelül 300 µA vagy korszerűbb
analóg (például MAX803L 12 μA fogyasztással). Három voltos tápegységhez
megfelelő áramkör MAX803R (2,6 V) vagy a DS1816 megfelelő változata a megfelelő
áramfeszültség. Az összes felsorolt ​​mikroáramkör hárompólusú (tápellátás, földelés
la", reset control pin) és nyitott kollektoros kimenettel rendelkeznek, pl.
biztosítják a felhúzó ellenállás beépítését. Tipikus válaszidő
Ezeknek a mikroáramköröknek az időtartama, amikor a feszültség csökken, mikroszekundum, ami biztosítja
adatbiztonság az EEPROM-ban. Amikor a feszültség növekszik, biztosítják
nagy időkésleltetés (a másodperc törtrészeinek nagyságrendjében), ami megbízhatóságot tesz lehetővé
zörgés nélkül állítsa vissza az MK-t.
A beépített BOD áramkör mikroszekundum nagyságrendű válaszidőt biztosít
késleltetés az üzemi állapotba való visszatéréshez a feszültség helyreállítása után, op-
ugyanazok a beállítások határozzák meg, mint a visszaállítási késleltetés (cella

4 MHz-es órajel) és még a ~68 ms-os maximális lehetséges értéke is képes
nem bizonyulnak elegendőnek a feszültség csökkenésekor fellépő fecsegés megkerülésére
autonóm forrás tápfeszültsége. A BOD üzemmód kiválasztásához használja a
nyomjon meg három konfigurációs cellát

a következő állapotokkal rendelkezik:

111 (alapbeállítás) - BOD áramkör letiltva;

101 - bekapcsolja a BOD-t 2,7 V működési küszöbnél;

100 - 4,0 V-os küszöbértéknek felel meg.

Vegye figyelembe, hogy a működési megbízhatóság szempontjából annál kisebb a különbség a
tápfeszültség és a teljesítményfigyelő küszöbértéke (külső ill
beépített BOD-áramkör, nem számít), annál jobb - kis feszültséglökésekkel,
érzéketlen a monitorra, azonban mindenféle kellemetlenség előfordulhat.
kellemes dolgok, mint például egy külső megszakítás spontán előfordulása. Egy-
Ezt a különbséget azonban figyelembe kell venni, amikor a készüléket akkumulátorról táplálja: pl.
négy AA alkáli elemre és egy teljesítménymonitorra számítsa ki
tannoy 4,7 V-on, maradék feszültség az elemeken a monitor kioldása után