Programování mikrokontrolérů avr. Jak začít s programováním AVR? Doporučení Postup pro programování mikrokontrolérů avr

Pro mikrokontroléry AVR existují různé programovací jazyky, ale možná nejvhodnější jsou assembler a C, protože tyto jazyky nejlépe implementují všechny potřebné schopnosti pro správu hardwaru mikrokontroléru.

Jazyk symbolických instrukcí je nízkoúrovňový programovací jazyk, který využívá přímou instrukční sadu mikrokontroléru. Vytvoření programu v tomto jazyce vyžaduje dobrou znalost příkazového systému programovatelného čipu a dostatek času na vývoj programu. Assembler je horší než C v rychlosti a snadnosti vývoje programu, ale má znatelné výhody ve velikosti konečného spustitelného kódu, a tedy v rychlosti jeho provádění.

C vám umožňuje vytvářet programy s mnohem větším pohodlím a poskytuje vývojářům všechny výhody jazyka na vysoké úrovni.
Je třeba ještě jednou poznamenat, že architektura a příkazový systém AVR byly vytvořeny za přímé účasti vývojářů kompilátoru jazyka C a zohledňuje vlastnosti tohoto jazyka. Kompilace zdrojového kódu C je rychlá a vytváří kompaktní a efektivní kód.

Hlavní výhody C oproti assembleru: vysoká rychlost vývoje programu; univerzálnost, která nevyžaduje důkladné studium architektury mikrokontroléru; lepší dokumentovatelnost a čitelnost algoritmu; dostupnost knihoven funkcí; podpora výpočtů s pohyblivou řádovou čárkou.

Jazyk C harmonicky kombinuje možnosti programování na nízké úrovni s vlastnostmi jazyka na vysoké úrovni. Schopnost nízkoúrovňového programování umožňuje snadnou obsluhu přímo na hardwaru a vlastnosti vysokoúrovňového jazyka umožňují vytvářet snadno čitelný a modifikovatelný programový kód. Kromě toho téměř všechny kompilátory jazyka C mají schopnost používat vložky assembleru k zápisu částí programu, které jsou kritické z hlediska doby provádění a spotřeby zdrojů.

Jedním slovem, C je nejvhodnější jazyk pro začátečníky, kteří se seznamují s mikrokontroléry AVR, i pro vážné vývojáře.

Kompilátory se používají k převodu zdrojového kódu programu do souboru firmwaru mikrokontroléru.

Atmel poskytuje výkonný kompilátor sestavení, který je součástí vývojového prostředí Atmel Studio běžícího na Windows. Spolu s kompilátorem obsahuje vývojové prostředí debugger a emulátor.
Atmel Studio je zcela zdarma a dostupné na webových stránkách Atmel.

V současné době existuje poměrně hodně C kompilátorů pro AVR. Za nejvýkonnější z nich je považován překladač od IAR Systems ze Stockholmu. Právě jeho zaměstnanci se v polovině 90. let podíleli na vývoji velitelského systému AVR. IAR C Compiler má rozsáhlé možnosti optimalizace kódu a přichází jako součást integrovaného vývojového prostředí IAR Embedded Workbench (EWB), které také zahrnuje kompilátor assembleru, linker, správce projektů a knihoven a debugger. Cena plné verze balíčku je 2820 EUR. Na webu společnosti si můžete zdarma stáhnout zkušební verzi na 30 dní nebo neomezenou verzi s limitem velikosti kódu 4 KB.

Americká společnost Image Craft z Palo Alto v Kalifornii vyrábí překladač jazyka C, který si získal poměrně širokou popularitu. JumpStart C pro AVR má přijatelnou optimalizaci kódu a nepříliš vysokou cenu (od 50 do 499 USD v závislosti na verzi). Demoverze JumpStart C pro AVR je plně funkční po dobu 45 dnů.

