Programiranje MK od nule. AVR programiranje

Nemam nekada, a ne dva kažem da studija MK-a treba započeti sa assednikom. Ovo je bilo posvećeno cijeli tečaj na mjestu (iako nije baš dosljedan, već sam ga češljao u adekvatan tip). Da, teško je, rezultat neće biti prvog dana, ali naučit ćete razumjeti šta se događa u vašem kontroleru. Znat ćete kako to funkcionira, a ne na majmunu kopiju izvore drugih ljudi i pokušavaju razumjeti zašto je iznenada prestao raditi. Pored toga, SI je mnogo lakši za pretežavanje srednjeg otopine, koji će izaći sa vilicama u najmanju anofportune momentu.

Nažalost, svi žele rezultat odmah. Stoga sam odlučio da odem s druge strane - da obučem SI, ali sa emisijom njegovog donjeg rublja. Dobar programer-ugrađivač uvijek drži svoj komad željeza za squall, a da joj ne daje korak do korak bez dozvole. Dakle, bit će na početku tako koda, a zatim ono što je rodio prevodilac i kako to zaista djeluje u stvari :)

S druge strane, si jaka strana Ovo je kôd prezentacije. Ako, naravno, sve pišete pravilno. Razdvajanjem radnog algoritama i njihovih implementacija željeza u različitim dijelovima projekta. Zatim, da prebacim algoritam u drugi MK, dovoljno je prepisati samo sloj sučelja, gdje je napisana sva privlačna u žlijezdu, a cijeli radni kod ostavite. I, naravno, čitljivost. Izvor izvora krila lakše je razumjeti na prvi pogled (iako .., na primjer, ne zanimaju ono što flertuje barem si, barem afm :), ali opet, ako sve napišete. Sa tim trenucima, takođe ću obratiti pažnju.

Kao provodnik hardvera na kojem će biti moj udio lavova u svim primjerima debug naknada.

Prvi program na C za AVR

Odabir prevodilaca i ugradnje okoliša
Za AVR postoji mnogo različitih C prevoditelja:
Prije svega IAR AVR C. - Gotovo jedinstveno prepoznat kao najbolji prevodilac za AVR, jer Sam kontroler kreirao je bliski kooperator Atmela i stručnjaka iz IAR-a. Ali za sve što morate platiti. A ovaj prevodilac nije dovoljan što je skup komercijalni softver, posjeduje i takve postavke za doručak koji ga samo uzimaju i sastavljaju u njemu treba žuriti. Stvarno nisam imao prijateljstvo s njim, projekt je bio pijan na čudnim greškama u fazi povezivanja (kasnije sam saznao da je to bila krivulja pukotine).

Drugi dolazi Winavr GCC. - Snažni optimiziranje prevodilaca. Potpuno otvaranje, prekogranična platforma, općenito, sve radosti života. Takođe se savršeno integriše u AVR studio koji vam omogućava da se debug debuug tamo tu, pakao je ugodno. Generalno sam je izabrao.

Takođe postoji Codevision AVR C.- Vrlo popularan kompajler. Postao je popularan u vezi sa svojom jednostavnošću. Radni program Možete ući u njega za nekoliko minuta - master početnog koda uvelike je unapređen, pečat inicijalizacije svih vrsta ušiju. Iskreno, žao mi je sa sumnjom na njega - nekako sam morao rastaviti prog koji napisao ovaj prevodilac, neka vrsta namijenjene, ali nije dobijena koda. Strašna količina nepotrebnih televizitacija i operacija, koja je izlijevana u male kodove i spora brzina. Međutim, možda je došlo do greške u DNK-u napisala originalni firmver. Plus on želi novac. Nije baš kao što je NIAR, ali uočljiv. A u Demozhimu ne daje više od 2KB koda.
Pukotina naravno, ali ako kradite, tako milion, u smislu IAR :)

Tu je i Image Craft AVR C i Mikroč iz mikroelektronike. Niti koristiti nijednu drugu upotrebu, već ovdje SWG. Vrlo oranje MicropascalMelt je užasno povoljno programirano okruženje i biblioteka. Mislim da Mikror neće biti gori, već je i plaćen.

Kao što sam rekao, biram Winavr. Iz tri razloga: BESPLATNO, integriran je u AVR studio i napisano je jednostavno razgradnja gotovog koda za sve prilike.

Dakle, preuzmite se za instaliranje Winavr C i AVR studio. Tada se studio prvo stavlja, a zatim odozgo, Winavr se prevrće i pričvršćuje u studio u obliku dodatka. Snažno preporučujem instaliranje Winavra na kratko, nešto poput C: \\ winavr čime izbjegavate gomile problema sa načinima.

Stvaranje projekta
Dakle, studio se isporučuje, SI se pričvršćuje, vrijeme je da pokušate nešto programirati. Započnimo sa jednostavnim, najjednostavnijim. Pokrenite studio, odaberite tamo novi projekat, kao prevodilac AVR GCC i unesite ime projekta.

Otvara radno polje prazno * .c datotekom.

Sada ne sprječava konfiguriranje prikaza staza na karti studio. Za ovo, nagib na:
Izbornik alata - Opcije - Općenito - FileTabs i odaberite "Samo naziv datoteke" na padajućoj listi. Inače će to biti nemoguće raditi - na kartici će biti puni put datoteke i na ekranu neće biti više od dvije kartice.

Podešavanje projekta
Općenito, stvaranje datoteke izrade u kojoj bi se opisale sva ovisnosti. I to je vjerovatno tačno. Ali odrastao sam na potpuno integriranom IDE-u uvision ili AVR studio. Ovaj pristup je duboko vanzemaljac. Stoga ću učiniti na svoj način, svi studiji.

Gomila u gumb sa opremom.


Ovo su postavke vašeg projekta, ili bolje rečeno, postavka automatske generacije datoteke za izradu. Na prvoj stranici samo morate unijeti frekvenciju na kojoj će vaš MK raditi. To ovisi o osiguračima bitova, tako da vjerujemo da je frekvencija 8000000GZ.
Takođe obratite pažnju na niz optimizacije. Sada postoje - za optimizaciju u veličini. Dok je odsustvo kakav jest, onda se možete pokušati igrati sa ovim parametrom. -O0 je uopće uklonjiva optimizacija.

Sljedeći korak je konfiguriranje staza. Prva stvar koju trebam dodati direktorij vašeg projekta postoji - stavite bit ćete bit ćete biblioteke treće strane. Lista će se pojaviti ". \\"

Napravite generiranu datoteku, možete ga vidjeti u zadanoj mapi u vašem projektu, samo prolazite kroz oči, vidite šta je tu.


To je sve. Jim svugdje u redu i idi do izvora.

Formulacija problema
Prazan list je toliko mahnuo da utjelovljuju neku škakljivu ideju, jer banalno treptanje diode ne umetne. Odmah uzmimo bika za rogove i provedimo vezu s računarom - ovo je prvo što radim.

To će raditi ovako:
Pod dolaskom COM porta, jedinica (šifra 0x31) svijetli diodion, a kada se ugasi od dolaska nule (kod 0x30). Štaviše, sve će se vršiti na prekidima, a pozadinsko zadatak će treptati drugu diodu. Jednostavno i sa značenjem.

Sakupite shemu
Moramo povezati USB-USB Converter modul pomoću mikrokontrolera USART pretvarača. Da biste to učinili, uzmite skakač od dva ožičenja i stavite križ u igle križa. To jest, RX kontroler se povezuje s TX pretvaračem, a TX pretvarač s RX kontrolerom.

Kao rezultat toga, ispostavilo se, ovo je takva shema:


Povezivanje drugih zaključaka, ishrane, pražnjenja, to je standardno

Pišemo kod

Odmah rezervirajte da se neću precizno produbiti u opisu samog jezika. Za to jednostavno postoji ogromna količina materijala, u rasponu od klasike "SI programski jezik" iz K & R i završava različitim tehnikama.

Jedna takva metoda pronađena je u meni u saće, jednom sam studirao ovaj jezik na njemu. Tamo je sve kratko, razumljivo i u slučaju. Postepeno se nadoknadim i preuredio na svoju stranicu.

Zaista ne odlaže se u cijelo poglavlje, ali mislim da nije dugo.

