Programavimo mikrovaldikliai atmega. Kaip parašyti kodą AVR, programuojant Atmel AVR mikrovaldiklius C

AVR mikrovaldiklių programavimo kalbų yra įvairių, tačiau bene tinkamiausios yra assembler ir C, kadangi šios kalbos geriausiai įgyvendina visas reikalingas mikrovaldiklio aparatinės įrangos valdymo galimybes.

Assembly kalba yra žemo lygio programavimo kalba, kuri naudoja tiesioginį mikrovaldiklio instrukcijų rinkinį. Kuriant programą šia kalba reikia gerai išmanyti programuojamo lusto komandų sistemą ir pakankamai laiko programai sukurti. Surinkimo kalba yra prastesnė nei C programos kūrimo greičiu ir paprastumu, tačiau turi pastebimų pranašumų dėl galutinio vykdomojo kodo dydžio ir, atitinkamai, jo vykdymo greičio.

C leidžia kurti programas su daug patogiau, suteikdama kūrėjui visus aukšto lygio kalbos pranašumus.
Dar kartą reikia pažymėti, kad AVR architektūra ir komandų sistema buvo sukurti tiesiogiai dalyvaujant C kalbos kompiliatoriaus kūrėjams ir atsižvelgiama į šios kalbos ypatybes. C šaltinio kodo kompiliavimas yra greitas ir sukuria kompaktišką, efektyvų kodą.

Pagrindiniai C pranašumai prieš assemblerį: didelis programos kūrimo greitis; universalumas, dėl kurio nereikia nuodugniai ištirti mikrovaldiklio architektūrą; geresnis algoritmo dokumentiškumas ir įskaitomumas; funkcinių bibliotekų prieinamumas; parama slankiojo kablelio skaičiavimams.

C kalba harmoningai derina žemo lygio programavimo galimybes su aukšto lygio kalbos savybėmis. Žemo lygio programavimo galimybė leidžia lengvai dirbti tiesiogiai su technine įranga, o aukšto lygio kalbos savybės leidžia sukurti lengvai skaitomą ir modifikuojamą programos kodą. Be to, beveik visi C kompiliatoriai turi galimybę naudoti asemblerio intarpus, kad būtų galima rašyti programos dalis, kurios yra labai svarbios vykdymo laiko ir išteklių sąnaudų požiūriu.

Žodžiu, C – pati patogiausia kalba tiek pradedantiesiems, susipažįstantiems su AVR mikrovaldikliais, tiek rimtiems kūrėjams.

Kompiliatoriai naudojami programos šaltinio kodui konvertuoti į mikrovaldiklio programinės įrangos failą.

Atmel teikia galingą surinkimo kompiliatorių, kuris yra įtrauktas į Atmel Studio kūrimo aplinką, veikiančią sistemoje Windows. Kartu su kompiliatoriumi kūrimo aplinkoje yra derinimo priemonė ir emuliatorius.
„Atmel Studio“ yra visiškai nemokama ir pasiekiama „Atmel“ svetainėje.

Šiuo metu yra gana daug C kompiliatorių, skirtų AVR. Galingiausiu iš jų laikomas kompiliatorius iš IAR Systems iš Stokholmo. Būtent jos darbuotojai 90-ųjų viduryje dalyvavo kuriant AVR komandų sistemą. IAR C Compiler turi daug kodo optimizavimo galimybių ir yra integruotos IAR Embedded Workbench (EWB) kūrimo aplinkos dalis, kuri taip pat apima surinkėjo kompiliatorių, susiejimo priemonę, projekto ir bibliotekos tvarkyklę bei derinimo priemonę. Pilnos paketo versijos kaina 2820 EUR. Įmonės svetainėje galite atsisiųsti nemokamą įvertinimo versiją 30 dienų arba neribotą versiją su 4 KB kodo dydžio riba.

Amerikiečių kompanija Image Craft iš Palo Alto, Kalifornijos, gamina C kalbos kompiliatorių, kuris sulaukė gana didelio populiarumo. JumpStart C, skirtas AVR, turi priimtiną kodo optimizavimą ir ne per didelę kainą (nuo 50 USD iki 499 USD, priklausomai nuo versijos). Demonstracinė JumpStart C versija, skirta AVR, visiškai veikia 45 dienas.

Ne mažiau populiarumo susilaukė rumuniškas Code Vision AVR C kompiliatorius, kurio pilnos versijos kaina yra gana žema ir siekia 150 EUR. Kompiliatorius ateina su integruota kūrimo aplinka, kurioje, be standartinių funkcijų, yra ir gana įdomi funkcija – CodeWizardAVR Automatic Program Generator. Nuosekliojo terminalo buvimas kūrimo aplinkoje leidžia derinti programas naudojant nuoseklųjį mikrovaldiklio prievadą. Galite atsisiųsti nemokamą įvertinimo versiją iš kūrėjų, kurių kodo dydis yra 4 KB ir išjungtas sugeneruoto šaltinio kodo išsaugojimas C.

