Atmega8 mikrokontroleri. Atmega8 programiranje za početnike. AVR mikrokontroleri. Programiranje za početnike Obuka mikrokontrolera atmega8

decembar 2015

1. Prednosti predložene metode

Kola uređaja bazirana na mikrokontrolerima (MCU) obično se razlikuju kombinacijom dva teško spojiva kvaliteta: maksimalne jednostavnosti i visoke funkcionalnosti. Osim toga, funkcionalnost se može mijenjati i proširivati ​​u budućnosti bez ikakvih promjena u krugu - samo zamjenom programa (flash). Ove karakteristike se objašnjavaju činjenicom da su kreatori modernih MK-a pokušali staviti na jedan čip sve što bi programeru moglo zatrebati elektronski uređaj- barem koliko god je to moguće. Kao rezultat toga, došlo je do promjene naglaska sa kola i instalacije na softver. Uz korištenje MK-a, sada je manje potrebe za "opterećenjem" kola dijelovima i manje je veza između komponenti. To, naravno, čini krug privlačnijim za ponavljanje kako iskusnim tako i početnicima elektroničarima. Ali, kao i obično, morate platiti za sve. Ni ovo nije bilo bez poteškoća. Ako kupite novi MK, instalirate ga u krug ispravno sastavljen od dijelova koji se mogu servisirati i primijeniti napajanje, onda ništa neće raditi - uređaj neće raditi. Mikrokontroleru je potreban program.

Čini se da je i s ovim sve jednostavno - na Internetu možete pronaći mnoge sheme s besplatnim firmverom. Ali ovdje postoji jedna kvaka: firmver se mora nekako "učitati" u mikrokontroler. Za nekoga ko to nikada ranije nije radio, takav zadatak često postaje problem i glavni odbojni faktor, često ga tjera da odustane od užitaka korištenja MK-a i traži šeme zasnovane na „labavoj“ i krutoj logici. Ali nije sve tako komplikovano kao što se čini na prvi pogled.

Nakon analize publikacija na Internetu, možete vidjeti da se ovaj problem najčešće rješava na jedan od dva načina: kupovinom gotovog programatora ili izradom domaćeg programatora. U isto vrijeme, objavljeni sklopovi domaćih programera vrlo su često nerazumno složeni - mnogo složeniji nego što je zaista potrebno. Naravno, ako planirate da flešujete MK svaki dan, bolje je imati “kul” programator. Ali ako se potreba za takvim postupkom javlja rijetko, s vremena na vrijeme, onda možete uopće bez programatora. Ne, naravno, ne govorimo o učenju da se ovo radi snagom misli. To znači da razumijevanjem načina na koji programer stupa u interakciju s mikrokontrolerom prilikom pisanja i čitanja informacija u njegovom načinu programiranja, možemo se zadovoljiti dostupnim alatima za širu svrhu. Ovi alati će morati zamijeniti i softverske i hardverske dijelove programatora. Hardver mora da obezbedi fizičku vezu sa MK mikrokolo, mogućnost primene logičkih nivoa na njegove ulaze i čitanje podataka sa njegovih izlaza. Softverski dio mora osigurati rad algoritma koji kontrolira sve potrebne procese. Također napominjemo da kvalitet snimanja informacija u MK ne ovisi o tome koliko je vaš programer "kul". Ne postoji nešto kao što je „bolje snimljeno” ili „gore”. Postoje samo dvije opcije: “registrovan” i “neregistrovan”. Ovo se objašnjava činjenicom da proces snimanja unutar kristala direktno kontroliše sam MK. Samo treba da mu obezbedite visokokvalitetno napajanje (bez smetnji ili mreškanja) i pravilno organizujete interfejs. Ako rezultati testnog očitavanja ne otkriju greške, onda je sve u redu - kontroler možete koristiti za njegovu namjenu.

Da bismo upisali program u MK bez programatora, potreban nam je USB-RS232TTL port konvertor i, takođe. USB-RS232TTL pretvarač vam omogućava da koristite USB port za kreiranje COM porta koji se razlikuje od "pravog" samo po tome što njegovi ulazi i izlazi koriste TTL logičke nivoe, odnosno napon u rasponu od 0 do 5 volti ( možete pročitati više u članku " "). U svakom slučaju, takav pretvarač je korisno imati u svom "domaćinstvu", pa ako ga već nemate, svakako ga vrijedi kupiti. Što se tiče logičkih nivoa, u našem slučaju TTL je čak i prednost u odnosu na običan COM port, jer se ulazi i izlazi takvog porta mogu direktno povezati na bilo koji mikrokontroler napajan od 5 V, uključujući ATtiny i ATmega. Ali nemojte pokušavati koristiti običan COM port - oni koriste napone u rasponu od -12 do +12 V (ili -15...+15V). U ovom slučaju, direktna veza sa mikrokontrolerom je neprihvatljiva!!!

Ideja o stvaranju skripte za program Perpetuum M, koja implementira funkcije programera, nastala je nakon čitanja brojnih publikacija na Internetu koje nude određena rješenja za MK firmware. U svakom slučaju otkriveni su ozbiljni nedostaci ili prevelike poteškoće. Često sam nailazio na programska kola koja su sadržavala mikrokontroler, a pritom su se vrlo ozbiljno davali savjeti poput: “...i da programiramo mikrokontroler za ovaj programator trebat će nam... tako je – još jedan programer!” Zatim je predloženo da odemo do prijatelja i potražimo plaćena usluga i tako dalje. Kvalitet softvera distribuiranog na mreži za ove namjene također nije bio impresivan - uočeni su mnogi problemi kako u funkcionalnosti, tako i sa „zamućenošću“ korisničkog interfejsa. Često je potrebno puno vremena da se shvati kako se koristi program - mora se proučiti čak i za izvođenje najjednostavnijih radnji. Drugi program može nešto raditi dugo i marljivo, ali korisnik sazna da se ništa ne upisuje u MK tek nakon što je kompletan firmware kompletan i naknadno probno očitavanje. Javlja se i sljedeći problem: korisnik pokušava odabrati svoj MK sa liste podržanih kristala, ali ga nema na listi. U ovom slučaju nećete moći koristiti program - uključivanje na listu nedostajućih MK-ova, u pravilu, nije predviđeno. Osim toga, ručni odabir kontrolera sa liste izgleda čudno, s obzirom na to da programer u mnogim slučajevima može sam odrediti vrstu MK-a. Sve ovo je rečeno ne da bi se blato nabacilo na postojeće proizvode, već da bi se objasnio razlog pojave skripte za program Perpetuum M, opisanog u ovom članku. Problem zaista postoji, a tiče se prvenstveno početnika koji ne uspiju uvijek da savladaju ovaj “zid” kako bi napravili prvi korak u svijet mikrokontrolera. Predložena skripta uzima u obzir nedostatke pronađene u drugim programima. Implementirana je maksimalna "transparentnost" rada algoritma, izuzetno jednostavno korisničko sučelje koje ne zahtijeva učenje i ne ostavlja šanse da se zbunite i "kliknete na pogrešnu stvar". Ako traženi MK nije među podržanim, možete sami dodati njegov opis, uzimajući potrebne podatke iz dokumentacije preuzete sa web stranice MK developera. I, što je najvažnije, scenario je otvoren za proučavanje i modifikacije. Svako može, otvaranjem uređivač teksta, proučavajte i uređujte ga po vlastitom nahođenju, mijenjajući postojeće funkcije po svom ukusu i dodajući nedostajuće.

Prva verzija scenarija kreirana je u junu 2015. Ova verzija pruža podršku samo za Atmelove ATtiny i ATmega serije mikrokontrolera sa funkcijama za pisanje/čitanje fleš memorije, postavljanje bitova konfiguracije i automatsko otkrivanje tipa kontrolera. Pisanje i čitanje EEPROM-a nije implementirano. Bilo je planova da se dopuni funkcionalnost skripte : dodati upisivanje i čitanje EEPROM-a, implementaciju podrške za PIC kontrolere itd. Iz tog razloga skripta još nije objavljena, ali zbog nedostatka vremena implementacija plana je kasnila, kako ne bi postao najbolji neprijatelja dobra, odlučeno je da se objavi postojeća verzija. Ako već implementirane funkcije neće biti dovoljne, nemojte se uznemiravati. U tom slučaju možete pokušati sami dodati željenu funkciju. Neću sakriti: ideja ​​kreiranja ove skripte u početku ima i edukativno značenje. Pošto ste razumjeli algoritam i dodali mu nešto svoje, moći ćete bolje razumjeti rad MK-a u programskom modu, tako da u u budućnosti se nećete naći u poziciji devojke ispred pokvarenog automobila, zamišljeno gledajući njegovu unutrašnjost i ne shvatajući zašto to „ne radi“.

2. MK interfejs u režimu programiranja

Postoji nekoliko različitih načina da stavite kontroler u režim programiranja i radite s njim u ovom režimu. Najlakši za implementaciju za kontrolere serije ATtiny i ATmega je, možda, SPI. Mi ćemo to iskoristiti.

Ali, prije nego počnemo razmatrati signale potrebne za generiranje SPI, napravit ćemo nekoliko rezervi. Mikrokontroler ima konfiguracijske bitove. To su nešto poput prekidača, prebacivanje koje vam omogućava da promijenite neka svojstva mikrokola u skladu sa potrebama projekta. Fizički, to su nepromjenjive memorijske ćelije, poput onih u koje je upisan program. Razlika je u tome što ih ima vrlo malo (do tri bajta za ATmega) i nisu dio adresnog prostora nijedne memorije. Zapisivanje i čitanje konfiguracijskih podataka vrši se posebnim naredbama u MK režimu programiranja. Sada je važno napomenuti da neki konfiguracioni bitovi utiču na samu mogućnost korišćenja SPI. Uz neke od njihovih vrijednosti, može se ispostaviti da se SPI ne može koristiti. Ako naiđete na takav mikrokontroler, metoda predložena u ovom članku neće pomoći. U tom slučaju ćete morati ili promijeniti postavke konfiguracijskih bitova u programatoru, koji podržava drugačiji način programiranja, ili ćete koristiti drugi mikrokontroler. Ali ovaj problem se odnosi samo na korišćene MK-ove, ili one sa kojima se neko već bezuspešno „igrao“. Činjenica je da novi MCU-ovi dolaze s konfiguracijskim bitnim postavkama koje ne sprječavaju korištenje SPI-a. To potvrđuju i rezultati testiranja programske skripte za program Perpetuum M, tokom kojeg su uspješno flešovana četiri različita MK-a (ATmega8, ATmega128, ATtiny13, ATtiny44). Sve su bile nove. Početna postavka konfiguracijskih bitova bila je u skladu s dokumentacijom i nije ometala korištenje SPI.

