AVR: programování v prostředí AVR Studio. Integrované ladicí prostředí AVR Studio od Atmel Avr studia

Chcete-li pracovat s AVR Studio 4, musíte jej nainstalovat samostatně. Pokud je již nainstalován, můžete tento krok přeskočit.

Instalace:
vytvořte adresář c:/avr/ - zde budou umístěny pracovní programy.
vytvořte adresář, například c:/works/ – zde budou uložena vaše díla.
Je nutné, aby existovaly zkratky, aby s nimi nebyly problémy.

Obecně existuje AVRStudio5, ale AVRStudio4 je stále docela dost.

Veškerá práce bude probíhat v AVRStudio4, WinAVR je potřeba jen kvůli knihovně AVR-GCC (Abyste mohli psát v C)
ALE! Nejprve je třeba nainstalovat WinAVR, jinak nebude knihovna AVR-GCC vyzvednuta.

Myslím, že tady na to přijdeš.
AVR-GCC pro zápis v C
Atmel Avr Assembler respektive pro assembler.

Je lepší začít rozumět MK od začátku. A to znamená z Assembleru, což znamená, že vytvoříte ten, který je Atmel AVR Assembler.

Poté vyberte mikrokontrolér Atmega8.

když je projekt vytvořen, bude tam velký bílý prázdný list. zde bude kód.

něco málo o obsahu tohoto listu

