AVR: programovanie v prostredí AVR Studio. Integrované ladiace prostredie AVR Studio od Atmel Avr studio

Ak chcete pracovať s AVR Studio 4, musíte si ho nainštalovať samostatne. Ak je už nainštalovaný, môžete tento krok preskočiť.

Inštalácia:
vytvorte adresár c:/avr/ - tu budú umiestnené pracovné programy.
vytvorte si adresár, napríklad c:/works/ – tu budú uložené vaše diela.
Je potrebné, aby existovali skratky, aby s nimi neboli žiadne problémy.

Vo všeobecnosti existuje AVRStudio5, ale AVRStudio4 je stále dosť.

Všetky práce budú prebiehať v AVRStudio4, WinAVR je potrebný len kvôli knižnici AVR-GCC (aby ste mohli písať v C)
ALE! Najprv musíte nainštalovať WinAVR, inak sa knižnica AVR-GCC nevyzdvihne.

Myslím, že tu na to prídeš.
AVR-GCC pre zápis v C
Atmel Avr Assembler resp. pre assembler.

Je lepšie začať chápať MK od začiatku. A to znamená z Assemblera, čo znamená, že vytvoríte ten, ktorý je Atmel AVR Assembler.

Potom vyberte mikrokontrolér Atmega8.

keď sa projekt vytvorí, bude tam veľká biela prázdna tabuľka. tu bude kód.

trochu o obsahu tohto listu