S obzirom na gore navedeno, obratite pažnju na sljedeće bitove. SPIEN bit eksplicitno dozvoljava ili onemogućuje upotrebu SPI, stoga u našem slučaju njegova vrijednost mora biti omogućavanje. Bit RSTDISBL je sposoban da jedan od izlaza mikrokola (prethodno određenog) pretvori u ulaz signala "resetovanja" ili ga ne okreće (u zavisnosti od vrijednosti zapisane u ovaj bit). U našem slučaju je neophodan ulaz za „resetovanje“ (ako ga nema, neće biti moguće prebaciti MK u režim programiranja preko SPI). Postoje i bitovi CKSEL grupe koji određuju izvor signala takta. Oni ne sprječavaju korištenje SPI-a, ali ih također treba imati na umu, jer ako uopće nema taktnih impulsa, ili ako je njihova frekvencija niža od prihvatljive za datu SPI brzinu, također se neće dogoditi ništa dobro. Tipično, novi MCU koji imaju interni RC oscilator imaju CKSEL grupne bitove konfigurirane da ga koriste. Ovo nam sasvim odgovara – taktiranje je obezbeđeno bez ikakvih dodatnih napora sa naše strane. Nema potrebe za lemljenjem kvarcnog rezonatora ili spajanjem eksternog generatora. Ako navedeni bitovi sadrže drugačiju postavku, morat ćete voditi računa o taktiranju u skladu s postavkom. U ovom slučaju, možda će biti potrebno povezati kvarcni rezonator ili vanjski generator takta na MCU. Ali u ovom članku nećemo razmatrati kako se to radi. Primjeri povezivanja MK-a za programiranje sadržani u ovom članku dizajnirani su za najjednostavniji slučaj.

Rice. 1. Razmjena podataka preko SPI u modu programiranja

Sada se okrenemo slici 1, preuzetoj iz dokumentacije za ATmega128A MK. Prikazuje proces odašiljanja jednog bajta do MK-a i istovremenog prijema jednog bajta od MK-a. Oba ova procesa, kao što vidimo, koriste iste taktne impulse dostavljene od programatora do mikrokontrolera na njegovom SCK ulazu - jednom od pinova mikrokola, kojem je takva uloga dodijeljena u režimu SPI programiranja. Još dvije signalne linije omogućavaju prijem i prijenos podataka po jedan bit po taktu. Preko MOSI ulaza podaci ulaze u mikrokontroler, a očitani podaci se preuzimaju sa MISO izlaza. Obratite pažnju na dvije isprekidane linije povučene od SCK do MISO i MOSI. Oni pokazuju u kom trenutku mikrokontroler "proguta" bit podataka postavljen na MOSI ulaz, a u kom trenutku sam postavlja svoj bit podataka na MISO izlaz. Sve je prilično jednostavno. Ali da bismo MK ušli u režim programiranja, još uvijek nam je potreban RESET signal. Ne zaboravimo ni na uobičajenu GND žicu i VCC napajanje. Ukupno se ispostavilo da je samo 6 žica potrebno spojiti na mikrokontroler da bi se njegov firmware fleširao preko SPI-a. U nastavku ćemo to detaljnije analizirati, ali za sada ćemo dodati da se razmjena podataka sa MK u programskom modu preko SPI-a vrši u paketima od 4 bajta. Prvi bajt svakog paketa je u osnovi u potpunosti posvećen kodiranju instrukcija. Drugi bajt, zavisno od prvog, može biti nastavak koda komande, ili deo adrese, ili može imati proizvoljnu vrednost. Treći bajt se prvenstveno koristi za prenos adresa, ali može imati proizvoljnu vrijednost u mnogim instrukcijama. Četvrti bajt obično prenosi podatke ili ima proizvoljnu vrijednost. Istovremeno sa prijenosom četvrtog bajta, neke komande primaju podatke koji dolaze iz mikrokontrolera. Detalji za svaku naredbu mogu se naći u dokumentaciji kontrolera u tabeli pod nazivom "SPI serijski programski set instrukcija". Za sada samo napominjemo da je cjelokupna razmjena sa kontrolerom izgrađena od niza 32-bitnih paketa, u svakom od kojih se ne prenosi više od jednog bajta korisnih informacija. Ovo nije baš optimalno, ali općenito dobro funkcionira.

3. Povezivanje MK-a za programiranje

Da bi se osiguralo da se svi potrebni signali dovode na ulaze mikrokontrolera za organizovanje SPI interfejsa i čitanje podataka sa njegovog MISO izlaza, nije potrebno kreirati programator. To se lako može učiniti korištenjem najčešćeg USB-RS232TTL pretvarača.

Na internetu se često mogu naći informacije da su takvi pretvarači inferiorni i da se s njima ništa ozbiljno ne može učiniti. Ali s obzirom na većinu modela pretvarača, ovo mišljenje je pogrešno. Da, u prodaji postoje pretvarači koji nemaju sve ulaze i izlaze na raspolaganju u poređenju sa standardnim COM portom (na primjer, samo TXD i RXD), a imaju neodvojivi dizajn (mikrokolo je ispunjeno plastikom - to je nemoguće dohvatiti njegove igle). Ali ovo nije vrijedno kupovine. U nekim slučajevima, ulaze i izlaze portova koji nedostaju možete dobiti lemljenjem ožičenja direktno na čip. Primjer takvog "poboljšanog" pretvarača prikazan je na slici 2 (čip PL-2303 - više detalja o svrsi njegovih pinova u članku ""). Ovo je jedan od najjeftinijih modela, ali ima svoje prednosti kada se koristi u domaćim dizajnima. Puno opremljeni adapterski kablovi sa standardnim devetopinskim konektorom na kraju, poput COM porta, takođe su široko rasprostranjeni. Razlikuju se od običnog COM porta samo po TTL nivoima i nekompatibilnosti sa naslijeđem softver i nešto stare opreme. Takođe se može primetiti da se kablovi na CH34x čipu pokazuju mnogo pouzdaniji i stabilniji u raznim ekstremnim testovima u poređenju sa pretvaračima na PL-2303. Međutim, tokom normalne upotrebe razlika nije primjetna.

Prilikom odabira USB-RS232TTL konvertera, obratite pažnju i na kompatibilnost njegovog drajvera sa verzijom operativnog sistema koji koristite.

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

Otpornici prikazani na općem dijagramu se u principu ne mogu instalirati, ali ih je ipak bolje instalirati. Koja je njihova svrha? Koristeći TTL ulaze i izlaze pretvarača i pet-voltno napajanje mikrokontrolera, time se oslobađamo potrebe za koordinacijom logičkih nivoa - sve je već sasvim ispravno. To znači da veze mogu biti direktne. Ali tokom eksperimenata , svašta se može desiti.Na primjer, po zakonu podlosti, odvijač može pasti upravo na mjesto gdje nikako ne bi mogao pasti, i kratko spojiti nešto što ni u kom slučaju ne smije biti kratko spojeno.Naravno, sve može ispadne kao "šrafciger". Otpornici u ovom slučaju ponekad smanjuju posljedice. Jedna od njihovih namjena je da eliminišu mogući izlazni konflikt. Činjenica je da nakon završenog programiranja mikrokontroler prelazi u normalan radni mod i može desi se da i njegov pin spojen na izlaz konvertora (RTS, TXD ili DTR) postane izlaz, prema programu koji je upravo snimljen u MK-u. U ovom slučaju bi bilo jako loše ako se dva direktno povezana izlaza "pobiju" - pokušajte postaviti različite logičke nivoe. U takvoj "borbi" neko može "izgubiti", ali mi to ne želimo.

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

Ako čip ima poseban AVCC pin za napajanje analogno-digitalnog pretvarača (na primjer, ATmega8 ili ATmega128), trebao bi biti povezan na zajednički VCC pin za napajanje. Neki IC-ovi imaju više od jednog VCC pina za napajanje ili više od jedne GND. Na primjer, ATmega128 ima 3 GND pina i 2 VCC pina. U trajnom dizajnu, bolje je povezati igle istog imena jedna s drugom. U našem slučaju, tokom programiranja možete koristiti po jedan VCC i GND pin.

A evo kako izgleda ATtiny13 veza. Slika prikazuje dodjelu pinova koja se koristi pri programiranju preko SPI. Pored fotografije je kako u stvarnosti izgleda privremena veza.


Neki mogu reći da to nije ozbiljno - veze na ožičenju. Ali ti i ja smo razumni ljudi. Naš cilj je da programiramo mikrokontroler, trošeći minimalno vrijeme i druge resurse na njega, a ne da se hvalimo pred nekim. Kvaliteta ne trpi. Metoda "na žicama" u ovom slučaju je prilično efikasna i opravdana. Flešovanje firmvera kontrolera je jednokratna procedura, tako da nema smisla prekrivati ​​ga kamenčićima. Ako se namjerava promijeniti firmver u budućnosti bez uklanjanja kontrolera iz kruga (u gotovom proizvodu), tada se to uzima u obzir prilikom instalacije tijekom proizvodnje uređaja. Obično se u tu svrhu instalira konektor (RESET, SCK, MOSI, MISO, GND), a MK se može flešovati čak i nakon instalacije na ploču. Ali ovo su kreativni užici. Razmatramo najjednostavniji slučaj.

Sada pređimo na ATtiny44 MK. Ovdje je sve otprilike isto. Na osnovu crteža i fotografije, čak ni početnik neće imati poteškoća da shvati vezu. Kao i ATtiny44, možete povezati ATtiny24 i ATtiny84 mikrokontrolere - dodjela pinova za ova tri su ista.


Još jedan primjer privremenog povezivanja kontrolera za njegovo programiranje je ATmega8. Ovdje ima više pinova, ali princip je isti - nekoliko žica, a sada je kontroler spreman da u njega "popuni" informacije. Dodatna crna žica na fotografiji koja dolazi sa pina 13 ne učestvuje u programiranju. Dizajniran je da ukloni zvučni signal iz njega nakon što MK izađe iz moda programiranja. To je zbog činjenice da je tokom ispravljanja grešaka u skripti za "Perpetuum M" program preuzet na MK muzicka kutija.


Često je jedan kontroler dostupan u različitim kućištima. U ovom slučaju, dodjela pinova za svaki slučaj se različito raspoređuje. Ako kućište vašeg kontrolera nije slično onom prikazanom na slici, provjerite namjenu pinova u tehničkoj dokumentaciji koju možete preuzeti sa web stranice MK developera.

Da bismo upotpunili sliku, pogledajmo povezivanje MK mikrokola s velikim brojem "noga". Svrha dodatne crne žice na fotografiji koja dolazi sa pina 15 je potpuno ista kao u slučaju ATmega8.


Vjerovatno ste se već uvjerili da je sve prilično jednostavno. Svako ko zna prebrojati pinove mikro krugova (od oznake u krugu suprotno od kazaljke na satu) shvatit će. I ne zaboravite na tačnost. Mikrokrugovi vole uredne ljude i ne opraštaju nemarno postupanje.

Pre nego što pređete na softverski deo, uverite se da je drajver USB-RS232TTL konvertor ispravno instaliran (proverite Windows Device Manager). Zapamtite ili zapišite broj virtuelnog COM porta koji se pojavljuje kada povežete pretvarač. Ovaj broj ćete morati unijeti u tekst skripte, o čemu možete pročitati u nastavku.

4. Skripta - programer za "Perpetuum M"

Shvatili smo hardverski dio "programatora". Ovo je već pola bitke. Sada ostaje da se pozabavimo softverskim dijelom. Njegovu ulogu će obavljati program Perpetuum M pod kontrolom skripte, koja implementira sve potrebne funkcije za interakciju sa mikrokontrolerom.

Arhivu sa skriptom treba raspakovati u isti folder u kojem se nalazi program perpetuum.exe. U tom slučaju, kada pokrenete datoteku perpetuum.exe, na ekranu će se prikazati meni sa listom instaliranih skripti, među kojima će se nalaziti red "AVR MK Programmer" (možda je i jedini). Ovo je linija koja nam treba.