Neméně oblibu si získal rumunský Code Vision AVR C Compiler, cena plné verze tohoto kompilátoru je poměrně nízká a činí 150 EUR. Kompilátor je dodáván s integrovaným vývojovým prostředím, které kromě standardních funkcí obsahuje poměrně zajímavou funkci - CodeWizardAVR Automatic Program Generator. Přítomnost sériového terminálu ve vývojovém prostředí umožňuje ladit programy pomocí sériového portu mikrokontroléru. Od vývojářů si můžete zdarma stáhnout zkušební verzi s limitem velikosti kódu 4 KB a zakázaným ukládáním vygenerovaného zdrojového kódu v C.

Společnost MikroElektronika se sídlem v srbském Bělehradě vyrábí celou rodinu kompilátorů pro mikrokontroléry AVR. Kompilátor pro jazyk C s názvem mikroC PRO pro AVR stojí 249 dolarů. Existují také mikroBasic a mikroPascal za stejnou cenu. Na webu vývojářů jsou demo verze s limitem velikosti kódu 4096 bajtů. Výhodou této rodiny kompilátorů je jednotná platforma a jednotná ideologie, která může zajistit snadný přechod nejen mezi jazyky, ale i mezi mikrokontroléry (existují verze kompilátorů pro PIC, STM32, 8051...).

Integrované vývojové prostředí se stalo skutečně ikonickým. Obsahuje výkonné kompilátory jazyka C a assembler, programátor AVRDUDE, debugger, simulátor a mnoho dalších podpůrných programů a utilit. WinAVR se hladce integruje s vývojovým prostředím Atmel AVR Studio. Assembler je ve vstupním kódu identický s assemblerem AVR Studio. Kompilátory C a assembleru mají schopnost vytvářet ladicí soubory ve formátu COFF, což umožňuje používat nejen vestavěné nástroje, ale také používat výkonný simulátor AVR Studio. Další důležitou výhodou je, že WinAVR je distribuován zdarma bez omezení (výrobci podporují GNU General Public License).

V souhrnu se sluší říci, že WinAVR je ideální volbou pro ty, kteří začínají ovládat mikrokontroléry AVR. Právě toto vývojové prostředí je v tomto kurzu považováno za hlavní.

Dobrý den, drahý Habrazhitel!

V tomto článku chci mluvit o tom, jak jsem se kdysi rozhodl začít programovat mikrokontroléry, co k tomu bylo potřeba a co se nakonec stalo.

Téma mikrokontrolérů mě zajímalo už dávno, už v roce 2001. Tehdy se ale ukázalo problematické sehnat programátora v místě bydliště a o jeho nákupu přes internet nemohla být ani řeč. Musel jsem tuto záležitost odložit na lepší časy. A pak, jednoho krásného dne, jsem zjistil, že nastaly lepší časy, aniž bych opustil domov, mohl jsem si koupit vše, co jsem potřeboval. Rozhodl jsem se to zkusit. Co tedy potřebujeme:

1. Programátor
Na trhu je mnoho možností – od nejlevnějších ISP (In-System Programming) programátorů za pár dolarů až po výkonné programátor-ladicí programy za pár stovek. Jelikož jsem v této věci neměl mnoho zkušeností, rozhodl jsem se nejprve vyzkoušet jeden z nejjednodušších a nejlevnějších - USBasp. Najednou jsem ho koupil na eBay za 12 dolarů, nyní ho najdete dokonce za 3-4 dolary. Jedná se vlastně o čínskou verzi programátoru od Thomase Fischla. Co o něm mohu říci? Jen jedna věc - funguje to. Navíc podporuje poměrně hodně AVR řadičů řady ATmega a ATtiny. Pod Linuxem nevyžaduje ovladač.

Pro flashování firmwaru je potřeba propojit výstupy programátoru VCC, GND, RESET, SCK, MOSI, MISO s odpovídajícími výstupy mikrokontroléru. Pro jednoduchost jsem sestavil pomocný obvod přímo na prkénku:

Vlevo na desce je stejný mikrokontrolér, který budeme blikat.

2. Mikrokontrolér
S výběrem mikrokontroléru jsem si příliš hlavu nelámal a vzal ATmega8 od Atmelu - 23 I/O pinů, dva 8bitové časovače, jeden 16bitový, frekvence až 16 MHz, nízká spotřeba (1-3,6 mA) , levné (2 $). Obecně platí, že pro začátek - více než dost.