„komentáre“ sú text, ktorý kompilátor pri kompilácii preskočí.
pred začiatkom komentára musí byť špeciálny symbol, používam symbol; „bodkočiarka“, existuje aj „dvojitá lomka“ (//),
tu sú príklady komentárov

/* * Komentár tohto typu (viacriadkový), * zvyčajne sa používa na * sprievodnú informáciu * o zdrojovom kóde, t.j. * meno, vývojár atď. */ NOP // Tento komentár sa používa hlavne na vysvetlenie účelu príkazu alebo časti kódu SLEEP ; Tento komentár, rovnako ako predchádzajúci, možno použiť na vysvetlenie (pre poznámky) v kóde

príkazy sú napísané na každom riadku. tie. jeden príkaz - jeden riadok.
Povedzme, že existujú príkazy s dvoma „parametrami“, s jedným alebo bez ničoho

MOV R16, R17 ; dva parametre INC R16 ; jeden parameter SEI; bez parametrov

MOV R16, R17 ; tri bajty INC R16; dva bajty SEI; jeden bajt

Vidíte súvislosť medzi veľkosťou tímu a parametrami?

Každý mikrokontrolér má svoj vlastný assembler, aj keď ich mnemotechnické pomôcky sú podobné, t.j. Príkaz MOV pre MK jednej série bude hľadať v strojovom kóde, povedzme 0x12, a pre inú 0x55.
Aby pri kompilácii bol skompilovaný v kóde, ktorý potrebujeme, musíme kompilátoru povedať, pre ktorý mikrokontrolér program píšeme.
Toto sa vo všeobecnosti vyberá pri vytváraní projektu.
Z tohto dôvodu sme zvolili mikrokontrolér Atmega8.

Ale to nie je všetko. Aby sme si uľahčili život, AVRStudio4 má súbor konštánt, ktoré sa nazývajú niečo ako „Macroassembler“.

Aby ste ich mohli načítať, musíte vložiť riadok na začiatok kódu

Include "m8def.inc" // pomocou príkazu .include sme načítali súbor m8def.inc; a teraz to bude pre nás jednoduchšie;)

Na samom začiatku kódu je umiestnená tabuľka prerušení. Čo to je a ako to funguje, vysvetlím v inom príspevku. Ale zatiaľ to napíšme takto:

RJMP RESET; Reset Handler RETI; RJMP EXT_INT0 ; IRQ0 manipulátor RETI; RJMP EXT_INT1 ; IRQ1 Handler RETI; RJMP TIM2_COMP ; Timer2 Porovnanie Handler RETI; RJMP TIM2_OVF ; Timer2 Overflow Handler RETI; RJMP TIM1_CAPT ; Timer1 Capture Handler RETI; RJMP TIM1_COMPA ; Timer1 CompareA Handler RETI; RJMP TIM1_COMPB ; Timer1 CompareB Handler RETI; RJMP TIM1_OVF ; Timer1 Overflow Handler RETI; RJMP TIM0_OVF ; Timer0 Ovládač pretečenia RETI; RJMP SPI_STC ; SPI Transfer Complete Handler RETI; RJMP USART_RXC ; USART RX kompletný manipulátor RETI; RJMP USART_UDRE ; UDR Empty Handler RETI; RJMP USART_TXC ; Kompletný manipulátor USART TX RETI; RJMP ADC; Kompletný manipulátor konverzie ADC RETI; RJMP EE_RDY ; EEPROM Ready Handler RETI; RJMP ANA_COMP ; Analógový komparátor RETI; RJMP TWSI ; Dvojvodičový ovládač sériového rozhrania RETI; RJMP SPM_RDY ; Store Program Memory Ready Handler

Potom nasleduje samotný kód

REŠTART: ; inicializačný token MAIN: NOP ; značka hlavnej slučky RJMP MAIN

Ale je tu jedna (alebo skôr nie jedna, ale veľa) funkcií.

Pre pohodlie pri písaní kódu, pre jeho prehľadnosť a uľahčenie relatívnych prechodov sme dostali značky, ako vyzerajú? „RESET:“ a „MAIN:“ sú značky; ich názvy môžu obsahovať takmer akékoľvek latinské znaky a čísla. Značky nemôžu mať názvy funkcií a príkazov, napríklad „NOP“.
Ako sa k nim človek dostane? Povedzme príkaz RJMP.

Taktiež z Markers môžeme urobiť podprogram (postup), po dokončení ktorého sa vrátime tam, odkiaľ bol vyvolaný. Na jej zavolanie použite príkaz „RCALL (podprogram)“ a na návrat z podprogramu (postupu) ho musíte ukončiť príkazom „RET“. Mali by sme skončiť s kódom takto:

RESTART: MAIN: NOP RCALL PPP1 ; zavolajte podprogram RJMP MAIN PPP1: NOP RET ; ukončiť podprogram

Ako funguje príkaz „RCALL“, keď je zavolaný, adresa, z ktorej bol volaný, sa umiestni do ZÁSOBNÍKA a pri zavolaní príkazu „RET“ sa odstráni z registra „zásobník“. STACK je potrebné inicializovať.

Aby sme mohli pracovať s naším MK, musíme ho inicializovať. pretože mk, toto zariadenie je univerzálne, má veľa vstupných/výstupných portov a periférnych zariadení. ako USART, PWM, DAC, ADC atď. Prvým krokom pri inicializácii mikrokontroléra je označenie začiatku „zásobníka“. Inicializáciu vykonáme po značke „RESET:“.

LDI R16,VYSOKÝ(RAMEND) VÝSTUP SPH,R16 LDI R16,NÍZKY(RAMEND) VÝSTUP SPL,R16

Ak by sme na začiatok kódu nezadali príkaz .include „m8def.inc“, museli by sme ho napísať takto:

LDI R16,0x04 OUT SPH,R16 LDI R16,0x5f OUT SPL,R16

Rozdiel je podľa mňa podstatný.

STACK je pamäť typu úložiska: (posledný dnu, prvý von).
Typ predajne nie je supermarket, ale klaksón zo samopalu. Dúfam, že si každý vie predstaviť, ako sa do nej vkladajú kazety a ako sa odtiaľ potom vyberajú.
Pamäti STACK musíte venovať veľkú pozornosť, pretože... akákoľvek menšia chyba pri práci s ním môže viesť k zlyhaniu zásobníka. Toto je taká dôležitá téma, že som sa jej rozhodol venovať celú jednu tému a napíšem ju do samostatnej poznámky.

Tak sme dostali nasledujúci kód:

Zahrnúť "m8def.inc" RJMP RESET ; Reset Handler RETI; RJMP EXT_INT0 ; IRQ0 manipulátor RETI; RJMP EXT_INT1 ; IRQ1 Handler RETI; RJMP TIM2_COMP ; Timer2 Porovnanie Handler RETI; RJMP TIM2_OVF ; Timer2 Overflow Handler RETI; RJMP TIM1_CAPT ; Timer1 Capture Handler RETI; RJMP TIM1_COMPA ; Timer1 CompareA Handler RETI; RJMP TIM1_COMPB ; Timer1 CompareB Handler RETI; RJMP TIM1_OVF ; Timer1 Overflow Handler RETI; RJMP TIM0_OVF ; Timer0 Ovládač pretečenia RETI; RJMP SPI_STC ; SPI Transfer Complete Handler RETI; RJMP USART_RXC ; USART RX kompletný manipulátor RETI; RJMP USART_UDRE ; UDR Empty Handler RETI; RJMP USART_TXC ; Kompletný manipulátor USART TX RETI; RJMP ADC; Kompletný manipulátor konverzie ADC RETI; RJMP EE_RDY ; EEPROM Ready Handler RETI; RJMP ANA_COMP ; Analógový komparátor RETI; RJMP TWSI ; Dvojvodičový ovládač sériového rozhrania RETI; RJMP SPM_RDY ; Uložiť program Memory Ready Handler RESET: LDI R16,HIGH(RAMEND) OUT SPH,R16 LDI R16,LOW(RAMEND) OUT SPL,R16 RGMP RESET MAIN: NOP ; značka hlavnej slučky RJMP MAIN

V tejto fáze môžeme skompilovať projekt a spustiť ho na ladenie, ale keďže náš kód nič nerobí, bude možné identifikovať iba syntaktické chyby v kóde.

Pre správny proces ladenia je potrebné nastaviť emulátoru frekvenciu, s ktorou bude MK pracovať, to sa robí až po skompilovaní a spustení ladenia,
To znamená, že na paneli s ponukami nájdeme „Build“, otvoríme ho a uvidíme „Build and Run“, po ktorom uvidíme žltú šípku oproti prvému príkazu v našom zozname kódov. Teraz hľadáme „Debug“ na paneli s ponukami a klikneme na „Možnosti AVR Simulatora“, otvorí sa nasledujúce okno:

V ktorom môžeme zmeniť MK a jeho frekvenciu, tiež na paneli vpravo vidíme nejaké informácie o našom MK: jeho maximálnu frekvenciu, kapacitu pamäte (EEPROM, RAM, FLASH). Teraz otvorte datasheet na Atmega8 na strane 203 (všeobecný zoznam registrov) a 205 (všeobecný zoznam príkazov) a začnite písať svoj program.
A pamätajte, že sa nebojte experimentovať so simulátorom, nerozbije sa!


Ahoj.

Tento článok osloví tých, ktorí veria, že „vyrástli“ z Arduina a sú pripravení vstúpiť do sveta „seriózneho“ programovania mikrokontrolérov. Okrem toho, že „napumpujete svoje programátorské schopnosti“, budete mať možnosť vybrať si pre svoje projekty ľubovoľný mikrokontrolér a samozrejme oceníte rýchlosť programov a veľkosť pamäte, ktorú zaberajú.

Všetko bude popísané (pre    ), od začiatku do konca, - inštalácia a príprava potrebného softvéru, montáž najjednoduchšieho programátora „Gromov“ (neľakajte sa, sú tam len tri diódy a sedem rezistorov), firmware MK a písanie kódu v AVR Studio. Celý proces bude sprevádzaný ilustráciami a príkladmi.

Dovoľte mi hneď urobiť rezerváciu: počítač musí byť vybavený portom COM (adaptér USB na COM nefunguje dobre). Ak váš počítač nemá takýto konektor na zadnej strane, potom je pravdepodobne na základnej doske (vo forme kolíkov), všetko sa dá vyriešiť týmto druhom „vysunutia“

Bohužiaľ, pre majiteľov notebookov bez COM je článok len akademickým záujmom.

Takže, začnime…

Čo budete potrebovať?

"mäkký"


UniProf- univerzálny program na flashovanie rôznych mikrokontrolérov ATmega, jednoduchý a pohodlný, a čo je najdôležitejšie, perfektne spolupracuje s naším programátorom. Autorom je ruský vývojár Michail Nikolaev.

Samozrejme, môžete flashovať MK od AVR Studio, ale na to potrebujete špeciálny programátor. Preto napíšeme kód v štúdiu a výsledné hex súbory flashujeme s UniProf pomocou nášho domáceho programátora. Okrem toho bude opísaný spôsob flashovania firmvéru z príkazového riadku.

Používatelia Linuxu budú musieť použiť virtuálny stroj alebo Wine. S Wine mi to nevyšlo, port vôbec nevidím a s virtuálnym strojom som to neskúšal.

  Vo Wine funguje bezchybne (Debian 8.5, wine1.6).

Všetok softvér je bezplatný.

"železo"

Budeme vykonávať experimenty na Arduino pro mini s čipom ATmega328. Frekvencia kremeňa (8/16 MHz), ako aj napätie (3,3/5V), nezáleží. (Pozri nižšie)

V budúcnosti budete programovať rôzne mikrokontroléry Atmel, ale na prvýkrát je táto doska tak akurát. Je to dobré, pretože je to prakticky holý ovládač s minimálnou kabelážou a spájkovanými kolíkmi. Presne to, čo potrebujete.

O značkách na mikrokontroléroch

Za menom sú čísla, ktoré najčastejšie označujú množstvo pamäte.

Písmeno za číslami označuje parametre napájacieho napätia.

Žiadny list- napájacie napätie regulátora je v rozmedzí 4,5-5,5 voltov.
L- verzie ovládačov pracujúcich pri redukovanom režime (nízka) napájacie napätie (2,7 - 5,5 voltov).
V- verzie ovládačov pracujúcich na nízkom napájacom napätí (1,8-5,5 voltov).
U- verzie ovládačov pracujúcich na ultranízkom napájacom napätí (0,7-5,5 voltov).
P- verzie s nízkou spotrebou energie (až 100 nA v režime vypnutia).
A- znížená spotreba prúdu, pokrývajúca celý rozsah taktovacej frekvencie všetkých verzií, napájacie napätie 1,8-5,5 voltov (v niektorých modeloch boli pridané nové funkcie a nové registre pri zachovaní plnej kompatibility s predchádzajúcimi verziami).

Mikrokontroléry « A" a nie- A" majú zvyčajne rovnaký podpis, čo spôsobuje určité ťažkosti, pretože bity poistky sú odlišné.

Príklady:

ATmega8- kapacita pamäte programu je 8 kilobajtov, napájacie napätie je 4,5-5,5 voltov.
ATmega8L- kapacita pamäte programu je 8 kilobajtov, napájacie napätie je 2,7-5,5 voltov.
ATtiny43U- kapacita pamäte 4 kilobajty, modifikácia - 3, napájacie napätie - 0,7-5,5 voltov.
ATtiny44A- kapacita pamäte 4 kilobajty, modifikácia - 4, znížená spotreba prúdu, napájacie napätie 1,8-5,5 voltov.

Stáva sa, že ovládač bez písmena môže mať znížené napájacie napätie (1,7 alebo 1,8 voltu). Toto je potrebné objasniť v údajovom liste.

ATtiny841- kapacita pamäte 8 kilobajtov, modifikácia - 41, napájacie napätie - 1,7-5,5 voltov.

Za pomlčkou je uvedená verzia mikrokontroléra pozostávajúca z čísel označujúcich maximálnu frekvenciu kontroléra (pri vhodnom napájacom napätí) a z písmen označujúcich možnosť krytu, rozsah prevádzkových teplôt a výrobné vlastnosti.

Jedno alebo dve písmená za frekvenciou označujú typ krytu:

UniProf
Napísanie programu je polovica úspechu, stále ho musíte nejako vtesnať do ovládača. Tak tomu venujme viac pozornosti.

Bolo by pekné, keby vaše Arduino bolo nabité štandardným Blinkom (dodáva sa s ním z výroby).

Spustíme UniProf... Možno sa objaví nasledujúce okno:

Toto je pripojené k portu LPT, takže stačí kliknúť OK.

Potom sa otvorí okno programu:

Ak port nie je vybratý správne, zobrazí sa okno s otázkou...

Kliknite na tlačidlo OK a vyberte požadovaný port.

Ak sa MK nezistí automaticky, zobrazí sa okno s manuálnym výberom:

Bohužiaľ nie na zozname atmega328, tak si vyberáme mega32 (majú rovnaké množstvo flash pamäte) a stlačte OK.

Potom sa namiesto slova neznámy zobrazí pripojený ovládač...

32 tis je množstvo pamäte Flash a 1024 - Objem EEPROM.

Teraz, ak je všetko ako na obrázku, otvorte pomocníka   a pozorne si prečítajte, čo je tam napísané. Autor bol veľmi stručný, takže to nezaberie veľa času. Zatiaľ nestláčajte žiadne tlačidlá.

Stretol si? Skvelé, teraz môžeme ísť ďalej. Zrušte začiarknutie políčka vedľa EEPROM a uvidíte zmenené rozhranie:

Po zrušení začiarknutia políčka EEPROM sa čítanie a zápis tejto oblasti pamäte nevykoná.

Keďže budeme pracovať s hex súbormi, odstránime „začiarknutia“ generál A BIN a tiež začiarknite políčko Brzda!, predĺži sa tým čas čítania/zápisu, ale zvýši sa stabilita.

Proces nie je rýchly, takže budete musieť počkať. Nižšie sa budú plaziť modré štvorce a čísla sa budú počítať v pravom dolnom rohu. Prvý prechod načíta oblasť PROGRAM a druhý načíta EEPROM.

Mám nové Arduino so zabudovaným štandardným Blinkom (keď je programátor pripojený, dióda prestane blikať). Ak máte to isté, zobrazí sa nasledujúci obrázok:

Vpravo vidíme, že v EEPROM nie je nič a vľavo v PROGRAME je nahratý program (ako som povedal, toto je Blink). Teraz pomocou šípky nadol posúvajte posúvač, kým sa neminú údaje...

...teraz prejdite na koniec. Uvidíte viac údajov - toto je zavádzač Arduino.

Teraz navrhujem oddýchnuť si od môjho článku a prečítať si o štruktúre MK, čo výrazne zvýši vaše pochopenie materiálu. Všetko je napísané veľmi dobre a zrozumiteľne. Keď si to prečítate, vráťte sa a pokračujeme...

Zrušte začiarknutie EEPROM. V skutočnosti to nepotrebujeme, ale bude jasné, že existuje „tik“ Brzda!

Teraz uložíme všetko, čo je firmvér v ovládači, aby sme ho po experimentoch vrátili do pôvodného stavu.

Stlačte tlačidlo   a uložte firmvér, nazvite ho nejako ako - origProMini328.hex. To je všetko, teraz máte zálohu.

... a potom kliknite na už známe tlačidlo Čítať. Potom uvidíte, že všetky bunky v PROGRAME sú prázdne. Bol odstránený nielen program, ale aj bootloader Arduino.
To znamená, že teraz nebudete môcť nahrať náčrty tradičnou metódou. Potom, ak chcete, ľahkým mávnutím ruky obnovte všetko zo zálohy.

Teraz preblikneme ovládač s rovnakým „Blink“, iba napísaným v AVR Studio.

Takto vyzerá kód:

#define F_CPU 16000000UL #include #include #define PIN_PB5 5 // PB5 (Arduino - D13) #define PIN_PB5_PORT PORTB #define PIN_PB5_DDR DDRB int main(void) ( PIN_PB5_DDR = 1<< PIN_PB5; // устанавливаем PIN_PB5 (PB5 (ардуина - D13)) как ВЫХОД while(1) { PIN_PB5_PORT = 1 << PIN_PB5; _delay_ms(300); PIN_PB5_PORT = 0 << PIN_PB5; _delay_ms(300); } return 0; }
Ak použijete Arduino s 8 MHz quartzom, tak na tom nie je nič zlé, len bude dióda blikať o polovicu častejšie.

Tu je, koľko miesta zaberá:

AVRDude

Uniprof, podobne ako mnoho iných podobných programov, je iba grafickým doplnkom nad programom AVRDude (AVR Downloader-Uploader), ktorý následne vykoná všetky vyššie opísané úkony na mikrokontroléri.
Pretože AVRDude nemá vlastné grafické rozhranie, musíte s ním pracovať z príkazového riadku. Niekomu sa to môže zdať nepohodlné, ale je to práve naopak; práca z konzoly je jednoducho skvelá. Pohodlné, jednoduché a neviazané na žiadny OS, pretože avrdude existuje snáď na všetko. Teraz to uvidíte.

Pre používateľov

Avrdude je súčasťou AVR toolchain, tak si ho nainštalujte (po inštalácii AVR Studio) ako je napísané na začiatku článku.

cd\
...prejdite do koreňového adresára disku S.

Zadaním príkazu:

Ak je to tak, potom avrdude pripravený ísť a pokračovať.

Teraz musíme pridať nášho programátora do konfiguračného súboru avrdude (C:\Program Files (x86)\Atmel\AVR Tools\AVR Toolchain\bin\ avrdude.conf) . Otvorte ho v programe Poznámkový blok++ a za nápis „DEFINÍCIE PROGRAMÁTOROV“ pridajte tieto riadky:

ID programátora = "gromov"; desc = "nabíjanie sériového portu, reset=dtr sck=rts mosi=txd miso=cts"; typ = srb; reset = 4; scck = 7; mosi = 3; miso = 8; ;
Bit-búchanie.

Uložte a zatvorte súbor; už nie je potrebný.

Vráťte sa do terminálu a zadajte príkaz na kontrolu komunikácie medzi MK a programátorom:

Avrdude -n -c gromov -P com1 -p m328p
Môžete mať iný komunikačný port.

Inštalácia avrdude

Sudo apt install avrdude

Zadaním príkazu:

Mali by ste vidieť pomocné informácie.

Ak je to tak, potom avrdude pripravený na prácu.

Nakonfigurujte port:

Sudo stty 9600 ignbrk -brkint -icrnl -imaxbel -opost -isig -icanon -iexten -echo noflshToto je potrebné vykonať po každom reštarte počítača alebo ho pridať do rc.local.

Kde je /dev/ttyS0 com1, /dev/ttyS1 - com2 atď.
V budúcnosti budem písať v tímoch /dev/ttyS0, možno máte /dev/ttyS1 atď.

Pridajte programátor do konfiguračného súboru /etc/avrdude.conf

Sudo nano /etc/avrdude.conf

Za „DEFINÍCIE PROGRAMÁTOROV“ pridajte nasledujúce riadky:

ID programátora = "gromov"; desc = "nabíjanie sériového portu, reset=dtr sck=rts mosi=txd miso=cts"; typ = "serbb"; reset = 4; scck = 7; mosi = 3; miso = 8; ;
Programátor používa technológiu Bit-banging.

Uistite sa, že pri kopírovaní zostanú úvodzovky len úvodzovkami, inak sa môžu zmeniť (kvôli rozdielom v kódovaní) a avrdude bude nadávať.

Uložte a zatvorte súbor.

Zadajte príkaz na kontrolu spojenia medzi MK a programátorom:

Sudo avrdude -n -c gromov -P /dev/ttyS0 -p m328p

Ak existuje spojenie, odpoveď bude takáto:

Tu sa rozdiely medzi operačnými systémami končia a príkazy sú duplikované.

Pridajte argument do príkazu -v alebo -v -v (možno pridať k ľubovoľným príkazom) na zobrazenie úplných informácií:

Avrdude -n -v -c gromov -P com1 -p m328p ###WIN###
sudo avrdude -n -v -c gromov -P /dev/ttyS0 -p m328p ###Linux###


Záver Avrdude je taký, že vo Windowse aj v Linuxe sú rovnaké, takže odteraz budem robiť screenshoty len vo Win.

Tu je viac informácií, napríklad môžete vidieť, aké poistky sú nainštalované. Tu sú zobrazené v šestnástkovej sústave (HEX)čísla. Napríklad hfuse 0xDA, binárne to vyzerá takto - . To znamená, že ide o rovnaké bity, ktoré sú začiarknuté v grafických rozhraniach.

Keď sa zaoberáte poistkami, nezabudnite, že v mikrokontroléroch ATmega sú poistky invertované. Teda 0 - Toto na Yucheno a 1 - vypnuté Yucheno. To spôsobuje zmätok v online kalkulačkách (pozri nižšie).

Prečítajme si firmvér z oblasti blesk (rovnako ako PROGRAM v uniprof) príkaz:

Avrdude -c gromov -P com1 -p m328p -U flash:r:readfl.txt:h ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U flash:r:readfl.txt:h ###Linux###

V uniprof bol kód zobrazený v programe, ale tu bude zapísaný do súboru.

Firmvér sa číta a zapisuje do súboru readfl.txt. List h (hexadecimálne) na konci označuje, že údaje by sa mali zapisovať v hexadecimálnom formáte. Ak napíšete list b (binárne), bude zapísaný v dvojkovej sústave a ak r (surový), potom budú údaje v „surovej“ forme (kryakozyabra).

Odteraz sa predpokladá, že používatelia win sa nachádzajú v koreňovom adresári disku S (C:\) a používatelia Linuxu pracujú zo svojho domovského priečinka, takže súbory budú uložené tam (pokiaľ nie je uvedené inak). Tam by sa mal nachádzať firmvér, ktorý sa nahrá do MK.

Pre win bude súbor umiestnený tu C:\readfl.txt a pre linux v /home/user/readfl.txt. Môžete otvoriť tento súbor a pozrieť sa.

Čítanie EEPROM:

Avrdude -c gromov -P com1 -p m328p -U eeprom:r:reader.txt:h ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U eeprom:r:reader.txt:h ###Linux###

Čítanie flash a eeprom spolu:

Avrdude -c gromov -P com1 -p m328p -U flash:r:readfl.txt:h -U eeprom:r:reader.txt:h ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U flash:r:readfl.txt:h -U eeprom:r:reader.txt:h ###Linux###

Vymazanie ovládača:

Avrdude -e -c gromov -P com1 -p m328p ###WIN###
sudo avrdude -e -c gromov -P /dev/ttyS0 -p m328p ###Linux###

Odpojte "reset" pin - dióda nebude blikať, program bude vymazaný.

Flashnime MK s predtým stiahnutým súborom 328test.hex. Leží v koreňovom adresári disku C(c:\328test.hex) v systéme windows alebo v domovskom priečinku (/home/user/328test.hex) v systéme linux.

Avrdude -c gromov -P com1 -p m328p -U flash:w:328test.hex ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U flash:w:328test.hex ###Linux###

Ak teraz vypnete „reset“, ovládač ožije.

Poznámka. Pri blikaní MK cez avrdude, nie je potrebné mazať ovládač, program to urobí sám. Ak však zadáte parameter -D, potom sa MK automaticky nevyčistí.

Firmvér EEPROM:

Avrdude -c gromov -P com1 -p m328p -U eeprom:w:eeprom.hex ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U eeprom:w:eeprom.hex ###Linux###

Čítanie všetkých poistiek:

Avrdude -c gromov -P com1 -p m328p -U hfuse:r:hfuse.txt:h -U lfuse:r:lfuse.txt:h -U lock:r:lock.txt:h -U fuse:r:efuse .txt:h ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U hfuse:r:hfuse.txt:h -U lfuse:r:lfuse.txt:h -U lock:r:lock.txt:h -U efuse :r:efuse.txt:h ###Linux###

Niektoré ovládače nemusia mať žiadnu poistku.

Len na čítanie Slabá poistka:

Avrdude -c gromov -P com1 -p m328p -U lfuse:r:lfuse.txt:h ###WIN###
sudo avrdude -c gromov -P com1 -p m328p -U lfuse:r:lfuse.txt:h ###Linux###

Nízka poistka je zodpovedná za výber zdroja hodinového signálu (interného, ​​externého), jeho frekvencie a pauzy pred spustením regulátora po pripojení napájania. Teraz tam máte napísanú hodnotu - 0xff, čo zodpovedá externému quartzu od 8 MHz a vyššie.

Teraz zablikáme ďalšiu fúziu, ktorá prenesie váš ATmeg do práce z interného 8 MHz generátora.

Avrdude -c gromov -P com1 -p m328p -U lfuse:š:0xe2:m ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U lfuse:w:0xe2:m ###Linux###

Ak máte 16 MHz Arduino, dióda bude blikať dvakrát pomalšie.
V budúcnosti, pri kódovaní v AVR Studio, môžete určiť frekvenciu 8 MHz a odspájkovať kremeň, čím získate ďalšie dva voľné digitálne kolíky.

Ale to je neskôr a teraz vráťme všetko tak, ako to bolo blikaním predchádzajúcej poistky:

Avrdude -c gromov -P com1 -p m328p -U lfuse:š:0xff:m ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U lfuse:w:0xff:m ###Linux###

Dióda bude správne blikať.

Poistky môžu blikať jednotlivo alebo spoločne:

Avrdude -c gromov -P com1 -p m328p -U poistka:š:0xda:m -U poistka:š:0xff:m -U poistka:š:0x05:m ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U hfuse:w:0xda:m -U lfuse:w:0xff:m -U efuse:w:0x05:m ###Linux###
Tieto príkazy nie je potrebné zadávať. Pre prehľadnosť ich uvádzam.

V budúcnosti, keď budete potrebovať použiť iné ovládače, začiarknete políčka v online kalkulačke a získate hodnoty (odkaz je v ľavom hornom rohu) v hexadecimálnom formáte a flashujte ho.

Teraz už zostáva len zistiť parametre avrdude a môžete prejsť na záverečnú časť.

-c gromov- typ programátora, alebo skôr meno, pod ktorým je napísané v konfigurácii (avrdude.conf).
-P com1- Tu je všetko jasné.
-p m328p- typ označenia MK.
-U- po tejto možnosti sa zobrazí oblasť pamäte (flash, eeprom, xfuse), na ktorom sa budú vykonávať prípadné úkony (r - čítať, w - písať).
Dvojbodky slúžia ako oddeľovače.

Tu s názvami mikrokontrolérov a ich aliasmi, programátormi a ďalšími možnosťami.

Prezývky MK

uc3a0512- AT32UC3A0512
c128- AT90CAN128
c32- AT90CAN32
c64- AT90CAN64
pwm2- AT90PWM2
pwm2b- AT90PWM2B
pwm3- AT90PWM3
pwm316- AT90PWM316
pwm3b- AT90PWM3B
1200 - AT90S1200 (****)
2313 - AT90S2313
2333 - AT90S2333
2343 - AT90S2343 (*)
4414 - AT90S4414
4433 - AT90S4433
4434 - AT90S4434
8515 - AT90S8515
8535 - AT90S8535
usb1286- AT90USB1286
usb1287- AT90USB1287
usb162- AT90USB162
usb646- AT90USB646
usb647- AT90USB647
usb82- AT90USB82
m103- ATmega103
m128- ATmega128
m1280- ATmega1280
m1281- ATmega1281
m1284p- ATmega1284P
m1284rfr2- ATmega1284RFR2
m128rfa1- ATmega128RFA1
m128rfr2- ATmega128RFR2
m16- ATmega16
m161- ATmega161
m162- ATmega162
m163- ATmega163
m164p- ATmega164P
m168- ATmega168
m168p- ATmega168P
m169- ATmega169
m16u2- ATmega16U2
m2560- ATmega2560 (**)
m2561- ATmega2561 (**)
m2564rfr2- ATmega2564RFR2
m256rfr2- ATmega256RFR2
m32- ATmega32
m324p- ATmega324P
m324pa- ATmega324PA
m325- ATmega325
m3250- ATmega3250
m328- ATmega328
m328p- ATmega328P
m329- ATmega329
m3290- ATmega3290
m3290p- ATmega3290P
m329p- ATmega329P
m32u2- ATmega32U2
m32u4- ATmega32U4
m406- ATMEGA406
m48- ATmega48
m48p- ATmega48P
m64- ATmega64
m640- ATmega640
m644- ATmega644
m644p- ATmega644P
m644rfr2- ATmega644RFR2
m645- ATmega645
m6450- ATmega6450
m649- ATmega649
m6490- ATmega6490
m64rfr2- ATmega64RFR2
m8- ATmega8
m8515- ATmega8515
m8535- ATmega8535
m88- ATmega88
m88p- ATmega88P
m8u2- ATmega8U2
t10-ATtiny10
t11- ATtiny11
t12- ATtiny12
t13- ATtiny13
t15-ATtiny15
t1634- ATtiny1634
t20- ATtiny20
t2313- ATtiny2313
t24- ATtiny24
t25- ATtiny25
t26- ATtiny26
t261- ATtiny261
t4- ATtiny4
t40- ATtiny40
t4313-ATtiny4313
t43u- ATtiny43u
t44- ATtiny44
t45- ATtiny45
t461- ATtiny461
t5- ATtiny5
t84- ATtiny84
t85- ATtiny85
t861- ATtiny861
t88- ATtiny88
t9- ATtiny9
x128a1- ATxmega128A1
x128a1d- ATxmega128A1revD
x128a1u- ATxmega128A1U
x128a3- ATxmega128A3
x128a3u- ATxmega128A3U
x128a4- ATxmega128A4
x128a4u- ATxmega128A4U
x128b1- ATxmega128B1
x128b3- ATxmega128B3
x128c3- ATxmega128C3
x128d3- ATxmega128D3
x128d4- ATxmega128D4
x16a4- ATxmega16A4
x16a4u- ATxmega16A4U
x16c4- ATxmega16C4
x16d4- ATxmega16D4
x16e5- ATxmega16E5
x192a1- ATxmega192A1
x192a3- ATxmega192A3
x192a3u- ATxmega192A3U
x192c3- ATxmega192C3
x192d3- ATxmega192D3
x256a1- ATxmega256A1
x256a3- ATxmega256A3
x256a3b- ATxmega256A3B
x256a3bu- ATxmega256A3BU
x256a3u- ATxmega256A3U
x256c3- ATxmega256C3
x256d3- ATxmega256D3
x32a4- ATxmega32A4
x32a4u- ATxmega32A4U
x32c4- ATxmega32C4
x32d4- ATxmega32D4
x32e5- ATxmega32E5
x384c3- ATxmega384C3
x384d3- ATxmega384D3
x64a1- ATxmega64A1
x64a1u- ATxmega64A1U
x64a3- ATxmega64A3
x64a3u- ATxmega64A3U
x64a4- ATxmega64A4
x64a4u- ATxmega64A4U
x64b1- ATxmega64B1
x64b3- ATxmega64B3
x64c3- ATxmega64C3
x64d3- ATxmega64D3
x64d4- ATxmega64D4
x8e5- ATxmega8E5

Používatelia Linuxu môžu používať víno.

Dúfam, že už máte všetko nainštalované, tak poďme spustiť AVR Studio...


Tu sme požiadaní, aby sme vytvorili nový projekt alebo otvorili starý. Kliknite Nový projekt


Vyberte si AVR GCC, keďže budeme písať v SI, a nie v assembleri.
Projektu dáme názov a zaškrtneme políčka.
Vyberte si Poloha (Vytvoril som priečinok AVR na disku C:\) tam sa automaticky vytvoria priečinky s projektmi.
Kliknite Ďalšie


Vyberte si Simulátor AVR, keďže nemáme špeciálny programátor, ktorý umožňuje ladenie, a náš mikrokontrolér áno ATmega 328p.
Kliknite Skončiť.

Po týchto manipuláciách je štúdio pripravené na prácu.

Vľavo sú cesty k projektu. V strede je textový editor, v ktorom sa píše kód. Na pravej strane sú registre regulátorov. Vľavo dole sú informácie o ladení.

Z tlačidiel nás momentálne zaujímajú tieto -

Zostavte projekt.
Zostavte projekt a začnite ladiť.
Kompilácia súboru.
Upratovanie.
Nastavenie projektu. Tak na to klikni...

Tu môžete zmeniť typ MK, nastaviť frekvenciu hodín (napíšeme to priamo do kódu), úroveň optimalizácie, ako aj určiť, aké súbory sa vytvoria.
Pre zaujímavosť kliknite na ikony vľavo a kliknite Zrušiť.
Nebudem vysvetľovať tieto a ďalšie možnosti, ale neskôr poskytnem odkaz s kompetentným popisom.

Teraz skopírujte kód napísaný na začiatku článku a vložte ho do editora:

V kóde sme zadali frekvenciu hodín, pretože to vyžaduje knižnica meškanie.h.

Zostavenie bolo úspešné, nevyskytli sa žiadne chyby ani upozornenia.

Teraz poďme na cestu C:\AVR\my328\default\, nájdeme tam hex súbor, ktorý sme vytvorili - my328.hex a bliknite ho do ovládača. Čo blikať (avrdude alebo uniprof) vyberte si sami.

V avrdude to bude vyzerať takto:

Avrdude -c gromov -P com1 -p m328p -U flash:w:\AVR\my328\default\my328.hex ###WIN###
avrdude -c gromov -P /dev/ttyS0 -p m328p -U flash:w:my328.hex ###Linux###

Deaktivujte „reset“ a uvidíte, že dióda bliká raz za sekundu. Dúfam, že som vás presvedčil o jednoduchosti a pohodlnosti príkazového riadku.

Ak chcete zmeniť Arduino späť na Arduino, máte zálohu.

Ako už bolo napísané vyššie, nebudem sa púšťať do vysvetľovania práce s AVR Studio, ani nebudem dávať lekcie jazyka SI. V prvom rade to nebol môj plán. (Len som chcel pomôcť pri prechode z Arduina na AVR Studio)

IDE je integrované vývojové prostredie, ktoré obsahuje rôzne šablóny, knižnice a funkcie ladiaceho nástroja. Ak hovoríme o, od roku 2004 bol pre nich vyvinutý výkonný softvérový balík AVR studio.

Prvé verzie

Prvé verzie štúdia obsahovali assembler pre , môžete ho extrahovať z prvých zostáv, ale neskôr sa od tohto projektu upustilo a ako hlavný jazyk bol zvolený C AVR. Kompilátor bol platený a veľmi seriózny produkt IAR. Môžete si stiahnuť zadarmo WINAVR, aby ste to urobili, po inštalácii štúdia ho musíte nainštalovať.

Poznámka! Je lepšie to urobiť až po inštalácii AVR studio 4 a ďalších verzií.

AVR studio 4 (na obrázku vyššie) bolo predstavované dlho. S týmto problémom sa stretli mnohí vývojári mikrokontrolérov. Neskôr bolo IDE upgradované na AVR studio 5. Okrem rozhrania nedošlo k žiadnym špeciálnym zmenám a až potom vývojárska spoločnosť preznačila produkt a zmenila názov na Atmel studio 6.

Prostredie AVR studio 5 podporovalo nasledujúce mikrokontroléry:

  • AVR32;
  • XMEGA.

Atmel studio 6 sa výrazne líšilo od AVR studio 5, najvýraznejšie inovácie vo verzii boli:

  1. Microsoft Visual Studio 2010 začalo pracovať s rodinou AVR.
  2. Vylepšené zvýraznenie syntaxe v porovnaní s AVR studio 5.
  3. Pridané rady a automatické dopĺňanie sady príkazov, čo urýchľuje proces vývoja.
  4. Vo všeobecnosti sa celá prevádzka prostredia stala spoľahlivejšou.
  5. Pridaná podpora pre ARM Cortex-M.
  6. WinAVR už nie je potrebné inštalovať samostatne, GCC je teraz nainštalovaný počas procesu inštalácie, na rozdiel od mladších verzií.

V Atmel studio 6 nastal pre užívateľa programu skok k lepšiemu, čo ovplyvnilo obľúbenosť rodín Atmel. Nebolo však možné dosiahnuť adekvátnu podporu ruských znakov v cestách k súborom.

Aktuálna verzia – Atmel studio 7

Vývojové prostredie, ktoré som použil, bolo Visual Studio Isolated Shell 2015; na jednej strane toto riešenie nie je podporované vo Windows XP, na druhej strane boli tieto opatrenia prijaté s cieľom zlepšiť vzhľad programu a jeho funkčnosť.

Azda najvýznamnejšie je pridanie podpory Arduina v Atmel studio 7. To znamená, že môžete prejsť od sady jednoduchých náčrtov k používaniu všetkých C funkcií, ladeniu, simulátoru MCU a ďalším funkciám. Kombinácia Arduina a Atmel studio 7 dala nové kolo vo vývoji tejto jednoduchej vzdelávacej platformy.

Štúdium Atmel štúdia s Arduinom poskytne príležitosť posunúť sa ku kompletnému a produktívnemu zvládnutiu a hlbšiemu zoznámeniu sa so srdcom Arduina – mikrokontrolérom Atmega.

Okrem toho si z webovej stránky Atmel môžete stiahnuť balík na obsluhu a pripojenie LCD. Ako príklad na mastering môžete použiť LCD 1602, na internete je o ňom veľa lekcií a vývojár má na displeji k dispozícii 16 znakov a 2 riadky.

Kde začať s učením?

Mali by ste začať, samozrejme, kúpou programátora; Najvýhodnejším z nich je USBASP. Programátor USBASP nie je podporovaný v Atmel Studio 7.


Stiahnite si ovládače pre programátor a program AVRdude a aby to všetko fungovalo spolu, môžete použiť príkaz cez príkazový riadok:

"avrdude -c usbasp -p atmega32 -U flash:w: názov súboru firmvéru. hex -U poistka:š:0x6a:m -U vložka:š:0xff:m"

a povoľte jeho podporu vytvorením profilu v atmel studio 7 (titul – externé nástroje) a do položky Argumenty zadajte „-c usbasp -p atmega32 -U flash:w:$(Cieľové meno).hex“ atď. typu používate mikrokontroléry.

Toto je jediný spôsob, ako prepojiť štúdio a programátor USBASP. Pri blikaní buďte opatrní - môžete poškodiť podpis mikrokontroléra a je možné ho obnoviť iba pomocou 12 V (vysokého napätia) programátora.

Akú literatúru by som mal použiť na školenie?

Najprv si stiahnite manuály z oficiálnych stránok pre každý mikrokontrolér. Je ťažké odporučiť konkrétnu učebnicu, ale existuje „DI Halt - AVR. Školiaci kurz“ môžete ho použiť - tvorcom tohto materiálu je odborník, autor mnohých článkov o rôznych internetových zdrojoch a jednoducho rešpektovaná osoba v odborných kruhoch.

Viac ako raz alebo dvakrát som povedal, že štúdium MK by malo začať assemblerom. Tomu bol venovaný celý kurz na stránke (nie je síce veľmi dôsledný, ale postupne ho česám do adekvátneho vzhľadu). Áno, je to ťažké, výsledok nebude hneď v prvý deň, ale naučíte sa rozumieť tomu, čo sa deje vo vašom ovládači. Budete vedieť, ako to funguje, a nebudete kopírovať zdroje iných ľudí ako opice a snažiť sa pochopiť, prečo to zrazu prestalo fungovať. Okrem toho je pre C oveľa jednoduchšie vytvoriť kód robotníka, ktorý sa objaví s vidlami v najnevhodnejšom momente.

Bohužiaľ, každý chce výsledky okamžite. Tak som sa rozhodol ísť inou cestou – spraviť návod na C, ale s ukazovaním jeho spodnej bielizne. Dobrý programátor embedderu vždy drží svoj kus hardvéru pevne za skrutku a nedovolí mu urobiť jediný krok bez povolenia. Takže najprv bude C kód, potom čo vytvoril kompilátor a ako to celé vlastne funguje :)