Skripta se nalazi u folderu PMS u datoteci "MK Programmer AVR.pms". Ova datoteka se može pregledati, proučavati i uređivati ​​ako je potrebno u običnom uređivaču teksta kao što je Windows Notepad. Prije korištenja skripte, najvjerovatnije ćete morati promijeniti tekst koji se odnosi na postavke porta. Da biste to učinili, provjerite naziv porta koji se koristi u Windows upravitelju uređaja i, ako je potrebno, izvršite odgovarajuću izmjenu u redu "PortName="COM4";" - umjesto broja 4 može postojati drugi broj. Takođe, kada koristite drugi model USB-RS232TTL konvertera, možda ćete morati da promenite postavke inverzije signala (redovi skripte koji počinju rečju „High“). Inverziju signala USB-RS232TTL konvertorom možete provjeriti pomoću jednog od primjera sadržanih u uputama za program Perpetuum M (odjeljak funkcija za rad sa portom).

Podmapa MK_AVR sadrži datoteke s opisima podržanih kontrolera. Ako kontroler koji vam je potreban nije među njima, možete sami dodati onaj koji vam je potreban, slijedeći analogiju. Uzmite jedan od fajlova kao uzorak i pomoću uređivača teksta unesite potrebne podatke, uzimajući ih iz dokumentacije za vaš mikrokontroler. Glavna stvar je da budete oprezni, unesite podatke bez grešaka, inače MK neće biti programiran ili će biti programiran pogrešno. Originalna verzija podržava 6 mikrokontrolera: ATtiny13, ATtiny24, ATtiny44, ATtiny84, ATmega8 i ATmega128. Skripta implementira automatsko prepoznavanje povezanog kontrolera - nema potrebe da ga navedete ručno. Ako identifikator pročitan iz MK-a nije među dostupnim opisima, prikazuje se poruka da se kontroler ne može prepoznati.

Arhiva sa skriptom takođe sadrži Dodatne informacije. Fascikla AVR kontroler inc datoteka sadrži vrlo korisnu i opsežnu kolekciju datoteka definicija kontrolera. Ove datoteke se koriste za pisanje vlastitih programa za MK. Još četiri foldera "MusicBox_..." sadrže datoteke sa programom na asemblerskom jeziku i firmverom spremnim za preuzimanje na MK zasebno za ATtiny13, ATtiny44, ATmega8 i ATmega128. Ako ste već povezali jedan od ovih MK-a za programiranje, kao što je predloženo u ovom članku, možete ga odmah flashati - dobit ćete muzičku kutiju. Više o tome u nastavku.

Kada odaberete liniju “MK AVR Programmer” u meniju skripte, skripta počinje da se izvršava. Istovremeno, otvara port, šalje naredbu MK-u da se prebaci u programski režim, prima potvrdu od MK-a o uspješnoj tranziciji, traži MK identifikator i traži opis ovog MK-a po njegovom identifikatoru među dostupnim datoteke sa opisima. Ako ne pronađe traženi opis, prikazuje odgovarajuću poruku. Ako se pronađe opis, otvara se glavni meni programatora. Njegov screenshot možete vidjeti na slici 8. Dalje razumijevanje nije teško - meni je vrlo jednostavan.

U prvoj verziji skripte neke funkcije punopravnog programera nisu implementirane. Na primjer, ne postoji način za čitanje i pisanje u EEPROM. Ali ako otvorite skriptu u uređivaču teksta, vidjet ćete da je vrlo male veličine, uprkos činjenici da je glavna stvar već implementirana u njoj. To sugerira da dodavanje nedostajućih funkcija nije tako teško - jezik je vrlo fleksibilan, omogućava vam da implementirate bogatu funkcionalnost u malom programu. Ali u većini slučajeva dovoljne su čak i postojeće funkcije.

Neka ograničenja funkcionalnosti su opisana direktno u tekstu skripte:
//implementirano snimanje samo sa nulte adrese (Zapis adrese proširenog segmenta se zanemaruje, LOAD OFFSET - također)
//redoslijed i kontinuitet zapisa u HEX datoteci se ne provjerava
//kontrolna suma nije provjerena
Ovo se odnosi na rad sa HEX datotekom iz koje je preuzet kod firmvera za MK. Ako ova datoteka nije oštećena, provjera kontrolne sume neće imati efekta. Ako je izobličen, neće ga biti moguće otkriti pomoću skripte. U većini slučajeva, preostala ograničenja neće škoditi, ali ih ipak morate imati na umu.

5. Muzička kutija - jednostavan zanat za početnike

Ako imate jedan od ovih mikrokontrolera: ATtiny13, ATtiny44, ATmega8 ili ATmega128, lako ga možete pretvoriti u muzičku kutiju ili muzičku karticu. Da biste to učinili, dovoljno je upisati odgovarajući firmver u MK - jedan od ona četiri koja se nalaze u folderima "MusicBox_..." u istoj arhivi sa skriptom. Kodovi firmvera se pohranjuju u datoteke sa ekstenzijom ".hex". Korištenje ATmega128 za takav zanat je, naravno, „debelo“, baš kao i ATmega8. Ali ovo može biti korisno za testiranje ili eksperimentiranje, drugim riječima, u obrazovne svrhe. U prilogu su i tekstovi programa u Assembleru. Programi nisu kreirani od nule - za osnovu je uzet program muzičke kutije iz knjige A.V. Belova. AVR mikrokontroleri u radioamaterskoj praksi." Originalni program je doživio niz značajnih promjena:
1. prilagođeno za svaki od četiri MK-a: ATtiny13, ATtiny44, ATmega8 i ATmega128
2. tasteri su eliminisani - ništa ne treba da bude povezano na kontroler osim napajanja i emitera zvuka (melodije se reprodukuju jedna za drugom u beskonačnoj petlji)
3. trajanje svake note se smanjuje za trajanje pauze između nota kako bi se eliminisali poremećaji u muzičkom ritmu
4. osma melodija je povezana, ne koristi se u verziji knjige
5. od subjektivnog: neka "poboljšanja" za optimizaciju i olakšavanje razumijevanja algoritma

U nekim melodijama se mogu čuti laži, pa čak i grube greške, posebno u “Smile” - u sredini. Kodovi melodija zvona preuzeti su iz knjige (ili bolje rečeno, preuzeti sa web stranice autora knjige zajedno s originalnim asm fajlom) i nisu modificirani. Očigledno postoje greške u kodiranju melodija. Ali to nije problem - svako ko je "prijateljski" sa muzikom može to lako shvatiti i popraviti sve.

U ATtiny13, zbog nedostatka 16-bitnog brojača, 8-bitni brojač je morao da se koristi za reprodukciju nota, što je dovelo do blagog smanjenja tačnosti nota. Ali to je jedva primjetno na uho.

O konfiguracijskim bitovima. Njihova podešavanja moraju odgovarati stanju novog mikrokontrolera. Ako je vaš MK već negdje korišten, potrebno je provjeriti stanje njegovih konfiguracijskih bitova i, ako je potrebno, uskladiti ih sa postavkama novog mikrokontrolera. Stanje konfiguracijskih bitova novog mikrokontrolera možete saznati iz dokumentacije za ovaj MK (odjeljak "Bitovi osigurača"). Izuzetak je ATmega128. Ovaj MCU ima M103C bit, koji omogućava način kompatibilnosti sa starijim ATmega103. Aktiviranje bita M103C uvelike smanjuje mogućnosti ATmega128, a ovaj bit je aktivan na novom MK-u. Morate resetirati M103C u neaktivno stanje. Za manipulaciju konfiguracijskim bitovima, koristite odgovarajući odjeljak menija skripte programera.

Nema smisla davati dijagram muzičke kutije: ona sadrži samo mikrokontroler, napajanje i emiter piezo zvuka. Napajanje se isporučuje na potpuno isti način kao što smo radili prilikom programiranja MK-a. Emiter zvuka je povezan između zajedničke žice (GND pin kontrolera) i jednog od MK pinova, čiji se broj nalazi u datoteci sa programskim sklopnim kodom (*.asm). Na početku teksta programa za svaki MK u komentarima stoji red: " zvučni signal formira se na pin XX." Kada programatorska skripta završi svoj rad, mikrokontroler izlazi iz režima programiranja i prelazi u normalan radni mod. Reprodukcija melodija počinje odmah. Povezivanjem emitera zvuka, ovo možete provjeriti. Možete napustiti emiter zvuka povezan tokom programiranja kristala samo ako zvuk dolazi sa pina koji SPI ne koristi, inače dodatni kapacitet na pinu može ometati programiranje.

Zadatak: Hajde da razvijemo program za upravljanje jednom LED diodom. Kada se dugme pritisne, LED se pali i kada se otpusti, gasi se.

Prvo, napravimo shematski dijagram uređaja. I/O portovi se koriste za povezivanje bilo kojeg vanjskog uređaja na mikrokontroler. Svaki od portova može raditi i kao ulaz i kao izlaz. Povežimo LED na jedan od portova, a dugme na drugi. Za ovaj eksperiment koristit ćemo kontroler Atmega8. Ovaj čip sadrži 3 I/O porta, ima 2 osam-bitna i 1 šesnaest-bitni tajmer/brojač. Također na brodu se nalazi 3-kanalni PWM, 6-kanalni 10-bitni analogno-digitalni pretvarač i još mnogo toga. Po mom mišljenju, mikrokontroler je odličan za učenje osnova programiranja.

Za povezivanje LED-a koristićemo liniju PB0, a za čitanje informacija sa dugmeta koristićemo liniju PD0. Dijagram je prikazan na slici 1.

Rice. 1

Preko otpornika R2 na ulaz PD0 se dovodi plus napon napajanja, što odgovara logičkom signalu. Kada se dugme zatvori, napon pada na nulu, što odgovara logičkoj nuli. U budućnosti, R2 se može isključiti iz kruga, zamjenjujući ga unutarnjim otpornikom opterećenja, unoseći potrebna podešavanja u program. LED dioda je povezana na izlaz porta PB0 preko strujno-ograničavajućeg otpornika R3. Da biste upalili LED, morate primijeniti logički jedan signal na PB0 liniju. Koristićemo interni glavni generator takta na 4 MHz, jer uređaj nema visoke zahtjeve za stabilnost frekvencije.

Sada pišemo program. Koristim programsko okruženje za pisanje programa AVR Studio I WinAvr. Otvorite AVR Studio, pojaviće se prozor dobrodošlice, kliknite na dugme "Kreiraj novi projekat", zatim izaberite tip projekta - AVR GCC, napišite naziv projekta na primer "cod1", označite i "Kreiraj fasciklu projekta" i "Kreiraj inicijalizacijski fajl" kliknite na dugme "Dalje", izaberite "AVR Simulator" u levom prozoru i ukucajte mikrokontroler "Atmega8" u desnom prozoru, kliknite na dugme "Završi", otvara se uređivač i stablo kategorije projekta - početna podešavanja su završena.

Prvo, dodajmo standardni tekst opisa za Atmega8 koristeći operator za pričvršćivanje vanjskih datoteka: #include

sintaksa direktive #include

#include<имя_файла.h>
#include “filename.h”

Ugaone zagrade< и >ukazati kompajleru da se uključene datoteke prvo moraju potražiti u standardnoj WinAvr fascikli pod nazivom include. Dvostruki navodnici “ i “ govore kompajleru da započne pretragu u direktoriju u kojem je projekt pohranjen.

Svaki tip mikrokontrolera ima svoju datoteku zaglavlja. Za ATMega8 ova datoteka se zove iom8.h, za ATtiny2313 - iotn2313.h. Na početku svakog programa moramo uključiti datoteku zaglavlja mikrokontrolera koji koristimo. Ali postoji i uobičajena datoteka zaglavlja io.h. Predprocesor obrađuje ovu datoteku i, ovisno o postavkama projekta, uključuje potrebnu datoteku zaglavlja u naš program.