Malo je vjerojatno da ću bolje opisati, pa iz tečaja za obuku, umjesto detaljne izloženosti plavih suptilnosti, jednostavno ću dati izravne veze na određene stranice ove tehnike.

Dodajte biblioteke.
Prije svega, dodajemo potrebne biblioteke i naslove definicijama. Uostalom, Si je univerzalni jezik i on treba objasniti da radimo s AVR-om, pa uđite u izvornu liniju:

1 #Include.

#Include.

Ova je datoteka u mapi Winavr. I sadrži opis svih registara i portova regulatora. I tu su svi lukavi, s obzirom na određeni kontroler, koji prenosi prevoditelj kroz napraviti Datoteka u parametru MCU. I na temelju ove varijable u vašem projektu, na ovom kontroleru je datoteka zaglavlja s opisom adresa svih portova i registara. Kako! Bez njega je takođe moguće, ali tada nećete moći koristiti simbolička imena registara poput SREG ili UDR-a i morate se sjetiti adrese svakog "0xc1", a ovo je glava.

Isti tim tima #Include.<имя файла> Omogućuje vam dodavanje na svoj projekt Sadržaj bilo koje tekstualne datoteke, na primjer, datoteku koja opisuje funkcije ili komad drugog koda. I tako da bi Direktiva mogla pronaći ovu datoteku, pokazali smo načine naših projekta (bitav direktorij je već napisan tamo).

Glavna funkcija.
Program na jeziku SI sastoji se od funkcija. Mogu se ugraditi i donijeti jedni od drugih u bilo kojem redoslijedu i na različite načine. Svaka funkcija ima tri potrebna parametra:

  • Povratna vrijednost, na primjer, grijeh (x) Vraća vrijednost x sinusa. Kao u matematici, kratko.
  • Prenosivi parametri, isti X.
  • Funkcija tijela.

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

Bilo koji program na C mora sadržavati funkciju glavni. Kao točka ulaska u glavni program, u suprotnom, to je Nifiga, a ne SI :). Prema prisustvu glavnog u tuđem izvoru iz milion dosjea, može se shvatiti da je to šef programa u kojem sve počinje. Pa pitajmo:

1 2 3 4 5 Int main (prazni) (povratak 0;)

int main (prazni) (povratak 0;)

Sve, napisan je prvi najjednostavniji program, nije važno da ona ne radi ništa, tek smo započeli.

Mi ćemo analizirati šta smo učinili.
int. Ova vrsta podataka koja se glavna funkcija vraća.

Naravno, u mikrokontroleru glavni. Ne mogu ništa vratiti u principu i u teoriji treba biti void main (nevažeći)Ali GCC se u početku izoštri na PC-u i tamo program može vratiti vrijednost operativnog sistema po završetku. Stoga GCC na void main (nevažeći) upozorenje za psovanje.

Ovo nije greška, to će raditi, ali ne volim varnice.

praznina. Ova vrsta podataka koje prenosimo na funkciju u ovom slučaju glavni. Takođe ne mogu ništa uzeti izvana, pjesnik praznina. - Lutka. Utikač se nanosi kada nije potrebno prenositi bilo šta ili povratak.

Ovo su { } Sloge zagrade su softverski blok, u ovom slučaju funkcija tijela glavni., Bit će kodeks.

povratak. - Ovo je povratna vrijednost koju će glavna funkcija dati po završetku, jer smo Int, odnosno broj koji moramo vratiti broj. Iako još uvijek nema smisla, jer Na mikrokontroleru iz Glavnog, mi smo osim nigde. Vraćam nulu. Za nefig. A prevodilac je obično pametan, a kod ne generira kod.
Iako, ako povučeš, onda iz glavni. Možete otići na MC - na primjer, spadajte u odjeljak za pokretanje pokretača i ispunite ga, ali već postoji prikupljanje firmvera sa niskim nivoom, za podešavanje tranzicijskih adresa. Ispod ćete vidjeti i shvatiti kako to učiniti. Zašto? Ovo je još jedno pitanje, u 99.999% slučajeva ovaj nafig nije potreban :)

Napravljeno, otišao dalje. Dodajte varijablu, nije nas posebno neophodno za nas i nije potrebno uvesti varijable, ali učimo. Ako se varijable dodaju unutar tijela funkcije - tada su lokalne i postoje samo u ovoj funkciji. Kada napustite funkciju, ove varijable se uklanjaju, a memorija RAM-a daje se važnim potrebama. .

1 2 3 4 5 6 Int main (nevažeći) (nepotpisani char I; povratak 0;)

int main (nevažeći) (nepotpisani char I; povratak 0;)

nepotpisan Tako neoprostivo. Činjenica je da u binarnom predstavljanju imamo seniorski zapis za znak, što znači u jednom bajtu (Char) broj + 127 / -128, ali ako znak odbacuje već od 0 do 255. Obično je znak Nije potrebno. Tako da nepotpisan.
i. - Ovo je samo naziv varijable. Dosta.

Sada morate inicijalizirati portove i Uart.. Naravno, možete uzeti i povezati biblioteku i nazvati neka vrsta uartinit (9600); Ali tada nećete znati šta se u stvari dogodilo.

