Programiranje mikrokontrolera u C od nule. CodeVisionAVR. Opšte informacije za početnike u programiranju u jeziku C. Koji mikrokontroler odabrati za rad

Nekako sam odmah osjetio potrebu da dam savjet o odabiru programskog okruženja za AVR kontrolere. Samo me nemoj gađati papučama. ja sam samo malo :)

Postoji mnogo programskih jezika za mikrokontrolere. Takođe postoji dosta programskih okruženja i pogrešno je međusobno ih porediti. Najbolji jezici programiranje ne postoji. To znači da ćete morati odabrati jezik i programsko okruženje koje vam najviše odgovara.

Ako ste trenutno pred izborom na čemu ćete početi raditi, evo nekoliko preporuka za vas.

Prethodno iskustvo u programiranju. Nemojte zanemariti svoje prethodno iskustvo u programiranju. Čak i da je OSNOVNO. Čak i ako je to bilo davno u školi. Programiranje je kao vožnja bicikla – kada jednom počnete, brzo se sećate svega što ste zaboravili. Počnite sa BASIC-om - savladajte ga - kasnije će vam biti lakše odabrati nešto prikladnije za vaše potrebe.

Pomoć iz okoline. Da li vaši prijatelji pišu na Pascalu? Problem je riješen umjesto vas - pišite na Pascalu! Uvijek će vam pomoći savjetom, dati vam biblioteke i dati vam gotove projekte za učenje. Uglavnom, rado će vam poželjeti dobrodošlicu u svoju zajednicu. Ako uradite suprotno, dobit ćete suprotan rezultat. Prijatelji industrije CIS-a će vas kljucati ako odlučite da studirate Assembler. Ne očekujte pomoć.

Dobra knjiga AVR programiranje će puno pomoći. Nažalost, takvih je vrlo malo. Ako naiđete na knjigu i mislite da je sve objašnjeno na vrlo pristupačan način, pokušajte. Ne preporučujem učenje iz e-knjiga; u krajnjem slučaju, odštampajte ih. Vrlo je nezgodno prebacivati ​​se između okruženja i teksta datoteke knjige. Mnogo je ugodnije pročitati knjigu i isprobati je odmah, a da ne budete ometani prebacivanjem; osim toga, možete praviti bilješke na marginama i zapisivati ​​ideje koje se pojave.

Programsko okruženje je jednostavnije. Ako postoji nekoliko programskih okruženja za vaš jezik koje možete izabrati, ne oklijevajte, odaberite ono koje je jednostavnije. Neka bude manje funkcionalan. Pustite je da sastavi užasno napuhan kod. Glavna stvar je da tek počnete da radite. Jednom kada vam bude udobno u jednostavnom okruženju, lako možete preći u naprednije i „ispravnije“ okruženje. I ne slušajte one koji kažu da ćete izgubiti više vremena - greše. Od učenika osnovnih škola se ne traži da čitaju „Rat i mir“, već im se daju jednostavnije knjige – sa slikama.

Biblioteke. Dostupnost biblioteka je kontroverzna za učenje jezika. Naravno, kasnije će znatno olakšati život, ali u početku su biblioteke „Crne kutije“ nerazumljive i ne doprinose baš razumijevanju jezika. S druge strane, oni čine programe lakšim za čitanje i omogućavaju početniku da napravi složene programe bez mnogo truda. Dakle, nemojte se previše zamarati njihovim prisustvom. Barem na početku.

Efikasan kod. Odabir programskog okruženja za učenje programiranja zasnovanog isključivo na tome koliko je efikasan kod koji kompajlira je loša ideja. Najvažnije je da se osjećate ugodno kada počnete da studirate – ono što proizlazi iz toga je deseta stvar. Naravno, na ovome možete raditi kasnije.

Čarobnjaci. Bilo koji uređaj na čipu mora biti konfiguriran pomoću portova. Procedura je prilično dosadna i potrebni su listovi sa podacima. Osim toga, postoje nijanse koje početniku nije lako shvatiti. Stoga je vrlo poželjno imati čarobnjake u okruženju. Vyzards su automatski tjuneri za SPI, I2C, USART, itd. Što je više uređaja podržano, to bolje. Postavljate potrebne periferne parametre, a sam čarobnjak generira kod koji će osigurati navedene parametre. Olakšava život.


Opće preporuke takav - programiranje u početnoj fazi treba da bude što jednostavnije (čak i primitivno). Okruženje za programiranje bi trebalo da bude lako za učenje (pošto prvo morate da savladate programiranje i da ne gubite vreme petljajući po podešavanjima). Po mogućnosti rusifikovani. Ruski priručnik i primjeri programa također bi bili od pomoći. Poželjna je mogućnost bljeskanja kristala iz okoline. Zatim, kako savladate osnove programiranja, možete prijeći na složenije ljuske.


Poslednja preporuka: radite sa pravim kristalom. Nemojte se plašiti da ga spalite. Steknite praktično iskustvo. Rad sa emulatorima (npr. Proteus), iako će vas osloboditi muke sa lemilom, nikada vam neće moći pružiti zadovoljstvo koje ćete dobiti od rada programa i prvog treptanja LED diode! Razumijevanje da ste napravili pravi radni dijagram vlastitim rukama daje vam samopouzdanje i poticaj da nastavite dalje!

(Posjećeno 7,377 puta, 1 posjeta danas)

Zdravo, dragi Habrazhitele!