Serbijos mieste Belgrade įsikūrusi įmonė „MikroElektronika“ gamina visą šeimą AVR mikrovaldiklių kompiliatorių. C kalbos kompiliatorius, vadinamas mikroC PRO, skirtas AVR, kainuoja 249 USD. Taip pat yra mikroBasic ir mikroPascal už tą pačią kainą. Kūrėjų svetainėje yra demonstracinės versijos, kurių kodo dydžio limitas yra 4096 baitai. Šios kompiliatorių šeimos privalumas – viena platforma ir viena ideologija, kuri gali užtikrinti lengvą perėjimą ne tik tarp kalbų, bet ir tarp mikrovaldiklių (yra kompiliatorių versijos PIC, STM32, 8051...).

Integruota kūrimo aplinka tapo tikrai ikonine. Jame yra galingi C ir surinkėjų kompiliatoriai, AVRDUDE programuotojas, derintuvas, simuliatorius ir daug kitų pagalbinių programų ir paslaugų. WinAVR sklandžiai integruojasi su Atmel AVR Studio kūrimo aplinka. Montuotojo įvesties kodas yra identiškas AVR Studio surinkėjo įvesties kodui. C ir assembler kompiliatoriai turi galimybę kurti derinimo failus COFF formatu, kas leidžia naudoti ne tik įmontuotus įrankius, bet ir galingą AVR Studio simuliatorių. Kitas svarbus privalumas – WinAVR platinamas nemokamai be apribojimų (gamintojai palaiko GNU General Public License).

Apibendrinant verta pasakyti, kad WinAVR yra idealus pasirinkimas tiems, kurie pradeda įvaldyti AVR mikrovaldiklius. Būtent ši kūrimo aplinka šiame kurse laikoma pagrindine.

Bitinės operacijos yra pagrįstos loginėmis operacijomis, kurias aptarėme anksčiau. Jie atlieka pagrindinį vaidmenį programuojant AVR ir kitų tipų mikrovaldiklius. Beveik nė viena programa neapsieina be bitų operacijų. Prieš tai sąmoningai jų vengėme, kad palengvintume MK programavimo mokymosi procesą.

Visuose ankstesniuose straipsniuose programavome tik I/O prievadus ir nenaudojome papildomų įmontuotų komponentų, pavyzdžiui, laikmačių, analoginių-skaitmeninių keitiklių, pertraukiklių ir kitų vidinių įrenginių, be kurių MK netenka visos galios.

Prieš pereidami prie integruotų MK įrenginių įsisavinimo, turite išmokti valdyti arba patikrinti atskirus AVR MK registrų bitus. Anksčiau tikrindavome arba iš karto nustatydavome viso registro skaitmenis. Išsiaiškinkime, koks skirtumas, ir tada eikime toliau.

Bitinės operacijos

Dažniausiai programuodami AVR mikrovaldiklius naudojome jį, nes jis yra vizualesnis, palyginti su pradedantiesiems MK programuotojams ir yra gerai suprantamas. Pavyzdžiui, turime nustatyti tik 3-ią D prievado bitą. Kaip jau žinome, galime tai padaryti naudodami šį dvejetainį kodą:

PORTD = 0b00001000;

Tačiau šia komanda 3 skaitmenį nustatome į vieną, o visus kitus (0, 1, 2, 4, 5, 6 ir 7) nustatome į nulį. Dabar įsivaizduokime situaciją, kai 6-asis ir 7-asis bitai naudojami kaip ADC įėjimai ir šiuo metu atitinkamuose MK kontaktuose gaunamas signalas iš kokio nors įrenginio, o mes naudojame aukščiau pateiktą komandą šiems signalams atkurti. Dėl to mikrovaldiklis jų nemato ir mano, kad signalai neatvyko. Todėl vietoj tokios komandos turėtume naudoti kitą, kuri tik 3 bitą nustatytų į vieną, nepaveikdama likusių bitų. Norėdami tai padaryti, paprastai naudojama ši bitų operacija:

PORTD |= (1<<3);

Toliau išsamiai aptarsime jo sintaksę. O dabar dar vienas pavyzdys. Tarkime, kad turime patikrinti PIND registro 3-iojo skaitmens būseną ir taip patikrinti mygtuko būseną. Jei šis bitas atstatomas į nulį, tai žinome, kad paspaudžiamas mygtukas ir tada vykdomas komandos kodas, atitinkantis paspausto mygtuko būseną. Anksčiau mes būtume vartoję šį žymėjimą:

