Programiranje avr mikrokontrolera u C. Programiranje AVR mikrokontrolera u C. Dakle, šta je mikrokontroler

Odlučio sam da napišem kratak uvodni članak za one koji su se prvi put bavili programiranjem mikrokontrolera i nikada ranije nisu bili upoznati sa jezikom C. Nećemo ulaziti u detalje, o svemu ćemo malo pričati kako bismo stekli opštu ideju o radu sa CodeVisionAVR-om.

Više detaljne informacije može se pogledati na engleskom u CodeVision korisničkom priručniku, a preporučujem i stranicu http://somecode.ru sa video lekcijama o C za mikrokontrolere i knjigu "Kako programirati u C" od Deitela, ovo je jedina dobra knjiga sa kojim sam i sam počeo.

Počnimo s činjenicom da bez obzira koje radnje radimo, na kraju se sve svodi na firmware mikrokontrolera. Sam proces firmvera odvija se na sljedeći način: pomoću određenog programa odabire se datoteka firmvera, odabiru se parametri, pritisne se dugme i direktno se treperi firmver, koji je, u suštini, kopija. Baš kao što kopirate muziku ili dokumente sa računara na fleš disk, fizika procesa je ista.

Sam firmver ima .hex ekstenziju i predstavlja skup instrukcija, u obliku jedinica i nula, što je razumljivo mikrokontroleru. Odakle mogu nabaviti firmver? Možete ga preuzeti sa web-stranica za elektroniku ili ga sami napisati. Možete ga napisati u posebnim programima koji se nazivaju razvojno okruženje. Najpoznatiji su mi AVR Studio, IAR, CodeVision, WinAVR... Nemoguće je reći koje je od ovih okruženja bolje ili lošije, svakom svoje. Možemo reći da se ovi programi razlikuju uglavnom po pogodnostima, programskom jeziku i cijeni. Unutar ove stranice razmatra se samo CodeVision.

Sredili smo okruženje, sada pogledajmo proces pisanja firmvera. U CodeVisionu prvo morate kreirati projekat. Može se kreirati pomoću čarobnjaka koda ili prazno. U svakom slučaju, potrebno je odabrati tip mikrokontrolera koji se koristi i navesti njegovu frekvenciju. Kada koristite čarobnjak, od vas će se tražiti da odaberete početne postavke i generišete izvorni kod sa postavkama. Zatim će se pojaviti prozor u kojem možete urediti ovaj kod. Iako možete napisati svoj izvorni kod u Notepad, a zatim ga priložiti projektu u postavkama.

Datoteka izvornog koda je skup naredbi u programskom jeziku, zadatak CodeVision-a je da prevede ove komande u binarni kod, vaš zadatak je da napišete ovaj izvorni kod. CodeVision razumije C jezik, datoteke izvornog koda imaju ekstenziju “.c”. Ali CodeVision ima neke konstrukcije koje se ne koriste u C-u, zbog čega ga mnogi programeri ne vole, a jezik koji se koristi naziva se C-like. Međutim, to vas ne sprečava da pišete ozbiljne projekte. Mnogo primjera, generator koda i veliki skup biblioteka daju CodeVisionu veliku prednost. Jedina negativna je što se plaća, iako postoji besplatne verzije sa ograničenjem koda.

Izvorni kod mora sadržavati zaglavlje s tipom mikrokontrolera koji se koristi i glavnom funkcijom. Na primjer, koristi se ATtiny13

#include void main(void) ( ) ;

#include void main(void) ( );

Prije glavne funkcije, možete povezati potrebne biblioteke, deklarirati globalne varijable, konstante i postavke. Biblioteka je zasebna datoteka, obično sa ekstenzijom “.h”, koja već sadrži unaprijed napisani kod. U nekim projektima će nam možda trebati ovaj kod, ali u drugim nam nije potreban. Na primjer, u jednom projektu koristimo LCD ekrane, au drugom ne. Biblioteku za rad sa LCD ekranom “alcd.h” možete spojiti na sljedeći način:

#include #include void main(void) ( ) ;

#include #include void main(void) ( );