U ovom članku želim da pričam o tome kako sam jednom odlučio da počnem da programiram mikrokontrolere, šta je bilo potrebno za to i šta se na kraju dogodilo.

Tema mikrokontrolera me je davno zanimala, davne 2001. godine. Ali tada se pokazalo da je problematično nabaviti programera u mjestu stanovanja i nije bilo govora o kupovini putem interneta. Morao sam da odložim ovu stvar do boljih vremena. A onda, jednog lijepog dana, otkrio sam da su došla bolja vremena bez napuštanja kuće, da mogu kupiti sve što mi treba. Odlučio sam da probam. Dakle, šta nam treba:

1. Programer
Postoji mnogo opcija na tržištu - od najjeftinijih ISP (In-System Programming) programera za nekoliko dolara, do moćnih programera-debuggera za nekoliko stotina. Nemajući puno iskustva u ovoj stvari, prvo sam odlučio isprobati jedan od najjednostavnijih i najjeftinijih - USBasp. Jednom sam ga kupio na eBayu za 12 dolara, sada ga možete naći i za 3-4 dolara. Ovo je zapravo kineska verzija programera od Thomasa Fischla. Šta da kažem o njemu? Samo jedno - radi. Osim toga, podržava dosta AVR kontrolera ATmega i ATtiny serije. Pod Linuxom nije potreban drajver.

Za flešovanje firmvera potrebno je da povežete izlaze programatora VCC, GND, RESET, SCK, MOSI, MISO sa odgovarajućim izlazima mikrokontrolera. Radi jednostavnosti, sastavio sam pomoćni krug direktno na matičnoj ploči:

Sa lijeve strane na ploči je isti mikrokontroler koji ćemo bljesnuti.

2. Mikrokontroler
Nisam se previše mučio oko izbora mikrokontrolera i uzeo sam ATmega8 od Atmela - 23 I/O pina, dva 8-bitna tajmera, jedan 16-bitni, frekvencija do 16 MHz, mala potrošnja (1-3,6 mA) , jeftino ($2). Općenito, za početak - više nego dovoljno.

Pod Linuxom, kombinacija avr-gcc + avrdude radi dobro za kompajliranje i učitavanje firmvera na kontroler. Instalacija je trivijalna. Slijedeći upute, možete instalirati sav potreban softver za nekoliko minuta. Jedina nijansa na koju treba obratiti pažnju je da avrdude (softver za snimanje na kontroler) može zahtijevati prava superkorisnika za pristup programatoru. Rješenje je da ga pokrenete putem sudo (nije baš dobra ideja) ili registrirate posebna udev prava. Sintaksa se može razlikovati u različitim verzijama OS-a, ali u mom slučaju ( Linux Mint 15) dodavanje sljedećeg pravila u datoteku /etc/udev/rules.d/41-atmega.rules radilo je:

# USBasp programator SUBSYSTEM=="usb", ATTR(idVendor)=="16c0", ATTR(idProduct)=="05dc", GROUP="plugdev", MODE="0666"

Nakon toga, naravno, morate ponovo pokrenuti uslugu
servis udev restart
Možete kompajlirati i flešovati bez problema direktno iz komandna linija(ko bi sumnjao), ali ako ima puno projekata, onda je zgodnije instalirati dodatak i sve raditi direktno iz Eclipse okruženja.

Za Windows ćete morati da instalirate drajver. Inače nema problema. Zbog naučnog interesa, isprobao sam kombinaciju AVR Studio + eXtreme Burner na Windows-u. Opet, sve radi odlično.

Počnimo sa programiranjem

AVR kontroleri se mogu programirati i u asembleru (AVR asembleru) i u C. Ovdje, mislim, svako treba da napravi svoj izbor u zavisnosti od konkretnog zadatka i svojih preferencija. Lično, prvo sam počeo da se bavim asemblerom. Prilikom programiranja u asembleru, arhitektura uređaja postaje jasnija i imate osjećaj da ulazite direktno u unutrašnjost kontrolera. Osim toga, vjerujem da u programima koji su posebno kritični po veličini i performansama, znanje asemblera može biti vrlo korisno. Nakon što sam se upoznao sa AVR asemblerom, dopuzao sam do C.

Nakon što sam se upoznao sa arhitekturom i osnovnim principima, odlučio sam da sastavim nešto korisno i zanimljivo. Tu mi je pomogla kćerka, igra šah i jedne lijepe večeri je rekla da želi imati sat-tajmer za igre na vrijeme. BAM! Evo je - ideja prvog projekta! Mogli ste ih, naravno, naručiti na eBayu, ali ja sam htio napraviti svoj sat, sa crnim... uh... indikatorima i dugmadima. Ne pre rečeno nego učinjeno!

Odlučeno je da se kao ekran koriste dva 7-segmentna diodna indikatora. Za kontrolu je bilo dovoljno 5 dugmadi - “Player 1”, “Player 2”, “Reset”, “Settings” i “Pause”. Pa, ne zaboravite na zvučnu indikaciju kraja igre. Izgleda da je to to. Na slici ispod prikazan je opšti dijagram povezivanja mikrokontrolera na indikatore i dugmad. Trebat će nam kada analiziramo izvorni kod programa:

Debrifing

Počnimo, kako se i očekivalo, od ulazne tačke programa - glavne funkcije. U stvari, nema ničeg posebnog u tome - postavljanje portova, inicijalizacija podataka i beskonačna petlja obrade pritiskanja gumba. Pa, pozivanje sei() - omogućava obradu prekida, više o njima malo kasnije.