jei (PIND == 0b00000000)

(bet koks kodas)

Tačiau su jo pagalba tikriname ne tik 3 bitą, bet visus PIND registro bitus iš karto. Todėl, net jei mygtukas paspaudžiamas ir norimas bitas atstatomas, tačiau šiuo metu signalas gaunamas kitame prievado D kontakte, atitinkama reikšmė bus nustatyta į vieną, o skliausteliuose esanti sąlyga bus klaidinga. Dėl to kodas garbanotųjų breketų viduje nebus vykdomas net paspaudus mygtuką. Todėl norint patikrinti atskiro 3-ojo PIND registro bito būseną, reikia naudoti bitų operaciją:

if (~PIND & (1<<3))

(bet koks kodas)

Norint dirbti su atskirais mikrovaldiklio bitais, C programavimo kalba turi įrankius, kuriais galima keisti arba patikrinti vieno ar kelių atskirų bitų būseną vienu metu.

Vieno bito nustatymas

Norint nustatyti vieną bitą, pvz., prievadą D, naudojama bitinė ARBA operacija. Tai mes naudojome straipsnio pradžioje.

PORTD = 0b00011100; // pradinė vertė

PORTD = PORTD | (1<<0); применяем побитовую ИЛИ

PORTD |= (1<<0); // сокращенная форма записи

PORTD == 0b00011101; // rezultatas

Ši komanda nustato nulinį bitą, o likusi dalis nepakeičiama.

Pavyzdžiui, įdiegkime dar 6-ąjį D prievado bitą.

PORTD = 0b00011100; // pradinė prievado būsena

PORTD |= (1<<6); //

PORTD == 0b01011100; // rezultatas

Vienu metu rašyti nuo vieno iki kelių atskirų bitų, pavyzdžiui, nulinį, šeštąjį ir septintą prievadus B Taikomas toks žymėjimas.

PORTB = 0b00011100; // pradinė vertė

PORTB |= (1<<0) | (1<<6) | (1<<7); //

PORTB == 0b1011101; // rezultatas

Atskirų bitų atstatymas (nulis).

Norint iš naujo nustatyti vieną bitą, vienu metu naudojamos trys anksčiau aptartos komandos: .

Iš naujo nustatykime 3-ią PORTC registro bitą, o likusį palikime nepakeistą.

PORTC = 0b00011100;

PORTC &= ~(1<<3);

PORTC == 0b00010100;

Atlikime panašius veiksmus su 2 ir 4 skaitmenimis:

PORTC = 0b00111110;

PORTC &= ~((1<<2) | (1<<4));

PORTC == 0b00101010;

Bitų perjungimas

Be nustatymo ir atstatymo, taip pat naudojama naudinga komanda, kuri perjungia vieną bitą į priešingą būseną: vieną į nulį ir atvirkščiai. Ši loginė operacija plačiai naudojama kuriant įvairius apšvietimo efektus, pavyzdžiui, Naujųjų metų girliandą. Pažiūrėkime į PORTA pavyzdį

PORTA = 0b00011111;

PORTA ^= (1<<2);

PORTA == 0b00011011;

Pakeiskime nulinio, antrojo ir šeštojo bitų būseną:

PORTA = 0b00011111;

PORTA ^= (1<<0) | (1<<2) | (1<<6);

PORTA == 0b01011010;

Tikrinama atskiro bito būsena. Priminsiu, kad I/O prievado tikrinimas (priešingai nei rašymas) atliekamas nuskaitant duomenis iš PIN registro.

Dažniausiai testavimas atliekamas vienu iš dviejų kilpos teiginių: if ir while. Su šiais operatoriais jau esame susipažinę anksčiau.

Tikrinama, ar bite nėra loginio nulio (reset) su jeigu

if (0==(PIND & (1<<3)))

Jei trečiasis D prievado bitas yra išvalytas, vykdomas Code1. Kitu atveju vykdomas Code2.

Panašūs veiksmai atliekami naudojant šią įrašymo formą:

if (~PIND & (1<<3))

Tikrinama, ar bite nėra loginio vieneto (nustatymo) su jeigu

if (0 != (PIND & (1<<3)))

if (PIND & (1<<3))

Aukščiau pateiktos dvi kilpos veikia panašiai, tačiau dėl C programavimo kalbos lankstumo gali turėti skirtingą žymėjimo formą. Operatorius != reiškia nelygus. Jei nustatytas trečiasis PD įvesties/išvesties prievado bitas (vienas), vykdomas Code1, jei ne, vykdomas Code2.

Laukiama, kol bus nustatytas iš naujo kol