„komentáře“ jsou text, který kompilátor při kompilaci přeskočí.
před začátkem komentáře musí být speciální symbol, já používám symbol; „středník“, existuje také „dvojité lomítko“ (//),
zde jsou příklady komentářů

/* * Komentář tohoto typu (víceřádkový), * obvykle se používá pro * doprovodnou informaci * o zdrojovém kódu, tzn. * jméno, vývojář atd. */ NOP // Tento komentář se používá hlavně k vysvětlení účelu příkazu nebo části kódu SLEEP ; Tento komentář, stejně jako ten předchozí, lze použít pro vysvětlení (pro poznámky) v kódu

příkazy jsou napsány na každém řádku. těch. jeden příkaz - jeden řádek.
Řekněme, že existují příkazy se dvěma „parametry“, s jedním nebo bez čehokoli

MOV R16, R17; dva parametry INC R16 ; jeden parametr SEI; bez parametrů

MOV R16, R17; tři bajty INC R16; dva bajty SEI; jeden bajt

Vidíte souvislost mezi velikostí týmu a parametry?

Každý mikrokontrolér má svůj assembler, i když jejich mnemotechnické pomůcky jsou podobné, tzn. Příkaz MOV pro MK jedné řady bude hledat ve strojovém kódu, řekněme 0x12, a pro další 0x55.
Aby při kompilaci byl zkompilován v kódu, který potřebujeme, musíme kompilátoru sdělit, pro jaký mikrokontrolér program píšeme.
To se obvykle vybírá při vytváření projektu.
Z tohoto důvodu jsme zvolili mikrokontrolér Atmega8.

Ale to není vše. Abychom nám usnadnili život, AVRStudio4 má sadu konstant, které se nazývají něco jako „Macroassembler“.

Abyste je mohli načíst, musíte vložit řádek na začátek kódu

Include "m8def.inc" // pomocí příkazu .include jsme načetli soubor m8def.inc; a teď to pro nás bude jednodušší;)

Na samém začátku kódu je umístěna tabulka přerušení. Co to je a jak to funguje, vysvětlím v jiném příspěvku. Ale zatím to napíšeme takto:

RJMP RESET ; Reset Handler RETI; RJMP EXT_INT0 ; IRQ0 Handler RETI; RJMP EXT_INT1 ; IRQ1 Handler RETI; RJMP TIM2_COMP ; Timer2 Compare 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 Ovladač přetečení 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 ; USART TX kompletní manipulátor RETI; RJMP ADC ; Kompletní manipulátor převodu ADC RETI; RJMP EE_RDY ; EEPROM Ready Handler RETI; RJMP ANA_COMP ; Obsluha analogového komparátoru RETI; RJMP TWSI ; Dvouvodičový ovladač sériového rozhraní RETI; RJMP SPM_RDY ; Store Program Memory Ready Handler

Poté přichází na řadu samotný kód

RESTART: ; inicializační token MAIN: NOP ; značka hlavní smyčky RJMP MAIN

Ale je tu jedna (nebo spíše ne jedna, ale mnoho) funkcí.

Pro usnadnění psaní kódu, pro jeho srozumitelnost a pro usnadnění relativních přechodů jsme dostali značky, jak vypadají? „RESET:“ a „MAIN:“ jsou značky; jejich názvy mohou obsahovat téměř libovolné latinské znaky a čísla. Značky nemohou mít názvy funkcí a příkazů, například „NOP“.
Jak se k nim člověk dostane? Řekněme příkaz RJMP.

Také z Markers můžeme udělat podprogram (procedura), po jehož dokončení se vrátíme tam, odkud byl volán. Chcete-li jej vyvolat, použijte příkaz „RCALL (podprogram)“ a pro návrat z podprogramu (procedura) jej musíte ukončit příkazem „RET“. Měli bychom skončit s kódem takto:

RESTART: MAIN: NOP RCALL PPP1 ; zavolejte podprogram RJMP MAIN PPP1: NOP RET ; opustit podprogram

Jak příkaz „RCALL“ funguje, když je zavolán, adresa, ze které byl volán, je umístěna na STACK, a když je zavolán příkaz „RET“, je odstraněn z registru „stack“. STACK je třeba inicializovat.

Abychom mohli s naším MK pracovat, musíme jej inicializovat. protože mk, toto zařízení je univerzální, má mnoho vstupních/výstupních portů a periferních zařízení. jako USART, PWM, DAC, ADC atd. Prvním krokem při inicializaci mikrokontroléru je označení začátku „zásobníku“. Inicializaci provádíme po značce „RESET:“.

LDI R16,VYSOKÝ(RAMEND) OUT SPH,R16 LDI R16,LOW(RAMEND) OUT SPL,R16

Pokud bychom na začátek kódu nezadali příkaz .include „m8def.inc“, museli bychom to napsat takto:

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

Rozdíl je podle mě podstatný.

STACK je paměť typu úložiště: (poslední dovnitř, první ven).
Typ obchodu není supermarket, ale roh ze samopalu. Doufám, že si každý umí představit, jak se do ní nakládají kazety a jak se odtamtud vyjímají.
Paměti STACK musíte věnovat velkou pozornost, protože... jakákoli drobná chyba při práci s ním může vést k selhání zásobníku. Toto je tak důležité téma, že jsem se mu rozhodl věnovat celé téma a napíšu ho do samostatné poznámky.

Tak jsme dostali následující kód:

Zahrnout "m8def.inc" RJMP RESET ; Reset Handler RETI; RJMP EXT_INT0 ; IRQ0 Handler RETI; RJMP EXT_INT1 ; IRQ1 Handler RETI; RJMP TIM2_COMP ; Timer2 Compare 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 Ovladač přetečení 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 ; USART TX Complete Handler RETI; RJMP ADC ; Kompletní manipulátor převodu ADC RETI; RJMP EE_RDY ; EEPROM Ready Handler RETI; RJMP ANA_COMP ; Obsluha analogového komparátoru RETI; RJMP TWSI ; Dvouvodičový ovladač sériového rozhraní RETI; RJMP SPM_RDY ; Store 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 hlavní smyčky RJMP MAIN

V této fázi můžeme projekt zkompilovat a spustit pro ladění, ale protože náš kód nic nedělá, bude možné pouze identifikovat syntaktické chyby v kódu.

Pro správný proces ladění je potřeba nastavit emulátoru frekvenci, se kterou bude MK pracovat, to se provádí až po zkompilování a spuštění ladění,
To znamená, že v řádku nabídek najdeme „Build“, otevřeme jej a uvidíme „Build and Run“, po kterém uvidíme žlutou šipku naproti prvnímu příkazu v našem seznamu kódů. Nyní hledáme „Debug“ na liště nabídek a klikneme na „Možnosti AVR Simulatoru“, otevře se následující okno:

Ve kterém můžeme změnit MK a jeho frekvenci, také na panelu vpravo vidíme nějaké informace o našem MK: jeho maximální frekvenci, kapacitu paměti (EEPROM, RAM, FLASH). Nyní otevřete datový list na Atmega8 na straně 203 (obecný seznam registrů) a 205 (obecný seznam příkazů) a začněte psát svůj program.
A pamatujte, nebojte se experimentovat se simulátorem, nerozbije se!


Ahoj.

Tento článek osloví ty, kteří věří, že „vyrostli“ z Arduina a jsou připraveni vstoupit do světa „seriózního“ programování mikrokontrolérů. Kromě toho, že „napumpujete své programátorské schopnosti“, budete mít možnost vybrat si pro své projekty libovolný mikrokontrolér a samozřejmě oceníte rychlost programů a velikost paměti, kterou zabírají.

Vše bude popsáno (pro    ), od začátku do konce, - instalace a příprava potřebného softwaru, sestavení nejjednoduššího programátoru „Gromov“ (nelekejte se, jsou tam jen tři diody a sedm rezistorů), firmware MK a psaní kódu v AVR Studiu. Celý proces bude doprovázen ilustracemi a příklady.

Dovolím si ihned provést rezervaci: počítač musí být vybaven portem COM (adaptér USB na COM nefunguje dobře). Pokud váš počítač takový konektor na zadní straně nemá, pak je pravděpodobně na základní desce (ve formě kolíků), vše lze vyřešit tímto druhem „vysunutí“

Bohužel, pro majitele notebooků bez COM má článek pouze akademický zájem.

Takže, začněme…

Co budete potřebovat?

"Měkký"


UniProf- univerzální program pro flashování různých mikrokontrolérů ATmega, jednoduchý a pohodlný a hlavně perfektně spolupracuje s naším programátorem. Autorem je ruský vývojář Michail Nikolaev.

Samozřejmě můžete flashovat MK z AVR Studia, ale k tomu potřebujete speciální programátor. Proto napíšeme kód ve studiu a výsledné hex soubory flashneme UniProfem pomocí našeho domácího programátoru. Dále bude popsán způsob flashování firmwaru z příkazové řádky.

Uživatelé Linuxu budou muset používat buď virtuální počítač, nebo Wine. U Wine mi to nevyšlo, port vůbec nevidím a s virtuálním strojem jsem to nezkoušel.

  Ve Wine funguje bezchybně (Debian 8.5, wine1.6).

Veškerý software je zdarma.

"Žehlička"

Budeme provádět experimenty na Arduino pro mini s čipem ATmega328. Křemenná frekvence (8/16 MHz), stejně jako napětí (3,3/5V), nevadí. (viz. níže)

V budoucnu budete programovat různé mikrokontroléry Atmel, ale poprvé je tato deska tak akorát. Je to dobré, protože je to prakticky holý ovladač s minimem kabeláže a pájených pinů. Přesně to, co potřebujete.

O značení na mikrokontrolérech

Za jménem jsou čísla, která nejčastěji udávají velikost paměti.

Písmeno za čísly označuje parametry napájecího napětí.

Žádný dopis- napájecí napětí regulátoru je v rozmezí 4,5-5,5 voltů.
L- verze ovladačů pracujících se sníženým výkonem (Nízký) napájecí napětí (2,7 - 5,5 voltů).
PROTI- verze regulátorů pracující na nízké napájecí napětí (1,8–5,5 voltu).
U- verze regulátorů pracující s ultranízkým napájecím napětím (0,7–5,5 voltu).
P- verze s nízkou spotřebou (až 100 nA v režimu vypnutí).
A- snížená spotřeba proudu, pokrývající celý rozsah taktovací frekvence všech verzí, napájecí napětí 1,8-5,5 V (u některých modelů byly přidány nové funkce a nové registry při zachování plné kompatibility s předchozími verzemi).

Mikrokontroléry « A“ a „ne- A" mají obvykle stejnou signaturu, což způsobuje určité potíže, protože pojistkové bity jsou různé.

Příklady:

ATmega8- kapacita paměti programu je 8 kilobajtů, napájecí napětí je 4,5-5,5 voltů.
ATmega8L- kapacita paměti programu je 8 kilobajtů, napájecí napětí je 2,7-5,5 voltů.
ATtiny43U- kapacita paměti 4 kB, modifikace - 3, napájecí napětí - 0,7-5,5 voltů.
ATtiny44A- kapacita paměti 4 kB, modifikace - 4, snížená spotřeba proudu, napájecí napětí 1,8-5,5 voltů.

Stává se, že ovladač bez písmene může mít snížené napájecí napětí (1,7 nebo 1,8 voltu). To je třeba objasnit v datovém listu.

ATtiny841- kapacita paměti 8 kB, modifikace - 41, napájecí napětí - 1,7-5,5 voltů.

Za pomlčkou je uvedena verze mikrokontroléru, která se skládá z čísel udávajících maximální frekvenci ovladače (při vhodném napájecím napětí) a z písmen označujících možnost krytu, rozsah provozních teplot a výrobní vlastnosti.

Jedno nebo dvě písmena za frekvencí označují typ krytu:

UniProf
Psaní programu je polovina úspěchu, pořád ho musíte nějak nacpat do ovladače. Věnujme tomu tedy více pozornosti.

Bylo by hezké, kdyby vaše Arduino bylo nabité standardním Blinkem (je s ním z výroby).

Spustíme UniProf... Možná se objeví následující okno:

To je připojeno k portu LPT, takže stačí kliknout OK.

Poté se otevře okno programu:

Pokud není port vybrán správně, zobrazí se okno s dotazem...

Klikněte na OK a vyberte požadovaný port.

Pokud není MK detekován automaticky, objeví se okno s ručním výběrem:

Bohužel ne na seznamu atmega328, tak vybíráme mega32 (mají stejné množství flash paměti) a stiskněte OK.

Poté se místo slova neznámý objeví připojený ovladač...

32 tis je množství paměti Flash a 1024 - Objem EEPROM.

Nyní, pokud je vše jako na obrázku, tak otevřete nápovědu   a pečlivě si přečtěte, co je tam napsáno. Autor byl velmi stručný, takže to nezabere moc času. Zatím nemačkejte žádná tlačítka.

Potkal jsi? Skvělé, teď můžeme pokračovat. Zrušte zaškrtnutí políčka vedle EEPROM a uvidíte změněné rozhraní:

Po zrušení zaškrtnutí políčka EEPROM se čtení a zápis této oblasti paměti neprovádí.

Protože budeme pracovat s hex soubory, odstraníme „zaškrtnutí“ Všeobecné A ZÁSOBNÍK a také zaškrtněte políčko Brzda!, prodlouží to dobu čtení/zápisu, ale zvýší stabilitu.

Proces není rychlý, takže budete muset počkat. Dole se budou plazit modré čtverečky a čísla se budou počítat v pravém dolním rohu. První průchod přečte oblast PROGRAM a druhý přečte EEPROM.

Mám nové Arduino se standardním Blinkem (když je programátor připojen, dioda přestane blikat). Pokud máte to samé, objeví se následující obrázek:

Vpravo vidíme, že v EEPROM není nic, a vlevo v PROGRAMU je nahraný program (jak jsem řekl, tohle je Blink). Nyní pomocí šipky dolů posouvejte posuvník, dokud nedojdou data...

...teď přejděte na konec. Uvidíte více dat – toto je zavaděč Arduino.

Nyní navrhuji dát si pauzu od mého článku a přečíst si o struktuře MK, což výrazně zvýší vaše porozumění materiálu. Vše je napsáno velmi dobře a srozumitelně. No, až si to přečtete, vraťte se a pokračujeme...

Zrušte zaškrtnutí EEPROM. Ve skutečnosti to nepotřebujeme, ale bude jasné, že existuje „tik“ Brzda!

Nyní uložme vše, co je firmware v ovladači, abychom jej po experimentech mohli vrátit do původního stavu.

Stiskněte tlačítko   a uložte firmware, nazvěte jej nějak jako - origProMini328.hex. To je vše, teď máte zálohu.

... a poté klikněte na již známé tlačítko Číst. Poté uvidíte, že všechny buňky v PROGRAMU jsou prázdné. Byl odstraněn nejen program, ale také zavaděč Arduino.
To znamená, že nyní nebudete moci nahrávat skici pomocí tradiční metody. Pak, pokud chcete, lehkým mávnutím ruky vše obnovte ze zálohy.

Nyní provedeme flashování ovladače stejným „Blink“, pouze napsaným v AVR Studiu.

Takto vypadá kód:

#define F_CPU 16000000UL #zahrnout #zahrnout #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; }
Pokud použijete Arduino s 8 MHz quartz, tak to nemá chybu, jen bude dioda blikat o polovinu častěji.

Zde je uvedeno, kolik místa zabírá:

AVRDude

Uniprof, stejně jako mnoho dalších podobných programů, je pouze grafickým doplňkem nad programem AVRDude (AVR Downloader-Uploader), který pak na mikrokontroléru provede všechny výše popsané akce.
Protože AVRDude nemá vlastní grafické rozhraní, musíte s ním pracovat z příkazové řádky. Někomu se to může zdát nepohodlné, ale je to právě naopak; práce z konzole je prostě skvělá. Pohodlné, jednoduché a nevázané na žádný OS, protože avrdude existuje snad na všechno. Nyní uvidíte toto.

Pro uživatele

Avrdude je součástí AVR toolchain, takže si jej nainstalujte (po instalaci AVR Studio) jak je napsáno na začátku článku.

CD\
...přejděte do kořenového adresáře disku S.

Zadáním příkazu:

Pokud je to tak, pak avrdude připraven jít a pokračovat.

Nyní musíme přidat našeho programátora do konfiguračního souboru avrdude (C:\Program Files (x86)\Atmel\AVR Tools\AVR Toolchain\bin\ avrdude.conf) . Otevřete jej v programu Poznámkový blok++ a za nápis „DEFINICE PROGRAMÁTORŮ“ přidejte tyto řádky:

ID programátora = "gromov"; desc = "narušení sériového portu, reset=dtr sck=rts mosi=txd miso=cts"; typ = srb; reset = 4; scck = 7; mosi = 3; miso = 8; ;
Bit-bouchání.

Uložte a zavřete soubor, již není potřeba.

Vraťte se do terminálu a dejte příkaz ke kontrole komunikace mezi MK a programátorem:

Avrdude -n -c gromov -P com1 -p m328p
Možná máte jiný komunikační port.

Nainstalujte avrdude

Sudo apt install avrdude

Zadáním příkazu:

Měli byste vidět informace nápovědy.

Pokud je to tak, pak avrdude připraven na práci.

Nakonfigurujte port:

Sudo stty 9600 ignbrk -brkint -icrnl -imaxbel -opost -isig -icanon -iexten -echo noflshTo je nutné provést po každém restartu počítače nebo jej přidat do rc.local.

Kde je /dev/ttyS0 com1, /dev/ttyS1 - com2 atd.
V budoucnu budu psát v týmech /dev/ttyS0, možná máte /dev/ttyS1 atd.

Přidejte programátor do konfiguračního souboru /etc/avrdude.conf

Sudo nano /etc/avrdude.conf

Za „DEFINICE PROGRAMÁTORU“ přidejte následující řádky:

ID programátora = "gromov"; desc = "narušení sériového portu, reset=dtr sck=rts mosi=txd miso=cts"; typ = "serbb"; reset = 4; scck = 7; mosi = 3; miso = 8; ;
Programátor využívá technologii Bit-banging.

Ujistěte se, že při kopírování zůstanou uvozovky pouze uvozovkami, jinak se mohou změnit (kvůli rozdílu v kódování) a avrdude bude nadávat.

Uložte a zavřete soubor.

Zadejte příkaz pro kontrolu spojení mezi MK a programátorem:

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

Pokud existuje spojení, odpověď bude takto:

Zde rozdíly mezi operačními systémy končí a příkazy se duplikují.

Přidejte k příkazu argument -proti nebo -v -v (lze přidat k libovolným příkazům) pro zobrazení úplných informací:

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


Závěr Avrdude je, že ve Windows i v Linuxu je to stejné, takže odteď budu pořizovat screenshoty pouze ve Win.

Zde je více informací, můžete se například podívat, jaké pojistky jsou nainstalovány. Zde jsou zobrazeny v šestnáctkové soustavě (HEX)čísla. Například hfuse 0xDA, binárně to vypadá takto - . To znamená, že se jedná o stejné bity, které jsou zaškrtnuté v grafických rozhraních.

Když se zabýváte pojistkami, nezapomeňte, že v mikrokontrolérech ATmega jsou pojistky obrácené. To znamená 0 - Tento na Yucheno a 1 - vypnuto Yucheno. To způsobuje zmatek v online kalkulačkách (viz níže).

Pojďme si přečíst firmware z oblasti blikat (stejně jako PROGRAM v uniprof) pří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 byl kód zobrazen v programu, ale zde bude zapsán do souboru.

Firmware čte a zapisuje do souboru readfl.txt. Dopis h (hexadecimální) na konci označuje, že data by měla být zapsána v hexadecimálním formátu. Pokud napíšete dopis b (binární), bude zapsán ve dvojkové soustavě a if r (drsný), pak budou data v „raw“ podobě (kryakozyabra).

Od této chvíle se předpokládá, že uživatelé win se nacházejí v kořenovém adresáři disku S (C:\) a uživatelé Linuxu pracují ze své domovské složky, takže soubory budou uloženy tam (pokud není uvedeno jinak). Tam by měl být umístěn firmware, který bude nahrán do MK.

Pro win bude soubor umístěn zde C:\readfl.txt a pro linux v /home/user/readfl.txt. Tento soubor můžete otevřít a podívat se.

Čtení 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###

Čtení flash a eeprom společně:

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###

Vymazání ovladače:

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

Odpojte "reset" pin - dioda nebude blikat, program bude vymazán.

Flashneme MK dříve staženým souborem 328test.hex. Leží v kořenovém adresáři disku C(c:\328test.hex) ve windows nebo v domovské složce (/home/user/328test.hex) v linuxu.

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###

Pokud nyní vypnete „reset“, ovladač ožije.

Poznámka. Při blikání MK přes avrdude, není nutné ovladač mazat, program to udělá sám. Pokud však zadáte parametr -D, pak se MK automaticky nevyčistí.

Firmware 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###

Čtení všech pojistek:

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 fuse :r:efuse.txt:h ###Linux###

Některé ovladače nemusí mít žádnou pojistku.

Pouze čtení Nízká pojistka:

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ízká pojistka je zodpovědná za výběr zdroje hodinového signálu (interní, externí), jeho frekvence a pauzy před spuštěním regulátoru po připojení napájení. Nyní tam máte napsanou hodnotu - 0xff, což odpovídá externímu quartzu od 8 MHz a výše.

Nyní blikneme další fuse, která převede váš ATmeg do práce z interního 8 MHz generátoru.

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###

Pokud máte 16 MHz Arduino, bude dioda blikat dvakrát pomaleji.
V budoucnu můžete při kódování v AVR Studiu zadat frekvenci 8 MHz a odpájet křemen, čímž získáte další dva volné digitální piny.

Ale to je později a nyní vraťme vše tak, jak to bylo blikáním předchozí pojistky:

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###

Dioda bude blikat správně.

Pojistky lze blikat jednotlivě nebo společně:

Avrdude -c gromov -P com1 -p m328p -U pojistka:š:0xda:m -U pojistka:š:0xff:m -U pojistka:š: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###
Tyto příkazy není nutné zadávat. Pro přehlednost je uvádím.

V budoucnu, až budete potřebovat použít jiné ovladače, zaškrtnete políčka v online kalkulačce a získáte hodnoty (odkaz je v levém horním rohu) v hexadecimálním formátu a flashnout.

Teď už zbývá jen vymyslet parametry avrdude a můžete přejít k závěrečné části.

-c gromov- typ programatoru, respektive jmeno pod kterym je to napsano v config (avrdude.conf).
-P com1- Tady je všechno jasné.
-p m328p- typ označení MK.
-U- po této volbě se zobrazí oblast paměti (flash, eeprom, xfuse), na kterém budou prováděny případné akce (r - číst, w - psát).
Dvojtečky slouží jako oddělovače.

Zde s názvy mikrokontrolérů a jejich aliasů, programátorů a dalších možností.

Přezdí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

Uživatelé Linuxu mohou používat víno.

Doufám, že už máte vše nainstalované, takže spustíme AVR Studio...


Zde jsme požádáni, abychom vytvořili nový projekt nebo otevřeli starý. Klikněte Nový projekt


Vybrat AVR GCC, protože budeme psát v SI, a ne v assembleru.
Projekt pojmenujeme a zaškrtneme políčka.
Vybrat Umístění (Vytvořil jsem složku AVR na disku C:\) tam se automaticky vytvoří složky s projekty.
Klikněte další


Vybrat AVR simulátor, protože nemáme speciální programátor, který umožňuje ladění, a náš mikrokontrolér ano ATmega 328p.
Klikněte Dokončit.

Po těchto manipulacích je studio připraveno k práci.

Vlevo jsou cesty k projektu. Uprostřed je textový editor, ve kterém se píše kód. Vpravo jsou registry regulátoru. Vlevo dole jsou informace o ladění.

Z tlačítek nás aktuálně zajímají tyto -

Sestavte projekt.
Sestavte projekt a začněte ladit.
Kompilace souboru.
Čištění.
Nastavení projektu. Tak na to klikni...

Zde můžete změnit typ MK, nastavit frekvenci hodin (napíšeme to přímo do kódu), úroveň optimalizace a také určit, jaké soubory budou vytvořeny.
Pro zajímavost klikněte na ikony vlevo a klikněte zrušení.
Nebudu vysvětlovat tyto a další možnosti, ale později poskytnu odkaz s kompetentním popisem.

Nyní zkopírujte kód napsaný na začátku článku a vložte jej do editoru:

V kódu jsme zadali frekvenci hodin, protože to knihovna vyžaduje zpoždění.h.

Sestavení bylo úspěšné, neobjevily se žádné chyby ani varování.

Nyní pojďme na cestu C:\AVR\my328\default\, najdeme tam hex soubor, který jsme vytvořili - my328.hex a flashnout jej do ovladače. Co flashnout (avrdude nebo uniprof) vyberte si sami.

V avrdude to bude vypadat 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###

Vypněte „reset“ a sledujte, jak dioda bliká jednou za sekundu. Doufám, že jsem vás přesvědčil o jednoduchosti a pohodlí příkazového řádku.

Chcete-li změnit Arduino zpět na Arduino, máte zálohu.

Jak již bylo napsáno výše, nebudu se pouštět do vysvětlování práce s AVR Studiem, ani nebudu dávat lekce o jazyce SI. Za prvé, tohle nebyl můj plán. (Chtěl jsem jen pomoci s přechodem z Arduina na AVR Studio)

IDE je integrované vývojové prostředí, které obsahuje různé šablony, knihovny a funkce debuggeru. Pokud se budeme bavit, od roku 2004 je pro ně vyvíjen výkonný softwarový balík AVR studio.

První verze

První verze studia obsahovaly assembler pro , můžete jej extrahovat z prvních sestavení, ale později byl tento projekt opuštěn a jako hlavní jazyk byl zvolen C AVR. Kompilátor byl placený a velmi seriózní produkt IAR. Můžete si zdarma stáhnout WINAVR; k tomu je třeba po instalaci studia nainstalovat.

Poznámka! Je lepší to udělat až po instalaci AVR studio 4 a dalších verzí.

AVR studio 4 (na obrázku výše) bylo uváděno po dlouhou dobu. S tímto problémem se setkalo mnoho vývojářů mikrokontrolérů. Později bylo IDE upgradováno na AVR studio 5. Kromě rozhraní nedošlo k žádným zvláštním změnám a teprve poté vývojářská společnost přeznačila produkt a změnila název na Atmel studio 6.

Prostředí AVR studio 5 podporovalo následující mikrokontroléry:

  • AVR32;
  • XMEGA.

Atmel studio 6 se výrazně lišilo od AVR studio 5; nejvýraznější inovace ve verzi byly:

  1. Microsoft Visual Studio 2010 začalo pracovat s rodinou AVR.
  2. Vylepšené zvýraznění syntaxe ve srovnání s AVR studio 5.
  3. Přidány rady a automatické dokončování sady příkazů, což urychluje proces vývoje.
  4. Obecně se celý provoz prostředí stal spolehlivější.
  5. Přidána podpora pro ARM Cortex-M.
  6. WinAVR již není třeba instalovat samostatně, GCC se nyní na rozdíl od mladších verzí instaluje během procesu instalace.

V Atmel studiu 6 došlo pro uživatele programu ke skoku k lepšímu, což ovlivnilo oblibu rodin Atmel. Nebylo však možné dosáhnout adekvátní podpory ruských znaků v cestách souborů.

Aktuální verze – Atmel studio 7

Vývojové prostředí, které jsem použil, bylo Visual Studio Isolated Shell 2015; jednak toto řešení není podporováno na Windows XP, jednak byla tato opatření přijata za účelem zlepšení jak vzhledu programu, tak jeho funkčnosti.

Snad nejvýznamnější je přidání podpory Arduina v Atmel studio 7. To znamená, že můžete přejít od sady jednoduchých náčrtů k používání všech funkcí C, ladění, simulátoru MCU a dalších funkcí. Spojení Arduina a Atmel studio 7 dalo nové kolo ve vývoji této jednoduché výukové platformy.

Studium Atmel studia s Arduinem poskytne příležitost posunout se ke kompletnímu a produktivnímu zvládnutí a hlubšímu seznámení se srdcem Arduina – mikrokontrolérem Atmega.

Navíc si z webu Atmel můžete stáhnout balíček pro obsluhu a připojení LCD. Jako příklad pro mastering lze použít LCD 1602, na internetu je o něm mnoho lekcí a vývojář má na displeji k dispozici 16 znaků a 2 řádky.

Kde se začít učit?

Měli byste samozřejmě začít zakoupením programátoru; Nejvýhodnější z nich je USBASP. Programátor USBASP není v Atmel Studio 7 podporován.


Stáhněte si ovladače pro programátor a program AVRdude, a aby vše fungovalo společně, můžete použít příkaz z příkazového řádku:

"avrdude -c usbasp -p atmega32 -U flash:w: název souboru firmwaru. hex -U pojistka:š:0x6a:m -U pojistka:š:0xff:m"

a povolte jeho podporu vytvořením profilu v atmel studio 7 (titul – externí nástroje) a do položky Argumenty zadejte „-c usbasp -p atmega32 -U flash:w:$(CílovýName).hex“ a tak dále pro každý typu používáte mikrokontroléry.

Toto je jediný způsob, jak propojit studio a programátor USBASP. Při blikání buďte opatrní - můžete poškodit podpis mikrokontroléru a lze jej obnovit pouze pomocí 12 V (vysokonapěťového) programátoru.

Jakou literaturu bych měl použít pro školení?

Nejprve si ke každému mikrokontroléru stáhněte manuály z oficiálních stránek. Je těžké doporučit konkrétní učebnici, ale existuje „DI Halt - AVR. Školicí kurz“ můžete jej použít - tvůrcem tohoto materiálu je praktik, autor mnoha článků o různých internetových zdrojích a prostě respektovaná osoba v odborných kruzích.

Více než jednou nebo dvakrát jsem řekl, že studium MK by mělo začít s assemblerem. Tomu byl věnován celý kurz na webu (sice není moc důsledný, ale postupně to česám do adekvátního vzhledu). Ano, je to těžké, výsledek nebude hned první den, ale naučíte se chápat, co se děje ve vašem ovladači. Budete vědět, jak to funguje, a nebudete kopírovat zdroje jiných lidí jako opice a snažit se pochopit, proč to najednou přestalo fungovat. Navíc je pro C mnohem snazší vytvořit kód dělníka, který vyleze vidlemi v tu nejméně vhodnou chvíli.

Bohužel každý chce výsledky hned. Tak jsem se rozhodl jít jinou cestou – udělat návod na C, ale s ukázkou jeho spodního prádla. Dobrý programátor embedderu vždy drží svůj kus hardwaru pevně za šroub a nedovolí mu udělat jediný krok bez povolení. Takže nejdřív bude C kód, pak co vytvořil kompilátor a jak to vlastně všechno funguje :)

