tévék. Konzolok. Projektorok és tartozékok. Technológiák. Digitális TV

Az atmel c LED zökkenőmentes villogása. Villogó LED-ek Arduino nélküli AVR-en. #define és regiszterek


A villogó LED áramkör egyszerű, ez egy tipikus huzalozás AVR mikrokontroller Atmega8 (lásd) + ellenállás LED-del a 14-es érintkezőhöz csatlakoztatva.

Remélem, nem lesz probléma a segédprogram telepítésével és letöltésével. Ezért a telepítés és a számítógép újraindítása után elindítjuk a programot és létrehozzuk új projekt. Ehhez kattintson a Fájl->Új menüre. Megjelenik az "Új fájl létrehozása" ablak. új fájl). Ebben válassza ki a Fájltípus - Projekt (projekt) elemet, és kattintson az OK gombra. Megjelenik egy új ablak "Szeretne új projektet létrehozni és használni a kódgenerátort?" Válasz igen. A kódgenerátor ablakban kiválasztjuk, hogy a főprogram elindítása előtt mit inicializáljon a mikrokontrollerünk. Kezdjük a lappal Chip, ebben kiválasztjuk az MK: Atmega 8-at 4 MHz-es frekvenciával.

Ugrás a következő lapra Portok. Itt a B porton átkapcsoljuk a nulla bitet In-ről Out-ra. Az alapértelmezett kimeneti érték nulla marad. Ez azt jelenti, hogy amikor az MK elindul, egy logikai nulla lesz a B port nulla bitjében. Ezután mentse el a projektünket merevlemez, például a C:/my_cvavr/project_led fájlban.

A kezdőkód generálásához kattintson a „fogaskerék” ikonra (a mentés ikontól kicsit jobbra), és mentse el a projektet kétszer ugyanazon a néven. Nézzük most az eredményül kapott kód egyes aspektusait.


Vonal: tartalmazza a mega8.h ebben azt mondjuk a fordítónak, hogy bele kell foglalnunk egy fájlt az összes ATmega8 regiszter leírásával

Sor: PORTB=0x00; Alapértelmezés szerint a kimenet logikai nullára van állítva. Igaz, ez a kifejezés nullákat ad ki a teljes portra. Vagy megteheti egy kicsit egyszerűbben is PORTB.0=0x00;

Sor: DDRB=0x01; Emlékezzünk a "" cikkre. Mivel a hexadecimális 0x01 számjegy egyenlő 0b00000001 és bin. Ha ezt a kifejezést a hexadecimális rendszerből bináris rendszerré alakítjuk, megértjük, hogy az 1-et a DDRB irányregiszter nulladik bitjébe írtuk, azaz a B port nulladik bitjén keresztül adjuk ki az adatokat.

Most menjünk tovább arra a helyre, ahol megírhatjuk saját kódunkat, ami a LED villogását szabályozza.

Mivel a LED-et a „B” port nulla bitjén keresztül vezéreljük, ezt írjuk:

PORTB.0 = 0x01;
PORTB.0 = 0x00;

Ez a legtöbb a legegyszerűbb módja, amelyben először a port nulla bitjére írunk, amit a pont jelzi a port után egy nullával, egy logikai egyessel, majd nullával. Az elképzelés szerint a LED-nek először fel kell kapcsolnia, majd ki kell aludnia, és így tovább egy végtelen ciklusban. De sajnos vagy szerencsére nem minden olyan egyszerű, mert be ebben az esetben A LED folyamatosan világít, mert a kvarc frekvenciája 4 MHz, azaz a LED másodpercenként 4 milliószor villog, de ezt az emberi szem további beépülő modulok nélkül nem tudja követni

Mit tegyünk? Alternatív megoldásként beszúrhat fél másodperces szüneteket, vagy használhat hardveres időzítőt megszakítással. De mivel a CodeVisionAVR segédprogramban dolgozunk, és kiváló könyvtárral rendelkezik hasznos funkciókat, amelyben kiválaszthat egy szünetet delay_ms(int x) vagy delay_us(int x). Az első esetben x ezredmásodperces szünet lesz, a másikban pedig x mikroszekundum. De a használatához vissza kell mennie a kód legtetejére és a sor után #beleértve tegyük alá #beleértve , azaz összekapcsoljuk a könyvtárat, és használhatjuk a szünetfunkciókat. Adjuk hozzá a kódunkat.