Na druhej strane, silnou stránkou C je prenosnosť kódu. Ak, samozrejme, napíšete všetko správne. Rozdelenie pracovných algoritmov a ich hardvérových implementácií do rôznych častí projektu. Potom na prenos algoritmu na iný mikrokontrolér bude stačiť prepísať iba vrstvu rozhrania, kde sú zapísané všetky volania hardvéru, a nechať všetok pracovný kód tak, ako je. A, samozrejme, čitateľnosť. Zdrojový kód C je na prvý pohľad zrozumiteľnejší (aj keď... napríklad mi je jedno, na čo mám ukazovať - ​​či už C alebo ASM :)), ale opäť, ak je všetko napísané správne. Budem venovať pozornosť aj týmto bodom.

Moja ladiaca doska bude slúžiť ako experimentálny hardvér, na ktorom bude nainštalovaný leví podiel všetkých príkladov.

Prvý program C pre AVR

Výber kompilátora a nastavenie prostredia
Existuje veľa rôznych kompilátorov C pre AVR:
V prvom rade toto IAR AVR C- je takmer určite uznávaný ako najlepší kompilátor pre AVR, pretože samotný ovládač vznikol v úzkej spolupráci Atmelu a špecialistov z IAR. Za všetko však treba platiť. A tento kompilátor nie je len drahý komerčný softvér, ale má aj toľko nastavení, že jednoducho ho v ňom skompilovať dá veľa námahy. Naozaj som si s ním nevybudoval priateľstvo; projekt hnil kvôli zvláštnym chybám vo fáze spájania (neskôr som zistil, že to bola krivá trhlina).