Varijable su područja memorije u koje se mogu smjestiti određene vrijednosti. Na primjer, ako dodate dva broja, rezultat je potrebno negdje sačuvati da biste ga koristili u budućnosti. Prvo morate deklarirati varijablu, tj. dodijelite memoriju za to, na primjer:
int i=0;
one. deklarisali smo promenljivu i i u nju postavili vrednost 0, int je tip varijable, ili jednostavnije, to znači veličinu dodeljene memorije. Svaki tip varijable može pohraniti samo određeni raspon vrijednosti. Na primjer, int se može napisati kao brojevi od -32768 do 32767. Ako trebate koristiti brojeve sa razlomkom, tada varijabla mora biti deklarirana kao float, a za znakove koristite tip char.

bit, _Bit 0 ili 1 char od -128 do 127 unsigned char od 0 do 255 int od -32768 do 32767 unsigned int od 0 do 65535 long int od -2147483648 do 2147483647 od -2147483648 do 2147483647 od 14 unsigned do 2147483647 od 19 flot do 19 flo 19 float. 7 5e- 38 do ±3,402e38

Unutar glavne funkcije, glavni program je već pokrenut. Nakon izvršenja funkcije, program će se zaustaviti, tako da prave beskonačnu while petlju, koja stalno ponavlja isti program.

void main(void) ( while (1) ( ) ; ) ;

void main(void) ( while (1) ( ); );

Možete napisati komentar u bilo kojem dijelu izvornog koda; to neće utjecati na rad programa ni na koji način, ali će pomoći u pisanju napisanog koda. Možete komentirati red s dvije kose crte //nakon čega će kompajler zanemariti cijeli red ili nekoliko redaka /**/, na primjer:

/*Osnovne matematičke operacije:*/ int i= 0 ; //deklariramo varijablu i i dodijelimo joj vrijednost 0//Sabiranje: i = 2 + 2 ; //Oduzimanje: i = 2 - 2 ; //nakon izvršenja ovog izraza, varijabla i će biti jednaka 0//Množenje: i = 2 * 2 ; //nakon izvršenja ovog izraza, varijabla i će biti jednaka 4//Podjela: i = 2 / 2 ; //nakon izvršenja ovog izraza, varijabla i će biti jednaka 1

/*Osnovne matematičke operacije:*/ int i=0; //deklariramo varijablu i i dodijelimo joj vrijednost 0 //Dodavanje: i = 2+2; //nakon izvršenja ovog izraza, varijabla i će biti jednaka 4 //Oduzimanje: i = 2-2; //nakon izvršenja ovog izraza, varijabla i će biti jednaka 0 //Množenje: i = 2*2; //nakon izvršavanja ovog izraza, varijabla i će biti jednaka 4 //Division: i = 2/2; //nakon izvršenja ovog izraza, varijabla i će biti jednaka 1

Često program mora da pređe sa jednog dela koda na drugi, u zavisnosti od uslova; za to postoje uslovne if() operacije, na primer:

if(i>3) //ako je i veći od 3, onda i dodijeli vrijednost 0 ( i=0; ) /*ako je i manji od 3, onda idi na kod koji slijedi tijelo uvjeta, tj. iza zagrada ()*/

Također ako se može koristiti u kombinaciji sa else - inače

ako ja<3) //если i меньше 3, то присвоить i значение 0 { i=0; } else { i=5; //иначе, т.е. если i больше 3, присвоить значение 5 }

Postoji i operator poređenja “==”, koji se ne smije brkati sa dodjelom “=”. Obrnuta operacija nije jednaka "!=", recimo

if(i==3)//ako je i 3, dodijeli i vrijednost 0 ( i=0; ) if(i!=5) //ako i nije 5, dodijeli i vrijednost 0 ( i=0; )

Pređimo na složenije stvari – funkcije. Recimo da imate određeni dio koda koji se ponavlja nekoliko puta. Štaviše, ovaj kod je prilično velike veličine. Nezgodno je pisati svaki put. Na primjer, u programu koji na neki način mijenja varijablu i, kada pritisnete tipke 0 i 3 porta D, izvršava se isti kod koji, ovisno o vrijednosti varijable i, uključuje noge porta B.