Za nas će prva linija programa izgledati ovako:

#include

Svaki C program mora sadržavati jednu glavnu funkciju. Naziva se glavnim. Izvršenje programa uvijek počinje izvršavanjem glavne funkcije. Funkcija ima zaglavlje - int main(void) i tijelo - ograničeno je kovrčave zagrade {}.

int main(void)
{
tijelo funkcije
}

Naš kod ćemo dodati u tijelo funkcije. Tip povratka je naznačen prije imena funkcije. Ako funkcija ne vrati vrijednost, koristi se ključ void.

int- ovo je 2-bajtni cijeli broj, raspon vrijednosti je od - 32768 do 32767

Nakon naziva funkcije, parametri koji se prosljeđuju funkciji kada se ona pozove označeni su u zagradama (). Ako funkcija nema parametre, koristi se ključna riječ void. Funkcija main sadrži skup komandi, sistemske postavke i glavnu programsku petlju.

Zatim konfigurišemo port D na ulazu. Način rada porta je određen sadržajem registra DDRD(registar pravaca prijenosa informacija). U ovaj registar upisujemo broj “0x00” (0b0000000 - u binarnom obliku), na ovaj port ništa nije povezano osim dugmeta, tako da konfigurišemo ceo port D kao ulaz. Port možete konfigurisati bit po bit tako što ćete upisati brojeve 0 ili 1 u svaki bit registra (0-ulaz, 1-izlaz), na primjer DDRD = 0x81 (0b10000001) - prva i zadnja linija porta D rade kao izlaz, ostalo kao ulaz. Interni otpornik opterećenja također mora biti spojen. PORTx registar kontrolira da li su interni otpornici uključeni ili isključeni kada je port u ulaznom modu. Hajde da upišemo jedinice tamo.

Postavljanje porta B do izlaza. Način rada porta je određen sadržajem registra DDRB. Ništa osim LED diode na portu B nije povezan, tako da se cijeli port može konfigurirati kao izlaz. To se radi upisom u registar DDRB brojevi "0xFF". Da spriječite da se LED dioda upali kada ga prvi put uključite, pišite na port B logičke nule. Ovo se radi snimanjem PORTB= 0x00;

Za dodjelu vrijednosti koristi se simbol "=" i naziva se operator dodjeljivanja, a ne smije se brkati sa znakom "jednako".

Konfiguracija porta će izgledati ovako:

DDRD = 0x00;
PORTD = 0xFF;
DDRB = 0xFF;
PORTB = 0x00;

Pišemo glavnu petlju programa. dok(“while” sa engleskog) - ova naredba organizira petlju, ponavljajući tijelo petlje mnogo puta dok se ne ispuni uslov, odnosno dok je izraz u zagradama tačan. U C-u izraz se smatra istinitim ako nije jednak nuli, a netačnim ako jeste.

Naredba izgleda ovako:

dok (uvjet)
{
tijelo petlje
}

U našem slučaju, glavna petlja će se sastojati od samo jedne naredbe. Ova komanda dodjeljuje registar PORTB vrijednost registra za invertiranje PORTD.

PORTB = ~PIND; //preuzeti vrijednost sa porta D, invertirati je i dodijeliti je PORTB (upisati u PORTB)

// C izrazi se čitaju s desna na lijevo

PIND registar za unos informacija. Da biste pročitali informacije sa eksternog izlaza kontrolera, prvo morate prebaciti željeni bit porta u način unosa. To jest, pisati u odgovarajući bit registra DDRx nula. Tek nakon toga se digitalni signal sa eksternog uređaja može isporučiti na ovaj pin. Zatim će mikrokontroler pročitati bajt iz registra PINx. Sadržaj odgovarajućeg bita odgovara signalu na vanjskom pinu porta. Naš program je spreman i izgleda ovako:

#include int main (void) ( DDRD = 0x00; //port D - ulaz PORTD = 0xFF; //spoji otpornik opterećenja DDRB = 0xFF; //port B - izlaz PORTB = 0x00; //postavimo izlaz na 0 while(1 ) ( PORTB = ~PIND; //~ znak inverzije bitova ) )

Komentari se široko koriste u jeziku C. Postoje dva načina za pisanje.

/*Komentar*/
//Komentar

U ovom slučaju kompajler neće obraćati pažnju na ono što je napisano u komentaru.

Ako koristite isti program i povežete 8 dugmadi i 8 LED dioda na mikrokontroler, kao što je prikazano na slici 2, tada će biti jasno da svaki bit porta D odgovara njegovom bitu porta B. Pritiskom na dugme SB1 svetli HL1, pritiskom na dugme SB2 svetli HL2 itd.

Slika 2

U članku su korišteni materijali iz knjige A.V. Belova. "Vodič za programere AVR uređaja"

Više od jednom ili dva puta sam rekao da učenje MK-a treba početi sa asemblerom. Tome je bio posvećen čitav kurs na web stranici (iako nije baš konzistentan, ali postepeno ga češljam do adekvatnog izgleda). Da, teško je, rezultat neće biti prvog dana, ali naučićete da razumete šta se dešava u vašem kontroleru. Znat ćete kako to funkcionira, a ne kao majmun kopirati tuđe izvore i pokušati razumjeti zašto je odjednom prestao raditi. Osim toga, C-u je mnogo lakše napraviti redneck kod koji će izaći s vilama u najnepovoljnijem trenutku.

Nažalost, svi žele rezultate odmah. Pa sam odlučio da krenem drugim putem - napravim tutorijal o C, ali sa pokazivanjem njegovog donjeg rublja. Dobar programer za ugradnju uvijek čvrsto drži svoj komad hardvera za vijak, ne dozvoljavajući mu da napravi nijedan korak bez dozvole. Dakle, prvo će biti C kod, zatim šta je kompajler proizveo i kako sve to zapravo radi :)

S druge strane, C-ova jača strana je prenosivost koda. Ako, naravno, sve ispravno napišete. Razdvajanje radnih algoritama i njihovih hardverskih implementacija u različite dijelove projekta. Zatim, da bi se algoritam prebacio na drugi mikrokontroler, biće dovoljno da se prepiše samo sloj interfejsa, u koji se upisuju svi pozivi hardveru, i ostavi sav radni kod kakav jeste. I, naravno, čitljivost. Izvorni kod C je lakši za razumevanje na prvi pogled (iako... na primer, nije me briga na šta da pokažem - bilo C ili ASM :)), ali, opet, ako je sve ispravno napisano. Takođe ću obratiti pažnju na ove tačke.

Moja debug ploča će poslužiti kao eksperimentalni hardver na koji će biti instaliran lavovski dio svih primjera.

Prvi C program za AVR

Odabir kompajlera i podešavanje okruženja
Postoji mnogo različitih C kompajlera za AVR:
Prije svega ovo IAR AVR C- je gotovo definitivno prepoznat kao najbolji kompajler za AVR, jer sam kontroler je kreiran u bliskoj saradnji između Atmela i stručnjaka iz IAR-a. Ali morate platiti za sve. A ovaj kompajler nije samo skup komercijalni softver, već ima toliku tonu postavki da je potrebno mnogo truda da se jednostavno prevede u njega. Zaista nisam razvio prijateljstvo s njim; projekat je trunuo zbog čudnih grešaka u fazi povezivanja (kasnije sam saznao da je to bila kriva pukotina).

Drugi dolazi WinAVR GCC- moćan kompajler za optimizaciju. Potpuno otvoren izvor, cross-platforma, općenito, sve radosti života. Takođe se savršeno integriše u AVR Studio, omogućavajući vam da otklanjate greške upravo tamo, što je prokleto zgodno. Generalno, izabrao sam ga.

Tu je i CodeVision AVR C je veoma popularan kompajler. Postala je popularna zbog svoje jednostavnosti. Možete dobiti radni program u njemu za samo nekoliko minuta - čarobnjak za početni kod to uvelike olakšava ukidanjem standarda za inicijalizaciju svih vrsta stvari. Da budem iskren, pomalo sam sumnjičav prema tome - kada sam morao da demontiram program koji je napisao ovaj kompajler, ispostavilo se da je to neka vrsta nereda, a ne koda. Užasna količina nepotrebnih pokreta i operacija, što je rezultiralo značajnom količinom koda i sporim performansama. Međutim, možda je došlo do greške u DNK osobe koja je napisala originalni firmver. Plus on želi novac. Ne toliko kao IAR, ali primjetno. A u demo modu vam omogućava da napišete ne više od 2 kb koda.
Naravno da postoji pukotina, ali ako ćeš krasti, to je milion, u IAR smislu :)

Tu je i Image Craft AVR C I MicroC iz mikroelektronike. Nisam morao da koristim ni jedno ni drugo, ali S.W.G. veoma pohvalno MicroPascal, kažu, užasno zgodno programsko okruženje i biblioteke. Mislim da MicroC neće biti ništa lošiji, ali je i plaćen.

Kao što sam rekao, izabrao sam WinAVR iz tri razloga: besplatan je, integriše se u AVR Studio i postoji samo tona gotovog koda napisanog za njega za sve prilike.

Stoga preuzmite instalaciju WinAVR-a sa AVR Studio-om. Zatim se prvo instalira studio, zatim se WinAVR namota na vrh i prikači na studio u obliku dodatka. Toplo preporučujem instalaciju WinAVR-a na kratkom putu, nešto poput C:\WinAVR, na ovaj način ćete izbjeći mnogo problema sa putanjama.

Kreiranje projekta
Dakle, studio je instaliran, C je sjeban, vrijeme je da pokušamo nešto programirati. Počnimo s jednostavnim, najjednostavnijim. Pokrenite studio, tamo odaberite novi projekat, kao AVR GCC kompajler i unesite naziv projekta.

Otvara se radno polje sa praznim *.c fajlom.

Sada neće škoditi da konfigurišete prikaz putanja u studijskim obeleživačima. Da biste to učinili, idite na:
Meni Alati - Opcije - Općenito - Kartice datoteka i odaberite “Samo naziv datoteke” sa padajuće liste. U suprotnom će biti nemoguće raditi - kartica će sadržavati punu putanju datoteke i neće biti više od dvije ili tri kartice na ekranu.

Postavljanje projekta
Uopšteno govoreći, smatra se klasičnim kreiranje make datoteke u kojoj su opisane sve zavisnosti. I to je vjerovatno tačno. Ali za mene, koji sam odrastao sa potpuno integrisanim IDE-ovima kao što su uVision ili AVR Studio ovaj pristup je duboko stran. Zato ću to uraditi na svoj način, sve koristeći studijski način.

Gurnite dugme sa zupčanikom.


Ovo su postavke vašeg projekta i preciznije postavke automatsko generisanje makefilea. Na prvoj stranici samo trebate unijeti frekvenciju na kojoj će vaš MK raditi. Ovo ovisi o bitovima osigurača, tako da pretpostavljamo da je naša frekvencija 8000000Hz.
Također obratite pažnju na liniju optimizacije. Sada postoji -Os - ovo je optimizacija veličine. Ostavite kako je za sada, onda možete pokušati igrati s ovim parametrom. -O0 uopće nije optimizacija.

Sljedeći korak je konfiguracija staza. Prije svega, dodajte svoj projektni direktorij tamo - tamo ćete dodati biblioteke trećih strana. Putanja “.\” će se pojaviti na listi.