Na druhou stranu, silnou stránkou C je přenositelnost kódu. Pokud samozřejmě vše napíšete správně. Rozdělení pracovních algoritmů a jejich hardwarových implementací do různých částí projektu. Pak pro přenos algoritmu na jiný mikrokontrolér bude stačit přepsat pouze vrstvu rozhraní, kde jsou zapsána všechna volání hardwaru, a ponechat veškerý pracovní kód tak, jak je. A samozřejmě čtivost. Zdrojový kód C je na první pohled srozumitelnější (i když... například je mi jedno, na co ukazovat - ať už C nebo ASM :)), ale opět, pokud je vše napsáno správně. I těmto bodům budu věnovat pozornost.

Moje ladicí deska poslouží jako experimentální hardware, na který bude nainstalován lví podíl všech příkladů.

První C program pro AVR

Výběr kompilátoru a nastavení prostředí
Existuje mnoho různých kompilátorů C pro AVR:
Za prvé toto IAR AVR C- je téměř určitě uznáván jako nejlepší kompilátor pro AVR, protože samotný ovladač byl vytvořen v úzké spolupráci mezi Atmelem a specialisty z IAR. Za všechno se ale musí platit. A tento kompilátor je nejen drahý komerční software, ale má také takovou tunu nastavení, že to v něm jednoduše zkompilovat dá hodně úsilí. Opravdu jsem si s ním nevypěstoval přátelství, projekt hnil kvůli podivným chybám ve fázi propojení (později jsem zjistil, že to byla křivá trhlina).