void main(void) (ako je (PIND.0== 0) //provjeravamo da li je dugme na PD0 pritisnuto( ako (i== 0 ) //ako je i==0 omogući PB0( PORTB.0= 1 ; ) ako (i== 5 ) // ako je i==5 uključi PB1( PORTB.1= 1 ; ) ) … ako (PIND.3== 0 ) // uradite istu stvar kada provjeravate PD3 dugme( if (i== 0 ) ( PORTB.0= 1 ; ) if (i== 5 ) ( PORTB.1= 1 ; ) ) )

void main(void) ( if(PIND.0==0) //provjeravamo da li je dugme na PD0 pritisnuto ( if(i==0) //if i==0 uključi PB0 ( PORTB.0=1; ) if( i==5) // if i==5 uključite PB1 ( PORTB.1=1; ) ) ... if(PIND.3==0) // uradite istu stvar kada provjeravate PD3 dugme ( if(i==0 ) ( PORTB.0=1; ) if(i==5) ( PORTB.1=1; ) ) )

Općenito, kod nije jako velik, ali može biti višestruko veći, tako da bi bilo mnogo zgodnije kreirati vlastitu funkciju.
Na primjer:

void i_check() ( if (i== 0 ) ( PORTB.0= 1 ; ) if (i== 5 ) ( PORTB.1= 1 ; ) )

void i_check() ( if(i==0) ( PORTB.0=1; ) if(i==5) ( PORTB.1=1; ) )

void znači da funkcija ne vraća ništa, više o tome ispod i_check() - ovo je naziv naše funkcije, možete je nazvati kako god želite, ja sam je nazvao upravo tako - check i. Sada možemo ponovo napisati naš kod:

void i_check() ( if(i==0) ( PORTB.0=1; ) if(i==5) ( PORTB.1=1; ) ) void main(void) ( if(PIND.0==0 ) //provjeravamo da li je dugme na PD0 pritisnuto ( i_check(); ) ... if(PIND.3==0) ( i_check(); ) )

Kada kod stigne do linije i_check(); tada će skočiti unutar funkcije i izvršiti kod unutra. Slažem se, kod je kompaktniji i jasniji, tj. funkcije pomažu zamijeniti isti kod, samo jedan red. Imajte na umu da je funkcija deklarirana izvan glavnog koda, tj. prije glavne funkcije. Možete reći, zašto mi to treba, ali dok proučavate lekcije često ćete naići na funkcije, na primjer, brisanje LCD ekrana lcd_clear() - funkcija ne prihvata nikakve parametre i ne vraća ništa, ali briše ekran. Ponekad se ova funkcija koristi gotovo u svakoj drugoj liniji, tako da je ušteda koda očigledna.

Mnogo je zanimljivije koristiti funkciju kada uzima vrijednosti, na primjer, postoji varijabla c i postoji suma funkcije koja uzima dvije vrijednosti tipa int. Kada glavni program izvrši ovu funkciju, argumenti će već biti u zagradama, tako da će "a" postati jednako dva, a "b" će postati jednako 1. Funkcija će se izvršiti i "c" će postati jednako 3 .

int c= 0 ; void sum(int a, int b) (c= a+ b; ) void main(void) (sum(2, 1) ;)

int c=0; void sum(int a, int b) ( c=a+b; ) void main(void) ( sum(2,1); )

Jedna od najčešćih sličnih funkcija je pomeranje kursora na LCD ekranu lcd_gotoxy(0,0); koji, inače, takođe uzima argumente - x i y koordinate.

Druga opcija za korištenje funkcije, kada vrati vrijednost, sada više neće biti nevažeća, poboljšajmo prethodni primjer funkcije za sabiranje dva broja:

int c= 0 ; int sum(int a, int b) ( return a+ b; ) void main(void) ( s= sum(2, 1) ; )

int c=0; int sum(int a, int b) ( return a+b; ) void main(void) ( s=sum(2,1); )

Rezultat će biti isti kao i prošli put c=3, ali imajte na umu da varijablu “c” dodjeljujemo vrijednost funkcije koja više nije nevaljana, ali vraća zbir dva broja tipa int. Na ovaj način nismo vezani za određenu varijablu “c”, što dodaje fleksibilnost u korištenju funkcija. Jednostavan primjer takve funkcije je čitanje ADC podataka, funkcija vraća izmjerenu vrijednost result=read_adc();. Završimo s funkcijama.

Sada pređimo na nizove. Niz je srodne varijable. Na primjer, imate tabelu sinusa sa nekoliko tačaka, nećete kreirati varijable int sinus1=0; int sinus2=1; itd. Za to se koristi niz. Na primjer, možete kreirati niz od tri elementa poput ovog:
int sinus=(0,1,5);
Ukupan broj elemenata niza je naveden u uglastim zagradama. Možete dodijeliti vrijednost trećeg elementa varijabli “c” na sljedeći način:
s=sinus;
Imajte na umu da numerisanje elemenata niza počinje od nule, tj. "c" će postati jednako pet. Ovaj niz nema sinusni element!!!
Možete dodijeliti vrijednost pojedinačnom elementu ovako:
sinus=10;

Možda ste već primijetili da CodeVision nema string varijable. One. ne možete kreirati varijabilni string hello=”hello”; Da biste to učinili, morat ćete kreirati niz pojedinačnih znakova.

lcd_putchar(zdravo); lcd_putchar(zdravo); lcd_putchar(zdravo);

itd.
Ispada prilično glomazno, tu u pomoć priskaču ciklusi.
Na primjer while petlja

while(PINB.0!=0) ( )

Dok se dugme ne pritisne, ne radite ništa - pokrenite praznu petlju.

Druga opcija je for petlja

int i; za (i= 0; i< 6 ; i++ ) { lcd_putchar(hello[ i] ) ; }

int i; za(i=0;i<6;i++) { lcd_putchar(hello[i]); }

Značenje je potpuno isto kao i while, samo se dodaju početni uvjet i=0 i uvjet koji se izvršava u svakom ciklusu i++. Kod unutar petlje je što je više moguće pojednostavljen.

Nakon što ste napisali svoj program, izvorni kod se kompilira, a ako nema grešaka, tada ćete dobiti željeni firmver u fascikli projekta. Sada možete flešovati mikrokontroler i uživati ​​u radu uređaja.

Ne biste trebali odmah pokušavati koristiti petlje, nizove i funkcije u svom firmveru. Vaš glavni zadatak je da firmver radi, pa uradite to kako vam je lakše i ne obraćajte pažnju na veličinu koda. Doći će vrijeme kada želite ne samo da napišete ispravan kod, već da ga napišete lijepo i kompaktno. Tada će biti moguće uroniti u divljinu C jezika. Za one koji žele sve savladati, još jednom preporučujem knjigu “Kako programirati u C-u”, ima mnogo primjera i zadataka. Instalirajte Visual Studio, kreirajte win32 konzolnu aplikaciju i vježbajte tamo do mile volje.

Lekcija 0.

Dakle, danas otvaramo seriju lekcija o programiranju mikrokontrolera AVR porodice.

Danas će se raspravljati o sljedećim pitanjima:

  1. Šta je mikrokontroler?
  2. Gdje se koriste mikrokontroleri?

Uvod.

Mikrokontroleri su posvuda. U telefonima, mašinama za pranje veša, „pametnim kućama“, alatnim mašinama u fabrikama i u nebrojenim drugim tehničkim uređajima. Njihova široka upotreba omogućava zamjenu složenih analognih kola sa komprimiranim digitalnim.

Dakle, šta je mikrokontroler?

Mikrokontroler (Mikrokontrolerska jedinica, MCU) - mikrokolo dizajnirano za upravljanje elektronskim uređajima.Možete ga zamisliti kao jednostavan računar sposoban za interakciju sa vanjskim uređajima.Na primjer, otvaranje i zatvaranje tranzistora, primanje podataka od temperaturnih senzora, prikazivanje podataka na LCD ekranima itd. Osim toga, mikrokontroler može obavljati različite obrade ulaznih podataka, baš kao i vaš lični računar.

Odnosno, mikrokontroleri nam nude gotovo neograničene mogućnosti za upravljanje bilo kojim uređajem, zahvaljujući prisustvu I/0 portova (ulazno/izlaznih portova), kao i mogućnosti njihovog programiranja.

Gdje se koriste mikrokontroleri?

  1. Kućanski aparati (mašine za pranje rublja, mikrovalne pećnice, itd.).
  2. Mobilna tehnologija (Roboti, robotski sistemi, komunikaciona oprema, itd.).
  3. Industrijska oprema (sistemi upravljanja mašinama).
  4. Računarska tehnologija (matične ploče, sistemi upravljanja perifernim uređajima).
  5. Oprema za zabavu (dječije igračke, ukrasi).
  6. Transport (sistemi upravljanja motorom automobila, sigurnosni sistemi)

Ovo nije potpuna lista aplikacija za mikrokontrolere. Često je vrlo isplativo zamijeniti set kontrolnih čipova jednim mikrokontrolerom, zbog pojednostavljene proizvodnje i smanjene potrošnje energije.

Početak rada s AVR-om

AVR- porodica mikrokontrolera iz Atmela koji imaju dovoljne performanse za većinu amaterskih uređaja. Takođe se široko koriste u industriji.

Šematski dijagram programatora LPT porta prikazan je na slici. Kao vozač autobusa, koristite mikrokolo 74AC 244 ili 74HC244 (K1564AP5), 74LS244 (K555AP5) ili 74ALS244 (K1533AP5).

LED VD1 označava način snimanja mikrokontrolera,

LED VD2 - očitavanje,

LED VD3 - prisutnost napajanja strujnog kruga.

Kolo preuzima napon potreban za napajanje iz ISP konektora, tj. sa programabilnog uređaja. Ovo kolo je redizajnirano STK200/300 programsko kolo (dodate LED diode radi lakšeg rada), tako da je kompatibilno sa svim programima PC programatora koji rade sa STK200/300 kolom. Za rad sa ovim programatorom koristite program CVAVR

Programator se može napraviti na štampanoj ploči i postaviti u kućište LPT konektora, kao što je prikazano na slikama:




Za rad s programatorom zgodno je koristiti proširenje LPT porta, koje je lako napraviti sami (na primjer, od Centronix kabla za štampač), glavna stvar je da ne štedite provodnike za uzemljenje (18- 25 nožica konektora) ili kupiti. Kabl između programatora i programabilnog čipa ne bi trebao biti veći od 20-30 cm.

Bitove operacije su zasnovane na logičkim operacijama koje smo ranije pokrili. Oni igraju ključnu ulogu u programiranju AVR i drugih tipova mikrokontrolera. Gotovo nijedan program ne može bez upotrebe bitnih operacija. Prije toga smo ih namjerno izbjegavali kako bismo olakšali proces učenja MK programiranja.

U svim prethodnim člancima programirali smo samo I/O portove i nismo koristili dodatne ugrađene komponente, na primjer, tajmere, analogno-digitalne pretvarače, prekide i druge interne uređaje bez kojih MK gubi svu snagu.

Prije nego što pređete na savladavanje ugrađenih uređaja MK, morate naučiti kako kontrolirati ili provjeriti pojedinačne bitove registara AVR MK. Prethodno smo vršili provjeru ili postavljali cifre cijelog registra odjednom. Hajde da shvatimo u čemu je razlika i onda idemo dalje.

Bitove operacije

Najčešće smo ga koristili prilikom programiranja AVR mikrokontrolera, jer je vizualniji u odnosu na početnike MK programere i dobro ga razumiju. Na primjer, trebamo postaviti samo 3. bit porta D. Za to, kao što već znamo, možemo koristiti sljedeći binarni kod:

PORTD = 0b00001000;

Međutim, ovom komandom postavljamo 3. cifru na jedan, a sve ostale (0, 1, 2, 4, 5, 6 i 7.) resetujemo na nulu. Sada zamislimo situaciju u kojoj se 6. i 7. bit koriste kao ADC ulazi i u ovom trenutku se signal od nekog uređaja prima na odgovarajuće MK pinove, a koristimo gornju komandu da resetujemo ove signale. Kao rezultat toga, mikrokontroler ih ne vidi i vjeruje da signali nisu stigli. Stoga, umjesto takve naredbe, trebali bismo koristiti drugu koja bi postavila samo 3. bit na jedan, bez utjecaja na preostale bitove. Da biste to učinili, obično se koristi sljedeća bitna operacija:

PORTD |= (1<<3);

U nastavku ćemo detaljno raspravljati o njegovoj sintaksi. A sada još jedan primjer. Recimo da trebamo provjeriti stanje 3. cifre PIND registra, i time provjeriti stanje gumba. Ako se ovaj bit resetuje na nulu, tada znamo da je dugme pritisnuto, a zatim se izvršava komandni kod, koji odgovara stanju pritisnutog dugmeta. Ranije bismo koristili sljedeću notaciju:

if (PIND == 0b00000000)

(bilo koji kod)

Međutim, uz njegovu pomoć provjeravamo ne samo 3. bit, već sve bitove PIND registra odjednom. Stoga, čak i ako je dugme pritisnuto i željeni bit se resetuje, ali u ovom trenutku je primljen signal na nekom drugom pinu porta D, odgovarajuća vrednost će biti postavljena na jedan, a uslov u zagradama će biti netačan. Kao rezultat toga, kod unutar vitičastih zagrada neće biti izvršen čak ni kada se pritisne dugme. Stoga, za provjeru stanja pojedinačnog 3. bita PIND registra, treba koristiti bitnu operaciju:

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

(bilo koji kod)

Za rad sa pojedinačnim bitovima mikrokontrolera, programski jezik C ima alate koji se mogu koristiti za promjenu ili provjeru stanja jednog ili više pojedinačnih bitova odjednom.

Postavljanje jednog bita

Za postavljanje jednog bita, kao što je port D, koristi se operacija ILI po bitu. To je ono što smo koristili na početku članka.

PORTD = 0b00011100; // početna vrijednost

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

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

PORTD == 0b00011101; // rezultat

Ova komanda postavlja nulti bit, a ostatak ostavlja nepromijenjenim.

Na primjer, instalirajmo još 6. bit porta D.

PORTD = 0b00011100; // početno stanje porta

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

PORTD == 0b01011100; // rezultat

Za pisanje jednog do nekoliko odvojenih bitova odjednom, na primjer nulti, šesti i sedmi port B Primjenjuje se sljedeća notacija.

PORTB = 0b00011100; // početna vrijednost

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

PORTB == 0b1011101; // rezultat

Resetovanje (nuliranje) pojedinačnih bitova

Za resetiranje jednog bita, koriste se tri prethodno razmatrane naredbe odjednom: .

Resetujmo 3. bit registra PORTC i ostavimo ostatak nepromijenjen.

PORTC = 0b00011100;

PORTC &= ~(1<<3);

PORTC == 0b00010100;

Izvršimo slične radnje za 2. i 4. cifru:

PORTC = 0b00111110;

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

PORTC == 0b00101010;

Prebacivanje bitova

Pored podešavanja i resetovanja, koristi se i korisna komanda koja prebacuje jedan bit u suprotno stanje: jedan na nulu i obrnuto. Ova logična operacija naširoko se koristi u stvaranju različitih svjetlosnih efekata, na primjer, novogodišnjeg vijenca. Pogledajmo primjer PORTA-e

PORTA = 0b00011111;

PORTA ^= (1<<2);

PORTA == 0b00011011;

Promijenimo stanje nulte, drugog i šestog bita:

PORTA = 0b00011111;

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

PORTA == 0b01011010;

Provjera stanja pojedinačnog bita. Da vas podsjetim da se provjera (za razliku od pisanja) I/O porta vrši čitanjem podataka iz PIN registra.

Najčešće se testiranje izvodi pomoću jedne od dvije izjave petlje: if i while. Već smo ranije upoznati sa ovim operaterima.

Provjera bita na prisutnost logičke nule (resetiranje) sa ako

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

Ako je treći bit porta D obrisan, tada se izvršava Code1. U suprotnom, Code2 se izvršava.

Slične radnje se izvode sa ovim oblikom snimanja:

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

Provjera bita za prisustvo logičke jedinice (postavke) sa ako

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

ako (PIND & (1<<3))

Gore navedene dvije petlje rade slično, ali mogu, zbog fleksibilnosti programskog jezika C, imati drugačiji oblik notacije. Operator != znači da nije jednako. Ako je treći bit PD I/O porta postavljen (jedan), onda se izvršava Code1; ako nije, izvršava se Code2.

Čeka se da se bit resetuje dok

dok (PIND & (1<<5))

Code1 će se izvršavati sve dok je 5. bit PIND registra postavljen. Kada ga resetujete, Code2 će početi da se izvršava.

Čeka se postavljanje bita dok

Ovdje vam C sintaksa omogućava pisanje koda na dva najčešća načina. U praksi se koriste oba tipa snimanja.

Mikrokontroleri (u daljem tekstu MK) čvrsto su ušli u naše živote, na Internetu možete pronaći mnogo zanimljivih kola koja se izvode na MK. Šta ne možete sastaviti na MK: razni indikatori, voltmetri, kućni aparati (zaštitni uređaji, prekidači, termometri...), detektori metala, razne igračke, roboti itd. Lista bi mogla potrajati jako dugo. Video sam prvo kolo na mikrokontroleru prije 5-6 godina u jednom radijskom časopisu i skoro odmah okrenuo stranicu, misleći u sebi “Još uvijek neću moći da ga sastavim”. Zaista, u to vrijeme MK-ovi su za mene bili vrlo složen i neshvaćen uređaj; nisam imao pojma kako funkcioniraju, kako da ih flešujem i šta da radim s njima u slučaju neispravnog firmvera. Ali prije otprilike godinu dana, prvi put sam sastavio svoje prvo kolo na MK; to je bio krug digitalnog voltmetra baziran na 7 indikatora segmenata i ATmega8 mikrokontroler. Desilo se da sam slučajno kupio mikrokontroler, dok sam stajao u odeljenju radio komponenti, momak ispred mene je kupovao MK, i ja sam takođe odlučio da ga kupim i pokušam nešto da sastavim. U svojim člancima ću vam pričati o tome AVR mikrokontroleri, naučit ću vas kako raditi s njima, pogledat ćemo programe za firmver, napravit ćemo jednostavan i pouzdan programator, pogledat ćemo proces firmvera i, što je najvažnije, probleme koji se mogu pojaviti ne samo za početnike.

Osnovni parametri nekih mikrokontrolera iz porodice AVR:

Mikrokontroler

Fleš memorija

RAM memorija

EEPROM memorija

I/O portovi

U power

Dodatni parametri AVR mega mikrokontrolera:

Radna temperatura: -55…+125*S
Temperatura skladištenja: -65…+150*S
Napon na RESET pinu u odnosu na GND: max 13V
Maksimalni napon napajanja: 6.0V
Maksimalna struja I/O linije: 40mA
Maksimalna struja napajanja VCC i GND: 200mA

Pinouts modela ATmega 8X

Pinoutovi za ATmega48x, 88x, 168x modele

Raspored pinova za ATmega8515x modele

Raspored pinova za ATmega8535x modele

Raspored pinova za ATmega16, 32x modele

Raspored pinova za ATtiny2313 modele

Arhiva sa podacima za neke mikrokontrolere nalazi se u prilogu na kraju članka.

MK AVR instalacijski FUSE bitovi

Zapamtite, programirani osigurač je 0, neprogramirani je 1. Trebali biste biti oprezni kada postavljate osigurače, pogrešno programirani osigurač može blokirati mikrokontroler. Ako niste sigurni koji osigurač trebate programirati, bolje je prvi put bljesnuti MK bez osigurača.

Najpopularniji mikrokontroleri među radio-amaterima su ATmega8, zatim ATmega48, 16, 32, ATtiny2313 i drugi. Mikrokontroleri se prodaju u TQFP i DIP paketima, a za početnike preporučujem kupovinu u DIP-u. Ako kupite TQFP, bit će problematičnije flešovati ih; morat ćete kupiti ili lemiti ploču jer noge su im smještene vrlo blizu jedna drugoj. Savjetujem vam da instalirate mikrokontrolere u DIP paketima na posebnim utičnicama, zgodno je i praktično, ne morate odlemiti MK ako želite da ga reflashujete, ili ga koristite za neki drugi dizajn.

Gotovo svi moderni MK-ovi imaju mogućnost programiranja ISP-a u krugu, tj. Ako je vaš mikrokontroler zalemljen na ploču, onda da bismo promijenili firmver nećemo morati da ga odlemimo sa ploče.

Za programiranje se koristi 6 pinova:
RESETOVATI- Prijava MK
VCC- Plus napajanje, 3-5V, zavisi od MK
GND- Zajednička žica, minus snaga.
MOSI- MK ulaz (informacijski signal u MK)
MISO- MK izlaz (informacijski signal sa MK)
SCK- MK ulaz (signal sata u MK)

Ponekad koriste i pinove XTAL 1 i XTAL2; kvarc je vezan za ove pinove ako je MK napajan eksternim oscilatorom; u ATmega 64 i 128, MOSI i MISO pinovi se ne koriste za ISP programiranje; umjesto toga, MOSI pinovi su spojen na pin PE0, a MISO na pin PE1. Prilikom povezivanja mikrokontrolera sa programatorom, žice za povezivanje treba da budu što kraće, a kabl koji ide od programatora do LPT porta takođe ne bi trebalo da bude predugačak.

Oznaka mikrokontrolera može sadržavati čudna slova sa brojevima, na primjer Atmega 8L 16PU, 8 16AU, 8A PU, itd. Slovo L znači da MK radi na nižem naponu od MK bez slova L, obično 2,7V. Brojevi iza crtice ili razmaka 16PU ili 8AU označavaju internu frekvenciju generatora koji se nalazi u MK. Ako su osigurači podešeni da rade od vanjskog kvarca, kvarc bi trebao biti podešen na frekvenciju koja ne prelazi maksimum prema podacima, to je 20 MHz za ATmega48/88/168, i 16 MHz za druge atmega.


Top