Make fajl je generisan, možete ga pogledati u podrazumevanoj fascikli u vašem projektu, samo pogledajte i vidite šta se tamo nalazi.


To je sve za sada. Kliknite OK svuda i idite na izvor.

Formulacija problema
Prazan list papira primamljiv je za implementaciju neke lukave ideje, jer banalno treptanje diode više ne funkcionira. Hajdemo odmah uhvatiti bika za rogove i uspostaviti vezu sa kompjuterom - ovo je prva stvar koju radim.

Radit će ovako:
Kada jedinica (kod 0x31) stigne na COM port, mi ćemo uključiti diodu, a kada stigne nula (kod 0x30) ona se gasi. Štaviše, sve će se raditi na prekidima, a pozadinski zadatak će biti treptanje druge diode. Jednostavno i smisleno.

Sastavljanje kola
Moramo spojiti USB-USART konvertorski modul na USART pinove mikrokontrolera. Da biste to učinili, uzmite kratkospojnik od dvije žice i postavite ga na igle poprečno. Odnosno, povezujemo Rx kontrolera sa Tx pretvarača, a Tx pretvarača sa Rx regulatorom.

Na kraju, ovo je dijagram:


Ne razmišljam o povezivanju preostalih pinova, napajanja ili resetiranja, to je standardno.

Pisanje koda

Odmah da rezervišem da se neću posebno upuštati u opis samog C jezika. Jednostavno postoji kolosalna količina materijala za ovo, u rasponu od klasičnog “C programskog jezika” od K&R-a do raznih priručnika.

Pronašao sam jednu takvu metodu u svojoj zalihi; jednom sam je koristio za proučavanje ovog jezika. Tamo je sve kratko, jasno i precizno. Postepeno ga sastavljam i prevlačim na svoju web stranicu.

Tačno je da još nisu sva poglavlja prebačena, ali mislim da neće još dugo.

Malo je vjerovatno da to mogu bolje opisati, pa ću sa kursa obuke, umjesto detaljnog objašnjenja suptilnosti, jednostavno dati direktne veze na pojedine stranice ovog priručnika.

Dodavanje biblioteka.
Prije svega, dodajemo potrebne biblioteke i zaglavlja s definicijama. Na kraju krajeva, C je univerzalni jezik i moramo mu objasniti da radimo posebno sa AVR-om, pa napišite red u izvornom kodu:

1 #include

#include

Ova datoteka se nalazi u folderu WinAVR i sadrži opis svih registara i portova kontrolera. Štaviše, sve je tu lukavo, sa vezivanjem za određeni kontroler, koji kompajler prenosi preko napraviti fajl u parametru MCU i na osnovu ove varijable, datoteka zaglavlja je povezana sa vašim projektom sa opisom adresa svih portova i registara za ovaj određeni kontroler. Vau! Bez toga je također moguće, ali tada nećete moći koristiti simbolička imena registara kao što su SREG ili UDR i morat ćete zapamtiti adresu svakog kao što je "0xC1", što će biti glavobolja.

Sam tim #include<имя файла> omogućava vam da svom projektu dodate sadržaj bilo koje vrste tekstualnu datoteku, na primjer, datoteka s opisom funkcija ili dio drugog koda. I da bi direktiva mogla pronaći ovu datoteku, odredili smo putanju do našeg projekta (WinAVR direktorij je tamo već registriran po defaultu).

Glavna funkcija.
C program se u potpunosti sastoji od funkcija. Mogu biti ugniježđene i pozvane jedna od druge bilo kojim redoslijedom i Različiti putevi. Svaka funkcija ima tri potrebna parametra:

  • Povratna vrijednost je npr. sin(x) vraća vrijednost sinusa od x. Kao u matematici, ukratko.
  • Preneseni parametri su isti X.
  • Tijelo funkcije.

Sve vrijednosti koje se prenose i vraćaju moraju biti nekog tipa, ovisno o podacima.

Svaki C program mora sadržavati funkciju main kao ulazna tačka u glavni program, inače uopšte nije C :). Po prisutnosti main u tuđem izvornom kodu iz milion datoteka, možete shvatiti da je ovo glavni dio programa, gdje sve počinje. Pa da pitamo:

1 2 3 4 5 int main(void) (vrat 0 ;)

int main(void) (vrat 0;)

To je to, prvo najjednostavniji program napisano, nema veze što ništa ne radi, tek smo počeli.

Hajde da shvatimo šta smo uradili.
int Ovo je tip podataka koji vraća glavna funkcija.

Naravno, u mikrokontroleru main u principu se ništa ne može vratiti i u teoriji bi trebalo void main(void), ali GCC je prvobitno dizajniran za PC i tamo program može vratiti vrijednost operativni sistem po završetku. Stoga je GCC uključen void main(void) kune se upozorenjem.

Ovo nije greška, radit će, ali ne volim upozorenja.

void ovo je tip podataka koji prosljeđujemo funkciji, u ovom slučaju main takođe ne može prihvatiti ništa izvana, dakle void- lutka. Stub se koristi kada nema potrebe da se bilo šta prenosi ili vraća.

Evo ih { } vitičaste zagrade su programski blok, u ovom slučaju tijelo funkcije main, kod će se tamo nalaziti.

povratak- ovo je povratna vrijednost koju će glavna funkcija vratiti po završetku, pošto imamo int, odnosno broj, onda moramo vratiti broj. Iako ovo i dalje nema smisla, jer... na mikrokontroleru, ne možemo ići nigdje od glavnog. Vraćam nulu. Jer nije bitno. Ali kompajler je obično pametan i ne generiše kod za ovaj slučaj.
Iako, ako je izopačeno, onda iz main Možete otići na MK - na primjer, upasti u odjeljak pokretačkog programa i izvršiti ga, ali to će zahtijevati petljanje na niskom nivou sa firmverom kako bi se ispravile adrese tranzicije. U nastavku ćete se sami uvjeriti i razumjeti kako to učiniti. Za što? Ovo je drugo pitanje, u 99.999% slučajeva to nije potrebno :)

Uradili smo to i krenuli dalje. Hajde da dodamo varijablu, nije nam baš potrebna i nema smisla uvoditi varijable bez nje, ali učimo. Ako se varijable dodaju unutar tijela funkcije, one su lokalne i postoje samo u ovoj funkciji. Kada izađete iz funkcije, ove varijable se brišu, a RAM memorija se dodjeljuje za važnije potrebe. .

1 2 3 4 5 6 int main(void) (nepotpisani char i; povratak 0;)

int main(void) (nepotpisani char i; povratak 0; )

nepotpisan znači nepotpisano. Činjenica je da se u binarnoj predstavi najznačajniji bit dodjeljuje znaku, što znači da se broj +127/-128 uklapa u jedan bajt (char), ali ako se znak odbaci, on će stati od 0 do 255. Obično znak nije potreban. Dakle nepotpisan.
i je samo ime varijable. Dosta.

Sada moramo inicijalizirati portove i UART. Naravno, možete uzeti i povezati biblioteku i pozvati neku vrstu UartInit(9600); ali tada nećete znati šta se zaista dogodilo.