Prichádza druhý WinAVR GCC- výkonný optimalizačný kompilátor. Plne otvorený zdroj, multiplatformový, vo všeobecnosti všetky radosti života. Dokonale sa tiež integruje do AVR Studio, čo vám umožní ladiť priamo tam, čo je sakramentsky pohodlné. Vo všeobecnosti som si to vybral.

Je tu tiež CodeVision AVR C je veľmi populárny kompilátor. Stala sa populárnou vďaka svojej jednoduchosti. Môžete v ňom získať funkčný program za pár minút - sprievodca štartovacím kódom to výrazne uľahčuje tým, že odstraňuje štandardy pre inicializáciu najrôznejších vecí. Aby som bol úprimný, mám to trochu podozrievavé - akonáhle som musel rozobrať program napísaný týmto kompilátorom, ukázalo sa, že je to nejaký neporiadok a nie kód. Strašné množstvo zbytočných pohybov a operácií, čo malo za následok značné množstvo kódu a pomalý výkon. Možno však došlo k chybe v DNA osoby, ktorá napísala pôvodný firmvér. Navyše chce peniaze. Nie toľko ako IAR, ale znateľné. A v demo režime vám umožňuje napísať maximálne 2 kb kódu.
Samozrejme je tam crack, ale ak sa chystáte kradnúť, je to milión v zmysle IAR :)