while (PIND & (1<<5))

Code1 bus vykdomas tol, kol bus nustatytas 5-asis PIND registro bitas. Kai iš naujo nustatysite, Code2 pradės vykdyti.

Laukiama, kol bus nustatytas bitas kol

Čia C sintaksė leidžia įrašyti kodą dviem dažniausiai pasitaikančiais būdais. Praktikoje naudojami abu įrašymo tipai.

Sveiki visi. Kaip ir buvo žadėta, nuo šiandien pradedame studijuoti AVR mikrovaldiklių programavimą (kaip pavyzdį naudojame Atmega8). Tiems skaitytojams, kurie domisi Arduino plokštės programavimu, nesijaudinkite, straipsniai šia tema bus tęsiami :) .

Galima kelti logišką klausimą, kodėl iš daugelio kitų mikrovaldiklių (toliau – MK) jis buvo pasirinktas kaip eksperimentinis. MK AVR. Tam yra keletas priežasčių:

  • MK AVR visuotinai prieinamas;
  • Jie turi gana mažą kainą;
  • Internete galite rasti daug nemokamų programų, kurios jums padės dirbant su MK duomenimis.
  • Be to, yra daugybė straipsnių ir forumų, kuriuose galite užduoti klausimus apie duomenis. MK AVR.

Kaip sakiau anksčiau, MK naudosime kaip bandomąjį dalyką. Atmega8. Kodėl jis?

Šis mikrovaldiklis turi 3 I/O prievadus. Be to, tai gana pigu.

Prievadais turime omenyje duomenų magistrales, kurios gali veikti dviem priešingomis kryptimis (ty išvestimi ir įvestimi).

U Atmega8 3 prievadai. Prievadą B sudaro 8 kaiščiai (numeruoti 0,1,2,3,4,5,6,7). C prievadas susideda iš 7 kaiščių (numeruotų 0,1,2,3,4,5,6). D prievadas susideda iš 8 kaiščių (numeruotų 0,1,2,3,4,5,6,7).

Mikrovaldiklis gali būti maitinamas nuo 3,3 ir 5 V. Kai maitinimo įtampa yra 5 V, maksimalus laikrodžio dažnis yra 16 MHz, o esant 3,3 V maitinimo įtampai, maksimalus laikrodžio dažnis yra 8 MHz. Kol kas negalvokime dėl laikrodžio dažnių.

Maitinimas tiekiamas į 7 kaištį, o įžeminimas - į 8 kaištį.

Atsisiųsti nemokamai. Atsisiųsta, įdiegta, paleista :)

Pirmiausia reikia pradėti pažintį su „Atmel Studio“ – sukurti projektą.

Pasirinkite Failas -> naujas -> projektas.

Atsidarys pasirinkimo langas. Pasirinkite aplanką „Naršyti“, kuriame išsaugosime parašytus projektus. Iš anksto sukūriau aplanką projektams.

Projektui suteikiame pavadinimą, mano atveju lesson_avr_1

Atkreipkite dėmesį į žymimąjį laukelį „Sukurti sprendimo katalogą“. Jei žymimasis laukelis pažymėtas, aplanke, kurį pasirinkome projektams išsaugoti, dabartiniam projektui bus sukurtas atskiras aplankas.

Štai ir viskas – projektas sukurtas.

Pradėkime kurti projektą, kurį sukūrėme. Spustelėkite Projektas -> lesson_avr_1 savybės arba (alt+F7)

Eikite į skirtuką Įrankis. Mes pasirenkame - simuliatorių. Veiksmai, kurių mes imsimės, leis derinti parašytą kodą. Išsaugokite pakeitimus. Galite įrašyti pakeitimus viename (dabartiniame) faile arba visuose projekto failuose vienu metu. Uždaryti nustatymus.

Kiselevas Romanas, 2007 m. gegužės mėn Straipsnis atnaujintas 2014 m. gegužės 26 d

Taigi, kas yra mikrovaldiklis (toliau – MK)? Tai, palyginti, yra mažas kompiuteris, patalpintas vienoje integrinėje grandinėje. Jis turi procesorių (aritmetinį loginį bloką arba ALU), „flash“ atmintį, EEPROM atmintį, daugybę registrų, įvesties/išvesties prievadų, taip pat papildomus skambučius ir švilpukus, tokius kaip laikmačiai, skaitikliai, komparatoriai, USART ir kt. , mikrovaldiklis paleidžiamas ir pradeda vykdyti programą, saugomą jo „flash“ atmintyje. Tuo pačiu metu jis gali valdyti įvairius išorinius įrenginius per I/O prievadus.