radimo ovo:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 int main(void) (nepotpisani char i; #define XTAL 8000000L #define baudrate 9600L #define bauddivider (XTAL/(16*baudrate)-1)#define HI(x) ((x)>>8) #define LO(x) ((x)& 0xFF) UBRRL = LO(bauddivider) ; UBRH = HI (razdjelnik prijenosa) ; UCSRA = 0; UCSRB = 1<< RXEN| 1 << TXEN| 1 << RXCIE| 0 << TXCIE; UCSRC = 1 << URSEL| 1 << UCSZ0| 1 << UCSZ1; }

int main(void) ( unsigned char i; #define XTAL 8000000L #define baudrate 9600L #define bauddivider (XTAL/(16*baudrate)-1) #define HI(x) ((x)>>8) #define LO( x) ((x)& 0xFF) UBRRL = LO (razdjelnik prijenosa); UBRRH = HI (razdjelnik prijenosa); UCSRA = 0; UCSRB = 1<

Strašno? U stvari, postoji samo pet poslednjih linija pravog koda. Sve, to #define To je preprocesorski makro jezik. Gotovo iste stvari kao u Assembly, ali je sintaksa malo drugačija.

Oni će vam olakšati rutinske operacije izračunavanja potrebnih koeficijenata. U prvom redu kažemo to umjesto toga XTAL možete sigurno zamijeniti 8000000, i L- indikacija tipa, govoreći long je frekvencija takta procesora. Isto baudrate— frekvencija prenosa podataka preko UART-a.

bauddivider već složeniji, umjesto njega će biti zamijenjen izraz izračunat po formuli iz prethodna dva.
Pa i L.O. I HI niski i visoki bajtovi će biti uzeti iz ovog rezultata, jer Očigledno ne može stati u jedan bajt. IN HI X (makro ulazni parametar) je pomaknut osam puta udesno, što rezultira samo najznačajnijim preostalim bajtom. I unutra L.O. radimo po bitu I sa brojem 00FF, kao rezultat će ostati samo niži bajt.

Dakle, sve što je urađeno je kao #define možete ga sigurno baciti i izračunati potrebne brojeve na kalkulatoru i odmah ih unijeti u redove UBBRL = …. i UBBRH = …..

Može. Ali! Uradi ovo APSOLUTNO NEMOGUĆE!

Radiće ovako ili onako, ali ćete imati tzv magični brojevi- vrijednosti ​​preuzete niotkuda i iz nepoznatih razloga, a ako za par godina otvorite takav projekat, biće vraški teško shvatiti koje su to vrijednosti. Čak i sada, ako želite da promenite brzinu, ili promenite kvarcnu frekvenciju, sve će morati ponovo da se računa, ali ste promenili par brojeva u kodu i to je to. Općenito, ako ne želite da budete označeni kao koder, onda napravite svoj kod tako da bude lak za čitanje, razumljiv i lak za mijenjanje.

Onda je sve jednostavno:
Svi ovi “UBRRL and Co” su konfiguracijski registri UART predajnika uz pomoć kojih ćemo komunicirati sa svijetom. I sada smo im dodijelili tražene vrijednosti, postavljajući ih na željenu brzinu i način rada.

Vrsta snimanja 1< Znači sljedeće: uzmite 1 i stavite ga na mjesto RXEN u bajtu. RXEN ovo je 4. bit registra UCSRB, Dakle 1< formira binarni broj 00010000, TXEN- ovo je 3. bit, i 1<će dati 00001000. Jednostruko "|" to je po bitovima ILI, tako 00010000 | 00001000 = 00011000. Na isti način, preostali potrebni konfiguracijski bitovi se postavljaju i dodaju u opću hrpu. Kao rezultat toga, prikupljeni broj se bilježi u UCSRB. Više detalja opisano je u podatkovnoj tablici na MK u odjeljku USART. Dakle, nemojmo se ometati tehničkim detaljima.

Gotovo, vrijeme je da vidimo šta se dogodilo. Kliknite na kompilaciju i pokrenite emulaciju (Ctrl+F7).

Otklanjanje grešaka
Prolazile su svakakve trake napretka, studio se mijenjao i žuta strelica se pojavila blizu ulaza u glavnu funkciju. Ovdje procesor trenutno radi i simulacija je pauzirana.

Činjenica je da je u početku, zapravo, bilo na liniji UBRRL = LO(bauddivider); Uostalom, ono što imamo u definiciji nije kod, već samo preliminarni proračuni, zbog čega je simulator pomalo dosadan. Ali sada je shvatio, prva instrukcija je završena i ako se popneš na drvo I/O View, u USART odjeljak i pogledajte UBBRL bajt tamo, vidjet ćete da je vrijednost već tamo! 0x33.

Napravite korak dalje. Pogledajte kako se mijenja sadržaj drugog registra. Dakle, prođite kroz sve njih, obratite pažnju na činjenicu da su svi naznačeni bitovi postavljeni kao što sam vam rekao, i da su postavljeni istovremeno za cijeli bajt. Neće ići dalje od Povratka - program je završen.

Otvaranje
Sada resetirajte simulaciju na nulu. Kliknite tamo Resetiraj (Shift+F5). Otvorite rastavljeni listing, sada ćete vidjeti šta se zapravo dešava u kontroleru. Pogled -> Disassembler. A ne YYAAAAAA!!! Assembler!!! HORROR!!! I TO JE POTREBNO. Tako da kasnije, kada nešto krene po zlu, ne budete glupi u kodu i ne postavljate jadna pitanja po forumima, već se odmah udubite i vidite gdje ste zapeli. Nema tu ništa strašno.

Prvo će biti topovi iz serije:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 +00000000: 940C002A JMP 0x00002A JMP 0x00000034 JMP 0x0000004: 94000004: 940000034 JMP +00000000: 940C0034 JMP +00000000: 940C0034 JMP 0x00000034 JMP 0x0000 0034 Jump + 0000000C: 940C0034 JMP 0x00000034 Jump + 0000000E: 940C0034 JMP 0x00000034 Skok +00000010: 940C0034 JMP 0x00000034 Skok +00000012: 940C0034 JMP 0x0000000 JMP 03000040004004 0x00000034 Skok +00000016: 940C0034 JMP 0x00000034 Skok +00000018: 940C0034 JMP 0x00000034 Skok +0000001A: 9400000000000000 : 940C0034 JMP 0x00000034 JMP + 00000034 JMP 0x00002043 JMP 0x000023: 940C0034: 940C0034 JMP 0x00000023: 940C0034 JMP 0x00000034 JMP 0x00000034 Skoči +0000 0028: 940C0034 JMP 0x00000034 Skoči

00000000: 940C002A JMP 0x0000002A Skok +00000034 JMP 0x0000004: 940000034 JMP 0x000000: 940C0034 JMP +00000000: 940C0034 JMP 0x00000034 JMP 0x000000 34 Jump + 0000000C: 940C0034 JMP 0x00000034 Jump + 0000000E : 940C0034 JMP 0x00000034 Skok +00000010: 940C0034 JMP 0x00000034 Skok +00000012: 940C0034 JMP 0x00000034 Jump0000000000000000000000000 000000000000000000000000000004 34 Skok +00000016: 940C0034 JMP 0x00000034 Skok +00000018: 940C0034 JMP 0x00000034 Skok +0000001A: 940C0034 JMP 000000000 : 940C0034 JMP 0x00000034 JMP +00002034 JMP 0x00002034 JMP 0x000023: 940C0034: 940C0034 JMP 0x00000034 JMP 3C0034 JMP 0x00000034 JMP 0x00000034 Skoči +0000 0028: 940C0034 JMP 0x00000034 Skoči

Ovo je tabela vektora prekida. Kasnije ćemo se vratiti na to, ali za sada samo pogledajte i zapamtite da postoji. Prva kolona je adresa fleš ćelije u kojoj se nalazi komanda, druga je kod komande, treća je mnemonika komande, ista instrukcija za sklapanje, treća su operandi komande. Pa automatski komentar.
Dakle, ako pogledate, postoje neprekidni prijelazi. A JMP komandni kod je četiri bajta, sadrži adresu za skok napisanu unazad - niži bajt na niskoj adresi i kod komande za skok 940C

0000002B: BE1F OUT 0x3F,R1 Izlaz na I/O lokaciju

Snimanje ove nule na adresi 0x3F Ako pogledate kolonu I/O pogleda, vidjet ćete da je adresa 0x3F adresa SREG registra - registra zastavice kontrolera. One. resetujemo SREG da pokrenemo program pod nultim uslovima.

1 2 3 4 +0000002C: E5CF LDI R28,0x5F Učitaj odmah +0000002D: E0D4 LDI R29,0x04 Učitaj odmah +0000002E: BFDE OUT 0x3E,R29 Izlaz na I/O lokaciju +0000002 Out to I/O lokaciju +0000002 Out to I/OUT

0000002C: E5CF LDI R28,0x5F Učitaj odmah +0000002D: E0D4 LDI R29,0x04 Učitaj odmah +0000002E: BFDE OUT 0x3E,R29 Izlaz na I/O lokaciju +0000002 Out to I/O lokaciju +0000002 Out to I/OUT

Ovo učitava pokazivač steka. Ne možete direktno učitavati u I/O registre, samo preko međuregistra. Prema tome, prvo LDI do srednjeg, a zatim odatle OUT do I/O. Također ću vam reći više o steku kasnije. Za sada znajte da je ovo područje dinamičke memorije koje visi na kraju RAM-a i pohranjuje adrese i međuvarijable. Sada smo naznačili odakle će početi naš stog.

00000032: 940C0041 JMP 0x00000041 Skoči

Skočite na sam kraj programa, i tamo imamo zabranu prekidanja i čvrstog petljanja po sebi:

1 2 +00000041: 94F8 CLI Global Interrupt Disable +00000042: CFFF RJMP PC-0x0000 Relativni skok

00000041: 94F8 CLI Global Interrupt Disable +00000042: CFFF RJMP PC-0x0000 Relativni skok

To je u slučaju nepredviđenih okolnosti, kao što je napuštanje glavne funkcije. Kontroler se može izvući iz takve petlje ili hardverskim resetiranjem, ili, što je vjerojatnije, resetiranjem od nadzornika. Pa, ili, kao što sam rekao gore, ispravite ovo u hex editoru i odgalopirajte gdje god nam srce želi. Također imajte na umu da postoje dvije vrste prijelaza: JMP i RJMP; prvi je direktan prijelaz na adresu. Zauzima četiri bajta i može direktno skočiti kroz cijelo memorijsko područje. Drugi tip tranzicije je RJMP - relativan. Njegova komanda zauzima dva bajta, ali se pomiče sa trenutne pozicije (adrese) 1024 koraka naprijed ili nazad. A njegovi parametri ukazuju na pomak od trenutne tačke. Češće se koristi jer zauzima polovinu prostora u ravnini, a dugi prijelazi rijetko su potrebni.

1 +00000034: 940C0000 JMP 0x00000000 Skoči

00000034: 940C0000 JMP 0x00000000 Skoči

A ovo je skok na sam početak koda. Neka vrsta ponovnog pokretanja. Ovdje možete provjeriti da li svi vektori skaču. Zaključak iz ovoga je da ako sada omogućite prekide (oni su podrazumevano onemogućeni) i dođe do vašeg prekida, ali nema rukovaoca, onda će doći do softverskog resetovanja - program će biti vraćen na sam početak.

Funkcija glavna. Sve je slično, ne treba ni opisivati. Pogledajte samo već izračunati broj koji se upisuje u registre. Preprocesor kompajlera pravi!!! Dakle, bez “magičnih” brojeva!

1 2 3 4 5 6 7 8 9 10 11 12 <

00000036: E383 LDI R24,0x33 Učitavanje odmah +00000037: B989 OUT 0x09,R24 Izlaz na I/O lokaciju 15: UBRRH = HI(bauddivider); +00000038: BC10 OUT 0x20,R1 Izlaz na I/O lokaciju 16: UCSRA = 0; +00000039: B81B OUT 0x0B,R1 Izlaz na I/O lokaciju 17: UCSRB = 1<

A evo i greške:

1 2 3 +0000003E: E080 LDI R24.0x00 Učitaj odmah +0000003F: E090 LDI R25.0x00 Učitaj odmah +00000040: 9508 RET Podrutinski povratak

0000003E: E080 LDI R24.0x00 Učitaj odmah +0000003F: E090 LDI R25.0x00 Učitaj odmah +00000040: 9508 RET Podprogramski povratak

Pitanje je zašto kompajler dodaje takve vrhove? I ovo nije ništa drugo do Return 0, definisali smo funkciju kao int main(void) i tako smo uzalud potrošili još četiri bajta :) A ako napravite void main(void) onda će ostati samo RET, ali će se pojaviti upozorenje , da naša glavna funkcija ne vraća ništa. Uglavnom, radi šta hoćeš :)

Tesko? Očigledno nije. Kliknite korak po korak izvršavanje u disassembler modu i pogledajte kako procesor izvršava pojedinačne instrukcije, šta se dešava sa registrima. Kako dolazi do kretanja kroz komande i konačnog petlje?

Nastavak za par dana...

Offtop:
Alexei78 Napravio sam dodatak za Firefox koji olakšava navigaciju mojom web lokacijom i forumom.
Diskusija i preuzimanje,


Savremeni radio-amater ne može se zamisliti bez mikrokontrolera, i to je očigledno. Posljednjih desetljeća, mikrokontroleri različitih proizvođača postali su široko rasprostranjeni u različitim područjima ljudske djelatnosti. Često se mogu naći u najneočekivanijim uređajima i dizajnu. Vi i ja smo svjedoci kompjuterizacije i automatizacije procesa oko nas. Istina je da je bez poznavanja osnova programiranja postalo gotovo nemoguće stvoriti moderne konkurentne uređaje...

Ako čitate ovaj članak, vjerovatno imate želju da shvatite kako rade mikrokontroleri i najvjerovatnije imate pitanja:

4. Koju literaturu treba da proučavam?

Pokušajmo odgovoriti na ova pitanja.

1. Koji mikrokontroler da odaberem za posao?

8-bitni mikrokontroleri su veoma popularni među radio amaterima. PIC Microchip Technology i AVR Atmel, 16-bit MSP430 od TI, kao i 32-bitni mikrokontroleri, arhitekture ARM.

U industriji, nešto drugačije, prvo mjesto s velikom razlikom zauzimaju Renesas Electronics na drugom Freescale, na trećem Samsung, onda idi Microchip I T.I., zatim sve ostalo.
Popularnost je određena cijenom i dostupnošću; dostupnost tehničkih informacija i cijena softverske podrške igraju značajnu ulogu.

Proučavaćemo 8-bitne AVR mikrokontrolere, porodice ATMEGA 8 i 16 serije. Izbor je bio određen, opet, dostupnošću, prisustvom mnogih amaterskih radova i ogromnom količinom edukativnog materijala. Prisutnost raznih ugrađenih komponenti i funkcionalnosti ove porodice.

2. Koje razvojno okruženje trebam koristiti za programiranje odabranog mikrokontrolera?

Za AVR su kreirana različita integrisana razvojna okruženja (IDE, Integrated development environment).
IDE je softverski sistem koji programeri koriste za razvoj softvera, koji uključuje:
uređivač teksta,
kompajler i/ili interpretator,
alati za automatizaciju montaže,
debugger

One najčešće AVRStudio, ATmelStudio, WINAVR, CodeVision, IAR Embedded Workbench.
Za pisanje programa koristit ćemo besplatne IDE ATmelStudio verzija 6 i više.
Atmel Studio možete preuzeti sa službene web stranice nakon registracije (registracija je potpuno besplatna i ne obavezuje vas ni na šta!)

ATmelStudio vam omogućava da kreirate projekte i pišete programe i na asembleru i na SI.

U početku se uvijek postavlja pitanje: koji programski jezik treba da odaberem da bih pisao učinkovite programe?