Mi to radimo:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Int main (nevažeći) (nepotpisani char I; #define xtal 8000000l #define baudrate 9600l #Define bauddivider (XTAL / (16 * baudrat) -1) #Define HI (x) ((x) \u003e\u003e 8) #define lo (x) ((x) & 0xff) ubrrl \u003d lo (bauddivider); Ubrrh \u003d hi (bauddivider); Ucsra \u003d 0; Ucsrb \u003d 1.<< RXEN| 1 << TXEN| 1 << RXCIE| 0 << TXCIE; UCSRC = 1 << URSEL| 1 << UCSZ0| 1 << UCSZ1; }

int main (nevaljeni) (nepotpisani char I; #define xtal 8000000l #define baudrate 9600l #define bauddivider (XTAL / (16 * baudrat) -1) #define HI (x) ((x) \u003e\u003e 8) #define lo ( x) ((x) & 0xff) ubrrl \u003d lo (bauddivider); ubrrh \u003d hi (bauddivider); ucsra \u003d 0; ucsrb \u003d 1<

Zastrašujuće? U stvari, pravi kôd ovdje je samo pet posljednjih redaka. Sve, to #Define Ovo je preprocesor makronasijea. Gotovo isti vrhovi kao i u sklopu, ali sintaksa je nešto drugačiji.

Oni će olakšati vaše rutinske operacije za izračunavanje potrebnih koeficijenata. U prvom redu mi to kažemo XTAL Možete sigurno zamijeniti 80.000.000, i L.- Specifikacija tipa, Long Mall su frekvencija satnog sata. Isto baudrate. - Frekvencija podataka uart.

bauddivider. Već složeniji, izraz izračunat formulom dva prethodna bit će zamijenjen.
Dobro i Lo. i Bok Iz ovog rezultata će uzeti mlađe i vise bajtove, jer U jednom bajtu to se jasno ne može uklopiti. U Bok ICSse se vrši (ulazni parametar makroa) osam puta udesno, kao rezultat toga, ostat će samo najstariji bajt. A B. Lo. Napravimo seriju i sa brojem 00FF-a, kao rezultat toga, ostat će samo najmlađi bajt.

Dakle, sve što se radi kao #Define Možete sigurno izbaciti, a željeni brojevi računaju na kalkulator i odmah ih unesite u UBBRL \u003d linije .... i ubbrh \u003d ... ..

Može. Ali! Uradi ovo To je kategorički nemoguće!

Takođe će raditi na poslu, ali imat ćete takozvani Čarobni brojevi - Vrijednosti su se nerazumno uzimale iz mjesta gdje nije jasno zašto i ako donirate takav projekt za nekoliko godina, tada je teško shvatiti da će to biti prokleto. Da, a sada želite promijeniti brzinu ili promijeniti frekvenciju kvarca i sve će morati preračunati, a tako se mijenjati nekoliko Tsiferoka u kodu i svemu. Općenito, ako ne želite uživati \u200b\u200bu Bydlokoderu, onda učinite kôd tako da je lako čitati, bilo je razumljivo i lako modificirano.

Tada je sve jednostavno:
Svi ovi "Ubrrl i Co" su registri konfiguracije predajnika sa kojim ćemo komunicirati sa svijetom. A sada smo dodijelili potrebne vrijednosti konfiguriranjem željene brzine i desnog režima.

Prikaz snimanja 1< Znači sljedeće: uzmi 1 i stavi na svoje mjesto RXEN. U letu. RXEN. Ovo je četvrti bit registra UCSRB., tako da 1< formira binarni broj 00010000, Txen. - Ovo je treći bit i 1< DAST 00001000. Single "|" Slomljen je IliSO 00010000 | 00001000 \u003d 00011000. Preostale potrebne bitove konfiguracije izložene su na isti način i dodaju se široj gomili. Kao rezultat toga, broj Skupštine napisan je u UCSRB-u. Detalji su napisani u Datashetu na MC-u u odjeljku USART-a. Dakle, ne ometajte se tehničkim detaljima.

Spremni, vrijeme je da se vidi šta se dogodilo. Poeni o kompilaciji i pokretanje emulacije (Ctrl + F7).

Uklanjanje pogrešaka
Sve vrste traka za napretku trčaju, studio se promijenio i pojavila se žuta strelica u blizini glavne funkcije. Ovde je procesor trenutno trenutna, a simulacija na pauziranju.

Činjenica je da je u početku, u stvari stajala na red ubrrl \u003d lo (bauddivider); Uostalom, činjenica da u definiranju to nije kod toga nije kod, već jednostavno preliminarne proračune, tada se simulator malo pričvršćen. Ali sada je shvatio, prvo je završeno i ako se popnete u drvo I / O View, U odeljku USARD-a i tamo pobijedite na UBBRL bajtu, vidjet ćete da već postoji već tamo! 0x33.

Napraviti još jedan korak. Gledajući kako sadržaj druge promjene registra. Dakle, oborite ih, obratite pažnju na činjenicu da su svi naznačeni bitovi izloženi kao što sam rekao, a postavljen je u vrijeme za cijeli bajt. Sljedeći povratak ne radi, program je završen.

Otvaranje
Sada resetirajte simulaciju u nuli. Kliknite tamo Resetiranje (Shift + F5). Otvorite listu za demontažu, sada ćete vidjeti šta se u kontrolama događa u stvari. Pogled -\u003e Desantsembler. A ne i yyaaaa !!! Assembler !!! Uzhos !!! Ali ti moraš. Dakle, kasnije, kad se nešto pođe po zlu, nije se usudio u Kodu i nije postavljao pitanja lamera na forumima i odmah se popela u gubitak i gledao gdje imate štand. Tamo nema ničeg strašnog.

Prvo će biti vrh 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 0x0000002A Skoči 00000002: 940C0034 JMP 0x00000034 Skoči 00000004: 940C0034 JMP 0x00000034 Skoči 00000006: 940C0034 JMP 0x00000034 Skoči 00000008: 940C0034 JMP 0x00000034 Skoči + 0000000A: 940C0034 JMP 0x00000034 Skoči + 0000000C: 940C0034 JMP 0x00000034 Jump + 0000000E: 940C0034 JMP 0x00000034 Skoči 00000010: 940C0034 JMP 0x00000034 Skoči 00000012: 940C0034 JMP 0x00000034 Skoči 00000014: 940C0034 JMP 0x00000034 Skoči 00000016: 940C0034 JMP 0x00000034 Skoči 00000018: 940C0034 JMP 0x00000034 Skoči + 0000001A: 940C0034 JMP 0x00000034 Jump + 0000001C : 940C0034 JMP 0x00000034 JMP +00000025 JMP 0x000023: 940C0023: 940C0023: 940C0034 JMP 0x00000034 JMP 0x00000034 JMP 0x00000034 JMP 0X00000034 JMP0000: 940C0034 JMP 0x000034

00000000: 940C002A JMP 0x0000002A Skoči 00000002: 940C0034 JMP 0x00000034 Skoči 00000004: 940C0034 JMP 0x00000034 Skoči 00000006: 940C0034 JMP 0x00000034 Skoči 00000008: 940C0034 JMP 0x00000034 Skoči + 0000000A: 940C0034 JMP 0x00000034 Skoči + 0000000C: 940C0034 JMP 0x00000034 Jump + 0000000E : 940C0034 JMP 0x00000034 Skoči 00000010: 940C0034 JMP 0x00000034 Skoči 00000012: 940C0034 JMP 0x00000034 Skoči 00000014: 940C0034 JMP 0x00000034 Skoči 00000016: 940C0034 JMP 0x00000034 Skoči 00000018: 940C0034 JMP 0x00000034 Skoči + 0000001A: 940C0034 JMP 0x00000034 Skoči + 0000001C: 940C0034 JMP 0x00000034 JMP +00000034 JMP 0x000023 JMP 0x000022: 940C0023: 940C0023: 940C0034: 940C0034 JMP 0x00000034 JMP 3X: 940C0034 JMP 0x000034

Ovo je tablica prekida vektora. Vratit ćemo se tome, dok samo vidite i sjetite se da jeste. Prvi stupac je bljeskalica bljeskalica u kojoj naredba laže, drugi naredbeni kôd trećeg menemnog tima, isti instrukcija za sastavljanje, treći operand tima. Pa, automatski komentar.
Dakle, ako pogledate, tu su čvrsti prelazi. A JMP naredbeni kod je četiri bajta, sadrži tranzicijsku adresu zabilježenu pozadi - mlađim bajtom za mlađu adresu i kôd tranzicijske naredbe 940C

0000002b: be1f out 0x3f, R1 na I / O lokaciju

Snimanje ove nule na 0x3F adresu Ako vidite da je I / O prikaz stupca, vidjet ćete da je adresa 0x3f adresa SRED - registar registra registra zastava. Oni. Resetiramo SREG da pokrene program u nula uvjetima.

1 2 3 4 + 0000002C: E5CF LDI R28.0X5F Učitavanje: E0D4 LDI R29.0x04 Učitaj nekretninu + 0000002E: BFDE Out 0x3e, R29 I od lokacije + 0000002F: bfcd out 0x3d, R28 na I / O lokaciju

0000002C: E5CF LDI R28.0X5F Umetanje odmah + 0000002D: E0D4 LDI R29.0X04 Učitaj neku, izlaz 0x3e, R29 iz I / O Lokacija + 0000002F: BFCD izlaz 0x3d, R28 na I / O lokaciju

Ovo je utovar pokazivača snopa. Direktno isporuka u I / O registrima ne može, samo putem intermedijarnog registra. Stoga, prvi LDI u srednjem, a zatim odatle u I / O. Takođe ću vam reći više o hrpi. U međuvremenu je poznato da je ovo takva dinamična memorijska površina, visi na kraju RAM-a i održava adrese i srednje varijable. Sada smo istakli tamo gdje ćemo imati snop.

00000032: 940C0041 JMP 0x00000041 Skoči

Skočite na kraj SaaAeaeeea, a tamo imamo zabranu prekida i čvrsto petlje:

1 2 +00000041: 94F8 CLI Globalni prekid Onemogući +00000042: CFFF RJMP PC-0x0000 relativni skok

00000041: 94F8 CLI GLOBALNI prekid Onemogući +00000042: CFFF RJMP PC-0x0000 relativni skok

To je u slučaju nepredviđenih okolnosti, poput izlaza iz glavne funkcije. Iz takve petlje, kontroler se može prikazati ili s resetiranjem hardvera ili je to vjerovatno, pražnjenje iz psa satoka - čuvar. Pa, ili, kao što sam rekao gore, ispravite ova mjesta u Hex Editoru i usmjeravanje gdje imamo dušu. Takođe obratite pažnju na činjenicu da postoje dvije vrste JMP-a i RJMP prijelaza prvo je direktan prijelaz na adresu. Potrebno je četiri bajta i može napraviti izravnu tranziciju u cijeloj memorijskoj površini. Druga vrsta tranzicije - RJMP - relativna. Njegov tim uzima dva bajta, ali tranzicija to radi iz trenutnog položaja (adrese) do 1024 koraka naprijed ili nazad. I u svojim parametrima je naznačeno pomak iz trenutne točke. Koristi češće, jer Potrebno je dva puta manje prostora u ispiranju, a dugi faktori rijetko su potrebni.

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

00000034: 940C0000 JMP 0x00000000 Skoči

A ovo je skok na samom početku koda. Ponovo pokrenite vrstu. Možete provjeriti, svi vektori skaču ovdje. Iz ovog izlaza - Ako vam omogućuje da se omogućite prekinuti (zabranjeni su zabranjeni (zabranjeni prema zadanim postavkama) i da ćete biti prekinuti, ali nema ruku, a zatim će biti resetiranja programa - program će u samom početku baciti program.

Glavna funkcija. Sve je slično, čak i ne možete opisati. Gledajući samo registre već izračunali broj. Preprocesorski kompiler taksi !!! Dakle, nema "magičnih" brojeva!

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

00000036: E383 LDI R24.0x33 Opterećenje Neposredno +000037: B989 Out 0x09, R24 OUT do I / O Lokacija 15: Ubrrh \u003d HI (Bauddivider); +000038: BC10 Out 0x20, R1 OUT do I / O Lokacija 16: UCSRA \u003d 0; +000039: B81B Out 0x0b, R1 OUT do I / O Lokacija 17: UCSRB \u003d 1<

A evo jamb:

1 2 3 + 0000003E: E080 LDI R24.0x00 Učitaj odmah + 0000003F: E090 LDI R25.0x00 Učitaj Nego +00000040: 9508 Ret Subrouthin Povratak

0000003E: E080 LDI R24.0X00 Učitaj odmah + 0000003F: E090 LDI R25.0x00 Neposredno +00000040: 9508 Ret Subrouthin Povratak

Pita se zašto ovaj prevodilac dodaje takav topmaster? I to nije ništa drugo nego povratak 0, tada smo identificirali kao glavnu (nevaljanu). Tako da sam osvojio više od četiri bajta, ne razumijem šta :) i ako napravite void glavnu (prazninu), to će biti samo ret, ali varning će biti. Ono što kažu da ne vratimo ništa u glavnu funkciju. Općenito, zar ne volite vi :)

Komplikovano? Čini se da nije. Preskočim uspješnost u kompleksu u režimu rastavljanja, a pokej kao procesor vrši pojedinačna uputstva koja se događa sa registrima. Kako se preći na naredbe i završno petlje.

Nastavak slijedi za nekoliko dana ...

Offtop:
Alexei78. Priključak za pričvršćivanje za Firefox omogućavanje navigacije na mojoj web lokaciji i forumu.
Rasprava i preuzimanje i preuzimanje

Za programiranje AVR mikrokontrolera, međutim, ima puno razvojnih alata, međutim, najpopularnije, nesumnjivo, paket treba prepoznati AVR studio. . Postoji nekoliko razloga za takvu popularnost - ovo je besplatni paket koji je razvio kompanija Atmel , Kombinuje uređivač teksta, sklopove i simulatora. Paket AVR Studio takođe se koristi u kombinaciji sa pričvršćivanjem hardvera. U predloženom članku primjeri razmatraju tehnike za rad sa paketom, koji će pomoći početnim programerima da shvate interakciju pojedinih komponenti AVR studija.

U sljedećem dijelu članka bit će opisano o uklanjanju pogrešaka u AVR studijskom okruženju programa napisanih u SI.

Paket AVR Studio ima solidnu povijest razvoja, koja se ogleda u broju postojećih verzija. Na kraju 2003. godine puštena je verzija 4.08 koja ima niz korisnih dodataka, a na početku 2004. godine objavljeno je ažuriranje (servisno pakovanje 1), dodajući podršku AVR-kontrolerima treće generacije ATTERGA48 Porodica. Proizvodnja čipova ove porodice zakazana je za drugu polovinu 2004. godine.

Distribucija i servisni paket paketa mogu se preuzeti sa www.atmel.com ili dobiti CD sa ovom distribucijom ruskog distributera Atmela.

Rad paketa AVR Studio prikladno je preispitan na bilo kojem određenom programu. Kao mišljenje, razmotrit ćemo kreiranje projekta najjednostavnijeg programa koji će biti zauzvrat da svijetli dvije LED diode. Za definitivnost, uzmi mikrocircuit ATMEGA128. I povežite dva LED na zaključcima 31 i 32 (to su bitovi 6 i 7 portu D Chip Atmega128). AVR kontroleri Imaju moćne izlazne kaskade, tipična struja svakog izlaza je 20 mA, maksimalna izlazna struja iznosi 40 mA, a to se odnosi na tekuće i do tekuće struje. U našem primjeru, LED-ovi su povezani sa anodama do zaključaka kontrolera, a katode kroz otpornike za gašenje povezani su na zemlju. To znači da se LED zapamti hranjenjem "1" na odgovarajući izlaz po luku. Shematski dijagram prikazan je na slici. Dijagram također prikazuje dva gumba koja će se koristiti u jednom od programa.

Ovdje je prikladno napraviti malu digresiju o odabiru vrste čipa za najjednostavniji primjer. Doista, na prvi pogled može izgledati čudno, zašto vam je potreban tako moćan kristal u 64-pin kućištu gdje ima dovoljno 8-polnog čipa Attiny12. ? Međutim, u ovom pristupu postoji logika. Poznato je da u srcu gotovo bilo kojeg AVR kontrolera nalazi se isti kernel. Po i velikim, kontroleri se razlikuju u memoriji, broju I / O portova i set perifernih modula. Značajke svakog određenog kontrolera - obvezujući logički registar logičkog imena / izlaza na fizičke adrese, adrese vektora prekida, identificiranje portnih bitova itd. Opisuje u datotekama sa produžetkom.inc, koji su uključeni u AVR studio paket. Slijedom toga, koristeći određenu vrstu kristala, možete se obratiti pogreškom za to i za bilo koji mlađi kristal. Nadalje, ako koristite najstarniji kristal kao pogrešku, danas je Atmega128, možete isključiti program za isključivanje programa za gotovo sve AVR kontrolerom, samo morate koristiti hardverske resurse koji nedostaju iz ciljanog mikrokontrolera. Dakle, na primjer, možete ispraviti program koji će se izvesti na atmega128 Attiny13. . U ovom slučaju izvorni kod ostat će praktično isti, samo naziv povezane datoteke sa 128def.inc na TN13Def.inc će se promijeniti. Ovaj pristup takođe ima svoje prednosti. Na primjer, "Extra" I / O portovi se mogu koristiti za povezivanje. LCD indikator koje možete povući podatke o pogrešci. Ili, koristite intrahemum emulator koji se povezuje sa JTAG portom CHIP-a ATTEGA128 (Attiny13 kontroler nema ovaj port). Stoga je moguće koristiti jedinstvenu ploču za uklanjanje pogrešaka na kojoj je instaliran "seniorski" AVR kontroler, kako bi se pogrešili sa pogrešnim novorazvijenim sistemima, naravno na osnovu AVR mikrokontrolera. Jedna od tih ploča naziva se kao-megam. Bilo je to korišteno za stvaranje primjera programa navedenih u članku. Ovo je univerzalni kontroler sa jednim bojom na osnovu atmega128 čipa, koji sadrži vanjski RAM, dvije portove RS-232. , port za povezivanje LCD indikatora, intrahemnoe programera i emulatora U jtag led . Odbor takođe ima mesto za Split Chip-ROM serije Chip AT45 U kućištima Tsop32 / 40/48 i dvokanalni seriji DAC AD5302 / AD5312 / AD5322 . Sada, nakon objašnjenja uzroka upotrebe AVR čudovišta da zapali par Swatodioda, možete ići dalje.

Kada programirate u AVR studijskom okruženju, morate izvesti standardni niz radnji:

  • kompilacija
  • Stvaranje projekta započinje odabirom projekta \\ Novi meni projekta. U prozoru "Kreiraj novi projekat" koji se otvori, morate navesti naziv projekta (u našem slučaju - uzorku1) i naziv datoteke inicijalizacije. Nakon pritiska na tipku "Next", otvara se platforma za uklanjanje pogrešaka i prozor uređaja, gdje je odabrana platforma za uklanjanje pogrešaka (simulator ili emulator) i vrstu mikrokontrolera.

    Možete odabrati jedan od ponuđenih intrahemskih emulatora, napominjemo da svaki emulator ima vlastiti popis podržanih mikro ciciju. Za primjer koji se razmatra, biramo kao platformu za uklanjanje pogrešaka AVR simulator i atmega128 čip. Nakon pritiska na tipku "Finish", naš izlaz se pojavljuje radni prozori AVR studio paketa, dok je prazan. Slijedi pravi prozor za postavljanje izvornog teksta programa. To se može učiniti na dva načina ili birati sav tekst izravno u prozoru uređivača ili preuzmite postojeću datoteku. Ispod je potpuni tekst najjednostavnijeg programa sa komentarima.

    ; Primjer "LED kontrola"; napisano za as-megam dasku za uklanjanje pogrešaka; Učestalost generatora parametara je 7,37 MHz; LED su povezani na PD6 i PD7 zaključci i putem otpornika - na zajedničkoj žici. ; Povezivanje ATmega128 kruga I / O datoteka detalja "M128def.inc"; Početak početnog programa:; Prva operacija - inicijalizacija snopa; Ako se to ne učini, nazovite podprogram ili prekinuti; neće vratiti kontrolu nazad; Pokazivač na kraju snopa postavljen je na posljednju adresu unutarnje RAM-a - Ramend LDI R16, niski (ramend) out SPL, R16 LDI R16, visok (ramen) out sph, R16; Da bi se kontrolirale LED povezane sa zaključcima PD6 i PD7; Potrebno je proglasiti ove zaključke. ; Da biste to učinili, napišite "1" na odgovarajuće bitove DDRD registra (DataDirection) LDI R16, (1<<6) | (1<<7) out DDRD,r16 ; основной цикл программы loop: ldi r16,(1<<6) ; светится один светодиод out PORTD,r16 rcall delay ; задержка ldi r16,(1<<7) ; светится второй светодиод out PORTD,r16 rcall delay ; задержка rjmp loop ; повторение цикла; процедура задержки; примерно полсекунды при частоте 7,37 МГц; три пустых вложенных цикла соответственно delay: ldi r16,30 ; 30 delay1: ldi r17,200 ; 200 delay2: ldi r18,200 ; и еще 200 итераций delay3: dec r18 brne delay3 dec r17 brne delay2 dec r16 brne delay1 ret ; возврат в главную программу

    Projekt se može sastojati od nekoliko datoteka, dok je jedna datoteka dodijeljena glavnom. Sve operacije su prikladne za proizvodnju korištenja kontekstom tipke miša. Nakon povezivanja izvorne datoteke, Windows ima sljedeći obrazac.

    Kompilacija projekta vrši se naredbom \\ projekta \\ grade ili pritiskom na tipku F7. Proces kompilacije prikazuje se u prozoru "izlaz". Ovaj prozor može biti "povlačenje" naredbe \\ View \\ izlaz.

    U principu smo već dobili izlaznu datoteku u formatu.Hex, što se već može učitati u mikrocircuit i pridržavati se povjerke LED-a. Međutim, svrha članka je pokazati cjelovit ciklus rada u AVR studijskom okruženju, tako da idemo u fazu za uklanjanje pogrešaka. To se radi od strane \\ Debug \\ Pokrenite ekipu za uklanjanje pogrešaka.

    Sada postavite frekvenciju kvarcne frekvencije 7,3728 MHz u prozoru "Opcije simulatora" kako bi precizno izmjerila vrijeme izvršenja programa.

    Preostale opcije trebaju biti nepromijenjene. Sada možete izvesti program u koraku po korak pomoću miša ili F11 tipke.

    Paket AVR Studio sadrži moćne alate za gledanje i uređivanje stanja unutrašnjih registara i I / O priključaka za uklanjanje bubreg mikrokontrolera, kao i vrijeme, izvršenje programa. Pristup njima se izvodi kroz prozor "I / O".

    U stvari, iznos informacija dostupnih putem prozora za gledanje AVR studija za gledanje prozora je toliko velik da je potrebno koristiti računar u konfiguraciji s dvije monitora kako biste dobili maksimalnu udobnost.

    Za uklanjanje našeg primjera za pristup portovima D bitama, morate otkriti i / o atmega128 nizu, a zatim portd liniju. Sada su vidljive sva tri registra ovog porta, porda, DDRD-a i PID-a. Da biste vidjeli polja vrijednosti, bita i adrese, morat ćete proširiti desnu granicu prozora, znojeći prozor s izvornim tekstom programa.

    Sada, prenošenje programa u korak po korak, možete vidjeti promjenu trenutnih stanja ovih registara u polju bitova. Moguće je brzo promijeniti stanje bilo kojeg bita portovi i to se može učiniti i pisanjem novog koda u polje vrijednosti ili direktno klikom na željeni bit registra.

    Za neovisne vježbe predlaže se sljedeći program koji se razlikuje od prethodnog koji paljenje LEDS-a kontrolira dva gumba.

    ; Primjer "LED kontrola od tastera"; napisano za as-megam dasku za uklanjanje pogrešaka; LED su povezani na PD6 i PD7 zaključci i putem otpornika - na zajedničkoj žici. ; Tasteri - na PE4 i PE5. Include "M128def.inc"; Počnite glavni program :; Inicijalizacija snopa LDI R16, niska (ramend) Out SPL, R16 LDI R16, visok (ramen) Out sph, R16; Inicijalizacija LED LED-ova R16, (1<<6) | (1<<7) out DDRD,r16 ; инициализация выводов, к которым подключены кнопки (на вход) ; внутренние подтягивающие резисторы подключены; для этого в PORTE нужно установить соответствующие биты в единицы ldi r16,(1<<4) | (1<<5) out PORTE,r16 ; а в DDRE - в нули ldi r16,0 out DDRE,r16 ; бесконечный цикл forever: in r16,PINE ; теперь в r16 находится текущее "состояние" кнопок com r16 ; кнопка "нажимается" нулем, поэтому инвертируем регистр lsl r16 ; переносим биты 4,5 в позиции 6,7 lsl r16 ; и обновляем "показания" светодиодов andi r16,(1<<6) | (1<<7) out PORTD,r16 rjmp forever ; цикл выполняется бесконечно

    Stoga su, na primjeru najjednostavnijih programa, prikazane su neke karakteristike paketa AVR Studio. Potrebno je shvatiti da je ovo samo prvi poznanik koji vam omogućava da se brzo naviknete sa osnovnim naredbama paketa. U međuvremenu, mogućnosti paketa koji se razmatraju su mnogo šire. Na primjer, ovdje možete ispraviti pogreške programe napisane jezicima na visokom nivou. Konkretno, C-Compiler kompanije Imagecraft koristi AVR Studio Debugger "kao izvorni". Da biste to učinili, prilikom sastavljanja izvornog koda trebate postaviti opciju proizvodnje izlazne datoteke u formatu kompatibilan sa AVR studio. Istovremeno, moguće je pogrešačiti u izvornim kodovima.

    Još jedna od mnogih karakteristika paketa AVR Studio mogućnost je povezivanja vanjskih programa. Na primjer, kako bi se osiguralo da je inspekcijski programer AS2 potreban za obavljanje nekoliko jednostavnih operacija.

    U meniju alata glavnog prozora AVR studio morate odabrati prilagodbu;

    U prozoru Prilagodi odaberite stavku alata;

    Dvokreirajte gumb miša ili pritiskom na tipkovnicu, dodajte novu naredbu na popis i nazovite ga "AS2 programer";

    Navedite put u izvršnu datoteku programera unošenjem izravno u polju za unos "naredba" ili klikom na "..." gumb s desne strane ovog polja;

    Sada se pojavljuje meni alata "Programer AS2".

    AVR Studio 4.08 Paket znači da vam omogućuje povezivanje pomoćnih programa - dodataka. Prvi dodatak za AVR studio je program grafičkog uređivača koji pojednostavljuje proces inicijalizacije LCD indikatora, koji može direktno upravljati AVR kontrolerom ATMEGA169. Maksimalna veličina logike LCD indikatora je 100 segmenata, svaki element indikatora izrađen je u skladu s bilom u posebnom registru kontrolera. Da biste pojednostavili postupak obvezanja rutine za određene bitove svakom segmentu, možete koristiti gore navedeni program.

    Dok je posjetio "matičnu iz AVR" - Norveška kancelarija Atmela, jedan od autora članka razgovarao je sa Lars Quener-om, šefom grupe programera, koji je stvorio i podržava paket AVR Studio. Ova osoba, klasični programer, sa bradom, u džemper i tkanim u čarapama sandale, govorili su o izgledima za razvoj paketa. Na sljedećoj verziji (4.09), sučelje će biti omogućeno za novi intrahemnoe emulator - JTAgice Mkii (naziva se i u Jtagice2), što će u drugoj polovini godine zamijeniti u jtagice. Ovaj emulator ima dvije osnovne razlike. S jedne strane, podržana podrška za novu interpužni sučelje za jednim žicom za mlađe AVR kontrolere, Debugwire. Ovo sučelje je zanimljivo jer ne zauzima dodatne zaključke mikrokontrolera za svoj rad, jer koristi za razmjenu proizvodnje mikrokontrolera za resetiranje! S druge strane (možete razumjeti ovaj izraz bukvalno), na jtagice2 emulator će se konačno pojaviti, konačno, USB sučelje za komunikaciju s računarom.

    Literatura

    1. AVR Tehnička obuka Tehnički seminarski materijali. Atmel. Norveška. Decepter 2003.
    2. Nikolay Korolev, Dmitrij Korolev AVR-mikrokontroleri druge generacije: medij programera. // Komponente i tehnologije, 2003 br. 7
    3. AVR-mikrokontroleri druge generacije: nove hardverske mogućnosti // komponente i tehnologije. 2003. br. 4.
    4. Nikolaj Korolev, Dmitrij Korolev. AVR mikrokontroleri: veliki u malom. // Schemery ", 2001, №5
    5. Nikolaj Korolev, Dmitrij Korolev. AVR mikrokontroleri: Softver // Komponente i tehnologije, 2000. br. 4.
    6. Nikolaj Korolev. AVR: programer hardver // komponente i tehnologije, 1999 № 1
    7. Nikolaj Korolev. Atmel Risc-MicroControllers // Chip-vijesti 1998, №2
    8. Nikolay Korolev, Dmitrij Korolev AVR: Novi 8-bitni RISC-mikrokontroleri kompanije Atmel // Mikroprocesor pregled, 1998, №1

    Nekako se odmah povukao da bi dao savjet o izboru programiranja okruženja za AVR kontrolere. Samo ne bacaj meni tenisice. Ja sam prilično malo

    Mnogo programiranja jezika za mikrokontrolere. Programski mediji također nisu dovoljni i u usporedbi s njima pogrešno. Ne postoje bolji programski jezici. Dakle, morate odabrati najprikladniji jezik za vas i programiranje okruženja.

    Ako ste trenutno, stanite ispred selekcije, na šta započeti s radom, evo nekoliko preporuka.

    Bivše iskustvo programiranja. Ne zanemarujte prvo iskustvo u programiranju. Čak i ako je to bio baizik. Čak i ako je bilo dugo u školi. Programiranje poput vožnje biciklom - samo morate započeti i brzo se sjećate svega zaboravljenog. Započnite s Beysikom - odbrinuti - kasnije će biti lakše odabrati nešto pogodnije za vaše potrebe.

    Pomoći okolišu.Da li vaši prijatelji pišu na Pascalu? Za vas je pitanje riješeno - pišite na Pascal! Uvijek ćete pomoći u Vijeću, biblioteke će biti bačeno u biblioteke, dat će gotove projekte. Općenito, sretno će biti odvedeno u njihovu zajednicu. Ako radite naprotiv, uzmite suprotni rezultat. Prijatelji koje su vas zabavljali koji su odlučili proučiti montažu. Ne čekajte pomoć.

    Dobra knjiga o programiranju AVR-a To će vam pomoći vrlo dobro. Nažalost, ima ih vrlo malo njih. Ako imate u rukama, i mislite da je u njemu sve vrlo dostupno. - Pokušajte. Ne savjetujem učenje putem e-knjiga, kao krajnje sredstvo, štampu. Veoma neugodno za prebacivanje između okoliša i teksta datoteke datoteke. Mnogo ugodnijim čitanjem knjige odmah pokušajte, a da ne budete ometani prebacivanjem, osim toga, možete napraviti oznaku na poljima, napišite ideje koje su nastale.

    Programski medij jednostavniji. Ako postoji izbor nekoliko programa vašeg jezičkog programiranja - ne sumnjajte, odaberite onu koja je lakše. Neka bude manje funkcionalna. Neka saspije zastrašujuće napuhani kod. Glavna stvar je samo početi raditi. Nakon što se nagnete u jednostavno okruženje, lako ćete ići na naprednije i "desno" okruženje. I ne slušajte one koji kažu da ćete izgubiti više vremena - nisu u pravu. Učenici mlađe klase se ne traži da čitaju "rat i mir", oni su im olakšali knjige - sa slikama.

    Biblioteke. Prisutnost biblioteka je kontroverzna za učenje jezika. Naravno, kasnije oni će uvelike olakšati život, ali u prvim "crnim kutijama" su neshvatljivi i ne pomažu u razumijevanju jezika. S druge strane, olakšava čitanje programa i omogućiti pridošlicu, ne posebno naprezanje, izgradnju složenih programa. Dakle, njihovo prisustvo nije posebno dosadno. Barem u početku.

    Efikasan kod. Odabir programiranja okruženja za proučavanje programiranja samo o tome koliko je efikasan kodeks kompilacije loša ideja. Uglavnom ste dobro započeli učenje - da je deseta stvar "na izlazu". Naravno, kasnije možete raditi na tome.

    Vizard.Bilo koji uređaj na brodu Kristal treba konfigurirati pomoću portova. Postupak je prilično energičan i potrebni su podaci. Pored toga, postoje nijanse u kojima novoposluga nije samo davati. Stoga je u mediju vrlo poželjno za prisustvo vizalica. Izjave su automatski SPI, I2C, USART itd. Automatska podešavanja. Što se više uređaja podržava, to bolje. Izložite potrebne periferne parametre, a sama Visard generira kôd koji će pružiti navedene parametre. Vrlo pojednostavljuje život.


    Opće preporuke Takvo - programiranje u početnoj fazi trebalo bi biti što jednostavnije (čak i ako primitivno). Programsko okruženje treba biti lako učiti (kao što vam je potrebno, za početak, naučiti programiranje i ne gubite vrijeme za odabir u postavkama). Preporučljivo je da se rusija. Takođe ne sprečava ruski priručnik i primjere programa. Poželjna je mogućnost firmvera kristala iz srednjeg. Zatim, kada napuštate osnove programiranja, možete se kretati na složenije granate.


    Još jedna preporuka, na kraju, rad sa stvarnim kristalom. Ne bojte se spaliti. Poboljšati praktično iskustvo. Rad sa emulatorima (na primer, Proteus), iako će se osloboditi od lemljenog željeza, ali nikada neće moći dati zadovoljstvo koje ćete dobiti od zarađenog programa, prve krigle od LED-a! Razumijevanje onoga što ste učinili sa vlastitim rukama Pravi radni krug bit će usavršavanje samopouzdanja i poticaj dalje!

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

    Koncept programera na LPT portu prikazan je na slici. Kao bivša guma koristite 74AC 244 ili 74HC244 Chip (K1564AP5), 74LS244 (K5555AP5) ili 74als244 (K1533AP5).

    VD1 LED ukazuje na režim snimanja mikrokontrolera,

    vD2 LED - čitanje,

    vD3 LED - prisustvo dijagrama.

    Napon potreban za uključivanje šeme uzima iz ISP priključka, I.E. sa programabilnog uređaja. Ova shema je reciklirani STK200 / 300 programer (dodane LED za jednostavno rad), tako da je kompatibilan sa svim programima programera koji rade sa STK200 / 300/300 shema. Da biste radili sa ovim programerom, koristite program Cvavr.

    Programer se može izvesti na tiskanom krugu i stavite ga u kućište LPT priključka, kao što je prikazano na slikama:




    Rad sa programerom, prikladno je koristiti Expressell LPPT priključka, koji je jednostavan za sebe (na primjer, od Cableronix kabla za štampač), glavna stvar je "ne žaliti" dirigentima za Zemlja (18-25 nogu konektora) ili kupuju. Kabl između programera i programabilnog mikrokorika ne smije biti veći od 20-30 cm.

    Pozdrav, dragi habrariti!

    U ovom članku želim reći o tome kako sam jednog dana odlučio započeti programiranje mikrokontrolera, što je bilo potrebno za to i da je na kraju ispostavilo.

    Tema mikrokontrolera zanima me već duže vrijeme, godina 2001. godine. Ali tada je dobio programer na mjestu prebivališta, a na internetu i govoru nije bilo kupovine. Morao sam odgoditi ovaj slučaj do najboljih vremena. I tako sam, jednog dana otkrio da su najbolji trenuci došli bez napuštanja kuće, možete kupiti sve što mi treba. Odlučio sam pokušati. Dakle, ono što nam treba:

    1. Programer
    Na tržištu postoji mnogo opcija - od najjeftinijeg ISP (u sistemskom programiranju) programera za nekoliko dolara, do moćnih programera za uklanjanje pogrešaka za nekoliko stotina. Bez većeg iskustva u ovom pitanju, prvo sam odlučio isprobati jednu od najlakših i najjeftinijih - USBASP. Kupio sam u jednom trenutku na eBayu za 12 dolara, sada možete pronaći čak i za 3-4 dolara. U stvari, ovo je kineska verzija programera iz Thomasa Fischla. Šta mogu reći o njemu? Samo jedna stvar - djeluje. Pored toga, postoji prilično puno AVR kontrolera Atmega i Attinke serije. Pod Linuxom ne zahtijeva vozača.

    Za firmver morate povezati VCC, GND, RESET, SCK, MOSI, MISO programera sa odgovarajućim mikrokontrolerom izlazima. Za jednostavnost sam prikupio pomoćnu shemu u pravu na muškarca:

    Ostavljeno na ploči - isti mikrokontroler koji ćemo treptati.

    2. mikrokontroler
    Uz izbor mikrokontrolera, nisam se posebno gnjavio i odlazio na Atmega8 iz Atmela - 23 I / O Bor, dva 8-bitna tajmera, jedan 16-bitni, frekvenciju - do 16 MHz, male potrošnje (1-3,6 MA) , jeftino ($ 2). Općenito, za početak - više nego dovoljno.

    Pod Linuxom za kompiliranje i preuzimanje firmvera na regulatoru, AVR-GCC + AVRDEDE BUNDLE savršeno funkcionira. TRIVIJAL ZA USTAVLJANJE. Nakon uputa, možete instalirati sve što vam je potrebno za nekoliko minuta. Jedini neance, koji bi trebali biti uplaćeni - Avrdude (softver za snimanje na kontroloru) može zahtijevati od super korisničkog prava na pristup programeru. Izlaz - prolazi kroz sudo (ne baš dobru ideju) ili registrujte posebna prava UDEV prava. Sintaksa se može razlikovati u različitim verzijama OS-a, ali u mom slučaju (Linux Mint 15) učinjeno je dodavanjem sljedeće pravila na datoteku /etc/udev/rules.d/41-atmega.rules:

    # USBASP programer podsistem \u003d\u003d "USB", atter (idvendor) \u003d\u003d "16c0", atrt (idproduct) \u003d\u003d "05DC", grupa \u003d "PLUPDEV", MODE \u003d "0666"

    Nakon toga, naravno, potrebna je ponovno pokretanje usluge.
    Servis Udev Restart.
    Možete sastaviti i bljesnuti bez ikakvih problema direktno iz naredbenog retka (ko bi sumnjao), ali ako postoji mnogo projekata, prikladnije je da dodatak stavite i učinite sve izravno iz okruženja pomračenja.

    Pod Windowsom će morati isporučiti vozača. U ostalo nema problema. Za naučni interes pokušao sam AVR studio + ekstremni paket gorionika u Windows-u. Opet sve radi sa praskom.

    Počinjemo programiranje

    Programiranje AVR kontrolera mogu biti i na anteru (AVR sklopnik) i na C. Ovdje mislim da svi moraju sami izbora, ovisno o specifičnom zadatku i njenim preferencijama. Lično sam prvi počeo da odaberem montažu. Kada se programiraju na antenaru, arhitektura uređaja postaje jasnija i čini se da se osjećaj kopaju direktno u unutrašnjosti kontrolera. Pored toga, vjerujem da u posebno kritičnim programima znanje o assedniku može biti vrlo korisno. Nakon upoznavanja sa AVR asembler, prelazim na SI.

    Nakon poznanstva sa arhitekturom i osnovnim principima odlučio sam prikupiti nešto korisno i zanimljivo. Moja ćerka mi je pomogla, radila je šah i jednu prekrasnu večer proglasila da želi imati sat vremena za serije na neko vrijeme. Batz! Evo ga - ideja prvog projekta! Bilo je moguće naručiti ih na istoj eBayu, ali želio sam napraviti vaš sat, sa crnim ... uh ... sa pokazateljima i tipkama. Ne prije nego što je to učinio!

    Kao prikaz, odlučeno je da se koristi dva indikator diode 7 segmenta. Za kontrolu je bilo dovoljno 5 tipki - "Player 1", "Player 2", "Resetiranje", "Podešavanje" i "Pause". Pa, ne zaboravite na zvučnu indikaciju igre. Izgleda da je to to. Na slici ispod prikazan je opći dijagram povezivanja mikrokontrolera na indikatore i tipke. Trebat će joj prilikom raščlanjivanja izvornog koda programa:

    Filcessing Let

    Počnimo, kao što bi trebalo biti, od ulazne točke programa - glavne funkcije. U stvari, u njemu ništa ne postoji - postavljanje portova, inicijalizacije podataka i beskonačno dugme pritiska. Pa, poziv SEI () je rezolucija prerade prekida, o njima nešto kasnije.

    Int main (nevažeći) (init_io (); init_data (); sound_off (); sei (); dok (1) (ručka_buttons ();) povratak 0;)
    Razmotrite svaku funkciju odvojeno.

    Void init_io () (// Podesite izlaz DDRb \u003d 0xff; DDRD \u003d 0xff; // Podesite ulaz DDRC \u003d 0b11100000; // portc-up-up otpornici | \u003d/700011111; // Timemer prekida timsk \u003d (1<

    Postavljanje I / O portova je vrlo jednostavno - u DDRX registar (gdje je x slovo, označavajući port), od kojih svaki način znači da li će odgovarajući PIN biti ulaznik (odgovara 0) ili izlaz (odgovara 0) ili izlaz (odgovara 0) ili izlazu (odgovara 0) ili izlaz do 1). Dakle, Seasushal u DDRB i DDRD broj 0xff, napravili smo b i d izlazne portove. U skladu s tim, naredba DDRC \u003d 0B11100000; Ulazne igle pretvara prvih 5 portova porta C u ulazne pinove, a preostali vikend. Timski portnik | \u003d 0b00011111; Uključuje unutrašnje otporne za zatezanje 5 ulaza kontrolera. Prema shemi, gumbi su povezani s tim ulazima, koji su ih pritisnuti na zemlju. Dakle, kontroler razumije da se dugme pritisne.

    Zatim slijedite postavljanje dva tajmera, timer0 i tajmer1. Koristimo prvo za ažuriranje pokazatelja, a drugo - za odbrojavanje vremena, nakon što ga postavite na pokretanje svake sekunde. Detaljan opis svih konstanti i metoda postavljanja tajmera u određeni interval mogu se naći u dokumentaciji za ATmega8.

    Prekid obrade

    ISR (prikaz (); ako (_Buzzer\u003e 0) (_Buzzer--; IF (_Buzzder \u003d\u003d 0) Sound_Off ()))))) ISR (Timer1_ComPA_VEct) (ako (ActiveTimer \u003d\u003d 1 i & timer1\u003e 0) (Timer1-- ; ako (Timer1 \u003d\u003d 0) proces_titimeoff ();) ako (ActiveTimer \u003d\u003d 2 && Timer2\u003e 0) (Timer2--; IF (Timer2 \u003d\u003d 0) proces_imetionff ();)

    Kada se tajmer aktivira, kontrola se prenosi na odgovarajući obračun prekidača. U našem slučaju, ovo je procesor Timer0_oVF_VEct, koji uzrokuje vremenski izlaz postupak pokazatelja i Timer1_ComPA_VEct, koji obrađuje odbrojavanje.

    Zaključak na pokazatelje

    Nevažeći ekran () (display_number ((Timer1 / 60) / 10, 0B00001000); _Delay_ms (0,25); Display_number ((Timer1 / 60)% 10, 0B00000100); _Delay_ms (0,25); Display_number (((Timer1% 60) / 10, 0B00000010); _Delay_ms (0,25); Display_number ((Timer1% 60)% 10, 0B00000001); _Delay_ms (0,25); Display_number ((TIMER20000000); _Delay_ms (0,25); Display_number ((TIMER2 / 60)% 10, 0B01000000); _Delay_ms (0,25); Display_number ((Timer2% 60) / 10, 0B00100000); _Delay_ms (0,25); Display_number (((Timer2% 60)% 10, 0B00010000); _Delay_ms (0,25) ; portd \u003d 0;) void displej_number (int broj, int maska) (portb \u003d broj_mask (broj); portdd \u003d maska;)

    Funkcija prikaza koristi dinamičku metodu indikacije. Činjenica je da svaki pojedinačni pokazatelj ima 9 kontakata (7 za kontrolu segmenata, 1 za točku i 1 za napajanje). Za kontrolu 4 cifara trebalo bi 36 kontakata. Previše rasipno. Stoga je izlaz pražnjenja na višecifreni pokazatelj u skladu sa sljedećim principom:

    Napon se naizmjenično hranio svakom od zajedničkih kontakata, što vam omogućava da označite željenu figuru u odgovarajućem indikatoru koristeći isti 8 kontrolnih kontakata. Uz dovoljno visoku izlaznu frekvenciju izgleda kao statička slika. Zbog toga su svi kontakti opskrbe oba pokazatelja na dijagramu spojeni na 8 portova porta D, a 16 segmenata kontaktnih kontrola povezani su u parovima i spojeni na 8 portova porta B. Dakle, funkcija ekrana s kašnjenjem od 0,25 MS naizmenično prikazuje željeni broj svakom od pokazatelja. Do kraja, svi izlazi koji hrane napon na indikatore su isključeni (naredba portdd \u003d 0;). Ako se to ne učini, posljednja dimenzija ekrana nastavit će sagorjeti sve dok se sljedeći poziv naziva funkcija ekrana, koja će dovesti do njenog svjetlijoj luminogramici u odnosu na ostalo.

    Liječenje preše

    Void ručka_buttons () (tipka_tup (tipka_reset); ručka_button (tipka_putton (ključ_player1); ručka_button (tipka_player2);) void ručka_button (int tipka) (tipka) (tipka) (tipka) (tipka) (tipka) \u003d Prekid; case tipka_reset: bit \u003d reseting_bit; bit \u003d pause_bit; pauza; case cjevay_player1: bit \u003d player1_bit2: bit \u003d player2_bit; pauza; zadano: povratak;) ako (bit_is_clear ( Dugme_pin, bit)) (ako (_pressed_ms (debounce_time); ako (bit_is_clear (dugme_pin, bit) (_pressed | \u003d tipka; // Key_Setup: CASE_SET; CASE CESTE_RESET : proces_reset (); pauza; CASE_Pause (); pauza; case_player1 (); pauza; case_player2 (); pauza;) sound_on (15);))) drugo (_pressied & \u003d ~ ključ ;))

    Ova značajka na ispitivanju zauzvrat svih 5 tipki i procesa Pritisnite, ako se takvi dogodilo. Prešanje je registrirano provjerom bit_is_clear (dugme_pin, bit), tj. Pritisnite tipku ako ulaz koji odgovara njemu povezan je na zemlju, što će se dogoditi u skladu s shemom, kada pritisnete tipku. Za odlaganje kašnjenja trajanja_time i ponovna provjera potrebni su za izbjegavanje više nepotrebnih odgovora zbog zveckanja kontakata. Spremanje statusa štampe u odgovarajućim varijablim bitovima _pressed se koristi za uklanjanje ponovnog pokretanja s dugom gumbom za štampu.
    Pritiskom na funkcije su prilično trivijalne i vjeruju da u dodatnim komentarima ne treba.

    Potpuni tekstni program

    #Define f_cpu 4000000l #include #Include. #Include. #define DEBOUNCE_TIME 20 define BUTTON_PIN PZZP define SETUP_BIT PC0 define RESET_BIT PC1 define PAUSE_BIT PC2 define PLAYER1_BIT PC3 define PLAYER2_BIT PC4 define KEY_SETUP 0b00000001 define KEY_RESET 0b00000010 define KEY_PAUSE 0b00000100 define KEY_PLAYER1 0b00001000 define KEY_PLAYER2 0b00010000 volatile int ActiveTimer \u003d 0; Volatilni Int Timer1 \u003d 0; Volatile Int Timer2 \u003d 0; Volatile int _buzzer \u003d 0; Volatile Int _pressed \u003d 0; // Deklaracije funkcija void init_io (); void init_data (); Int numering_mask (int num); void ručka_buttons (); void ručka_button (Int tipka); Void proces_setup (); Void proces_reset (); void proces_pause (); void proces_timeoff (); Void proces_player1 (); Void proces_player2 (); nevažeći prikaz (); void displej_number (int maska, int broj); Nevažeći zvuk_on (interval int); void sound_off (); // prekidati ISR \u200b\u200b(prikaz (); ako (_Buzzer\u003e 0) (_Buzzer--; ako (_Buzzder \u003d\u003d 0) sound_off ()))))) ISR (IF (ActiveTimer \u003d\u003d 1 && Timer1\u003e 0) ( Timer1--; IF (Timer1 \u003d\u003d 0) proces_timeoff ();) ako (ActiveTimer \u003d\u003d 2 && Timer2\u003e 0) (Timer2 \u003d\u003d 0) proces_imetionff ()))))) (init_io (); init_data (); sei (); sei (); dok (1) (ručka_buttons ();) povratak 0;) void_io () (// postavljena izlaz ddrb \u003d 0xff; // set Ulaz DDRC \u003d 0b11100000; // Portc-up otpornici portc | \u003d 0b00011111; // TIMER prekida timsk \u003d (1< 5940 || TIMER2\u003e 5940) (Timer1 \u003d 0; Timer2 \u003d 0;)) Void proces_reset () (init_data ();) void proces_timeoffffff ();) zvuk_on (30);) (ActiveTimer \u003d 0;) void procese_player1 () (ActiveTimer \u003d 2;) void proces_player2 () (aktivan) _player2 () (ActiveTimer \u003d 1;) praznina ručka_button (tipka_etup_bit; pauza; bit \u003d reseting_bit; pauza; Case Key_Pause: BIT \u003d Pause_Player1: Bit \u003d Player1_bit; Break; Case Key_Player2: Bit \u003d Player2_bit; Break; Default: Povratak;) Ako (tipka_pin, bit)) (ako (_Presed \u003d\u003d 0) ( _delay_ms (debonci_time); ako (Bit_IS_Clear (gumb_pin, bit)) (_Presed | \u003d tipka; proces_setup (); pauza; case_reset (); prekidač; case_pause (); pauza; case couter_player1 : proces_player1 (); pauza; case tipke_player2: proces_player2 (); pauza;) zvuk_on (15);))) drugo (_Pre SSED & \u003d ~ ključ; )) Void ručka_buttons () (tipka_button (ključ_reset (tipka_button (tipka_putton (tipka_button (ključ_player1); ručka_button (taster_player2);) nevažni displej () (TIMER1 / 60) / 10, 0B00001000) ; _Delay_ms (0,25); Display_number ((Timer1 / 60)% 10, 0B00000100); _Delay_ms (0,25); Display_number ((Timer1% 60) / 10, 0B00000010); _Delay_ms (0,25); Display_number (((TIMER1% 60) % 10, 0B00000001); _Delay_ms (0,25); Display_number ((Timer2 / 60) / 10, 0B10000000); _Delay_ms (0,25); Display_number ((TIMER2000000); _Delay_ms (0,25); Display_number ((0,25); TIMER2% 60) / 10, 0B00100000); _Delay_ms (0,25); Display_number (((Timer2% 60)% 10, 0B00010000); _Delay_ms (0,25); portdd \u003d 0;) nevažeći displej_Number (int number_mask) (portb \u003d broj_mask ( Broj); portd \u003d maska;) nevaljani zvuk_on (INT interval) (_Buzzer \u003d interval; // stavite zvučni pin visoki portc | \u003d 0b00100000;) void sound_off () (// stavite zvučni pin niski portc & \u003d ~ 0B00100000;)

    Prototip je sastavljen na odlagališnom dasku.