Ką tai reiškia? Tai reiškia, kad MK galite įdiegti bet kokią loginę grandinę, kuri atliks tam tikras funkcijas. Tai reiškia, kad MK yra mikroschema, kurios vidinį turinį iš tikrųjų kuriame patys. Tai leidžia, nusipirkus keletą visiškai vienodų MK, ant jų surinkti visiškai skirtingas grandines ir įrenginius. Jei norite atlikti kokius nors elektroninio įrenginio veikimo pakeitimus, lituoklio naudoti nereikės, tereikės perprogramuoti MK. Tokiu atveju jums net nereikia jo pašalinti iš savo įrenginio, jei naudojate AVR, nes šie MK palaiko programavimą grandinėje. Taigi, mikrovaldikliai užpildo atotrūkį tarp programavimo ir elektronikos.

AVR yra 8 bitų mikrovaldikliai, ty jų ALU gali atlikti paprastas operacijas tik su 8 bitų skaičiais per vieną laikrodžio ciklą. Dabar atėjo laikas kalbėti apie tai, kurį MK naudosime. Aš dirbu su ATMega16 MK. Tai labai įprasta ir galima įsigyti beveik bet kurioje radijo dalių parduotuvėje už maždaug 100 rublių. Jei nerandate, tuomet galite įsigyti bet kurį kitą MEGA serijos MK, tačiau tokiu atveju teks ieškoti jam dokumentacijos, kadangi tos pačios skirtingų MK „kojos“ gali atlikti skirtingas funkcijas, o iki jungiantis, atrodytų, Jei visos išvados teisingos, gali gautis veikiantis prietaisas, o gal tiesiog smirdančių dūmų debesis. Įsigydami ATMega16 įsitikinkite, kad jis yra didelėje 40 kontaktų DIP pakuotėje, taip pat įsigykite jam lizdą, į kurį jį būtų galima įkišti. Norėdami dirbti su juo, jums taip pat reikės papildomų įrenginių: šviesos diodų, mygtukų, jungčių ir kt.

ATMega16 turi labai daug įvairių funkcijų. Štai keletas jo savybių:

  • Maksimalus laikrodžio dažnis – 16 MHz (8 MHz ATMega16L)
  • Dauguma komandų vykdomos per vieną laikrodžio ciklą
  • 32 8 bitų darbo registrai
  • 4 pilni 8 bitų I/O prievadai
  • du 8 bitų laikmačiai / skaitikliai ir vienas 16 bitų
  • 10 bitų analoginis-skaitmeninis keitiklis (ADC)
  • vidinis laikrodžio generatorius 1 MHz dažniu
  • analoginis komparatorius
  • sąsajos SPI, I2C, TWI, RS-232, JTAG
  • programavimas grandinėje ir savarankiškas programavimas
  • impulsų pločio moduliavimo (PWM) modulis

Visas šio įrenginio charakteristikas ir jų naudojimo instrukcijas galite rasti šio MK žinyne (duomenų lape). Tiesa, jis yra anglų kalba. Jei mokate anglų kalbą, būtinai atsisiųskite šį duomenų lapą, jame yra daug naudingos informacijos.

Pagaliau imkimės reikalo. Rekomenduoju pasidaryti specialią mikrovaldiklio kūrimo ir derinimo plokštę, ant kurios be lituoklio (arba beveik be jo) galima surinkti bet kokią elektros grandinę su mikrovaldikliu. Tokios plokštės naudojimas labai palengvins darbą su MK ir pagreitins jos programavimo mokymosi procesą. Tai atrodo taip:

Ko tau tam prireiks?

Pirma, jums reikės pačios plokštės. Radijo dalių parduotuvėje nusipirkau gatavą už 115 rublių. Tada prie jo prilitavau visas reikalingas detales. Rezultatas yra neįtikėtinai patogus dalykas, ant kurio per kelias minutes galite surinkti bet kokią elektros grandinę, prijungdami laidus ir sumontuodami mikroschemas bei indikatorius.

Norėdami sujungti grandinės elementus, labai patogu naudoti laidus su jungtimis galuose. Šios jungtys dedamos ant „kojelių“, išsikišusių šalia kiekvieno MK prievado. Mikrovaldiklis turi būti montuojamas į lizdą, o ne prilituotas prie plokštės, kitaip bus labai sunku jį išimti, jei netyčia sudeginsite. Žemiau yra ATMEGA16 MK kontaktas:

Paaiškinkime, kurios kojos mus domina dabar.

  • VCC - čia tiekiama maitinimas (4,5 - 5,5 V) iš stabilizuoto šaltinio
  • GND – žemė
  • RESET – atstatymas (esant žemai įtampai)
  • XTAL1, XTAL2 – čia prijungtas kvarcinis rezonatorius
  • PA, PB, PC, PD – įvesties/išvesties prievadai (atitinkamai A, B, C ir D).