Int main(void) ( init_io(); init_data(); sound_off(); sei(); while(1) ( handle_buttons(); ) return 0; )
Pogledajmo svaku funkciju posebno.

Void init_io() ( // postavi izlaz DDRB = 0xFF; DDRD = 0xFF; // postavi ulaz DDRC = 0b11100000; // pull-up otpornike PORTC |= 0b00011111; // tajmer prekida TIMSK = (1<

Postavljanje I/O portova je vrlo jednostavno - u DDRx registar se upisuje broj (gdje je x slovo koje označava port), a svaki bit znači da li će odgovarajući pin biti ulazni uređaj (odgovara 0) ili izlazni uređaj (odgovara 1). Tako smo slanjem broja 0xFF na DDRB i DDRD napravili B i D izlazne portove. Prema tome, DDRC komanda = 0b11100000; pretvara prvih 5 pinova porta C u ulazne pinove, a preostalih u izlazne pinove. PORTC komanda |= 0b00011111; uključuje unutrašnje pull-up otpornike na 5 ulaza kontrolera. Prema dijagramu, na ove ulaze su spojena dugmad, koja ih, kada se pritisnu, kratko spajaju na masu. Na ovaj način kontroler razumije da je dugme pritisnuto.

Zatim dolazi konfiguracija dva tajmera, Timer0 i Timer1. Prvi koristimo za ažuriranje indikatora, a drugi za odbrojavanje vremena, nakon što smo ga prethodno konfigurirali da pali svake sekunde. Detaljan opis svih konstanti i metode za podešavanje tajmera na određeni interval možete pronaći u ATmega8 dokumentaciji.

Obrada prekida

ISR (TIMER0_OVF_vect) ( display(); if (_buzzer > 0) ( _buzzer--; if (_buzzer == 0) sound_off(); ) ) ISR(TIMER1_COMPA_vect) ( if (ActiveTimer == 1 && Timer1 > 0) ( Timer1--; if (Timer1 == 0) process_timeoff(); ) if (ActiveTimer == 2 && Timer2 > 0) (Timer2--; if (Timer2 == 0) process_timeoff(); ) )

Kada se tajmer aktivira, kontrola se prenosi na odgovarajući rukovalac prekida. U našem slučaju to je TIMER0_OVF_vect handler, koji poziva proceduru za prikaz vremena na indikatorima, i TIMER1_COMPA_vect, koji obrađuje odbrojavanje.

Izlaz na indikatore

Void display() ( display_number((Timer1/60)/10, 0b00001000); _delay_ms(0.25); display_number((Timer1/60)%10, 0b00000100); _delay_ms(0.25); display_number((0)/10 , 0b00000010); _delay_ms(0.25); display_number((Timer1%60)%10, 0b00000001); _delay_ms(0.25); display_number((Timer2/60)/10, 0b1000_delayms(0b100000000); 60)%10, 0b01000000); _delay_ms(0.25); display_number((Timer2%60)/10, 0b00100000); _delay_ms(0.25); display_number((Timer2%60)%10, 0b000ms); = 0; ) void display_number (int broj, int maska) ( PORTB = number_mask (broj); PORTD = maska; )

Funkcija prikaza koristi metodu dinamičkog prikaza. Činjenica je da svaki pojedinačni indikator ima 9 kontakata (7 za kontrolu segmenta, 1 za tačku i 1 za napajanje). Za kontrolu 4 cifre bilo bi potrebno 36 kontakata. Previše rasipnički. Stoga je izlaz cifara na indikator sa više znamenki organiziran prema sljedećem principu:

Napon se naizmjenično dovodi na svaki od zajedničkih kontakata, što vam omogućava da označite željeni broj na odgovarajućem indikatoru pomoću istih 8 kontrolnih kontakata. Na dovoljno visokoj izlaznoj frekvenciji, za oko izgleda kao statična slika. Zbog toga je svih 8 strujnih kontakata oba indikatora na dijagramu spojeno na 8 izlaza priključka D, a 16 kontakata za upravljanje segmentima spojeno je u paru i spojeno na 8 izlaza priključka B. Dakle, displej funkcioniše sa kašnjenjem od 0,25 ms naizmjenično prikazuje željeni broj na svakom od indikatora. Konačno se isključuju svi izlazi koji dovode napon na indikatore (naredba PORTD = 0;). Ako se to ne učini, posljednja prikazana cifra će i dalje svijetliti do sljedećeg poziva funkcije prikaza, što će dovesti do njenog svjetlijeg sjaja u odnosu na ostale.

Rukovanje klikovima