Druhý přichází WinAVR GCC- výkonný optimalizační kompilátor. Plně open source, multiplatformní, obecně všechny radosti života. Dokonale se také integruje do AVR Studia, což vám umožní ladit přímo tam, což je zatraceně pohodlné. Obecně jsem si to vybral.

Existuje také CodeVision AVR C je velmi populární kompilátor. Stala se populární díky své jednoduchosti. Funkční program v něm získáte za pár minut – průvodce startovacím kódem to značně usnadňuje tím, že razí standardy pro inicializaci nejrůznějších věcí. Abych byl upřímný, mám to trochu podezřelé - jakmile jsem musel rozebrat program napsaný tímto kompilátorem, ukázalo se, že to byl nějaký nepořádek a ne kód. Strašné množství zbytečných pohybů a operací, což mělo za následek značné množství kódu a pomalý výkon. Možná však došlo k chybě v DNA člověka, který napsal původní firmware. Navíc chce peníze. Ne tolik jako IAR, ale znatelné. A v demo režimu vám umožňuje napsat ne více než 2 kb kódu.
Samozřejmě existuje crack, ale pokud se chystáte krást, je to milion ve smyslu IAR :)

Existuje také Image Craft AVR C A MicroC z mikroelektroniky. Nemusel jsem použít ani jeden, ale S.W.G. velmi chválit MicroPascal, říkají, strašně pohodlné programovací prostředí a knihovny. Myslím, že MicroC nebude o nic horší, ale je také placený.