Viskas, kas gamina 7–11 V nuolatinę įtampą, gali būti naudojama kaip maitinimo šaltinis. Kad MK veiktų stabiliai, reikalingas stabilizuotas maitinimo šaltinis. Kaip stabilizatorių galima naudoti 7805 serijos mikroschemas.Tai linijiniai integruoti stabilizatoriai, į kurių įėjimą tiekiama 7-11 V nuolatinė nestabilizuota srovė, o išėjimas yra 5 V stabilizuotos srovės. Prieš ir po 7805 reikia sumontuoti filtrų kondensatorius (elektrolitinį žemo dažnio trikdžiams filtruoti ir keraminius aukšto dažnio). Jei nerandate stabilizatoriaus, tuomet kaip maitinimo šaltinį galite naudoti 4,5 V bateriją. MK turi būti maitinamas tiesiai iš jo.

Žemiau yra MK jungties schema:

Dabar išsiaiškinkime, kas čia yra.

BQ1 yra kvarcinis rezonatorius, kuris nustato MK veikimo dažnį. Galite nustatyti bet kokį iki 16 MHz dažnį, bet kadangi ateityje planuojame dirbti su COM prievadu, rekomenduoju naudoti rezonatorius šiems dažniams: 14,7456 MHz, 11,0592 MHz, 7,3725 MHz, 3,6864 MHz arba 1 ,8432 MHz (vėliau). paaiškės kodėl). Aš naudojau 11,0592 MHz. Akivaizdu, kad kuo didesnis dažnis, tuo didesnis įrenginio greitis.

R1 yra ištraukiamasis rezistorius, kuris palaiko 5 V įtampą RESET įėjime. Žemas įtampos lygis šiame įėjime rodo atstatymą. Po atstatymo MK įsikrauna (10–15 ms) ir vėl pradeda vykdyti programą. Kadangi tai yra didelės varžos įvestis, negalite jo palikti „kabančio ore“ - nedidelis jo paėmimas lems netikėtą MK nustatymą iš naujo. Būtent tam ir skirtas R1. Dėl patikimumo taip pat rekomenduoju įdiegti kondensatorių C6 (ne daugiau kaip 20 µF).

SB1 – atstatymo mygtukas.

Kvarcinis rezonatorius ir filtro kondensatorius C3 turi būti kuo arčiau MK (ne toliau kaip 5–7 cm), nes priešingu atveju laiduose gali atsirasti trikdžių, dėl kurių gali atsirasti MK gedimų.

Mėlynas stačiakampis diagramoje apibūdina patį programuotoją. Patogu jį daryti laido pavidalu, kurio vienas galas įkišamas į LPT prievadą, o kitas į tam tikrą jungtį, esančią šalia MK. Viela neturėtų būti per ilga. Jei kyla problemų dėl šio kabelio (dažniausiai jų nėra, bet visko gali nutikti), turėsite lituoti Altera ByteBlaster adapterį. Kaip tai padaryti, parašyta AVReal programuotojo aprašyme.

Dabar, kai susitvarkėme su technine įranga, laikas pereiti prie programinės įrangos.

Yra keletas AVR programavimo kūrimo aplinkų. Pirma, tai yra „AVR Studio“ - oficiali „Atmel“ programavimo sistema. Tai leidžia rašyti surinkėjo ir derinimo programomis, parašytomis assembly, C ir C++. IAR yra komercinė programavimo sistema C, C++ ir asamblėjos kalbomis. WinAVR yra atvirojo kodo kompiliatorius. AtmanAVR yra AVR programavimo sistema, kurios sąsaja beveik lygiai tokia pati kaip Visual C++ 6. AtmanAVR taip pat leidžia derinti programas ir turi daug pagalbinių funkcijų, kurios palengvina kodo rašymą. Ši programavimo sistema yra komercinė, tačiau, pagal licenciją, mėnesį ja naudotis galite nemokamai.

Siūlau pradėti dirbti su IAR kaip skaidriausia kūrimo aplinka. IAR projektas kuriamas visiškai rankomis, todėl įvykdę kelis projektus jau aiškiai žinosite, ką reiškia kiekviena kodo eilutė ir kas atsitiks ją pakeitus. Dirbant su AtmanAVR teks arba naudoti iš anksto sukurtą šabloną, kuris yra labai gremėzdiškas ir patirties neturinčiam žmogui sunkiai suprantamas, arba susidėlioti projektą nuo nulio turės daug problemų su antraštės failais. Išnagrinėję IAR, vėliau pažvelgsime į kitus kompiliatorius.