Pod Linuxem kombinace avr-gcc + avrdude funguje dobře pro kompilaci a nahrání firmwaru do řadiče. Instalace je triviální. Podle pokynů můžete nainstalovat veškerý potřebný software během několika minut. Jediná nuance, které byste měli věnovat pozornost, je to, že avrdude (software pro nahrávání do ovladače) může vyžadovat práva superuživatele pro přístup k programátoru. Řešením je spustit to přes sudo (není to moc dobrý nápad), nebo zaregistrovat speciální práva udev. Syntaxe se může mezi verzemi OS lišit, ale v mém případě (Linux Mint 15) přidání následujícího pravidla do souboru /etc/udev/rules.d/41-atmega.rules fungovalo:

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

Poté je samozřejmě nutné službu restartovat
restart služby udev
Kompilovat a flashovat bez problémů přímo z příkazové řádky (kdo by o tom pochyboval), ale pokud je projektů hodně, pak je pohodlnější nainstalovat plugin a vše dělat přímo z prostředí Eclipse.

Pro Windows budete muset nainstalovat ovladač. Jinak problémy nejsou. Z důvodu vědeckého zájmu jsem na Windows vyzkoušel kombinaci AVR Studio + eXtreme Burner. Opět vše funguje skvěle.

Začněme programovat

AVR regulátory lze programovat jak v assembleru (AVR assembler), tak v C. Zde si myslím, že by si měl každý vybrat sám v závislosti na konkrétním úkolu a svých preferencích. Osobně jsem nejprve začal fušovat do assembleru. Při programování v assembleru se zpřehlední architektura zařízení a máte pocit, že se noříte přímo do útrob regulátoru. Kromě toho se domnívám, že v programech, které jsou zvláště důležité z hlediska velikosti a výkonu, může být znalost assembleru velmi užitečná. Po seznámení s assemblerem AVR jsem se plazil do C.

Po seznámení s architekturou a základními principy jsem se rozhodl dát dohromady něco užitečného a zajímavého. Tady mi pomohla dcera, která hraje šachy a jednoho krásného večera řekla, že by chtěla mít časomíru na hry na čas. BAM! Tady to je - myšlenka prvního projektu! Mohli jste si je samozřejmě objednat na eBay, ale chtěl jsem si vyrobit vlastní hodinky s černými... ehm... indikátory a tlačítky. Sotva řečeno, než uděláno!

Jako displej bylo rozhodnuto použít dva 7segmentové diodové indikátory. Pro ovládání stačilo 5 tlačítek - „Player 1“, „Player 2“, „Reset“, „Settings“ a „Pause“. No, nezapomeňte na zvukovou indikaci konce hry. Zdá se, že je to ono. Níže uvedený obrázek ukazuje obecné schéma připojení mikrokontroléru k indikátorům a tlačítkům. Budeme jej potřebovat při analýze zdrojového kódu programu:

Debriefing

Začněme podle očekávání od vstupního bodu programu – hlavní funkce. Ve skutečnosti na tom není nic pozoruhodného – nastavení portů, inicializace dat a nekonečná smyčka stisku tlačítek pro zpracování. Volání sei() - umožňující zpracování přerušení, více o nich později.

Int main(void) ( init_io(); init_data(); sound_off(); sei(); while(1) ( handle_buttons(); ) return 0; )
Podívejme se na každou funkci zvlášť.