PORTB.0 = 0x01;
delay_ms(500);
PORTB.0 = 0x00;
delay_ms(500);

A projekt felépítéséhez. A menüben kattintson a Project->Build All menüpontra. Két sor: Nincs hiba és nincs figyelmeztetés.

A cikk a LED-ek mikrokontrollerhez való csatlakoztatását, a portokkal való munkát és a program írását SI-ben tárgyalja. A cikk elsősorban azoknak a kezdőknek szól, akik most kezdték el az AVR mikrokontrollereket.

Először ki kell választania egy mikrokontrollert. Az én esetemben ATmega8535. Ebben az esetben bármilyen mikrovezérlőt használhat, mivel ez a feladat bármely mikrokontroller alatt könnyen megvalósítható. Assembly-ben, SI-ben, Pascalban és Bascomban is lehet programot írni egy mikrokontrollerhez. SI nyelvet használtam, ezek a nyelvek különböznek egymástól.
A C és a Pascal közötti specifikus különbség az alábbiakban látható.

//Villogó LED void main() ( ddrB = 0b11111111; //beállítja a B portokat a kimeneti portra B = 0b11111111; //alapértelmezés szerint minden ki van kapcsolva, míg(1) ( portB = ˜portB; //a LED állapotának átváltása delay_ms(100 ); //késleltetés 100 ezredmásodperccel ) )

Program első; start ddrB:= $FF; //A B port beállítása B kimeneti portra:= $FF; //alapértelmezés szerint semmi sem világít, míg(1) do begin portB:= not(portB); //a LED állapotának váltása fordított késleltetésre_ms(100); //rövid késleltetés végét tesszük;

vége.

Radioelemek listája Kijelölés Írja be Megnevezés MennyiségJegyzetÜzlet
A jegyzettömböm U1

MK AVR 8 bites

1 ATmega8535
Jegyzettömbhöz R1-R8

Ellenállás

8 ATmega8535
R9-R11 R1-R8

10 kOhm

3 ATmega8535
V1-V8 LED 8 ATmega8535
Tapintat gomb 3

Hozzáadva: 2017.06.28., 13:00

Ebben a példában megírjuk az első C programunkat az ATtiny13 mikrokontrollerhez. Feltételezhető, hogy már mindent előkészítettünk, ami a munkához kell: fejlesztői környezet, fordító, stb. A tesztalanyom egy házi készítésű hibakereső tábla lesz, ezért minden kódot megadok vele kapcsolatban.
Írjunk tesztprogramként egy klasszikus programot, legegyszerűbb példa"villog", amely bizonyos frekvencián villog a LED.

Tehát hozzunk létre egy új projektet, és kezdjük el. Azonnal megadom a program teljes kódját, majd mindent részletesebben elmagyarázok:

/* * tiny13_board_blink * Az ATtiny13 hibakereső kártya demó firmware-je * az MK működőképességének ellenőrzéséhez. * Villogó LED.*/ #define F_CPU 1200000UL // Adja meg órajel frekvenciája MK #define LED PB2 // Használja a PB2-höz csatlakoztatott LED-et (7 tűs) #include<

// I/O definíciók szerepeltetése #include
// Csatlakoztassa a késleltetési függvénykönyvtárat in main(void) ( // DDRB LED |= (1 A legelején beállítjuk az állandók értékeit, és belefoglaljuk a fejlécfájlokat és a könyvtárakat. Fájl
avr/io.h egy adott mikrovezérlő típushoz köti össze az I/O definíciókat (az MK típus opcióként van megadva a fordító számára). könyvtár util/delay.h kapcsolódjon a késleltetési függvények használatához, esetünkben: _delay_ms(). A késleltetési függvények működéséhez meg kell adnunk a processzor órajelét. azért egy adott mikrovezérlő típushoz köti össze az I/O definíciókat (az MK típus opcióként van megadva a fordító számára). TO kapcsolatokat definiáljon egy állandót

F_CPU (ebben az esetben - 1,2 MHz). Ezután megvan a fő funkció

fő-