Je tu tiež Image Craft AVR C A MicroC z mikroelektroniky. Nemusel som použiť ani jeden, ale S.W.G. veľmi chválim MicroPascal, hovoria, strašne pohodlné programovacie prostredie a knižnice. Myslím, že MicroC nebude o nič horšie, ale je tiež platené.

Ako som povedal, vybral som si WinAVR z troch dôvodov: je to zadarmo, integruje sa do AVR Studio a je preň napísané množstvo hotového kódu pre všetky príležitosti.

Stiahnite si teda inštaláciu WinAVR s AVR Studio. Ďalej sa najprv nainštaluje štúdio, potom sa navrch natočí WinAVR a pripojí sa k štúdiu vo forme pluginu. Dôrazne odporúčam nainštalovať WinAVR na krátku cestu, niečo ako C:\WinAVR, týmto spôsobom sa vyhnete mnohým problémom s cestami.

Vytvorenie projektu
Takže štúdio je nainštalované, C je zaskrutkované, je čas skúsiť niečo naprogramovať. Začnime tým jednoduchým, najjednoduchším. Spustite štúdio, vyberte tam nový projekt ako kompilátor AVR GCC a zadajte názov projektu.

Otvorí sa pracovné pole s prázdnym súborom *.c.

Teraz nezaškodí nakonfigurovať zobrazenie ciest v záložkách štúdia. Ak to chcete urobiť, prejdite na:
Ponuka Nástroje - Možnosti - Všeobecné - Karty súborov a z rozbaľovacieho zoznamu vyberte možnosť „Iba názov súboru“. V opačnom prípade nebude možné pracovať - ​​karta bude obsahovať úplnú cestu k súboru a na obrazovke nebudú viac ako dve alebo tri karty.