Void init_io() ( // nastavení výstupu DDRB = 0xFF; DDRD = 0xFF; // nastavení vstupu DDRC = 0b11100000; // pull-up rezistory PORTC |= 0b00011111; // časovač přeruší TIMSK = (1<

Nastavení I/O portů je velmi jednoduché - do registru DDRx se zapíše číslo (kde x je písmeno označující port), jehož každý bit znamená, zda příslušný pin bude vstupní zařízení (odpovídá 0) nebo výstupní zařízení (odpovídá 1). Takže odesláním čísla 0xFF do DDRB a DDRD jsme vytvořili výstupní porty B a D. V souladu s tím příkaz DDRC = 0b11100000; změní prvních 5 pinů portu C na vstupní piny a zbývajících na výstupní piny. Příkaz PORTC |= 0b00011111; obsahuje vnitřní pull-up rezistory na 5 vstupech regulátoru. Na tyto vstupy jsou podle schématu připojena tlačítka, která je po stisknutí zkratují k zemi. Tímto způsobem ovladač pochopí, že je tlačítko stisknuto.

Následuje nastavení dvou časovačů, Timer0 a Timer1. První používáme k aktualizaci indikátorů a druhý k odpočítávání času, protože jsme ho předtím nakonfigurovali tak, aby spouštěl každou sekundu. Podrobný popis všech konstant a způsob nastavení časovače na konkrétní interval naleznete v dokumentaci ATmega8.

Manipulace s přerušením

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

Když se spustí časovač, řízení se přenese na příslušnou obsluhu přerušení. V našem případě se jedná o handler TIMER0_OVF_vect, který volá proceduru pro zobrazení času na indikátorech, a TIMER1_COMPA_vect, který zpracovává odpočítávání.

Výstup do indikátorů

Void display() ( display_number((Timer1/60)/10, 0b00001000); _delay_ms(0,25); display_number((Timer1/60)%10, 0b00000100); _delay_ms(0,25); display_number0(/10%6) , 0b000010); 60)%10, 0b01000000); (číslo PORTD = maska);

Funkce zobrazení používá metodu dynamického zobrazení. Faktem je, že každý jednotlivý indikátor má 9 kontaktů (7 pro ovládání segmentu, 1 pro bod a 1 pro napájení). K ovládání 4 číslic by bylo potřeba 36 kontaktů. Příliš plýtvání. Proto je výstup číslic do indikátoru s několika číslicemi organizován podle následujícího principu:

Napětí je střídavě přiváděno ke každému ze společných kontaktů, což umožňuje zvýraznit požadované číslo na odpovídajícím indikátoru pomocí stejných 8 ovládacích kontaktů. Při dostatečně vysoké výstupní frekvenci to pro oko vypadá jako statický obraz. Proto je všech 8 výkonových kontaktů obou indikátorů ve schématu připojeno na 8 výstupů portu D a 16 kontaktů pro ovládání segmentů je zapojeno do párů a připojeno k 8 výstupům portu B. Funkce displeje tak funguje se zpožděním 0,25 ms střídavě zobrazuje požadované číslo na každém z indikátorů. Nakonec se vypnou všechny výstupy, které napájí indikátory (příkaz PORTD = 0;). Pokud tak neučiníte, bude poslední zobrazená číslice svítit až do dalšího volání funkce displeje, což povede k její jasnější záři ve srovnání se zbytkem.

Zvládání kliknutí

Void handle_buttons() ( handle_button(KEY_SETUP); handle_button(KEY_RESET); handle_button(KEY_PAUSE); handle_button(KEY_PLAYER1); handle_button(KEY_PLAYER2); ) void handle_button (klíč int) (int bit; přepínač (klíč) ( případ KEY_SETUP: bit = SETUP_BIT; case KEY_RESET; zlomek KEY_BIT; bit) / klíč akce přepínač (klíč) ( case KEY_SETUP: process_setup(); break; case KEY_RESET(); break; case KEY_pause(); break; case KEY_PLAYER2: break; sound_on(15); &= ~key; ) )

Tato funkce se postupně dotazuje všech 5 tlačítek a zpracovává kliknutí, pokud nějaké existuje. Kliknutí se zaregistruje kontrolou bit_is_clear(BUTTON_PIN, bit) , tzn. tlačítko je stisknuto, pokud je příslušný vstup připojen k zemi, což se stane podle schématu po stisknutí tlačítka. Je potřeba zpoždění DEBOUNCE_TIME a opakovaná kontrola, aby se předešlo vícenásobným zbytečným operacím kvůli odraženým kontaktům. Uložení stisknutého stavu do odpovídajících bitů proměnné _pressed slouží k zamezení opakovaného spouštění při delším stisku tlačítka.
Funkce pro zpracování kliknutí jsou vcelku triviální a věřím, že nepotřebují další komentáře.

Plné znění programu