Először is konfigurálnunk kell az I/O portot. A régebbi AVR modellekben több I/O port is lehet (A, B, C, D). Minden porthoz legfeljebb nyolc érintkező csatlakoztatható. Mindegyik láb bemenetre és kimenetre egyaránt konfigurálható. Az ATtiny13-nak csak egy portja van (B), amelyhez hat érintkező csatlakozik (PB0-PB5, lásd az adatlapot). Alapértelmezés szerint az összes érintkező bemenetként van konfigurálva, és egy LED működtetéséhez a megfelelő érintkezőt kell használnunk kimenetként. Az AVR mikrovezérlőkben az összes hardver nyolc bites regiszterekkel van konfigurálva. Az irányt (input-output) a DDRx regiszterek bitjei határozzák meg (ahol x a port betűje, esetünkben B). A "0" bitérték a bemenetnek, az "1" - a kimenetnek felel meg. Tehát a PB2 láb kimenetként való használatához be kell állítani a regiszter második bitjét DDRB egységenként:

DDRB |= (1<

A PORTx regiszterek a kimeneti állapot szabályozására szolgálnak. Például a PB2 érintkezőhöz csatlakoztatott LED kikapcsolásához (alacsony jel küldéséhez) nullát kell írnunk a regiszter második bitjébe. PORTB:

PORTB &= ~(1<

A bekapcsoláshoz (magas jelszint küldéséhez) - ennek megfelelően írjon fel egy egységet:

PORTB |= (1<

Most, hogy az I/O port konfigurálva van, elindítjuk a fő hurkot, amelyben megfordítjuk a PB2 kimenet állapotát (felváltva a magas és alacsony jelszintek között) 500 ms késleltetéssel. Így a LED-ünk másodpercenként 1-szer villog.

80-as szintű fejlesztő 2015. július 17-én 11:33-kor

Villogó LED-ek Arduino nélküli AVR-en

  • DIY vagy csináld magad *

A cikkben szereplő események egy éve történtek, így előfordulhat, hogy néhány dolog elavult, és néhány dolgot kihagytam. Hadd kezdjem azzal, hogy nem vagyok programozó, nem értek a digitális elektronikához, és egész életemben érdekelt az analóg elektronika. Nem tudtam, mik azok a mikrokontrollerek, mert nem olvastam a Habr-t. Őszintén szólva, ha akkoriban tudtam volna az Arduinóról, Arduino-n tettem volna. Tehát kezdjük.

Szükség volt egy olyan eszközre, amely pszeudovéletlen számokat generál. Miért nem véletlen, hanem pszeudovéletlen, mert lehetetlen véletlen számokat programozottan generálni: egyszer a ciklus megismétlődik, például a készülék ismételt bekapcsolása után. A véletlen számok generálásához külső hatást kell használni, sok lehetőség van, beszéljük meg a megjegyzésekben. Ez bonyolultabb lenne, ezért térjünk vissza a pszeudo-véletlen generáláshoz. A LED-eket számjelzőként is fogják használni, mert ez egyszerűbb.

Sok-sok guglizás, cikkek, fórumok olvasása, adatlapok tanulmányozása után, és nem találtam kész megoldást, úgy döntöttem, hogy megcsinálom. A LED-ek villogása mindenhol megtalálható, de a véletlenszerű villogás nem. Senki nem készített füzért? Remélem, az utasításaim érdekesek lesznek egy kezdő számára.

Először rajzolunk egy diagramot. A diagram nem az enyém, elvesztettem az enyémet, így nem lesz forráskód a Proteushoz.

Aki nem tudja, hogy ez milyen program, annak nagyon ajánlom, nagyon kényelmes, hogy forrasztás vagy a vezérlő villogása nélkül megnézze, hogyan működik minden. Mikrokontroller az Atmel Atmega8-tól. Azt javaslom, hogy a megjegyzésekben beszéljétek meg, miért az atmel.

Valójában maga a kód:

#beleértve //Tartalmazza az ATMega8 mikrokontrollerrel való munkához szükséges könyvtárat #include //Tartsa be a könyvtárat a késések szervezéséhez #include //Tartalmazza az álvéletlen számok generálására szolgáló könyvtárat (rand) void main(void) //Szükséges fejléc (törzs) ( char i; //Változó deklarálása (i) PORTD=0x00; //A D port összes kimenetének beállítása 0-ra, azaz kapcsolja ki a teljes D portot DDRD=0xFF //A D portot állítsa be kimenetnek, hogy a port kimeneteinek feszültsége 5 V legyen PORTC=0x00 //A C port összes kimenetét állítsa 0-ra, azaz a teljes C portot kapcsoljuk ki DDRC=0xFF //C portot állítunk be úgy, hogy a port kimenetei 5V feszültségűek legyenek PORTB=0x00 //A B port összes kimenetét állítsuk 0-ra, vagyis kapcsoljuk ki a teljes B port DDRB=0xFF //B portot készítünk kimenetként, hogy a port kimenetek feszültsége 5 V legyen, míg (1) //Végtelen hurok hozzáadása, az alábbi kód ciklusban fut le ( i = rand; () % 22 + 1 /*Változóhoz rendelünk egy függvényt, amely 0 és 32767 közötti értékeket vesz fel ==1)(PORTD.0=1;) else PORTD.0=0 //Ha az (i) változó egyenlő (1), akkor a port (D) 0. bitje egyenlő (1), if (; i==2)(PORTD.1=1;) egyébként PORTD.1=0; // ha másképp, akkor 0 if (i==3)(PORTD.2=1;) else PORTD.2=0; //Minden más alábbi feltételben, analógia szerint, ha (i==4)(PORTD.3=1;) else PORTD.3=0; if (i==5)(PORTD.4=1;) else PORTD.4=0; if (i==6)(PORTD.5=1;) else PORTD.5=0; if (i==7)(PORTD.6=1;) else PORTD.6=0; if (i==8)(PORTD.7=1;) else PORTD.7=0; if (i==9)(PORTC.0=1;) else PORTC.0=0; if (i==10)(PORTC.1=1;) else PORTC.1=0; if (i==11)(PORTC.2=1;) else PORTC.2=0; if (i==12)(PORTC.3=1;) else PORTC.3=0; if (i==13)(PORTC.4=1;) else PORTC.4=0; if (i==14)(PORTC.5=1;) else PORTC.5=0; if (i==15)(PORTB.0=1;) else PORTB.0=0; if (i==16)(PORTB.1=1;) else PORTB.1=0; if (i==17)(PORTB.2=1;) else PORTB.2=0; if (i==18)(PORTB.3=1;) else PORTB.3=0; if (i==19)(PORTB.4=1;) else PORTB.4=0; if (i==20)(PORTB.5=1;) else PORTB.5=0; if (i==21)(PORTB.6=1;) else PORTB.6=0; if (i==22)(PORTB.7=1;) else PORTB.7=0; ); )

2 napig írtam a kódot, amíg megértettem, hogy mi az. Röviden leírom. Összekötjük a szükséges könyvtárakat, a rand() függvény segítségével ciklusban generálunk számokat, a feltételek az „i” változó értékétől függően nyitnak és zárnak portokat. Hogyan csinálnád? Le lehet rövidíteni a kódot?

A kód működőképességének ellenőrzéséhez, mielőtt feltölti a mikrokontrollerre, azt javaslom, hogy futtassa a Proteusban, és nézze meg, mi történik.

Utána magát a mikrokontrollert kell flashelni. A helyzet itt is ugyanaz. Van egy sokat dicsért AVRDUDE program, de a KhazamaAVRProgrammer tetszett. A szokásos USBASP programozóként működött:

Ebből a cikkből kihagytam néhány nagyon fontos pontot. Nem mutattam képernyőképet a programokról, hogy mire és hova kell kattintani. Végezetül azt szeretném mondani: ha magad találod ki, akkor képes leszel rá.

A nyomtatott áramköri lapot lay formátumban töltheti le

Az előző leckéken kitaláltuk, hogyan működik az MK, és megnéztük, mik azok a bemeneti/kimeneti portok és ezek alternatív funkciói. Próbáljunk meg írni egy egyszerű programot "Villogó LED". A programot C-ben fogjuk megírni. Természetesen sokan kezdenek felháborodni, mondván, hogy ez egy redneck, csak az assemblerben kell lennie, és Isten áldja őket. Ha elkezdem elmondani, hogyan kell programot írni az assemblerben, akkor valószínűleg néhányan egyszerűen azt gondolják: „Milyen zavaros minden! És részben igazuk lesz. Egy program írásához szükségünk van egy speciális programra. használom CodeVisionAVR V2.04.4aés meg is találhatod. Vagy közvetlenül a weboldalunkon, ezen. Remélem nem lesz gond a telepítéssel. Indítsuk el a programot. 1. ábra Most hozzunk létre egy új projektet. Ehhez kattintson a gombra Fájl->Új . 2. ábra. Megjelenik egy ehhez hasonló ablak. 3. ábra. Chip Nos, itt minden világos, válassza ki a Projektet, és kattintson az „Ok” gombra. És ismét a kérdés. 4. ábra. Portok Itt a program kéri, hogy futtasson egy kódgenerátort. Először, és talán mindig, Ön dönti el, nyomja meg az „Igen” gombot. 5. ábra. Itt részletesebben kitérünk. Ez az ablak pontosan a kódgenerátor. Itt kiválasztjuk, hogy az MK mit inicializál a főprogram végrehajtása előtt. Kezdjük a lappal. Nos, itt szerintem minden világos. Vezérlőnket választjuk, mégpedig az Önnel egyeztetett módon ATmega8-at és 4 MHz-es kvarcfrekvenciát. 6. ábra. Ezen a lapon semmi máshoz nem kell hozzányúlnia. Menjen a lapra. 7. ábra. Itt választunk B portés változtassa meg a nulla bitet ezzel In-on
De ez még nem minden. Most kérjük meg a programot, hogy generálja nekünk a kezdőkódunkat. Ehhez kattintson a „fogaskerék” ikonra, és kétszer ugyanazon a néven, nevezetesen In mentse a projektet. Minden. A program generálta nekünk a kódot, és most nézzük meg. Nem írom le a teljes kódot, mivel ez egy másik téma, de itt van, amire figyelni fogunk. Nézd meg az alábbi képet.
9. ábra. #beleértve Vonal: PORTB vagy Ebben a sorban arra kérjük a fordítót, hogy csatoljon egy fájlt az ATmega8 MK összes regiszterének leírásával. Ez a megértést szolgálja. Ami könnyebben érthető 0x18 . Véleményem szerint itt minden nyilvánvaló. Csupán arról van szó, hogy ez a fájl olyan ekvivalenseket tartalmaz, amelyek a hétköznapi ember számára érthetőek. Könnyebb megérteni a port nevét vagy címét. Vonal: PORTB=0x00; Ne feledje, alapértelmezés szerint nulla kimenetet akartunk, itt van. Az igazság az, hogy a verebekre lövés és fegyver van, mivel ez a kifejezés nullákat jelenít meg az egész kikötőben. Lehetne egyszerűbb? PORTB.0=0x00; de nem ez a lényeg. DDRB Vonal: DDRB=0x01; Emlékezzünk vissza az előző leckére azok számára, akik még nem olvasták itt. Mivel a hexadecimális 0x01 számjegy egyenlő 0b00000001 és bin. Tanuljunk meg hexadecimálisról binárisra konvertálni! Ekkor ezt látjuk az irányregiszter nulla számjegyében
írta 1. Vagyis a port nulla bitjén keresztül fogjuk kiadni az adatokat IN. Nos, miután megnéztük a kódot, meg voltunk győződve arról, hogy a kódgenerátor a szükséges kódot generálta. Vegye figyelembe, hogy ez nagyon kényelmes és gyors. Most nézzük meg, hová kell írnunk a kódot. Ehhez futunk le ezekre a sorokra. 7. ábra.. És jó könyvtárat készítettek nekünk a hasznos funkciókból. És az egyik a szünet delay_ms(int x) vagy delay_us(int x). Az első x ezredmásodperces szünetet ad meg, a második pedig x mikroszekundumot. De a használatához térjünk vissza a legtetejére és a sor mögé #beleértve és írd alá #beleértve . Így csatlakoztattuk a könyvtárat, és biztonságosan használhatjuk a szünetfunkciókat. Adjuk hozzá a kódunkat. PORTB.0 = 0x01; delay_ms(500); PORTB.0 = 0x00; delay_ms(500); Most állítsuk össze a projektünket. Project->Build AllÖsszeszerelés után látni fogjuk az ablakot 11. ábra. amely azt mondja, hogy minden hiba nélkül történt, és nincsenek figyelmeztetések. Két sor
Nincsenek hibák Nincsenek figyelmeztetések



Kapcsolódó kiadványok