Jak jsem řekl, vybral jsem WinAVR ze tří důvodů: je zdarma, integruje se do AVR Studia a je pro něj napsána jen tuna připraveného kódu pro všechny příležitosti.

Stáhněte si tedy instalaci WinAVR pomocí AVR Studia. Dále se nejprve nainstaluje studio, poté se navrch natočí WinAVR a připojí se ke studiu ve formě pluginu. Důrazně doporučuji nainstalovat WinAVR na krátkou cestu, něco jako C:\WinAVR, předejdete tak spoustě problémů s cestami.

Vytvoření projektu
Takže studio je nainstalováno, C je zašroubováno, je čas zkusit něco naprogramovat. Začněme tím jednoduchým, nejjednodušším. Spusťte studio, vyberte nový projekt jako kompilátor AVR GCC a zadejte název projektu.

Otevře se pracovní pole s prázdným souborem *.c.

Nyní nebude na škodu nakonfigurovat zobrazení cest v záložkách studia. Chcete-li to provést, přejděte na:
Nabídka Nástroje - Možnosti - Obecné - Záložky souborů a z rozevíracího seznamu vyberte možnost „Pouze název souboru“. V opačném případě nebude možné pracovat - karta bude obsahovat úplnou cestu k souboru a na obrazovce nebudou více než dvě nebo tři karty.