Moj odgovor je jednostavan: morate znati pisati na najmanje dva jezika: asembleru i SI. Asemblerski jezik je jednostavno neophodan kada trebate napisati brze i kompaktne potprograme i makroe, te razne drajvere uređaja. Ali, kada treba da napravite veliki projekat izgrađen na složenim algoritmima, bez znanja o SI, može se potrošiti mnogo vremena, posebno u procesu otklanjanja grešaka, i ako postoji želja da se to prenese na drugu platformu, na primer PIC18 , ili STM, može postati nerješiv problem.
Osim toga, sada su se pojavile i hardverske računarske platforme Arduino, za rad sa kojim je potrebno poznavanje SI++ jezika.
Stoga ćemo pisati programe i na asembleru i u SI.

Da biste jasno vidjeli rezultat svog rada bez upotrebe lemilice ili matične ploče, samo instalirajte program Proteus.

3. Kako flešovati kontroler i koji su dodatni uređaji i dodaci potrebni za praktičan rad sa njima?

Koristimo Datagorian. Osim toga, morat ćete kupiti matične ploče i napajanje s izlaznim naponom od 5 volti. Možete ga koristiti kao napajanje niskog talasa pomoću 5-voltne zener diode.
Možda ćemo s vremenom Igor i ja predložiti projekt za sastavljanje ploče za otklanjanje grešaka.

4. Koju literaturu treba da proučavam?

Ali, na primjer:
Praktično programiranje AVR-a u asembleru. Revič, 2011
1000 i jedno kolo mikrokontrolera Vol. 1-2. Ryumik, 2010-2011
10 praktičnih uređaja na AVR MK Book 1-2. Kravčenko, 2008-2009
Vodič za programere uređaja koji koriste AVR MK. Belov, 2008
MK AVR porodice Tiny i Atmega. Efstifejev, 2008
CodeVisionAVR. Vodič za početnike. Lebedev, 2008
Mikroprocesorska kontrola uređaja, tiristora, releja. Belov, 2008
Analogni interfejsi MK. Steward, Ball, 2007
Izrađujemo uređaje na AVR MK. Belov, 2007
MK AVR u radioamaterskoj praksi. Potpuna analiza ATTINY2313. Belov, 2007
Mrežna i mrežna razmjena podataka sa MK. Idi, 2007
MK AVR. radionica za početnike. Hartov, 2007
Primena AVR šema, algoritama, programa. Baranov, 2006
AVR mikrokontroleri. Uvodni kurs. Morton, 2006
Mjerenje, kontrola i regulacija pomoću AVR-a. Trumpert, 2006
Programiranje u C jeziku za AVR i PIC MK. Špak, 2006
Dizajn uređaja na MK. Belov, 2005
MK - to je jednostavno, sveske 1-3. Frunze, 2002-2003
Programski jezik C, 2. izdanje. Kernighan, Riči, 2009
Programiranje ATMEL mikrokontrolera na jeziku S. Prokopenko, 2012

5. Gdje na internetu možete postaviti pitanja i dobiti konkretne odgovore?

Pitanja možete postavljati na našem ili bilo kom drugom forumu gdje se na ovaj ili onaj način dotiču teme o mikrokontrolerima. Glavna stvar na forumima je da pravilno formulirate pitanja kako biste dobili jasne odgovore. Apstraktna pitanja nisu dobrodošla, a najvjerovatnije ćete umjesto odgovora dobiti oštru kritiku ili će vaše pitanje ostati bez odgovora!

Sada pogledajmo izbliza naš omiljeni, ATMEGA 8 mikrokontroler

8-bitni AVR mikrokontroler visokih performansi male snage
Progresivna RISC arhitektura
130 instrukcija visokih performansi, većina instrukcija se izvršava u jednom ciklusu takta
32 8-bitna radna registra opšte namene
Potpuno statičan rad
Performanse se približavaju 16 MIPS (pri brzini od 16 MHz)
Ugrađeni 2-ciklusni množitelj

Nestalna memorija programa i podataka
8 KB samoprogramirajuće flash memorije unutar sistema
Pruža 1000 ciklusa brisanja/pisanja
Dodatni sektor koda za pokretanje sa nezavisnim bitovima za zaključavanje
Omogućava simultani način čitanja/pisanja (čitaj-dok-piši)
512 bajtova EEPROM
Pruža 100.000 ciklusa brisanja/pisanja
1 KB SRAM na čipu
Programabilno zaključavanje za zaštitu korisničkog softvera

Ugrađene periferije
Dva 8-bitna tajmera/brojača sa odvojenim predskalerom, jedan sa uporednim režimom
Jedan 16-bitni tajmer/brojač sa odvojenim predskalerom i načinima snimanja i poređenja
Brojač u realnom vremenu sa zasebnim generatorom
Tri PWM kanala
8-kanalni A/D konverter (TQFP i MLF)
6 kanala sa 10-bitnom preciznošću
6-kanalni analogno-digitalni pretvarač (u PDIP paketu)
4 kanala sa 10-bitnom preciznošću
2 kanala sa 8-bitnom preciznošću
Bajt orijentisan 2-žični serijski interfejs
Programabilni serijski USART
Serijski interfejs SPI (master/slave)
Programabilni watchdog timer sa zasebnim ugrađenim oscilatorom
Ugrađen analogni komparator

Posebne funkcije mikrokontrolera
Resetovanje po uključenju i programibilna detekcija prekida rada
Ugrađeni kalibrirani RC oscilator
Interni i eksterni izvori prekida
Pet režima niske potrošnje: mirovanje, ušteda energije, gašenje, stanje pripravnosti i smanjenje buke ADC-a

I/O pinovi i kućišta
23 programabilne I/O linije
28-pinski PDIP paket, 32-pinski TQFP paket i 32-pinski MLF paket

Radni naponi
2,7 - 5,5 V (ATmega8L)
4,5 - 5,5 V (ATmega8)

Radna frekvencija
0 - 8 MHz (ATmega8L)
0 - 16 MHz (ATmega8)

razlike između ATMEGA16 i 8
16 KB samoprogramabilne fleš memorije unutar sistema

JTAG interfejs (kompatibilan sa IEEE 1149.1)
Mogućnost perifernog skeniranja u skladu sa JTAG standardom
Proširena podrška za ugrađeno otklanjanje grešaka
Programiranje preko JTAG interfejsa: Flash, EEPROM memorija, džamperi i lock bitovi

Četiri kanala PWM/PWM

8-kanalni 10-bitni analogno-digitalni pretvarač
8 neuravnoteženih kanala
7 diferencijalnih kanala (samo TQFP paket)
2 diferencijalna kanala sa programabilnim pojačanjem od 1x, 10x ili 200x (samo TQFP paket)

Šest režima niske potrošnje: mirovanje, ušteda energije, isključenje napajanja, stanje pripravnosti, produženo stanje pripravnosti i smanjenje buke ADC-a

32 programabilne I/O linije

40-pinski PDIP paket i 44-pinski TQFP paket

AtmelStudio

Ako tek počinjete, onda morate preuzeti i instalirati AtmelStudio program sa službene stranice atmel.com
Nakon što instalirate AtmelStudio, možete započeti kreiranje projekta.
Projekt- ovo je vaš program koji ćete napisati, debugovati i flešovati, nakon kompilacije, u memoriju mikrokontrolera.

Da biste kreirali projekat, morate otvoriti program, pojavit će se sljedeći screensaver,

i otvoriće se stranica za kreiranje projekta

Da biste kreirali novi projekat, potrebno je da kliknete na "Novi projekat..."
U tom slučaju otvorit će se novi prozor u kojem možete odabrati programski jezik, naziv projekta, njegovu lokaciju, naziv paketa sa projektnim datotekama i mogućnost kreiranja direktorija za daljnju upotrebu u drugim međuprojektima. . Za kreiranje projekta u kojem ćemo programirati na asembleru, potrebno je da odaberete - Asembler, nakon toga mijenjamo naziv projekta, njegovu lokaciju i odabiremo UREDU.

Pojavit će se sljedeći prozor

Izaberi “megaAVR, 8-bitni” i pronađite mikrokontroler koji nam je potreban, mi smo izabrali ATmega8. Na desnoj strani screen saver-a pojavljuje se lista uređaja koji rade sa ovim mikrokontrolerom, od kojih jedan možemo povezati. Izaberi UREDU.

Pojavljuje se stranica za uređivanje teksta, koja vam omogućava da uređujete i otklanjate greške u programu. Dok je stranica prazna, naznačeno je vrijeme i datum kreiranja te naziv projektne datoteke, korisničko ime. Postoji prozor dodatnih I/O uređaja i prozor izvještaja o kompilaciji programa. sada mi


Možemo programirati na asembleru.
Na isti način se kreira i projekat za programiranje na SI jeziku.

Zdravo, MySku stanovnici! Junak našeg pregleda je Atmega8A-16PU mikrokontroler. Reći ću vam o programiranju ovog mikrokontrolera u integriranom razvojnom okruženju CodeVisionAvr, treperit ćemo LED diodom i razmotriti prednosti i nedostatke rada u ovom okruženju. Možda će vam u budućnosti ovo poslužiti kao alternativa već "popularnom" Arduinu. Ako ste zainteresovani, idite na rez.

Preambula.
Desilo se da sam svoje upoznavanje sa MK-om započeo sa Arduinom. Upalio sam LED, spojio razne senzore i štitove i napravio razne projekte. Sve je uspjelo, bio sam zadovoljan, ali sam htio nešto više. Naišao sam na jedan projekat u kojem je uključen Atmega8A, za koji moram sam napisati firmware. On me je natjerao da proučim proces programiranja "golog" MK-a.
Dakle, imamo mikrokontroler iz Atmela, AVR porodice Atmega8A.

specifikacije:


Pinout:


Ovdje je
Sada za rad i programiranje morate ga spojiti na programator prema dijagramu:

Nažalost, ja sam kao obućar - bez čizama, sada nemam programera pri ruci, pa ću koristiti Arduino UNO da učitam gotov firmver u mikrokontroler i konfigurišem osigurače. Vi samo trebate preuzeti skicu “Arduinoisp” iz mape primjera Arduino IDE i povezati je prema dijagramu:


Međutim, ovo rješenje ima značajan nedostatak, o kojem ću govoriti nešto kasnije. Prije nego počnemo pisati program u CodeVisionAvru (u daljem tekstu CvAvr), moramo odlučiti na kojoj frekvenciji će naš mikrokontroler raditi. Po defaultu, iz tvornice, naš heroj radi od internog rc generatora na frekvenciji od 1 MHz (sa mogućnošću rekonfiguracije na 2, 4 i 8 MHz). Pošto je interni rc generator fabrički kalibrisan pod određenim uslovima (tačan napon, temperatura), tačnost njegovog rada u „poljskim“ uslovima može da varira od 3% do 10%. Za zadatke kod kojih nije potrebna visoka tačnost vremena, to se može zanemariti; u drugim slučajevima, bolje je koristiti vanjski kvarc. U svom projektu koristio sam eksterni kvarc na frekvenciji od 8 MHz. Sada treba da "objasnimo" MC-u da mora raditi od vanjskog kvarca. To se radi zamjenom osigurača. Jednostavnije rečeno, ovo je nešto poput BIOS-a, kao na matičnoj ploči, gdje naznačite njegove načine rada; slično tome, MK-u kažemo u kojim režimima, osim frekvencije, treba da radi. Sve informacije će biti pohranjene u nepromjenjivu memoriju.
Reći ću vam o spajanju firmware-a ispod spojlera; oni koji to znaju sami mogu da skroluju dalje.