Nastavenie projektu
Vo všeobecnosti sa za klasické považuje vytvorenie súboru make, v ktorom sú popísané všetky závislosti. A to je asi správne. Ale pre mňa, ktorý vyrastal s plne integrovanými IDE, ako uVision alebo Štúdio AVR tento prístup je hlboko cudzí. Preto si to urobím po svojom, všetko pomocou štúdiových prostriedkov.

Stlačte tlačidlo s ozubeným kolieskom.


Toto sú nastavenia pre váš projekt, alebo skôr nastavenia pre automatické generovanie súboru make. Na prvej stránke stačí zadať frekvenciu, na ktorej bude váš MK fungovať. To závisí od bitov poistky, takže predpokladáme, že naša frekvencia je 8 000 000 Hz.
Venujte pozornosť aj optimalizačnej línii. Teraz je tu -Os - to je optimalizácia veľkosti. Zatiaľ to nechajte tak, potom sa môžete skúsiť pohrať s týmto parametrom. -O0 nie je vôbec žiadna optimalizácia.

Ďalším krokom je konfigurácia ciest. Najprv tam pridajte svoj adresár projektu – pridáte tam knižnice tretích strán. V zozname sa zobrazí cesta „.\“.

Súbor Make bol vygenerovaný, môžete si ho pozrieť v predvolenom priečinku vo svojom projekte, stačí sa pozrieť a zistiť, čo tam je.


To je zatiaľ všetko. Kliknite na tlačidlo OK všade a prejdite na zdroj.

Formulácia problému
Prázdny list papiera láka na realizáciu nejakého prefíkaného nápadu, pretože banálne blikanie diódy už nefunguje. Okamžite vezmime býka za rohy a implementujme spojenie s počítačom - to je prvá vec, ktorú robím.

Bude to fungovať takto:
Keď cez COM port príde jednotka (kód 0x31), diódu zapneme a keď príde nula (kód 0x30), zhasne. Navyše sa všetko bude robiť na prerušeniach a úlohou na pozadí bude blikanie ďalšej diódy. Jednoduché a zmysluplné.

Zostavenie obvodu
Potrebujeme pripojiť modul prevodníka USB-USART na piny USART mikrokontroléra. Aby ste to urobili, vezmite prepojku z dvoch drôtov a umiestnite ju na kolíky krížom. To znamená, že pripojíme Rx regulátora k Tx prevodníka a Tx prevodníka k Rx regulátora.

Nakoniec je to schéma:


Neuvažujem o pripojení zostávajúcich pinov, napájania alebo resetovaní, je to štandard.

Písanie kódu

Dovoľte mi hneď urobiť výhradu, že sa nebudem venovať konkrétne popisu samotného jazyka C. Existuje na to jednoducho obrovské množstvo materiálu, od klasického „programovacieho jazyka C“ od K&R až po rôzne príručky.

Jednu takú metódu som našiel vo svojej skrýši, raz som ju použil na štúdium tohto jazyka. Všetko je tam krátke, jasné a vecné. Postupne to dávam dokopy a presúvam na svoj web.

Je pravda, že ešte nie sú prenesené všetky kapitoly, ale myslím si, že to nebude dlho.

Je nepravdepodobné, že by som to mohol lepšie opísať, takže zo školiaceho kurzu namiesto podrobného vysvetlenia jemností jednoducho poskytnem priame odkazy na jednotlivé stránky tohto návodu.

Pridávanie knižníc.
V prvom rade pridávame potrebné knižnice a hlavičky s definíciami. Koniec koncov, C je univerzálny jazyk a musíme mu vysvetliť, že pracujeme špeciálne s AVR, takže napíšte riadok do zdrojového kódu:

1 #include

#include

Tento súbor sa nachádza v priečinku WinAVR a obsahuje popis všetkých registrov a portov radiča. Okrem toho je všetko prefíkané, s väzbou na konkrétny ovládač, ktorý prenáša kompilátor cez urobiť súbor v parametri MCU a na základe tejto premennej sa k vášmu projektu pripojí hlavičkový súbor s popisom adries všetkých portov a registrov pre tento konkrétny radič. Wow! Bez nej je to tiež možné, ale potom nebudete môcť používať symbolické názvy registrov ako SREG alebo UDR a budete si musieť zapamätať adresy každého z nich, napríklad „0xC1“, čo bude bolieť hlava.

Tým samotným #include<имя файла> umožňuje pridať do projektu obsah ľubovoľného textového súboru, napríklad súbor s popisom funkcií alebo kus iného kódu. A aby smernica tento súbor našla, uviedli sme cestu k nášmu projektu (adresár WinAVR je tam už štandardne zaregistrovaný).

Hlavná funkcia.
Program C pozostáva výlučne z funkcií. Môžu byť vnorené a volané jeden od druhého v akomkoľvek poradí a rôznymi spôsobmi. Každá funkcia má tri požadované parametre:

  • Návratová hodnota je napr. hriech(x) vráti hodnotu sínusu x. Skrátka ako v matematike.
  • Prenášané parametre sú rovnaké X.
  • Funkčné telo.

Všetky prenášané a vrátené hodnoty musia byť určitého typu v závislosti od údajov.

Každý program v jazyku C musí obsahovať funkciu Hlavná ako vstupný bod do hlavného programu, inak to vôbec nie je C :). Prítomnosťou hlavného v zdrojovom kóde niekoho iného z milióna súborov môžete pochopiť, že toto je hlavná časť programu, kde všetko začína. Tak sa spýtajme:

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

int main(void) ( return 0; )

To je všetko, bol napísaný prvý najjednoduchší program, nezáleží na tom, že nič nerobí, práve sme začali.

Poďme zistiť, čo sme urobili.
int Toto je dátový typ, ktorý vracia hlavná funkcia.