Nastavení projektu
Obecně se za klasické považuje vytvoření souboru make, ve kterém jsou popsány všechny závislosti. A to je asi správně. Ale pro mě, který vyrostl s plně integrovanými IDE, jako uVision nebo AVR Studio tento přístup je hluboce cizí. Proto si to udělám po svém, vše pomocí studiových prostředků.

Stiskněte tlačítko s ozubeným kolem.


Jedná se o nastavení pro váš projekt, respektive nastavení pro automatické generování make souboru. Na první stránce stačí zadat frekvenci, na které bude váš MK fungovat. To závisí na pojistkových bitech, takže předpokládáme, že naše frekvence je 8 000 000 Hz.
Pozornost věnujte také optimalizační linii. Nyní je zde -Os - to je optimalizace velikosti. Nechte to zatím tak, jak je, pak si můžete zkusit pohrát s tímto parametrem. -O0 není vůbec žádná optimalizace.

Dalším krokem je konfigurace cest. Nejprve tam přidejte svůj adresář projektu – přidáte tam knihovny třetích stran. V seznamu se objeví cesta „.\“.

Soubor Make byl vygenerován, můžete se na něj podívat ve výchozí složce ve vašem projektu, stačí se podívat a zjistit, co tam je.


To je prozatím vše. Všude klikněte na OK a přejděte ke zdroji.

Formulace problému
Prázdný list papíru svádí k realizaci nějakého mazaného nápadu, protože banální blikání diody už nefunguje. Okamžitě vezmeme býka za rohy a implementujeme spojení s počítačem - to je první věc, kterou dělám.

Bude to fungovat takto:
Když na COM port dorazí jednička (kód 0x31), diodu rozsvítíme a když přijde nula (kód 0x30), zhasne. Navíc vše bude probíhat na přerušení a na pozadí bude blikat další dioda. Jednoduché a smysluplné.

Sestavení obvodu
Potřebujeme připojit modul převodníku USB-USART k pinům USART mikrokontroléru. Chcete-li to provést, vezměte propojku ze dvou vodičů a umístěte ji na kolíky křížem. To znamená, že připojíme Rx regulátoru k Tx převodníku a Tx převodníku k Rx regulátoru.

Nakonec je toto schéma:


Neuvažuji o připojení zbývajících pinů, napájení nebo resetu, je to standardní.

Psaní kódu

Dovolím si hned učinit výhradu, že se nebudu pouštět konkrétně do popisu samotného jazyka C. Existuje na to prostě obrovské množství materiálu, od klasického „programovacího jazyka C“ od K&R po různé příručky.

Jednu takovou metodu jsem našel ve své skrýši, kdysi jsem ji použil ke studiu tohoto jazyka. Vše je tam krátké, jasné a věcné. Postupně to dávám dohromady a přetahuji na svůj web.

Je pravda, že ještě nebyly převedeny všechny kapitoly, ale myslím, že to nebude na dlouho.

Je nepravděpodobné, že bych to mohl popsat lépe, takže ze školení, místo podrobného vysvětlení jemností, poskytnu jednoduše přímé odkazy na jednotlivé stránky této příručky.

Přidávání knihoven.
Nejprve přidáme potřebné knihovny a hlavičky s definicemi. C je přece univerzální jazyk a musíme mu vysvětlit, že pracujeme konkrétně s AVR, takže do zdrojového kódu napište řádek:

1 #zahrnout

#zahrnout

Tento soubor je umístěn ve složce WinAVR a obsahuje popis všech registrů a portů řadiče. Navíc je tam vše mazané, s vazbou na konkrétní řadič, který překladač přenáší přes udělat soubor v parametru MCU a na základě této proměnné se k vašemu projektu připojí hlavičkový soubor s popisem adres všech portů a registrů pro tento konkrétní řadič. Páni! Bez toho je to také možné, ale pak nebudete moci používat symbolická jména registrů jako SREG nebo UDR a budete si muset pamatovat adresy každého z nich, jako je „0xC1“, což bude bolet hlavy.

Samotný tým #zahrnout<имя файла> umožňuje přidat do projektu obsah libovolného textového souboru, například soubor s popisem funkcí nebo kusem jiného kódu. A aby direktiva mohla tento soubor najít, zadali jsme cestu k našemu projektu (adresář WinAVR je tam již registrován standardně).

Hlavní funkce.
Program v C se skládá výhradně z funkcí. Mohou být vnořeny a volány jeden od druhého v libovolném pořadí a různými způsoby. Každá funkce má tři požadované parametry:

  • Návratová hodnota je např. hřích(x) vrátí hodnotu sinusu x. Zkrátka jako v matematice.
  • Přenášené parametry jsou stejné X.
  • Funkční tělo.

Všechny přenášené a vrácené hodnoty musí být určitého typu v závislosti na datech.

Každý program v jazyce C musí obsahovat funkci hlavní jako vstupní bod do hlavního programu, jinak to vůbec není C :). Přítomností hlavního ve zdrojovém kódu někoho jiného z milionu souborů můžete pochopit, že toto je hlavní část programu, kde vše začíná. Tak se zeptejme:

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

int main(void) ( return 0; )

To je vše, první nejjednodušší program byl napsán, nezáleží na tom, že nic nedělá, právě jsme začali.

Pojďme zjistit, co jsme udělali.
int Toto je datový typ, který vrací hlavní funkce.

Samozřejmě v mikrokontroléru hlavní v zásadě nelze nic vrátit a teoreticky by mělo být void main (void), ale GCC je původně určeno pro PC a tam může program po dokončení vrátit hodnotu operačnímu systému. Proto GCC zapnuto void main (void) přísahá Varováním.

Toto není chyba, bude to fungovat, ale nemám rád varování.

prázdnota v tomto případě jde o typ dat, která funkci předáme hlavní také nemůže přijmout nic zvenčí, proto prázdnota- figurína. Útržek se používá, když není potřeba nic přenášet nebo vracet.

Zde jsou { } složené závorky jsou programový blok, v tomto případě tělo funkce hlavní, bude tam kód umístěn.

vrátit se- to je návratová hodnota, kterou funkce main vrátí po dokončení, protože máme int, tedy číslo, musíme vrátit číslo. I když to stále nedává smysl, protože... na mikrokontroléru můžeme nikam jít pouze z hlavního. Vracím se nula. Protože na tom nezáleží. Kompilátor je ale většinou chytrý a kód pro tento případ negeneruje.
I když, když zvrácený, tak z hlavní Můžete přejít na MK - například spadnout do sekce bootloader a spustit jej, ale bude to vyžadovat nízkoúrovňové pohrávání s firmwarem, aby se opravily přechodové adresy. Níže uvidíte sami a pochopíte, jak na to. Proč? To je další otázka, v 99,999% případů to není nutné :)

Udělali jsme to a šli dál. Přidejme proměnnou, vlastně ji nepotřebujeme a bez ní nemá smysl zavádět proměnné, ale učíme se. Pokud jsou proměnné přidány do těla funkce, pak jsou lokální a existují pouze v této funkci. Když funkci ukončíte, tyto proměnné se vymažou a paměť RAM je přidělena pro důležitější potřeby. .

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

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