Dodatne informacije

Kako registrovati ove iste osigurače?! Za ovo sam koristio program AvrDude, besplatan je i lako se može pronaći na internetu. Da biste ispravno postavili osigurače u skladu sa željenom frekvencijom, pogledajte podatkovni list, ili možete koristiti jednostavan.
Postavljamo parametre kao na slici.


Ovdje je sve jednostavno:
Clock Source - podesite frekvenciju (External Crystal 3 - 16 Mhz) od vanjskog kvarca.
Vrijeme pokretanja - MC startna brzina nakon uklanjanja RESET-a ili uključivanja napajanja (16K CK + 4,1 ms brzo).
Označite polje: Ext. Sat/RC Osc./Niskofrekv. Crystal: omogući interne kondenzatore (36 pF)
Interni R/C Osc.: ostavite neoznačeno! External Crystal: omogući puni zamah (neophodno za >8 MHz).
Tako smo dobili Low Fuse 0xEF i High Fuse 0xC9. Odlično, pola posla obavljeno. Sada povezujemo mikrokontroler sa Arduino UNO, a sam Arduino sa računarom. Pokrenite komandnu liniju, idite u fasciklu sa AvrDude. Zatim unesite red: avrdude -C avrdude.conf -c avrisp -P COM13 -b 19200 -p m8 -U lfuse:w:0xef:m -U hfuse:w:0xc9:m
Ovako to izgleda na slici:


Hajde da analiziramo red koji ste uneli:
avrisp je vrsta našeg programatora nalik Arduinu
COM13 je broj com porta koji identificira naš Arduino u sistemu (u vašem slučaju morate ga potražiti u upravitelju uređaja)
19200 - brzina com porta, ostavite kako jeste
m8 - označava da je naš MK Atmega8
-U lfuse:w:0xef:m -U hfuse:w:0xc9:m - ovdje su naznačeni naši Low Fuse 0xEF i High Fuse 0xC9
Budi MOLIM PAŽLJIVO!!, Pogrešno naveden osigurač može dovesti do toga da se MK zazida (ne treba nam ples s tamburom da bismo ga obnovili).
Pritisnemo “Enter” i na izlazu dobijemo rezultat, kao na slici:


Ako se tokom procesa ne pojave greške, onda je posao završen, naš mikrokontroler će sada raditi od vanjskog kvarca.
O osiguračima možete pročitati vrlo detaljno i također pretražujući na Google-u.


Sada smo spremni za početak programiranja. Za sebe sam izabrao razvojno okruženje CvAvr. Programski jezik će se razlikovati od Arduina; u CvAvru je sličan C. Hajde da napišemo naš prvi Blink.
Nakon instalacije i pokretanja okruženja, koristit ćemo čarobnjak za kreiranje projekta. Odaberite “Datoteka” - “Novo” - “Projekat”. Na pitanje da li ćemo koristiti čarobnjaka, odgovaramo potvrdno. Tip ciljnog AVR čipa: AT90, ATtity, ATmega.
Ovako izgleda čarobnjak za projekte:


Na kartici Čip odaberite ATmega8A, takt 8.000000 Mhz. Idite na karticu Portovi. Naša LED dioda će biti povezana na pin 14 mikrokontrolera, prema pinoutu - PB0. Na kartici odaberite Port B, Bit 0 prebacite sa IN na OUT, tj. Prebacujemo način rada 14. kraka našeg mikrokontrolera na izlaz.


Ovim je završen magistarski rad. Odaberite “Program” - “Generiraj, sačuvaj i izađi”. Naš projekat spremamo, na primjer, pod imenom Blink.

Uzmimo ovakvu krpu

/*******************************************************
Ovaj program je kreirao
CodeWizardAVR V3.12 Napredno
Automatski generator programa
Tip čipa: ATmega8A
Vrsta programa: Aplikacija
Frekvencija AVR jezgra: 8.000000 MHz
Model memorije: Mala
Veličina eksterne RAM memorije: 0
Veličina steka podataka: 256
*******************************************************/
#include
#include
// Ovdje deklarirajte svoje globalne varijable

Void main(void)
{
// Ovdje deklarirajte svoje lokalne varijable

// Inicijalizacija ulaznih/izlaznih portova
// Inicijalizacija porta B
// Funkcija: Bit7=Ulaz Bit6=Ulaz Bit5=Ulaz Bit4=Ulaz Bit3=Ulaz Bit2=Ulaz Bit1=Ulaz Bit0=Izlaz
DDRB=(0<// Stanje: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=0
PORTB=(0<

// Inicijalizacija porta C
// Funkcija: Bit6=U Bit5=U Bit4=U Bit3=U Bit2=U Bit1=U Bit0=U
DDRC=(0<// Stanje: Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTC=(0<

// Inicijalizacija porta D
// Funkcija: Bit7=U Bit6=U Bit5=U Bit4=U Bit3=U Bit2=U Bit1=U Bit0=U
DDRD=(0<// Stanje: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTD=(0<

// Inicijalizacija tajmera/brojača 0

// Vrijednost sata: Tajmer 0 Zaustavljen
TCCR0=(0<TCNT0=0x00;

// Inicijalizacija tajmera/brojača 1
// Izvor sata: Sistemski sat
// Vrijednost sata: Timer1 Zaustavljen
// Način rada: Normalni vrh=0xFFFF
// OC1A izlaz: isključen
// OC1B izlaz: isključen
// Poništavanje buke: Isključeno
// Snimanje ulaza na padajućem rubu
// Prekid prekoračenja Timer1: Isključeno
// Prekid hvatanja ulaza: Isključeno
// Usporedi prekid utakmice: Isključeno
// Usporedi B Match Interrupt: Isključeno
TCCR1A=(0<TCCR1B=(0<TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Inicijalizacija tajmera/brojala 2
// Izvor sata: Sistemski sat
// Vrijednost sata: Timer2 Zaustavljen
// Način rada: Normalni vrh=0xFF
// OC2 izlaz: isključen
ASSR=0<TCCR2=(0<TCNT2=0x00;
OCR2=0x00;

// Inicijalizacija prekida(a) tajmera/brojaca
TIMSK=(0<

// Inicijalizacija eksternog prekida
// INT0: Isključeno
// INT1: Isključeno
MCUCR=(0<

// USART inicijalizacija
// USART onemogućen
UCSRB=(0<

// Inicijalizacija analognog komparatora
// Analogni komparator: Off
// Pozitivan ulaz analognog komparatora je
// spojen na AIN0 pin
// Negativan ulaz analognog komparatora je
// spojen na AIN1 pin
ACSR=(1<SFIOR=(0<

//ADC inicijalizacija
//ADC onemogućen
ADCSRA=(0<

// SPI inicijalizacija
// SPI onemogućen
SPCR=(0<

// TWI inicijalizacija
// TWI onemogućen
TWCR=(0<

dok (1)
{


Ovdje nema razloga za brigu; projekt specificira načine rada portova, tajmera, prekida, USART-a, analognog komparatora, ADC-a, SPI-a i povezanih biblioteka. Ukratko, svi parametri koje smo naveli u čarobnjaku, sve osim portova i čipa, su konfigurisani po defaultu. Zapisaćemo glavnu programsku petlju u while (1) (tekst programa). Jer radimo sa PB0 (14 kraka), u programskoj petlji ćemo napisati:
dok (1)
{
PORTB.0=1;
kašnjenje_ms(1000);
PORTB.0=0;
kašnjenje_ms(1000);
}
Ovdje postavljamo PB0 visoko, čekamo 1 sekundu i postavljamo nisko, a zatim se ciklus ponavlja. Ne zaboravite uključiti biblioteku na početku projekta #include . Naš program je spreman!!! Kao što vidite, sve je vrlo jednostavno. Sada odaberite “Projekat” - “Izgradi sve”. Ako nije napravljena nijedna greška, vidjet ćemo izvještaj čarobnjaka:

Veličina našeg programa bila je 198 bajtova i zauzimala je 2,4% mikronske memorije.
Zatim sastavljamo dijagram:


Sada idite u fasciklu sa našim projektom, idite u fasciklu "Debug", zatim "Exe", postoji datoteka sa heksadecimalnom ekstenzijom. U mom slučaju to je blink.hex.
Ostao je još jedan posljednji korak. Kopirajte ovu datoteku u fasciklu sa AvrDude. Ponovo pokrećemo komandnu liniju, idite u naš folder. Unesite red avrdude -C avrdude.conf -c avrisp -P COM13 -b 19200 -p m8 -U flash:w:blink.hex
Ovako to izgleda na slici:


Ako je sve ispravno uneseno, pritisnite "Enter"


Čestitamo! Posao je obavljen, LED dioda bi vam trebala radosno treptati :)
Zaključak.
U zaključku, želim reći o nedostatku programatora sličnog Arduinu; CvAvr ga jednostavno ne podržava. Imajući, na primjer, AVRISP mkII u ruci, možete flešovati osigurače i preuzeti program direktno sa CodeVisionAvr-a. Inače, homebrew programer je takođe odbio da koristi AvrDude grafički interfejs i radio je samo iz komandne linije.
CodeVisionAvr sam shvatio prilično brzo; Internet je pun tekstualnih i video lekcija. Za par nedelja sam savladao rad hardverskog PWM-a, prekida, tajmera, rada sa dugmadima i povezivanja grafičkog displeja. Konkretno, morao sam da uradim deo svog projekta: da organizujem hardverski 16-bitni PWM na Atmega8, da povežem 2 dugmeta da ga kontrolišem, i takođe da prikažem njegove režime rada na grafičkom displeju, što sam uradio sa lakoćom :) Evo par fotografija:

Dodatne informacije





Rezultati u poređenju sa Arduinom:
+ Razumijevanje CvArv-a nije teško jer postoji čarobnjak za kreiranje projekta;
+ Dostupnost plug-in biblioteka, ima ih dovoljno;
+ Brza kompilacija;
+ Mogućnost simulacije projekta u Proteusu, kao i otklanjanja grešaka pomoću ugrađenog debuggera;
+ Veličina programa je nekoliko puta manja. Standardni Blink nam je uzeo 198 bajtova, slična skica u Arduino IDE 1084 bajta + 2 KB bootloader;
+ Mogućnost implementacije modova koji se ne mogu učiniti na Arduinu. Na primjer, 16-bitni PWM (općenito, to je moguće na Arduinu, ali samo sa "štakama");
+ Mogućnost korištenja ATtiny, ATmega mikrokontrolera za vaše projekte gdje bi Arduino bio suvišan;
- Ipak, za početnika je bolje da počne savladavati MK sa Arduinom;
- Programski jezik se razlikuje od Arduino obrade;
- Još uvijek postoji više biblioteka za Arduino;
- CodeVisionAvr je program koji se plaća, postoje besplatne verzije sa ograničenjima;
Programiranjem "golog" mikrokontrolera u CodeVisionAvru, stekao sam veliko iskustvo. Proučavanje tajmera, registara, načina rada, arhitekture, čitanje tablica sa podacima će povećati vaše vještine, proširiti vaše vidike i otvoriti nove aspekte rada s mikrokontrolerima.
Kao bonus, prilažem par fotografija kada sam shvatio grafički LCD ekran i malo se poigrao.





P.s. Ima još mnogo toga o čemu sam želio pisati, ali ovo neće biti recenzija, već ogroman članak. Spreman sam odgovoriti na pitanja iz svoje nadležnosti, privatno ili u komentaru. Možete pogledati mnogo lekcija na AVR-u.

Top