Samozrejme, v mikrokontroléri Hlavná v zásade sa nedá nič vrátiť a teoreticky by malo void main (void), ale GCC je pôvodne určený pre PC a tam môže program po dokončení vrátiť hodnotu do operačného systému. Preto GCC zapnuté void main (void) prisahá pri Varovaní.

Toto nie je chyba, bude to fungovať, ale nemám rád upozornenia.

neplatné v tomto prípade ide o typ údajov, ktoré odovzdávame funkcii Hlavná tiež nemôže prijať nič zvonku, preto neplatné- figurína. Pahýľ sa používa, keď nie je potrebné nič prenášať alebo vracať.

Tu sú { } zložené zátvorky sú programový blok, v tomto prípade telo funkcie Hlavná, kód sa tam bude nachádzať.

vrátiť- to je návratová hodnota, ktorú vráti funkcia main po dokončení, keďže máme int, teda číslo, tak musíme vrátiť číslo. Aj keď to stále nedáva zmysel, pretože... na mikrokontroléri nemôžeme ísť nikam len z hlavného. vraciam null. Lebo na tom nezáleží. Ale kompilátor je zvyčajne inteligentný a negeneruje kód pre tento prípad.
Hoci, ak zvrátené, tak z Hlavná Môžete prejsť na MK - napríklad spadnúť do sekcie bootloader a spustiť ho, ale bude to vyžadovať prácu s firmvérom na nízkej úrovni, aby sa opravili adresy prechodu. Nižšie uvidíte sami a pochopíte, ako na to. Prečo? To je ďalšia otázka, v 99,999% prípadov to nie je potrebné :)

Urobili sme to a išli ďalej. Pridajme premennú, v podstate ju nepotrebujeme a bez nej nemá zmysel zavádzať premenné, ale učíme sa. Ak sú premenné pridané do tela funkcie, potom sú lokálne a existujú iba v tejto funkcii. Keď funkciu ukončíte, tieto premenné sa vymažú a pamäť RAM sa pridelí pre dôležitejšie potreby. .

1 2 3 4 5 6 int main(void) ( unsigned char i; return 0; )

int main(void) ( unsigned char i; return 0; )

nepodpísané znamená nepodpísaný. Faktom je, že v binárnej reprezentácii je najvýznamnejší bit pridelený znamienku, čo znamená, že číslo +127/-128 sa zmestí do jedného bajtu (char), ale ak sa znamienko zahodí, zmestí sa od 0 do 255. Zvyčajne znak nie je potrebný. Takže nepodpísané.
i je len názov premennej. Nikdy viac.

Teraz musíme inicializovať porty a UART. Samozrejme, môžete vziať a pripojiť knižnicu a zavolať nejaký druh UartInit(9600); ale potom nebudes vediet co sa vlastne stalo.

Robíme toto:

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

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

desivé? V skutočnosti existuje len päť posledných riadkov skutočného kódu. Všetko, to #definovať je to makrojazyk preprocesora. Takmer to isté ako v Assembly, ale syntax je mierne odlišná.

Uľahčia vám bežné operácie výpočtu potrebných koeficientov. V prvom riadku hovoríme, že namiesto toho XTAL môžete bezpečne nahradiť 8000000 a L- označenie typu, pričom long je hodinová frekvencia procesora. Rovnaký prenosová rýchlosť— frekvencia prenosu dát cez UART.

prenosový delič už zložitejšie, namiesto neho sa nahradí výraz vypočítaný pomocou vzorca z dvoch predchádzajúcich.
No a L.O. A AHOJ nízke a vysoké bajty budú prevzaté z tohto výsledku, pretože Očividne sa nemusí zmestiť do jedného bajtu. IN AHOJ X (vstupný parameter makra) sa posunie osemkrát doprava, výsledkom čoho je, že zostane len najvýznamnejší bajt. A v L.O. urobíme bitové AND s číslom 00FF, výsledkom čoho bude len nízky bajt.

Takže všetko, čo sa robí, je ako #definovať môžete ho pokojne vyhodiť a potrebné čísla si vypočítať na kalkulačke a hneď ich zadať do riadkov UBBRL = …. a UBBRH = ....

Môcť. Ale! To urobiť ABSOLÚTNE NEMOŽNÉ!

Bude to fungovať tak alebo tak, ale budete mať tzv magické čísla- hodnoty prevzaté odnikiaľ a z neznámych dôvodov a ak takýto projekt otvoríte o pár rokov, bude sakra ťažké pochopiť, o aké hodnoty ide. Aj teraz, ak chcete zmeniť rýchlosť alebo zmeniť frekvenciu quartz, všetko sa bude musieť znova prepočítať, ale zmenili ste pár čísel v kóde a je to. Vo všeobecnosti, ak nechcete byť označený ako kódovač, vytvorte si kód tak, aby bol ľahko čitateľný, zrozumiteľný a ľahko upraviteľný.

Potom je všetko jednoduché:
Všetky tieto „UBRRL and Co“ sú konfiguračné registre vysielača UART, pomocou ktorých budeme komunikovať so svetom. A teraz sme im priradili požadované hodnoty, nastavili ich na požadovanú rýchlosť a režim.

Typ nahrávania 1< Znamená nasledovné: vezmite 1 a vložte ho na miesto RXEN v byte. RXEN toto je 4. bit registra UCSRB, Takže 1< tvorí binárne číslo 00010000, TXEN- toto je 3. bit a 1< dá 00001000. Single "|" je to bitové ALEBO, teda 00010000 | 00001000 = 00011000. Rovnakým spôsobom sa nastavia zostávajúce potrebné konfiguračné bity a pridajú sa do všeobecnej haldy. Výsledkom je, že zhromaždené číslo je zaznamenané v UCSRB. Viac podrobností je popísaných v datasheete na MK v sekcii USART. Nenechajme sa teda rozptyľovať technickými detailmi.

Hotovo, je čas pozrieť sa, čo sa stalo. Kliknite na kompiláciu a spustite emuláciu (Ctrl+F7).

Ladenie
Prebehli najrôznejšie postupové lišty, štúdio sa zmenilo a pri vchode do hlavnej funkcie sa objavila žltá šípka. Tu je momentálne spustený procesor a simulácia je pozastavená.

Faktom je, že spočiatku to v skutočnosti bolo na riadku UBRRL = LO(bauddivider); Koniec koncov, to, čo definujeme, nie je kód, ale iba predbežné výpočty, a preto je simulátor trochu nudný. Ale teraz si uvedomil, že prvý pokyn bol dokončený a ak vyleziete na strom Zobrazenie I/O, do sekcie USART a pozrite sa tam na bajt UBBRL, uvidíte, že hodnota tam už je! 0x33.

Urobte to ešte o krok ďalej. Pozrite sa, ako sa mení obsah druhého registra. Prejdite si ich teda všetky, dávajte pozor na to, že všetky uvedené bity sú nastavené tak, ako som vám povedal, a sú nastavené súčasne pre celý bajt. Ďalej ako Návrat to nepôjde – program sa skončil.

Otvorenie
Teraz resetujte simuláciu na nulu. Kliknite tam Obnoviť (Shift+F5). Otvorte rozobraný výpis, teraz uvidíte, čo sa vlastne v ovládači deje. Zobraziť -> Disassembler. A nie YYAAAAAA!!! Assembler!!! HOROR!!! A JE TO POTREBNÉ. Aby ste neskôr, keď sa niečo pokazí, neboli v kóde hlúpi a nekládli na fórach chabé otázky, ale okamžite sa dostali do útrob a zistili, kde ste uviazli. Nie je tam nič strašidelné.

Najprv to budú topy zo série:

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 Skok +00000002: 940C0034 JMP 0x00000034 Skok +00000004: 940C0034 JMP0000000000000000C0034 JMP 0x00000000 0x00000034 Skok +00000008: 940C0034 JMP 0x00000034 Skok +0000000A: 940C0034 JMP 0x00000034 Skok +0000000C: 3440C000C: 0340C00000 0000000E: 940C0034 JMP 0x00000034 Skok +00000010: 940C0034 JMP 0x00000034 Skok +00000012: 940C0034 JMP 0x3409000000000004 009000400000000000001 0x00000034 Skok +00000016: 940C0034 JMP 0x00000034 Skok +00000018: 940C0034 JMP 0x00000034 Skok +0000001A: 0000001A: 00000000000000000000000 : 940C0034 JMP 0x00000034 Skok +0000001E: 940C0034 JMP 0x00000034 Skok +00000020: 940C0034 JMP 0x00000034 Skok 0x00000034 Skok 040002000002000002 34 Skok +00000024: 940C0034 JMP 0x00000034 Skok +00000026: 940C0034 JMP 0x00000034 Skok +00000028: 940C0030 Jump 0x003