nepodepsaný znamená nepodepsaný. Faktem je, že v binární reprezentaci je nejvýznamnější bit přidělen znaménku, což znamená, že číslo +127/-128 se vejde do jednoho bajtu (char), ale pokud se znaménko zahodí, vejde se od 0 do 255. Obvykle znak není potřeba. Tak nepodepsaný.
i je pouze název proměnné. Už ne.

Nyní musíme inicializovat porty a UART. Samozřejmě můžete vzít a připojit knihovnu a zavolat nějaký druh UartInit(9600); ale pak nebudete vědět, co se vlastně stalo.

Dělá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(přenosový oddělovač) ; UBRRH = HI(přenosový dělič) ; 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 (přenosový dělič); UBRRH = HI (přenosový dělič); UCSRA = 0; UCSRB = 1<

děsivé? Ve skutečnosti existuje pouze pět posledních řádků skutečného kódu. Všechno, to #definovat je to preprocesorový makro jazyk. Téměř stejné věci jako v Assembly, ale syntaxe je mírně odlišná.

Usnadní vám rutinní operace výpočtu potřebných koeficientů. V prvním řádku říkáme místo toho XTAL můžete bezpečně nahradit 8000000 a L- označení typu, přičemž long je hodinová frekvence procesoru. Stejný přenosová rychlost— frekvence přenosu dat přes UART.

přenosový dělič již složitější, místo něj bude nahrazen výraz vypočítaný pomocí vzorce ze dvou předchozích.
Dobře a HLE. A AHOJ nízké a vysoké bajty budou převzaty z tohoto výsledku, protože Zjevně se nemusí vejít do jednoho bajtu. V AHOJ X (parametr vstupu makra) se osmkrát posune doprava, takže zbývá pouze nejvýznamnější bajt. A dovnitř HLE. uděláme bitový AND s číslem 00FF, ve výsledku zůstane pouze nízký bajt.

Takže všechno, co se dělá, je jako #definovat můžete to klidně vyhodit a na kalkulačce si spočítat potřebná čísla a hned je zadat do řádků UBBRL = …. a UBBRH = …..

Umět. Ale! Udělej to NAPROSTO NEMOŽNÉ!

Bude to fungovat tak nebo tak, ale budete mít tzv magická čísla- hodnoty převzaté odnikud a z neznámých důvodů, a pokud takový projekt otevřete za pár let, bude zatraceně těžké pochopit, co tyto hodnoty jsou. I nyní, pokud chcete změnit rychlost nebo změnit frekvenci quartz, bude se muset vše znovu přepočítat, ale změnili jste pár čísel v kódu a je to. Obecně platí, že pokud nechcete být označeni jako kodér, vytvořte svůj kód tak, aby byl snadno čitelný, srozumitelný a snadno upravitelný.

Pak je vše jednoduché:
Všechny tyto „UBRRL and Co“ jsou konfigurační registry vysílače UART, pomocí kterých budeme komunikovat se světem. A nyní jsme jim přiřadili požadované hodnoty a nastavili je na požadovanou rychlost a režim.

Typ záznamu 1< Znamená následující: vezměte 1 a umístěte jej na místo RXEN v byte. RXEN toto je 4. bit registru UCSRB, Tak 1< tvoří binární číslo 00010000, TXEN- toto je 3. bit a 1< dá 00001000. Jediné "|" je to bitové NEBO, takže 00010000 | 00001000 = 00011000. Stejným způsobem se nastaví zbývající potřebné konfigurační bity a přidají se do obecné haldy. Výsledkem je, že shromážděné číslo je zaznamenáno v UCSRB. Více podrobností je popsáno v datovém listu na MK v sekci USART. Nenechme se tedy rozptylovat technickými detaily.

Hotovo, je čas podívat se, co se stalo. Klikněte na kompilaci a spusťte emulaci (Ctrl+F7).

Ladění
Proběhly všechny možné ukazatele průběhu, studio se změnilo a poblíž vstupu do hlavní funkce se objevila žlutá šipka. Zde právě běží procesor a simulace je pozastavena.

Faktem je, že zpočátku to ve skutečnosti bylo na řádku UBRRL = LO(bauddivider); Koneckonců, to, co definujeme, není kód, ale pouhé předběžné výpočty, a proto je simulátor trochu nudný. Ale teď si uvědomil, že první instrukce byla dokončena a pokud vylezete na strom Zobrazení I/O, do sekce USART a podívejte se tam na byte UBBRL, uvidíte, že ta hodnota už tam je! 0x33.

Udělejte to ještě o krok dále. Podívejte se, jak se mění obsah druhého registru. Projděte si je tedy všechny, věnujte pozornost tomu, že všechny uvedené bity jsou nastaveny tak, jak jsem vám řekl, a jsou nastaveny současně pro celý bajt. Dál než Návrat to nepůjde – program je u konce.

Otevírací
Nyní resetujte simulaci na nulu. Klikněte tam Resetovat (Shift+F5). Otevřete rozložený výpis, nyní uvidíte, co se vlastně v ovladači děje. Zobrazit -> Disassembler. A ne YYAAAAAA!!! Assembler!!! HRŮZA!!! A JE TO NUTNÉ. Abyste později, až se něco pokazí, nebyli v kódu hloupí a nekladli hloupé otázky na fórech, ale okamžitě se dostali do vnitřností a viděli, kde jste uvízli. Není tam nic děsivého.

Nejprve budou topy ze 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 JMP 0x340900000000006 0009000000000000000000000004 0x00000034 Skok +00000008: 940C0034 JMP 0x00000034 Skok +0000000A: 940C0034 JMP 0x00000034 Skok +0000000C: 3440C0000C: 000000000 0000000E: 940C0034 JMP 0x00000034 Skok +00000010: 940C0034 JMP 0x00000034 Skok +00000012: 940C0034 JMP0010C00900001 0x00000034 Skok +00000016: 940C0034 JMP 0x00000034 Skok +00000018: 940C0034 JMP 0x00000034 Skok +0000001A: 0000001A:1001A: 000001 : 940C0034 JMP 0x00000034 Skok +0000001E: 940C0034 JMP 0x00000034 Skok +00000020: 940C0034 JMP 0x00000034 Skok 0x00000034 Skok 04020000304 +00002002 34 Jump +00000024: 940C0034 JMP 0x00000034 Jump +00000026: 940C0034 JMP 0x00000034 Jump +00000028: 940C0030 Jump 0x003

00000000: 940C002A JMP 0x0000002A Skok +00000002: 940C0034 JMP 0x00000034 Skok +00000004: 940C0034 JMP00000000000000000000C0034 JMP 0x000000034 0x00000034 Jump +00000008: 940C0034 JMP 0x00000034 Jump +0000000A: 940C0034 JMP 0x00000034 Jump +0000000C: 0000000C: 00000000000000000000000000: 940C0034 JMP 0x00000034 Skok +00000010: 940C0034 JMP 0x00000034 Skok +00000012: 940C0034 JMP 0x00000034 Skok 0904 +00003004 +00000004 0004 34 Jump +00000016: 940C0034 JMP 0x00000034 Jump +00000018: 940C0034 JMP 0x00000034 Jump +0000001A: 940C00030 Jump +0x0003004000003 : 940C0034 JMP 0x00000034 Skok +0000001E: 940C0034 JMP 0x00000034 Skok +00000020: 940C0034 JMP 0x00000034 Skok 0x00000034 Skok 04020000304 +00002002 34 Jump +00000024: 940C0034 JMP 0x00000034 Jump +00000026: 940C0034 JMP 0x00000034 Jump +00000028: 940C0030 Jump 0x003