Void handle_buttons() ( handle_button(KEY_SETUP); handle_button(KEY_RESET); handle_button(KEY_PAUSE); handle_button(KEY_PLAYER1); handle_button(KEY_PLAYER2); ) void handle_button(int key) (int key) (int key) (int key) (int key) (int key) (int key) (int key) (int key) (int key) (int key) (int key) (int bitkeEY_UP); = SETUP_BIT; prekid; slučaj KEY_RESET: bit = RESET_BIT; prekid; slučaj KEY_PAUSE: bit = PAUSE_BIT; prekid; slučaj KEY_PLAYER1: bit = PLAYER1_BIT; prekid; slučaj KEY_PLAYER2: bit = PLAYER2_BIT; break; default: povratak; )clear (bit_is_ BUTTON_PIN, bit)) ( if (_pritisnut == 0) ( _delay_ms(DEBOUNCE_TIME); if (bit_is_clear(BUTTON_PIN, bit)) ( _pritisnut |= tipka; // prekidač radnje tipke (ključ) ( case KEY_SETUP: process_setup(); break; slučaj KEY_RESET: process_reset(); break; case KEY_PAUSE: process_pause(); break; case KEY_PLAYER1: process_player1(); break; case KEY_PLAYER2: process_player2(); break; ) sound_on(15); ) ) ) else ( _pritisnut &= ~ključ; ) )

Ova funkcija provjerava redom svih 5 dugmadi i obrađuje klik, ako postoji. Klik se registruje provjerom bit_is_clear(BUTTON_PIN, bit) , tj. dugme se pritisne ako je odgovarajući ulaz spojen na masu, što će se, prema dijagramu, desiti kada se dugme pritisne. Odgoda od DEBOUNCE_TIME trajanja i ponovljena provjera su potrebni kako bi se izbjegle višestruke nepotrebne operacije zbog odbijanja kontakta. Čuvanje pritisnutog statusa u odgovarajućim bitovima varijable _pressed se koristi za sprečavanje ponovnog aktiviranja kada je dugme pritisnuto duže vreme.
Funkcije za obradu klikova su prilično trivijalne i vjerujem da im nisu potrebni dodatni komentari.

Kompletan tekst programa

#define F_CPU 4000000UL #include #include #include #define DEBOUNCE_TIME 20 #define BUTTON_PIN PINC #define SETUP_BIT PC0 #define RESET_BIT PC1 #define PAUSE_BIT PC2 #define PLAYER1_BIT PC3 #define PLAYER2_BIT PC4 #defineb KEY_000RESET0 #define KEY_000000 001 0 #define KEY_PAUSE 0b00000100 #define KEY_PLAYER1 0b00001000 #define KEY_PLAYER2 0b00010000 volatile int ActiveTimer = 0; volatile int Timer1 = 0; volatile int Timer2 = 0; volatile int _buzzer = 0; volatile int _pressed = 0; // deklaracije funkcije void init_io(); void init_data(); int broj_maska(int broj); void handle_buttons(); void handle_button(int key); void process_setup(); void process_reset(); void process_pause(); void process_timeoff(); void process_player1(); void process_player2(); void display(); void display_number(int maska, int broj); void sound_on(int interval); void sound_off(); // prekida ISR (TIMER0_OVF_vect) ( display(); if (_buzzer > 0) ( _buzzer--; if (_buzzer == 0) sound_off(); ) ) ISR(TIMER1_COMPA_vect) ( if (ActiveTimer == 1 && Timer1 > 0) ( Timer1--; if (Timer1 == 0) process_timeoff(); ) if (ActiveTimer == 2 && Timer2 > 0) ( Timer2--; if (Timer2 == 0) process_timeoff(); ) ) int main (void) ( init_io(); init_data(); sound_off(); sei(); while(1) ( handle_buttons(); ) vrati 0; ) void init_io() ( // postavi izlaz DDRB = 0xFF; DDRD = 0xFF ; // postavimo ulaz DDRC = 0b11100000; // pull-up otpornike PORTC |= 0b00011111; // tajmer prekida TIMSK = (1<5940 || Timer2 > 5940) ( Timer1 = 0; Tajmer2 = 0; ) ) void process_reset() ( init_data(); ) void process_timeoff() ( init_data(); sound_on(30); ) void process_pause() ( ActiveTimer = 0; ) void process_player1() ( ActiveTimer = 2; ) void process_player2() ( ActiveTimer = 1; ) void handle_button (int ključ) ( int bit; prekidač (ključ) ( case KEY_SETUP: bit = SETUP_BIT; prekid; slučaj KEY_RESET: bit = RESET_BIT ; break; case KEY_PAUSE: bit = PAUSE_BIT; break; case KEY_PLAYER1: bit = PLAYER1_BIT; break; case KEY_PLAYER2: bit = PLAYER2_BIT; break; default: return; ) if (bit_is_clear(BUTTON_PIN, bit)) ( if (_pritisnut) 0) ( _delay_ms(DEBOUNCE_TIME); if (bit_is_clear(BUTTON_PIN, bit)) ( _pritisnut |= tipka; // prekidač radnje tipke (ključ) ( case KEY_SETUP: process_setup(); break; case KEY_RESET: process_reset(); break; case KEY_PAUSE: process_pause(); break; case KEY_PLAYER1: process_player1(); break; case KEY_PLAYER2: process_player2(); break; ) sound_on(15); ) ) ) else ( _pritisnut &= ~key; ) ) void handle_buttons() ( handle_button(KEY_SETUP); handle_button(KEY_RESET); handle_button(KEY_PAUSE); handle_button(KEY_PLAYER1); handle_button(KEY_PLAYER2); ) void display() ( display_number(()0b010) ; _delay_ms(0.25); display_number((Timer1/60)%10, 0b00000100); _delay_ms(0.25); display_number((Timer1%60)/10, 0b00000010); _delay_ms_number(0.25) display_number(0.25); 10, 0b00000001); _delay_ms(0.25); display_number((Timer2/60)/10, 0b10000000); _delay_ms(0.25); display_number((Timer2/60)%10, 0b01000000(Timer2.000); %60)/10, 0b00100000); _delay_ms(0.25); display_number((Timer2%60)%10, 0b00010000); _delay_ms(0.25); PORTD = 0; ) void display_number(int number, int broj maska) (broj); PORTD = maska; ) void sound_on(int interval) ( _buzzer = interval; // stavite pin zujalice na visoki PORTC |= 0b00100000; ) void sound_off() ( // postavite pin zujalice na niski PORTC &= ~0b00100000; )

Prototip je sastavljen na matičnoj ploči.

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.

Postoje različiti programski jezici za AVR mikrokontrolere, ali su možda najpogodniji asembler i C, jer ovi jezici najbolje implementiraju sve potrebne mogućnosti za upravljanje hardverom mikrokontrolera.

Asemblerski jezik je programski jezik niskog nivoa koji koristi direktni skup instrukcija mikrokontrolera. Kreiranje programa na ovom jeziku zahteva dobro poznavanje sistema komandi programabilnog čipa i dovoljno vremena za razvoj programa. Asemblerski jezik je inferiorniji od C u brzini i pogodnosti razvoja programa, ali ima uočljive prednosti u veličini konačnog izvršnog koda, i, shodno tome, brzini njegovog izvršavanja.

C vam omogućava da kreirate programe sa mnogo većom udobnošću, dajući programeru sve prednosti jezika visokog nivoa.
Još jednom treba napomenuti da su arhitektura i komandni sistem AVR-a kreirani uz direktno učešće programera kompajlera jezika C i uzimaju u obzir karakteristike ovog jezika. Prevođenje C izvornog koda je brzo i proizvodi kompaktan, efikasan kod.

Glavne prednosti C u odnosu na asembler: velika brzina razvoja programa; univerzalnost koja ne zahtijeva temeljno proučavanje arhitekture mikrokontrolera; bolja dokumentabilnost i čitljivost algoritma; dostupnost biblioteka funkcija; podrška za izračune u pokretnom zarezu.

Jezik C harmonično kombinuje mogućnosti programiranja niskog nivoa sa svojstvima jezika visokog nivoa. Mogućnost programiranja na niskom nivou omogućava vam da lako radite direktno na hardveru, a svojstva jezika visokog nivoa omogućavaju vam da kreirate lako čitljiv i promenljiv programski kod. Pored toga, skoro svi prevodioci C imaju mogućnost da koriste asemblerske umetke za pisanje sekcija programa koji su kritični u smislu vremena izvršavanja i potrošnje resursa.

Jednom riječju, C je najpogodniji jezik i za početnike koji se upoznaju sa AVR mikrokontrolerima i za ozbiljne programere.

Kompajleri se koriste za pretvaranje izvornog koda programa u datoteku firmvera mikrokontrolera.

Atmel pruža moćan kompajler za sklapanje koji je uključen u razvojno okruženje Atmel Studio koji radi na Windows-u. Zajedno sa kompajlerom, razvojno okruženje sadrži debuger i emulator.
Atmel Studio je potpuno besplatan i dostupan na Atmel web stranici.

Trenutno postoji dosta C kompajlera za AVR. Najmoćnijim od njih smatra se kompajler kompanije IAR Systems iz Štokholma. Upravo su njegovi zaposlenici učestvovali u razvoju komandnog sistema AVR sredinom 90-ih. IAR C kompajler ima opsežne mogućnosti optimizacije koda i dolazi kao deo integrisanog razvojnog okruženja IAR Embedded Workbench (EWB), koje takođe uključuje asemblerski kompajler, linker, menadžer projekta i biblioteke i debager. Cijena pune verzije paketa je 2820 EUR. Na web stranici kompanije možete preuzeti besplatnu probnu verziju za 30 dana ili neograničenu verziju s ograničenjem veličine koda od 4 KB.

Američka kompanija Image Craft iz Palo Alta u Kaliforniji proizvodi kompajler za jezik C koji je stekao prilično veliku popularnost. JumpStart C za AVR ima prihvatljivu optimizaciju koda i ne previsoku cijenu (od $50 do $499 u zavisnosti od verzije). Demo verzija JumpStart C za AVR je potpuno funkcionalna 45 dana.

Ništa manju popularnost nije stekao ni rumunski Code Vision AVR C kompajler, cena pune verzije ovog kompajlera je relativno niska i iznosi 150 EUR. Kompajler dolazi sa integrisanim razvojnim okruženjem, koje, pored standardnih karakteristika, uključuje i prilično zanimljivu karakteristiku - CodeWizardAVR Automatic Program Generator. Prisustvo serijskog terminala u razvojnom okruženju omogućava vam da otklanjate greške u programima koristeći serijski port mikrokontrolera. Možete preuzeti besplatnu probnu verziju od programera s ograničenjem veličine koda od 4 KB i onemogućenim spremanjem generiranog izvornog koda u C.

Kompanija MikroElektronika, koja se nalazi u Beogradu, proizvodi čitavu porodicu kompajlera za AVR mikrokontrolere. Kompajler za jezik C pod nazivom mikroC PRO za AVR košta 249 dolara. Tu su i mikroBasic i mikroPascal po istoj ceni. Na web stranici programera postoje demo verzije s ograničenjem veličine koda od 4096 bajtova. Prednost ove porodice kompajlera je jedinstvena platforma i jedinstvena ideologija, koja može da obezbedi laku tranziciju ne samo između jezika, već i između mikrokontrolera (postoje verzije kompajlera za PIC, STM32, 8051...).

Integrisano razvojno okruženje postalo je zaista kultno. Uključuje moćne kompajlere C i asemblera, AVRDUDE programator, debuger, simulator i mnoge druge prateće programe i uslužne programe. WinAVR se neprimetno integriše sa razvojnim okruženjem Atmel AVR Studio. Asembler je identičan u ulaznom kodu kao i AVR Studio asembler. Prevodioci C i asemblera imaju mogućnost kreiranja datoteka za otklanjanje grešaka u COFF formatu, što vam omogućava da koristite ne samo ugrađene alate, već i moćni AVR Studio simulator. Još jedna važna prednost je što se WinAVR distribuira besplatno bez ograničenja (proizvođači podržavaju GNU General Public License).

Kao rezime, vredi reći da je WinAVR idealan izbor za one koji počinju da savladavaju AVR mikrokontrolere. Upravo se ovo razvojno okruženje smatra glavnim u ovom kursu.

Kiselev Roman, maj 2007 Članak ažuriran 26. maja 2014

Dakle, šta je mikrokontroler (u daljem tekstu MK)? Ovo je, relativno govoreći, mali računar smešten u jedno integrisano kolo. Ima procesor (aritmetičku logičku jedinicu ili ALU), flash memoriju, EEPROM memoriju, mnoge registre, I/O portove, kao i dodatna zvona i zviždaljke kao što su tajmeri, brojači, komparatori, USART-ovi, itd. Nakon uključivanja napajanja , mikrokontroler se pokreće i počinje izvršavati program pohranjen u njegovoj fleš memoriji. Istovremeno, može kontrolisati širok spektar eksternih uređaja preko I/O portova.

Šta to znači? To znači da u MK možete implementirati bilo koji logički sklop koji će obavljati određene funkcije. To znači da je MK mikrokolo, čiji unutrašnji sadržaj, u stvari, sami stvaramo. To omogućava, nakon kupovine nekoliko potpuno identičnih MK-a, da na njima sastavite potpuno različite sklopove i uređaje. Ako želite napraviti bilo kakve promjene u radu elektroničkog uređaja, nećete morati koristiti lemilicu, samo ćete morati reprogramirati MK. U ovom slučaju, ne morate ga čak ni uklanjati sa svog uređaja ako koristite AVR, jer ovi MK-ovi podržavaju programiranje u krugu. Dakle, mikrokontroleri premošćuju jaz između programiranja i elektronike.

AVR su 8-bitni mikrokontroleri, odnosno njihov ALU može obavljati jednostavne operacije sa samo 8-bitnim brojevima u jednom ciklusu takta. Sada je vrijeme da razgovaramo o tome koji ćemo MK koristiti. Radim sa ATMega16 MK. Vrlo je uobičajen i može se kupiti u gotovo svakoj trgovini radio-dijelova za oko 100 rubalja. Ako ga ne pronađete, onda možete kupiti bilo koji drugi MK serije MEGA, ali u ovom slučaju ćete morati potražiti dokumentaciju za njega, jer iste “noge” različitih MK-a mogu obavljati različite funkcije, a povezivanje, čini se, Ako su svi zaključci tačni, možda ćete dobiti uređaj koji radi, ili možda samo oblak smrdljivog dima. Kada kupujete ATMega16, vodite računa da dolazi u velikom DIP paketu od 40 pinova, a za njega kupite i utičnicu u koju se može umetnuti. Za rad s njim trebat će vam i dodatni uređaji: LED diode, dugmad, konektori itd.

ATMega16 ima veoma veliki broj različitih funkcija. Evo nekih od njegovih karakteristika:

  • Maksimalna frekvencija takta – 16 MHz (8 MHz za ATMega16L)
  • Većina naredbi se izvršava u jednom taktu
  • 32 8-bitna radna registra
  • 4 puna 8-bitna I/O porta
  • dva 8-bitna tajmera/brojača i jedan 16-bitni
  • 10-bitni analogno-digitalni pretvarač (ADC)
  • interni generator takta na 1 MHz
  • analogni komparator
  • interfejsi SPI, I2C, TWI, RS-232, JTAG
  • programiranje unutar kola i samoprogramiranje
  • modul širine impulsa (PWM).

Kompletne karakteristike ovog uređaja, kao i uputstva za njihovu upotrebu, možete pronaći u priručniku (Datasheet) za ovaj MK. Istina, na engleskom je. Ako znate engleski, obavezno preuzmite ovaj list sa podacima, on sadrži mnogo korisnih informacija.

Hajdemo konačno na posao. Preporučujem da napravite posebnu ploču za razvoj i otklanjanje grešaka za mikrokontroler, na kojoj možete sastaviti bilo koji električni krug s mikrokontrolerom bez lemilice (ili gotovo bez njega). Korištenje takve ploče će uvelike olakšati rad sa MK-om i ubrzati proces učenja njegovog programiranja. izgleda ovako:

Šta će vam trebati za ovo?

Prvo će vam trebati sama ploča. Kupio sam gotovu u prodavnici radio-dijelova za 115 rubalja. Zatim sam na njega zalemio sve potrebne dijelove. Rezultat je nevjerojatno zgodna stvar, na kojoj možete sastaviti bilo koji električni krug za nekoliko minuta spajanjem kabela i ugradnjom mikro krugova i indikatora.

Za spajanje elemenata kola vrlo je zgodno koristiti kabele s konektorima na krajevima. Ovi konektori se postavljaju na “noge” koje vire pored svakog porta MK-a. Mikrokontroler treba biti instaliran u utičnicu, a ne zalemljen na ploču, inače će ga biti vrlo teško ukloniti ako ga slučajno spalite. Ispod je pinout ATMEGA16 MK:

Hajde da objasnimo koje nas noge sada zanimaju.

  • VCC - napajanje se ovdje napaja (4,5 - 5,5 V) iz stabiliziranog izvora
  • GND – uzemljenje
  • RESET – reset (na niskom naponskom nivou)
  • XTAL1, XTAL2 – ovdje je spojen kvarcni rezonator
  • PA, PB, PC, PD – ulazno/izlazni portovi (A, B, C i D, respektivno).

Sve što proizvodi 7-11 V DC može se koristiti kao izvor napajanja. Za stabilan rad MK-a potrebno je stabilizirano napajanje. Kao stabilizator možete koristiti mikro krugove serije 7805. To su linearni integrirani stabilizatori na čiji se ulaz napaja 7-11 V jednosmjerne nestabilizirane struje, a izlaz je 5 V stabilizirane struje. Prije i poslije 7805 potrebno je ugraditi filterske kondenzatore (elektrolitičke za filtriranje niskofrekventnih smetnji i keramičke za visokofrekventne). Ako ne možete pronaći stabilizator, onda kao izvor napajanja možete koristiti bateriju od 4,5 V. MK se mora napajati direktno iz nje.

Ispod je dijagram MK veze:

Hajde sada da shvatimo šta je ovde.

BQ1 je kvarcni rezonator koji postavlja radnu frekvenciju MK. Možete podesiti bilo koji do 16 MHz, ali pošto planiramo u budućnosti raditi sa COM portom, preporučujem korištenje rezonatora za sljedeće frekvencije: 14,7456 MHz, 11,0592 MHz, 7,3725 MHz, 3,6864 MHz ili 1,8432 MHz (later postaće jasno zašto). Koristio sam 11.0592 MHz. Jasno je da što je veća frekvencija, to je veća brzina uređaja.

R1 je pull-up otpornik koji održava napon od 5 V na RESET ulazu. Nizak nivo napona na ovom ulazu ukazuje na resetovanje. Nakon resetovanja, MK se pokreće (10 - 15 ms) i ponovo počinje da izvršava program. Budući da je ovo ulaz visoke impedancije, ne možete ga ostaviti "da visi u zraku" - mali podizač na njemu će dovesti do neočekivanog resetiranja MK-a. To je upravo ono čemu služi R1. Za pouzdanost, preporučujem i ugradnju kondenzatora C6 (ne više od 20 µF).

SB1 – dugme za resetovanje.

Kvarcni rezonator i filter kondenzator C3 trebaju biti smješteni što je moguće bliže MK (ne dalje od 5-7 cm), jer u suprotnom može doći do smetnji u žicama, što dovodi do kvarova MK.

Plavi pravougaonik na dijagramu ocrtava sam programator. Pogodno ga je napraviti u obliku žice, čiji je jedan kraj utaknut u LPT port, a drugi u određeni konektor pored MK. Žica ne bi trebala biti pretjerano duga. Ako se pojave problemi s ovim kabelom (obično ne, ali svašta se može dogoditi), morat ćete zalemiti Altera ByteBlaster adapter. Kako to učiniti piše u opisu AVReal programatora.

Sada kada smo se pozabavili hardverom, vrijeme je da pređemo na softver.

Postoji nekoliko razvojnih okruženja za AVR programiranje. Prvo, ovo je AVR Studio - zvanični sistem za programiranje kompanije Atmel. Omogućava vam da pišete na asembleru i debugujete programe napisane na asembleru, C i C++. IAR je komercijalni programski sistem u C, C++ i asembleru. WinAVR je kompajler otvorenog koda. AtmanAVR je programski sistem za AVR sa interfejsom skoro potpuno istim kao Visual C++ 6. AtmanAVR vam takođe omogućava da otklanjate greške u programima i sadrži mnoge pomoćne funkcije koje olakšavaju pisanje koda. Ovaj programski sistem je komercijalan, ali, prema licenci, možete ga koristiti besplatno mjesec dana.

Predlažem da počnete da radite sa IAR-om kao najtransparentnijim razvojnim okruženjem. U IAR-u se projekt kreira u potpunosti ručno, stoga, nakon što ste završili nekoliko projekata, već ćete jasno znati što znači svaki red koda i što će se dogoditi ako ga promijenite. Kada radite sa AtmanAVR-om, morat ćete ili koristiti unaprijed kreirani predložak, koji je vrlo glomazan i teško razumljiv za osobu bez iskustva, ili ćete imati puno problema s datotekama zaglavlja prilikom sklapanja projekta od nule. Nakon što smo se pozabavili IAR-om, kasnije ćemo pogledati druge kompajlere.

Dakle, prvo uzmite IAR. Vrlo je čest i pronalaženje ne bi trebao biti problem. Nakon preuzimanja IAR 3.20 odnekud, instalirajte kompajler/radno okruženje i pokrenite ga. Nakon toga možete početi sa radom.

Nakon što ste pokrenuli IAR, odaberite fajl/novi/radni prostor, odaberite putanju do našeg projekta i kreirajte mapu za njega i dajte mu ime, na primjer, “Prog1”. Sada kreirajmo projekat: Projekat / Kreiraj novi projekat… Nazovimo ga i “Prog1”. Desni klik na naslov projekta u stablu projekta i odaberite "Opcije"

Ovdje ćemo konfigurirati kompajler za određeni MK. Prvo, morate odabrati tip procesora ATMega16 na kartici Cilj, potvrditi okvir Omogući definicije bitova u I/O-include datotekama na kartici Konfiguracija biblioteke (tako da možete koristiti nazive bitova različitih MK registara u programskom kodu ), i tamo odaberite tip C biblioteke /EU++. U kategoriji ICCAVR, potrebno je da označite polje za potvrdu Omogući višebajtnu podršku na kartici Jezik i isključite optimizaciju na kartici Optimizacija (u suprotnom će uništiti naš prvi program).

Zatim odaberite kategoriju XLINK. Ovdje morate odrediti format kompajlirane datoteke. Pošto sada postavljamo opcije za način rada za otklanjanje grešaka, kao što je opisano u naslovu, moramo dobiti datoteku za otklanjanje grešaka kao izlaz. Kasnije ćemo ga otvoriti u AVR studiju. Da biste to učinili, trebate odabrati ekstenziju.cof, a tip datoteke je ubrof 7.

Sada kliknite OK, a zatim promijenite Debug u Release.

Idite ponovo na Opcije, gdje su svi parametri osim XLINK-a postavljeni na isto. U XLINK-u promijenite ekstenziju u .hex, a format datoteke u intel-standart.

To je sve. Sada možete početi pisati svoj prvi program. Kreirajte novi izvor/tekst i u njega unesite sljedeći kod:

#include"iom16.h" kratki neoznačeni int i; void glavni ( void) (DDRB = 255; PORTB = 0; dok(1) { ako(PORTB == 255) PORTB = 0; ostalo PORTB++; za(i=0; i

Datoteka "iom16.h" se nalazi u folderu (C:\Program Files)\IAR Systems\Embedded Workbench 3.2\avr\inc. Ako koristite drugi MK, na primjer, ATMega64, tada odaberite datoteku “iom64.h”. Ove datoteke zaglavlja pohranjuju informacije o MK-u: imena registara, bitove u registrima i imena prekida. Svaki pojedinačni pin porta A, B, C ili D može djelovati ili kao ulaz ili kao izlaz. Ovo je utvrđeno registrom smjera podataka (DDR). 1 čini nogu izlazom, 0 ulazom. Tako, postavljanjem, na primjer, DDRA = 13, pravimo "noge" PB0, PB2, PB3 izlaze, ostalo - ulaze, jer 13 u binarnom obliku je 00001101.

PORTB je registar koji određuje stanje pinova porta. Nakon što smo tamo napisali 0, postavljamo napon na svim izlazima na 0 V. Zatim postoji beskonačna petlja. Kada programiraju MK, oni uvijek prave beskonačnu petlju u kojoj MK izvodi neku radnju dok se ne resetuje ili dok ne dođe do prekida. U ovom ciklusu pišu, takoreći, „pozadinski kod“, koji MK izvršava kao posljednju stvar. To može biti, na primjer, prikazivanje informacija na displeju. U našem slučaju, sadržaj PORTB registra se povećava dok se ne napuni. Nakon toga sve počinje iznova. Konačno, deset hiljada ciklusa for petlje. Potrebno je da se formira vidljivo kašnjenje u prebacivanju stanja porta B.



Sada čuvamo ovu datoteku u fascikli projekta kao Prog1.c, kopiramo datoteku iom16.h u fasciklu projekta, biramo Project/Add Files i dodajemo “iom16.h” i “Prog1.c”. Odaberite Release, pritisnite F7, program se kompajlira i poruka bi se trebala pojaviti:


Ukupan broj grešaka: 0
Ukupan broj upozorenja: 0

Evo fotografije mog programera:

Preuzmite AVReal programator. Kopirajte ga (AVReal32.exe) u fasciklu Release/exe, gde treba da se nalazi datoteka Prog1.hex. Napajamo MK, povezujemo kabl za programiranje. Otvorite Far Manager (najpogodnije je flešovati MK), idite u ovu fasciklu, pritisnite Ctrl+O. S obzirom da imamo potpuno novi MK, punimo se

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

Ne zaboravite unijeti ispravnu frekvenciju ako ne koristite 11059200 Hz! Istovremeno, tzv osigurači – registri koji kontrolišu njegov rad (korišćenje internog generatora, Jtag, itd.). Nakon toga, spreman je za prijem prvog programa. Programatoru se daje korišteni LPT port, frekvencija, naziv datoteke i drugi kao parametri (svi su navedeni u opisu AVReal-a). Mi biramo:

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

Ako je veza ispravna, programer će prijaviti uspješno programiranje. Ne postoji garancija da će ovo raditi prvi put (prvi put kada pozovete program). I sam se ponekad programiram po drugi put. Možda je LPT port neispravan ili ima smetnji u kablu. Ako dođe do problema, pažljivo provjerite kabel. Iz vlastitog iskustva znam da je 60% kvarova povezano s nedostatkom kontakta na pravom mjestu, 20% s prisustvom nepotrebnog, a još 15% s pogrešnim lemljenjem pogrešne stvari na pogrešnu stvar. Ako ništa drugo ne uspije, pročitajte opis programatora i pokušajte napraviti Byte Blaster.

Pretpostavimo da sve radi za vas. Ako sada spojite osam LED dioda na port B MK-a (učinite to s isključenim MK-om, a preporučljivo je uključiti otpornike od 300-400 Ohma u seriju sa LED diodama) i uključite napajanje, dogodit će se malo čudo - “ talas” će proći kroz njih!

© Kiselev Roman
maj 2007


Top