00000000: 940C002A JMP 0x0000002A Skok +00000002: 940C0034 JMP 0x00000034 Skok +00000004: 940C0034 JMP 0x340900000000000x00000034 Skok +00000008: 940C0034 JMP 0x00000034 Skok +0000000A: 940C0034 JMP 0x00000034 Skok +0000000C: 0000000C: 3440C: 940C0034 JMP 0x00000034 Skok +00000010: 940C0034 JMP 0x00000034 Skok +00000012: 940C0034 JMP 0x00000034 Skok 040004 +0000004 +000000004 00004 34 Skok +00000016: 940C0034 JMP 0x00000034 Skok +00000018: 940C0034 JMP 0x00000034 Skok +0000001A: 940C00034 Jump +0x000000000003 : 940C0034 JMP 0x00000034 Skok +0000001E: 940C0034 JMP 0x00000034 Skok +00000020: 940C0034 JMP 0x00000034 Skok 0x00000034 Skok 040002000002000002 34 Skok +00000024: 940C0034 JMP 0x00000034 Skok +00000026: 940C0034 JMP 0x00000034 Skok +00000028: 940C0030 Jump 0x003

Toto je tabuľka vektorov prerušení. Vrátime sa k tomu neskôr, ale zatiaľ sa len pozrite a zapamätajte si, že existuje. Prvý stĺpec je adresa flash bunky, v ktorej príkaz leží, druhý je kód príkazu, tretí je mnemotechnická pomôcka príkazu, rovnaký návod na zostavenie, tretí sú operandy príkazu. No, automatický komentár.
Takže, ak sa pozriete, existujú nepretržité prechody. A príkazový kód JMP má štyri bajty, obsahuje spätne zapísanú adresu skoku - nízky bajt na nízkej adrese a kód príkazu skoku 940C

0000002B: BE1F OUT 0x3F,R1 Out to I/O umiestnenie

Zaznamenajte túto nulu na adrese 0x3F. Ak sa pozriete na stĺpec zobrazenia I/O, uvidíte, že adresa 0x3F je adresa registra SREG - príznak registra kontroléra. Tie. resetujeme SREG, aby sa program spustil pri nulových podmienkach.

1 2 3 4 +0000002C: E5CF LDI R28,0x5F Okamžité načítanie +0000002D: E0D4 LDI R29,0x04 Okamžité načítanie +0000002E: BFDE OUT 0x3E,R29 Výstup do I/O umiestnenie +0000002F: BOF3D IROUT umiestnenie/00x umiestnenie BFCD IR29

0000002C: E5CF LDI R28,0x5F Okamžité načítanie +0000002D: E0D4 LDI R29,0x04 Okamžité načítanie +0000002E: BFDE OUT 0x3E,R29 Out to I/O umiestnenie +0000002F: BFCD OUT2/O0x umiestnenie BFCD 22002F

Načítava sa ukazovateľ zásobníka. Nemôžete priamo načítať do I/O registrov, iba cez prechodný register. Preto najprv LDI na stredný a potom odtiaľ OUT na I/O. Neskôr vám tiež poviem viac o zásobníku. Zatiaľ vedzte, že ide o oblasť dynamickej pamäte, ktorá visí na konci pamäte RAM a ukladá adresy a prechodné premenné. Teraz sme naznačili, odkiaľ bude náš stack začínať.

00000032: 940C0041 JMP 0x00000041 Skok

Preskočte na úplný koniec programu a tam máme zákaz prerušovania a tesného cyklovania:

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

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

Je to v prípade nepredvídaných okolností, ako je napríklad ukončenie hlavnej funkcie. Regulátor môže byť z takejto slučky vyvedený buď hardvérovým resetom, alebo pravdepodobnejšie resetom z watchdogu. Alebo, ako som povedal vyššie, opravte to v hexadecimálnom editore a odcválajte tam, kam si naše srdce želá. Všimnite si tiež, že existujú dva typy prechodov: JMP a RJMP; prvý je priamy prechod na adresu. Zaberá štyri bajty a môže priamo preskakovať cez celú oblasť pamäte. Druhým typom prechodu je RJMP – relatívny. Jeho príkaz trvá dva bajty, ale z aktuálnej pozície (adresy) sa posunie o 1024 krokov dopredu alebo dozadu. A jeho parametre označujú posun od aktuálneho bodu. Používa sa častejšie, pretože zaberá polovicu priestoru pri splachovaní a dlhé prechody sú potrebné len zriedka.

1 +00000034: 940C0000 JMP 0x00000000 Skok

00000034: 940C0000 JMP 0x00000000 Skok

A toto je skok na úplný začiatok kódu. Akýsi reštart. Tu môžete skontrolovať, či všetky vektory skáču. Záver z toho je, že ak teraz povolíte prerušenia (v predvolenom nastavení sú vypnuté) a vaše prerušenie nastane, ale neexistuje žiadna obsluha, dôjde k resetovaniu softvéru – program sa vráti na úplný začiatok.

Hlavná funkcia. Všetko je podobné, ani to netreba opisovať. Stačí sa pozrieť na už vypočítané číslo, ktoré sa zapisuje do registrov. Preprocesor kompilátora skaly!!! Takže žiadne „magické“ čísla!

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

00000036: E383 LDI R24,0x33 Okamžité načítanie +00000037: B989 OUT 0x09,R24 Out to I/O umiestnenie 15: UBRRH = HI(bauddivider); +00000038: BC10 OUT 0x20,R1 Out to I/O umiestnenie 16: UCSRA = 0; +00000039: B81B OUT 0x0B,R1 Výstup na I/O umiestnenie 17: UCSRB = 1<

A tu je chyba:

1 2 3 +0000003E: E080 LDI R24.0x00 Okamžité načítanie +0000003F: E090 LDI R25.0x00 Okamžité načítanie +00000040: 9508 Návrat podprogramu RET

0000003E: E080 LDI R24.0x00 Okamžité načítanie +0000003F: E090 LDI R25.0x00 Okamžité načítanie +00000040: 9508 Návrat podprogramu RET

Otázkou je, prečo kompilátor pridáva takéto vrcholy? A to nie je nič iné ako Return 0, funkciu sme definovali ako int main(void) a tak sme premrhali ďalšie štyri bajty pre nič za nič :) A ak spravíte void main(void) tak zostane len RET, ale objaví sa varovanie , že naša hlavná funkcia nič nevracia. Vo všeobecnosti robte, ako chcete :)

ťažké? Zjavne nie. Kliknite na spustenie krok za krokom v režime disassemblera a uvidíte, ako procesor vykonáva jednotlivé inštrukcie, čo sa deje s registrami. Ako prebieha pohyb cez príkazy a záverečná slučka?

Pokračovanie o pár dní...

Offtop:
Alexej78 Vytvoril som doplnok pre Firefox, ktorý uľahčuje navigáciu na mojej stránke a fóre.
Diskusia a sťahovanie,

Atmel Studio je integrovaná vývojová platforma, ktorá poskytuje možnosť navrhovať a ladiť aplikácie vyvinuté pre mikrokontroléry Atmel založené na architektúre procesorov série ARM Cortex-M. Atmel Studio je bezproblémové, ľahko použiteľné prostredie, ktoré poskytuje možnosť ladiť a vytvárať aplikácie vytvorené v C/C++ alebo v assembleri. Má vstavanú objemnú knižnicu úplne bezplatného zdrojového kódu Atmel Software Framework, ktorá obsahuje viac ako 1 600 projektov pre architektúry ARM a AVR. Mať takúto knižnicu je skvelý bonus pre každého programátora. Toto IDE je možné použiť na programovanie širokej škály mikrokontrolérov na báze AVR, ako aj flash mikrokontrolérov na báze Atmel SAM3, ktoré využívajú jadrá Cortex-M3, Cortex-M4.

Atmel Studio obsahuje aj nástroje, ktoré výrazne uľahčia život každému programátorovi. Platforma zahŕňa riešenia ako Atmel Spaces a Atmel Gallery. Atmel Gallery je online obchod s vývojovými nástrojmi a integrovaným softvérom. Atmel Spaces je cloudový priestor pre spoločný vývoj a ukladanie súborov hardvérových a softvérových projektov pre mikrokontroléry Atmel.

Kľúčové vlastnosti a funkcie

  • je úplne bezplatné integrované vývojové prostredie;
  • podporuje jazyky C/C++ a Assembler;
  • sprevádzaná podrobnou dokumentáciou;
  • obsahuje rozsiahlu knižnicu s príkladmi zdrojového kódu pre rôzne aplikácie;
  • určené na programovanie mikrokontrolérov Atmel.

Špeciálne požiadavky

  • frekvencia procesora 1,6 GHz a vyššia;
  • pre 32-bitové systémy od 1 GB RAM;
  • pre 64-bitové systémy od 2 GB RAM;
  • pri spustení na virtuálnom počítači sa odporúča ďalších 512 MB RAM;
  • 6 GB voľného miesta na pevnom disku.

Čo je nové v tejto verzii?

7.0.790 (25.02.2016)

  • pridaná podpora pre rozšírený debugger (EDBG);
  • pridaná podpora pre profily nastavení rozhrania. Medzi profilmi môžete prepínať pomocou tlačidiel na paneli nastavení;
  • pridala možnosť importovať knižnice do predtým importovaných projektov. Pridaná podpora pre Arduino Zero a Zero Pro;
  • paralelné zostavovanie je teraz predvolene povolené;
  • aktualizovaný firmvér pre Xplained Mini;
  • Funkcia „Zobraziť všetky súbory“ v Prieskumníkovi riešení bola opravená.