Toto je tabulka vektorů přerušení. Vrátíme se k tomu později, ale zatím se jen podívejte a zapamatujte si, že existuje. V prvním sloupci je adresa flash buňky, ve které příkaz leží, ve druhém je kód příkazu, ve třetím je mnemotechnická pomůcka příkazu, stejná instrukce sestavení, ve třetím jsou operandy příkazu. No, automatický komentář.
Takže, když se podíváte, jsou tam nepřetržité přechody. A příkazový kód JMP je čtyřbajtový, obsahuje adresu skoku zapsanou pozpátku - dolní bajt na nízké adrese a kód příkazu skoku 940C

0000002B: BE1F OUT 0x3F,R1 Out to I/O umístění

Zaznamenejte tuto nulu na adrese 0x3F. Pokud se podíváte na sloupec zobrazení I/O, uvidíte, že adresa 0x3F je adresa registru SREG - registru příznaků řadiče. Tito. resetujeme SREG, aby program běžel za nulových podmínek.

1 2 3 4 +0000002C: E5CF LDI R28,0x5F Okamžité načtení +0000002D: E0D4 LDI R29,0x04 Okamžité načtení +0000002E: BFDE OUT 0x3E,R29 Out to I/O umístění +0000002F: BFCD IROUT/O0x umístění Out33 IROUT/00x

0000002C: E5CF LDI R28,0x5F Okamžité načtení +0000002D: E0D4 LDI R29,0x04 Okamžité načtení +0000002E: BFDE OUT 0x3E,R29 Out to I/O umístění +0000002F: BFCD OUT8/O0x umístění BFCD IR29,0x04

Tím se načítá ukazatel zásobníku. Nemůžete přímo načíst do I/O registrů, pouze přes přechodný registr. Proto nejprve LDI na střední a pak odtud OUT na I/O. Později vám také řeknu více o zásobníku. Prozatím vězte, že se jedná o oblast dynamické paměti, která visí na konci RAM a ukládá adresy a meziproměnné. Nyní jsme naznačili, odkud bude náš stack začínat.

00000032: 940C0041 JMP 0x00000041 Skok

Přejděte na úplný konec programu a tam máme zákaz přerušení a těsného opakování:

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

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

To v případě nepředvídaných okolností, jako je opuštění hlavní funkce. Regulátor lze z takové smyčky vyvést buď hardwarovým resetem, nebo pravděpodobněji resetem z hlídacího psa. No, nebo, jak jsem řekl výše, opravte to v hexadecimálním editoru a odcválejte tam, kam si naše srdce přeje. Všimněte si také, že existují dva typy přechodů: JMP a RJMP; první je přímý přechod na adresu. Zabírá čtyři bajty a může přímo přeskakovat celou oblast paměti. Druhým typem přechodu je RJMP – relativní. Jeho příkaz zabere dva bajty, ale z aktuální pozice (adresy) se posune o 1024 kroků dopředu nebo dozadu. A jeho parametry udávají posun od aktuálního bodu. Používá se častěji, protože zabírá polovinu místa v jedné rovině a dlouhé přechody jsou potřeba jen zřídka.

1 +00000034: 940C0000 JMP 0x00000000 Skok

00000034: 940C0000 JMP 0x00000000 Skok

A to je skok na úplný začátek kódu. Nějaký restart. Zde můžete zkontrolovat, že všechny vektory přeskakují. Závěr z toho je, že pokud nyní povolíte přerušení (ve výchozím nastavení jsou zakázána) a vaše přerušení nastane, ale neexistuje žádná obsluha, dojde k softwarovému resetu – program se vrátí na úplný začátek.

Funkce hlavní. Všechno je podobné, ani to není třeba popisovat. Stačí se podívat na již vypočítaný počet zapisovaný do registrů. Preprocesor kompilátoru rockuje!!! Takže žádná „magická“ čísla!

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

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

A tady je chyba:

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

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

Otázkou je, proč kompilátor přidává takové vrcholy? A to není nic jiného než Return 0, funkci jsme definovali jako int main(void) a tak jsme promarnili další čtyři bajty za nic :) A pokud uděláte void main(void) tak zůstane jen RET, ale objeví se varování , že naše hlavní funkce nic nevrací. Obecně udělej, jak chceš :)

Obtížný? Očividně ne. Klikněte na spouštění krok za krokem v režimu disassembler a podívejte se, jak procesor provádí jednotlivé instrukce, co se děje s registry. Jak probíhá pohyb po příkazech a finální smyčka?

Pokračování za pár dní...

Mimo:
Alexej78 Vytvořil jsem plugin pro Firefox, který usnadňuje navigaci na mém webu a fóru.
Diskuse a stahování,

Atmel Studio je integrovaná vývojová platforma, která poskytuje možnost navrhovat a ladit aplikace vyvinuté pro mikrokontroléry Atmel založené na architektuře procesorů řady ARM Cortex-M. Atmel Studio je bezproblémové, snadno použitelné prostředí, které poskytuje možnost ladění a sestavování aplikací vytvořených v C/C++ nebo v assembleru. Má vestavěnou objemnou knihovnu absolutně bezplatného zdrojového kódu Atmel Software Framework, která obsahuje více než 1 600 projektů pro architektury ARM a AVR. Mít takovou knihovnu je skvělý bonus pro každého programátora. Toto IDE lze použít k programování široké škály mikrokontrolérů na bázi AVR, stejně jako flash mikrokontrolérů na bázi Atmel SAM3, které používají jádra Cortex-M3, Cortex-M4.

Atmel Studio obsahuje také nástroje, které výrazně usnadní život každému programátorovi. Platforma zahrnuje řešení jako Atmel Spaces a Atmel Gallery. Atmel Gallery je online obchod s vývojovými nástroji a integrovaným softwarem. Atmel Spaces je cloudový prostor pro společný vývoj a ukládání souborů hardwarových a softwarových projektů pro mikrokontroléry Atmel.

Klíčové vlastnosti a funkce

  • je zcela zdarma integrované vývojové prostředí;
  • podporuje jazyky C/C++ a Assembler;
  • doprovázena podrobnou dokumentací;
  • obsahuje rozsáhlou knihovnu s příklady zdrojového kódu pro různé aplikace;
  • určený pro programování mikrokontrolérů Atmel.

Speciální požadavky

  • frekvence procesoru 1,6 GHz a vyšší;
  • pro 32bitové systémy od 1 GB RAM;
  • pro 64bitové systémy od 2 GB RAM;
  • při běhu na virtuálním počítači se doporučuje dalších 512 MB RAM;
  • 6 GB volného místa na pevném disku.

Co je nového v této verzi?

7.0.790 (25.02.2016)

  • přidána podpora pro rozšířený debugger (EDBG);
  • přidána podpora pro profily nastavení rozhraní. Mezi profily můžete přepínat pomocí tlačítek na panelu nastavení;
  • přidána možnost importovat knihovny do dříve importovaných projektů. Přidána podpora pro Arduino Zero a Zero Pro;
  • paralelní sestavení je nyní ve výchozím nastavení povoleno;
  • aktualizovaný firmware pro Xplained Mini;
  • Funkce "Zobrazit všechny soubory" v Průzkumníku řešení byla opravena.