#define F_CPU 4000000UL #zahrnout #zahrnout #zahrnout #define DEBOUNCE_TIME 20 #define BUTTON_PIN PINC #define SETUP_BIT PC0 #define RESET_BIT PC1 #define PAUSE_BIT PC2 #define PLAYER1_BIT PC3 #define PLAYER2_BIT PC4 #define KEY_SETUP 0b0000000001 #defineET0000001 #define00000000 USE 0b00000100 #define KEY_PLAYER1 0b00001000 #define KEY_PLAYER2 0b00010000 volatile int Aktivní časovač = 0; volatile int Časovač1 = 0; volatile int Časovač2 = 0; volatile int _buzzer = 0; volatile int _pressed = 0; // deklarace funkce void init_io(); void init_data(); int maska_cisla(int cislo); void handle_buttons(); void tlačítko_handle (klíč int); void process_setup(); void proces_reset(); void process_pause(); void process_timeoff(); void process_player1(); void process_player2(); void display(); void display_number(int mask, int number); void sound_on(int interval); void sound_off(); // přeruší ISR (TIMER0_OVF_vect) ( display(); if (_buzzer > 0) ( _buzzer--; if (_buzzer == 0) sound_off(); ) ) ISR(TIMER1_COMPA_vect) ( if (ActiveTimer == 1 && Timer1 > 0) ( Timer1--; if (Timer1 == 0) process_timeoff(); ) if (ActiveTimer == 2 && Timer2 > 0) (Timer2--; if (Timer2 == 0) process_timeoff(); ) ) int main (void) ( init_io(); init_data(); sound_off(); sei(); while(1) ( handle_buttons(); ) return 0; ) void init_io() ( // nastavení výstupu DDRB = 0xFF; DDRD = 0xFF ; // nastavení vstupu DDRC = 0b11100000; // pull-up rezistory PORTC |= 0b00011111 // časovač přeruší TIMSK = (1<5940 || Timer2 > 5940) ( Timer1 = 0; Timer2 = 0; ) ) void process_reset() ( init_data(); ) void process_timeoff() ( init_data(); sound_on(30); ) void process_pause() (ActiveTimer = 0; ) void process_player1() ( ActiveTimer = 2; ) void process_player2() ( ActiveTimer = 1; ) void handle_button (int key) ( int bit; switch (key) ( case KEY_SETUP: bit = SETUP_BIT; break; case KEY_RESET: bit = RESET_BIT ; break; KEY_PAUSE: break; case KEY_PLAYER2: break; výchozí: návrat; (klíč) ( case KEY_SETUP: process_setup(); break; case KEY_RESET: process_reset(); break; case KEY_PAUSE(); break; case KEY_PLAYER1(); break; case KEY_PLAYER2(); sound_on(15) ) else ( _pressed & = ~klíč;

) ) void handle_buttons() ( handle_button(KEY_SETUP); handle_button(KEY_RESET); handle_button(KEY_PAUSE); handle_button(KEY_PLAYER1); handle_button(KEY_PLAYER2); ) void display() ( display_number((Timer1/60)/10, 0b0000) ;_zpoždění_ms(0,25) číslo_zobrazení((Časovač1/60)%10, 0b00000100 číslo_zobrazení((Časovač1%60)/10, 0b00000001; 0b00000001; display_number((Timer2/60)%10, 0b01000000 2 %60)/10, 0b00100000 _delay_ms(0.25); 0b00010000; číslo, maska ​​int) ( PORTB = maska_čísla (číslo); PORTD = maska; ) void sound_on(int interval) ( _buzzer = interval; // dát bzučák pin vysoký PORTC |= 0b00100000; ) void sound_off() ( // dát bzučák pin nízký PORTC &= ~0b00100000;

Prototyp byl sestaven na prkénku.

Programování mikrokontrolérů AVR pro začátečníky Mikrokontrolér

– mikroobvod určený k ovládání elektronických zařízení, nebo jinými slovy – jednoduchý počítač (mikropočítač) schopný provádět jednoduché úkoly.
Co potřebujete, abyste mohli začít využívat všechny možnosti mikrokontrolérů?
Myslím, že moc ne. Hlavní věcí v této věci je touha. Pokud existuje touha, bude výsledek.

V této sekci (a v sekci „Zařízení AVR“) na webu se pokusím pomoci začínajícím „inženýrům mikrokontrolérů“ udělat první, také nejtěžší krok směrem k mikrokontrolérům – zkusme porozumět návrhu a programování AVR mikrokontroléry rodiny ATtiny a ATmega.
Na internetu je mnoho stránek, které se tak či onak zabývají tématy „mikrokontrolérů“, a také mnoho různé literatury pro začátečníky. Nehodlám proto všechny a všechno „přebít“ a vytvořit další mistrovské dílo duševního trápení v podobě manuálu o mikrokontrolérech pro začátečníky. Pokusím se systematizovat, dát dohromady vše, co si myslím, že je pro první krok do světa mikrokontrolérů nutné, a podat to více či méně přístupným jazykem.

Ve svých článcích se budu opírat o materiály z publikací populárních autorů na téma mikrokontrolérů: Ryumik S.M., Belov A.V., Revich Yu.V., Evstifeev A.V., Grebnev V.V., Morton D., Trumpert V., Frunze A.V. a Frunze A.A. (a mnoho dalších), stejně jako materiály z radioamatérských stránek. No a možná trochu mých „chytrých myšlenek“.

Programování mikrokontrolérů Atmel AVR

Tento článek, stejně jako všechny následující, je malým krokem do světa mikrokontrolérů. A takových „kroků“ budeme mít mnoho, dokud nedosáhneme okamžiku, kdy budeme moci říci: „Mikrokontrolér je posledním krokem“. Ale to je s největší pravděpodobností z říše fantazie - je nemožné pochopit nezměrnost - svět mikrokontrolérů se neustále vyvíjí a zlepšuje. Naším úkolem je udělat první krok, jehož logickým výsledkem by měl být první samostatně vyvinutý a sestavený návrh na mikrokontroléru.

Jak asi víte, existuje mnoho různých číselné soustavy, některé se používají dodnes (naše původní desítková soustava; římský systém, nám známý jako „římské číslice“), jiné zůstávají v hluboké minulosti (incké a mayské číselné soustavy, staroegyptský systém, babylonština).
Tady, myslím, nemáme žádné otázky, rozumíme tomu, co jsou číselné soustavy - zobrazení čísel pomocí symbolů. Jaká je ale souvislost mezi číselnými soustavami a mikrokontroléry?

Všechny moderní digitální technologie jsou založeny na logických operacích, bez nich není úniku. Všechny digitální mikroobvody využívají při své práci logické obvody (provádějí logické operace včetně mikrokontroléru).
Při tvorbě programu předepisujeme všechny akce mikrokontroléru na základě naší logiky pomocí logických operací, někdy aniž bychom to věděli, které aplikujeme na logické výrazy.


V minulém článku jsme probrali téma logických operací a výrazů. V tomto článku se podíváme na logické bitové operace. Bitové operace mají velmi blízko k logickým operacím, dalo by se dokonce říci, že jde o jedno a totéž. Jediný rozdíl je v tom, že logické operace jsou aplikovány na příkazy a bitové operace se stejnými pravidly a výsledky jsou aplikovány na bity.

Přímé, reverzní a dvojkové doplňkové kódy binárního čísla - způsoby reprezentace binárních čísel s pevnou řádovou čárkou v počítačové (mikrokontrolérové) aritmetice, určené pro zápis záporných a nezáporných čísel

Dnes se podíváme na to, jak levně a rychle naprogramovat jakýkoli mikrokontrolér AVR, který podporuje režim sériového programování (rozhraní ISP) přes USB port počítače. Jako programátor použijeme velmi jednoduchý a oblíbený programátor USBASP a jako program AVRdude_Prog V3.3, který je určen pro programování AVR MK.

Nejoblíbenější program AVRDUDE_PROG 3.3 určený pro programování mikrokontrolérů AVR ATmega a ATtiny

Tímto článkem se začneme konkrétně zabývat jedním problémem - programování mikrokontroléru. Proces bude probíhat následovně – nejprve článek o návrhu mikrokontroléru (například první článek bude o I/O portech) a poté článek o programování. Náš dnešní rozhovor je úvodní a bude věnován problematice materiálu a softwaru procesu studia základů programování mikrokontrolérů.

V tomto článku budeme hovořit o problémech rusifikace programu Atmel Studio, jak přeložit program do ruštiny (nebo jiného) jazyka a jak program usnadnit práci s programátorem USBASP. Po instalaci programu Atmel Studio bude celé rozhraní v angličtině. Někdo, kdo se vyzná v angličtině, nebo je již zvyklý pracovat s programy s anglickým rozhraním, bude s tím docela spokojen. Osobně mi tento přístup tvůrců programu k velkému a mocnému nevyhovuje spíše s ruskými menu.


Tento článek probere základní informace o jazyce C, strukturu programu v jazyce C a poskytne koncept funkcí, operátorů a komentářů tohoto programovacího jazyka.


Schéma programátoru LPT portů je na obrázku.

Jako řidič autobusu použijte mikroobvod 74AC 244 nebo 74HC244 (K1564AP5), 74LS244 (K555AP5) nebo 74ALS244 (K1533AP5).

LED VD1 indikuje režim záznamu mikrokontroléru,

LED VD2 - čtení,

LED VD3 - přítomnost napájení obvodu. Obvod odebírá napětí potřebné pro napájení z ISP konektoru, tzn. z programovatelného zařízení. Tento obvod je předělaný obvod programátoru STK200/300 (přidané LED pro usnadnění ovládání), takže je kompatibilní se všemi programy programátoru PC, které pracují s obvodem STK200/300. Pro práci s tímto programátorem použijte program

CVAVR




Programátor lze vyrobit na desce s plošnými spoji a umístit do pouzdra konektoru LPT, jak je znázorněno na obrázcích:

Pro práci s programátorem je vhodné použít rozšíření LPT portu, které si snadno vyrobíte sami (např. z kabelu Centronix pro tiskárnu), hlavní je nešetřit vodiče pro zem (18- 25 konektorových noh) nebo koupit. Kabel mezi programátorem a programovatelným čipem by neměl přesáhnout 20-30 cm.

Bitové operace jsou založeny na logických operacích, které jsme probrali dříve. Hrají klíčovou roli při programování AVR a dalších typů mikrokontrolérů. Téměř žádný program se neobejde bez použití bitových operací. Předtím jsme se jim záměrně vyhýbali, abychom usnadnili proces učení se programování MK.

Ve všech předchozích článcích jsme programovali pouze I/O porty a nepoužívali jsme další vestavěné komponenty, například časovače, analogově-digitální převodníky, přerušení a další interní zařízení, bez kterých MK ztrácí veškerou svou energii.

Než přejdete k ovládání vestavěných zařízení MK, musíte se naučit ovládat nebo kontrolovat jednotlivé bity registrů AVR MK. Dříve jsme prováděli kontrolu nebo nastavovali číslice celého registru najednou. Pojďme zjistit, jaký je rozdíl, a pak jít dál.

Bitové operace

Nejčastěji jsme jej používali při programování mikrokontrolérů AVR, protože je vizuálnější ve srovnání s programátory MK a je dobře srozumitelný pro začínající programátory MK. Potřebujeme například nastavit pouze 3. bit portu D. K tomu, jak již víme, můžeme použít následující binární kód:

Tímto příkazem však nastavíme 3. číslici na jedničku a všechny ostatní (0, 1, 2, 4, 5, 6 a 7) vynulujeme. Nyní si představme situaci, kdy jsou 6. a 7. bit použity jako vstupy ADC a v tuto chvíli je na odpovídajících pinech MK přijímán signál z nějakého zařízení a pomocí výše uvedeného příkazu tyto signály resetujeme. V důsledku toho je mikrokontrolér nevidí a věří, že signály nedorazily. Místo takového příkazu bychom tedy měli použít jiný, který by nastavil pouze 3. bit na jedničku, aniž by to ovlivnilo zbývající bity. K tomu se obvykle používá následující bitová operace:

PORTD |= (1<<3);

Jeho syntaxi si podrobně probereme níže. A teď další příklad. Řekněme, že potřebujeme zkontrolovat stav 3. číslice registru PIND, čímž zkontrolujeme stav tlačítka. Pokud je tento bit vynulován, pak víme, že je tlačítko stisknuto a následně je proveden příkazový kód, který odpovídá stavu stisknutého tlačítka. Dříve jsme používali následující zápis:

if (PIND == 0b00000000)

(libovolný kód)

S jeho pomocí však nekontrolujeme jen 3. bit, ale všechny bity registru PIND najednou. Proto, i když je tlačítko stisknuto a požadovaný bit je resetován, ale v tomto okamžiku je přijat signál na nějakém jiném pinu portu D, odpovídající hodnota bude nastavena na jedničku a podmínka v závorkách bude nepravdivá. V důsledku toho se kód uvnitř složených závorek nespustí ani po stisknutí tlačítka. Pro kontrolu stavu jednotlivého 3. bitu registru PIND by se tedy měla použít bitová operace:

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

(libovolný kód)

Pro práci s jednotlivými bity mikrokontroléru má programovací jazyk C nástroje, kterými lze měnit nebo kontrolovat stav jednoho nebo více jednotlivých bitů najednou.

Nastavení jednoho bitu

Pro nastavení jednoho bitu, jako je port D, se používá bitová operace OR. To jsme použili na začátku článku.

PORTD = 0b00011100; // počáteční hodnota

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

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

PORTD == 0b00011101; // výsledek

Tento příkaz nastaví nulový bit a zbytek ponechá beze změny.

Například nainstalujme další 6. bit portu D.

PORTD = 0b00011100; // počáteční stav portu

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

PORTD == 0b01011100; // výsledek

Zapsat jeden až několik samostatných bitů najednou, například nulový, šestý a sedmý port B platí následující záznam.

PORTB = 0b00011100; // počáteční hodnota

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

PORTB == 0b1011101; // výsledek

Nulování (nulování) jednotlivých bitů

K resetování jednoho bitu se současně používají tři dříve popsané příkazy: .

Resetujme 3. bit registru PORTC a zbytek necháme beze změny.

PORTC = 0b00011100;

PORTC &= ~(1<<3);

PORTC == 0b00010100;

Proveďme podobné akce pro 2. a 4. číslici:

PORTC = 0b00111110;

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

PORTC == 0b00101010;

Přepínání bitů

Kromě nastavení a nulování se používá i užitečný příkaz, který přepne jediný bit do opačného stavu: jednička na nulu a naopak. Tato logická operace je široce používána při vytváření různých světelných efektů, například novoroční girlandy. Podívejme se na příklad PORTA

PORTA = 0b00011111;

PORTA ^= (1<<2);

PORTA == 0b00011011;

Změňme stav nulového, druhého a šestého bitu:

PORTA = 0b00011111;

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

PORTA == 0b01011010;

Kontrola stavu jednotlivého bitu. Připomínám, že kontrola (na rozdíl od zápisu) I/O portu se provádí čtením dat z registru PIN.

Nejčastěji se testování provádí jedním ze dvou příkazů cyklu: if a while. Tyto operátory známe již dříve.

Kontrola bitu na přítomnost logické nuly (reset) pomocí -li

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

Pokud je vymazán třetí bit portu D, provede se Code1. Jinak se provede Code2.

S touto formou záznamu se provádějí podobné akce:

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

Kontrola bitu na přítomnost logické jednotky (nastavení) s -li

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

pokud (PIND & (1<<3))

Výše uvedené dvě smyčky fungují podobně, ale díky flexibilitě programovacího jazyka C mohou mít jinou formu zápisu. Operátor != znamená nerovná se. Pokud je nastaven třetí bit PD I/O portu (jedna), pak se provede Code1, pokud ne, provede se Code2;

Čeká se na reset bitu zatímco

zatímco (PIND & (1<<5))

Kód1 se bude provádět tak dlouho, dokud je nastaven 5. bit registru PIND. Když jej resetujete, spustí se Code2.

Čeká se na nastavení bitu zatímco

Zde vám syntaxe jazyka C umožňuje psát kód dvěma nejběžnějšími způsoby. V praxi se používají oba typy záznamu.