Taigi pirmiausia įsigykite IAR. Tai labai dažna ir ją rasti neturėtų kilti problemų. Atsisiuntę iš kažkur IAR 3.20, įdiekite kompiliatorių/darbo aplinką ir paleiskite. Po to galite pradėti dirbti.

Paleidę IAR, pasirinkite failas/nauja/darbo sritis, pasirinkite kelią į mūsų projektą ir sukurkite jam aplanką bei suteikite pavadinimą, pavyzdžiui, „Prog1“. Dabar sukurkime projektą: Projektas / Sukurti naują projektą… Taip pat pavadinkime jį „Prog1“. Dešiniuoju pelės mygtuku spustelėkite projekto pavadinimą projekto medyje ir pasirinkite „Parinktys“

Čia sukonfigūruosime konkrečiam MK kompiliatorių. Pirmiausia reikia pasirinkti ATMega16 procesoriaus tipą skirtuke Target, pažymėti žymimąjį laukelį Įjungti bitų apibrėžimus I/O-įtraukti failus skirtuke Bibliotekos konfigūracija (kad programos kode galėtumėte naudoti įvairių MK registrų bitų pavadinimus ), ir ten pasirinkite C bibliotekos tipą /EU++. ICCAVR kategorijoje turite pažymėti žymės langelį Įgalinti kelių baitų palaikymą skirtuke Kalba ir išjungti optimizavimą skirtuke Optimizavimas (kitaip sugadinsite mūsų pirmąją programą).

Tada pasirinkite XLINK kategoriją. Čia reikia nustatyti sudaryto failo formatą. Kadangi dabar nustatome derinimo režimo parinktis, kaip aprašyta pavadinime, kaip išvestį turime gauti derinimo failą. Vėliau jį atidarysime AVR Studio. Norėdami tai padaryti, turite pasirinkti plėtinį.cof, o failo tipas yra ubrof 7.

Dabar spustelėkite Gerai, tada pakeiskite Debug į Release.

Dar kartą eikite į Parinktys, kur visi parametrai, išskyrus XLINK, yra tokie patys. XLINK pakeiskite plėtinį į .hex, o failo formatą į intel-standart.

Tai viskas. Dabar galite pradėti rašyti savo pirmąją programą. Sukurkite naują šaltinį / tekstą ir įveskite jame šį kodą:

#įtraukti"iom16.h" trumpas nepasirašytas int i; tuštuma pagrindinis ( tuštuma) (DDRB = 255; PORTB = 0; kol(1) { jeigu(PORTB == 255) PORTB = 0; Kitas PORTB++; dėl(i=0; i

Failas „iom16.h“ yra aplanke (C:\Program Files)\IAR Systems\Embedded Workbench 3.2\avr\inc. Jei naudojate kitą MK, pavyzdžiui, ATMega64, tada pasirinkite failą „iom64.h“. Šiose antraštėse saugoma informacija apie MK: registrų pavadinimus, registrų bitus ir pertraukimų pavadinimus. Kiekvienas atskiras A, B, C arba D prievadų kaištis gali veikti kaip įvestis arba išvestis. Tai nustato duomenų krypties registras (DDR). 1 paverčia koją išvestimi, 0 - įvestį. Taigi, nustatę, pavyzdžiui, DDRA = 13, padarome "kojas" PB0, PB2, PB3 išėjimus, likusius - įėjimus, nes 13 dvejetainėje yra 00001101.

PORTB yra registras, nustatantis prievado kaiščių būseną. Ten parašę 0, visuose išėjimuose nustatome įtampą 0 V. Tada yra begalinė kilpa. Programuodami MK, jie visada sukuria nesibaigiančią kilpą, kurioje MK atlieka tam tikrą veiksmą, kol jis atstatomas arba kol įvyksta pertraukimas. Šiame cikle jie tarsi rašo „fono kodą“, kurį MK vykdo kaip paskutinį dalyką. Tai gali būti, pavyzdžiui, informacijos rodymas ekrane. Mūsų atveju PORTB registro turinys didinamas tol, kol jis prisipildo. Po to viskas prasideda iš naujo. Galiausiai, dešimties tūkstančių ciklas. Jis reikalingas norint suformuoti matomą delsą perjungti B prievado būseną.



Dabar šį failą išsaugome projekto aplanke kaip Prog1.c, nukopijuojame iom16.h failą į projekto aplanką, pasirenkame Project/Add Files ir pridedame "iom16.h" ir "Prog1.c". Pasirinkite Release, paspauskite F7, programa bus kompiliuojama ir turėtų pasirodyti pranešimas:


Bendras klaidų skaičius: 0
Bendras įspėjimų skaičius: 0

Štai mano programuotojo nuotrauka:

Atsisiųskite AVReal programuotoją. Nukopijuokite jį (AVReal32.exe) į aplanką Release/exe, kur turėtų būti failas Prog1.hex. Tiekiame maitinimą MK, prijungiame programavimo kabelį. Atidarykite Far Manager (patogiausia mirksėti MK), eikite į šį aplanką, paspauskite Ctrl+O. Kadangi turime visiškai naują MK, prikimšame

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

Nepamirškite įvesti teisingo dažnio, jei nenaudojate 11059200 Hz! Tuo pačiu metu vadinamasis saugikliai – jo veikimą valdantys registrai (vidinio generatoriaus naudojimas, Jtag ir kt.). Po to jis yra paruoštas priimti pirmąją programą. Programuotojui kaip parametrai suteikiamas naudojamas LPT prievadas, dažnis, failo pavadinimas ir kiti (visi jie nurodyti AVReal aprašyme). Mes renkame:

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

Jei ryšys teisingas, programuotojas praneš apie sėkmingą programavimą. Nėra garantijos, kad tai veiks pirmą kartą (pirmą kartą paskambinus programai). Aš pats kartais užsiprogramuoju antrą kartą. Galbūt LPT prievadas yra sugedęs arba kabelis trukdo. Jei kyla problemų, atidžiai patikrinkite kabelį. Iš savo patirties žinau, kad 60% gedimų yra susiję su kontakto trūkumu tinkamoje vietoje, 20% su nereikalingo kontakto buvimu, o dar 15% su klaidingu netinkamo daikto sulitavimu su netinkamu daiktu. Jei visa kita nepavyksta, perskaitykite programuotojo aprašymą ir pabandykite sukurti „Byte Blaster“.

Tarkime, kad viskas jums tinka. Jei dabar prijungsite aštuonis šviesos diodus prie MK prievado B (padarykite tai, kai MK išjungtas, ir patartina nuosekliai su šviesos diodais įtraukti 300–400 omų rezistorius) ir įjungsite maitinimą, įvyks mažas stebuklas - „ banga“ prabėgs per juos!

© Kiselevas Romanas
2007 m. gegužės mėn

Užduotis: Sukurkime programą vienam šviesos diodui valdyti. Paspaudus mygtuką, šviesos diodas užsidega, o atleidus - užgęsta.

Pirmiausia sukurkime scheminę įrenginio schemą. Įvesties / išvesties prievadai naudojami bet kokiems išoriniams įrenginiams prijungti prie mikrovaldiklio. Kiekvienas iš prievadų gali veikti kaip įvestis ir išvestis. Prijunkite LED prie vieno iš prievadų, o mygtuką prie kito. Šiam eksperimentui naudosime valdiklį Atmega8. Šis lustas turi 3 I/O prievadus, turi 2 aštuonių bitų ir 1 šešiolikos bitų laikmatį/skaitiklį. Taip pat laive yra 3 kanalų PWM, 6 kanalų 10 bitų analoginis-skaitmeninis keitiklis ir daug daugiau. Mano nuomone, mikrovaldiklis puikiai tinka mokytis programavimo pagrindų.

Šviesos diodui prijungti naudosime eilutę PB0, o informacijai iš mygtuko nuskaityti naudosime liniją PD0. Diagrama parodyta 1 pav.

2 pamoka. LED perjungimas

3 pamoka. LED mirksi

Pamoka Nr.4. Bėgimo žibintai

Pamoka Nr.5. Bėgimo žibintai naudojant laikmatį

Pamoka Nr.6. Bėgimo žibintai. Laikmačio pertraukimų naudojimas

Pamoka Nr.7. Bitų valdymo operatoriai

Pamoka Nr.8. PWM diegimas

Skaitmeniniai įrenginiai, pavyzdžiui, mikrovaldiklis gali dirbti tik su dviem signalo lygiais, t.y. nulis ir vienas arba išjungti ir įjungti. Taigi galite lengvai jį naudoti norėdami stebėti apkrovos būseną, pavyzdžiui, įjungti arba išjungti šviesos diodą. Taip pat galite jį naudoti norėdami valdyti bet kurį elektros įrenginį naudodami atitinkamas tvarkykles (tranzistorius, triacas, relė ir kt.) Tačiau kartais jums reikia daugiau nei tik "įjungti" ir "išjungti" įrenginį. Taigi, jei norite valdyti šviesos diodo (arba lempos) ryškumą arba nuolatinės srovės variklio greitį, skaitmeniniai signalai to tiesiog negali. Tokia situacija labai paplitusi skaitmeninėse technologijose ir vadinama Impulso pločio moduliacija (PWM).

Dalintis