MK programozása a semmiből. AVR programozás

Nem voltam egyszer, és nem két mondván, hogy az MK tanulmányozását el kell kezdeni az összeszerelővel. Ez egy egész tanfolyamot szentelt a helyszínen (bár ez nem túl konzisztens, de fokozatosan fésültem egy megfelelő típusra). Igen, nehéz, az eredmény nem lesz az első napon, de megtanulod megérteni, mi történik a vezérlőn. Tudni fogod, hogyan működik, és nem a majom másolat más emberek forrásait, és megpróbálja megérteni, hogy miért hirtelen abbahagyta a munkát. Ezenkívül az SI sokkal könnyebben felülmúlja a közepén, amely a leginkább inopportune pillanatban villákkal jön ki.

Sajnos mindenki azonnal az eredményt akarja. Ezért úgy döntöttünk, hogy menjen, másrészt - a képzést a SI, de a show az ő fehérnemű. A jó programozó-emelder mindig a vasalót tartja a squall-nek, anélkül, hogy engedélyt adna neki. Tehát az elején lesz a kód, akkor mi született a fordítót, és hogyan működik valójában :)

Másrészt, si erős oldal Ez az adósíthatósági kód. Ha természetesen mindent ír le. A munka algoritmusainak és vas-megvalósításának elválasztása a projekt különböző részeiben. Ezután át az algoritmus egy másik MK, elég átírni csak az interfész réteget, ahol minden fellebbezést a mirigy van írva, és hagyja az egész dolgozó kód, ahogy van. És természetesen az olvashatóság. Az ablakszárny forrás forrás könnyebb megérteni első látásra (bár .. én például nem érdekel, hogy mit lehet flörtölni legalább si, legalább AFM :)), de újra, ha írsz mindent jól. Ezekkel a pillanatokkal figyelni fogok.

Mint egy olyan hardveres darab, amelyen az oroszlán részesedése minden példa lesz az enyém hibakeresési díj.

Első program az AVR-re

A fordító kiválasztása és a környezet felszerelése
Az AVR számára sok különböző C fordító létezik:
Először is IAR AVR C. - szinte egyedülállóan elismert, mint az AVR legjobb fordítója, mert Maga a vezérlőt az Atsel és az IAR szakembereinek szoros együttműködõje hozta létre. De mindazért, amit meg kell fizetned. És ez a fordító nem elég ahhoz, hogy mi a drága kereskedelmi szoftver, hanem olyan reggeli beállításokat is tartalmaz, amelyek csak meg kell adniuk és összeállítják azt. Tényleg nem volt barátságom vele, a projekt furcsa hibákon részeg volt a kapcsolódási szakaszban (később kiderült, hogy repedési görbe volt).

A második jön Winavr GCC. - Erőteljes optimalizáló fordító. Teljes megnyitja, keresztplatformot, általában az élet minden örömét. Ő is tökéletesen integrálódik az AVR stúdióba, amely lehetővé teszi, hogy hibakeresését hozzák létre, hogy a pokol kényelmes. Általában úgy döntöttem.

Is van CodeVision AVR C.- Nagyon népszerű fordító. Az egyszerűségével kapcsolatban népszerűvé vált. Munkaprogram Néhány perc múlva bejuthatsz - a kiindulási kód mestere nagymértékben támogatott, az összes fül inicializálásának bélyegzője. Őszintén szólva, sajnálom, hogy gyanúja van vele - valahogy meg kellett szétszerelni egy PROG-t, amelyet a fordító írott, valamiféle értett, de nem a kódot kapták. A felesleges televíziók és műveletek szörnyű mennyisége, amelyet kis kódokba és lassú sebességgel öntöttünk. Talán azonban hiba történt a DNS-ben, írta az eredeti firmware-t. Plusz pénzt akar. Nem sokkal olyan, mint az IAR, de észrevehető. És Demozhimben nem több, mint 2kb kódot ad.
Persze repedés van, de ha ellopsz, akkor egy millió, az IAR értelemben :)

Van még Kép kézműves avr c és Microc mikroelektronika. Nem használhat más felhasználást, de itt SWG. Nagyon szántás MikropascalAz olvadék rettenetesen kényelmes programozási környezet és könyvtár. Azt hiszem, a mikrok nem lesz rosszabb, de kifizetett.

Ahogy mondtam, én választom Winavr. Három okból: Ingyenes, az AVR stúdióba integrálva van, és egyszerűen csak a kész kód lebontása minden alkalommal.

Tehát töltse le magad a Winavr C és avr stúdió telepítéséhez. Ezután a stúdió először helyezkedik el, majd felülről, a WinAVR-ről a stúdióra gördül, plugin formájában. Határozottan javaslom a WinAvr telepítését röviden, valami ilyesmi, mint a C: \\ WinAvr, ezáltal elkerülheti a problémák merülését.

Projekt létrehozása
Tehát a stúdió szállítása, SI rögzítve van, itt az ideje, hogy megpróbáljon valamit programozni. Kezdjük egy egyszerű, legegyszerűbb módon. Indítsa el a stúdiót, válasszon ott új projekt, mint fordító AVR GCC, és adja meg a projekt nevét.

Megnyitja a munka mezőt üres * .c fájllal.

Most nem akadályozza meg az útvonalak megjelenítését a stúdió lapokon. Ehhez a ferde:
Az Eszközök menü - Opciók - Általános - Filetabs, és válassza a "Csak fájlnév" lehetőséget a legördülő listában. Ellenkező esetben lehetetlen dolgozni - a fülön a fájl teljes elérési útja lesz, és nem lesz több, mint két lap a képernyőn.

Projektbeállítás
Általánosságban elmondható, hogy az összes függőséget le kell írni. És ez valószínűleg helyes. De a teljesen integrált IDE-re nőttem fel uvision. vagy AVR stúdió. Ez a megközelítés mélyen idegen. Ezért a saját útján fogok tenni, az összes stúdiót.

Halom a gombhoz egy fogaskerékkel.


Ezek a projekt beállításai, vagy inkább a Make fájl automatikus generációjának beállítása. Az első oldalon csak meg kell adnia az MK-t, amelyen az MK fog működni. Ez a bitek biztosítékaitól függ, ezért úgy véljük, hogy a frekvencia 8000000GZ.
Figyeljen az optimalizálási karakterláncra is. Most van - az optimalizálás mérete. Míg hagyja, ahogy van, akkor megpróbálhat játszani ezzel a paraméterrel. -O0 az eltávolítható optimalizálás egyáltalán.

A következő lépés az útvonalak konfigurálása. Az első dolog, hogy hozzáadja a projekt könyvtárát - van egy harmadik fél könyvtárat. A lista megjelenik ". \\"

A fájl létrehozása, a projekt alapértelmezett mappájában láthatja, csak fut a szemedben, nézze meg, mi van ott.


Ez minden. Jim mindenütt rendben van, és menjen a forráshoz.

A probléma megfogalmazása
Az üres lap olyan integetett, hogy néhány trükkös ötletet testesítse meg, mivel a dióda banális villogása nem helyezkedik el. Hagyjuk azonnal egy bikát a szarvakért, és hajtsa végre a kapcsolatot a számítógéphez - ez az első dolog, amit csinálok.

Ez így fog működni:
A COM port megérkezése alatt a készülék (0x31 kód) megvilágítja a diódozást, és ha a nulla érkezés (0x30 kód) eltűnik. Ráadásul mindent megszakítanak, és a háttérfeladat egy másik diódát villog. Egyszerűen és jelentéssel.

Összegyűjti a rendszert
Az USB-USART Converter modulot a Microcontroller USART konverterekkel kell összekötni. Ehhez vegyen egy jumper két vezetéket, és tegye a keresztet a kereszt csapokba. Azaz, az Rx vezérlő csatlakozik a TX átalakító, és a TX átalakító RX vezérlő.

Ennek eredményeképpen kiderül, ez egy ilyen rendszer:


Egyéb következtetések összekapcsolása, táplálkozás, mentesítés, szabványos

Kódot írunk

Azonnal kell foglalni, hogy nem fogok elmélyíteni kifejezetten az SI nyelv leírásában. Ehhez egyszerűen hatalmas mennyiségű anyag van, a K & R klasszikusoktól kezdve, és különböző technikákkal végződik.

Egy ilyen módszert találtak bennem a méhsejtben, egyszer tanulmányoztam ezt a nyelvet. Minden rövid, érthető és az ügyben. Fokozatosan felállítom és átrendeztem a webhelyemre.

Van valójában nem minden fejezet elhalasztott, de azt hiszem, ez nem sokáig.

Nem valószínű, hogy jobban leírom, így a képzési kurzusból a kék finomságok részletes expozíciója helyett egyszerűen közvetlen linkeket adok a technika bizonyos oldalaihoz.

Könyvtárak hozzáadása.
Először is hozzáadjuk a szükséges könyvtárakat és címeket definíciókkal. Végtére is, az SI univerzális nyelv, és meg kell magyaráznia, hogy az AVR-vel dolgozunk, ezért lépjen be a forrásvonalba:

1 #Inlude.

#Inlude.

Ez a fájl a mappában van Winavr. És tartalmazza az adatkezelő minden nyilvántartását és portját. És ott minden ravasz, hivatkozva egy adott vezérlőre, amelyet a fordító átirányítja készít Fájl a paraméterben Mcu. Ezen változó a projektben, egy fejlécfájl az összes port és regiszter címének leírásával rendelkezik ezen a vezérlőn. Hogyan! Nélkül is lehetséges, de akkor nem fogod használni a regiszterek szimbolikus nevét, mint egy SEGREG vagy UDR, és emlékeznie kell mindegyik, mint a "0xc1", és ez egy fej.

Ugyanaz a csapat maga #Inlude.<имя файла> Lehetővé teszi a projekthez való hozzáadását, például bármely szövegfájl tartalmát, például egy másik kód funkcióját vagy egy darabját leíró fájlt. És így az irányelv megtalálhatja ezt a fájlt, feltüntetettük a projektünk módját (a winavr könyvtár már meg van írva).

Fő funkció.
Az SI nyelven szereplő program funkciókból áll. Bármilyen sorrendben és különböző módon beágyazhatók és hozhatók egymástól. Minden funkciónak három szükséges paramétere van:

  • Visszatérési érték, például, sin (x) Visszaadja az x sinus értékét. Mint a matematikában, röviden.
  • Továbbított paraméterek, ugyanaz az X.
  • Testfunkció.

A továbbított és visszaadott értéknek bármilyen típusúnak kell lennie, az adatoktól függően.

A C-n lévő bármely programnak tartalmaznia kell egy funkciót fő. A fő programba való belépéspontjaként, különben NIFIGA NEM SI :). Szerint a fő jelenléte valaki más forrás egy millió fájlból, meg lehet érteni, hogy ez a program vezetője, ahol minden elkezdődik. Tehát kérdezzük:

1 2 3 4 5 Int fő (üresség) (visszatérés 0;)

int fő (üresség) (visszatérés 0;)

Minden, az első legegyszerűbb program meg van írva, nem számít, hogy nem tesz semmit, csak elkezdtük.

Elemezzük, amit tettünk.
int. Ez a fajta adat, amelyet a fő funkció visszatér.

Természetesen egy mikrokontrollerben fő. Nem tudok semmit visszaadni elvben és elméletileg void Main (Void)De a GCC eredetileg a számítógépen élesítve, és a program befejezheti az operációs rendszer értékét. Ezért a GCC void Main (Void) káromkodás figyelmeztetés.

Ez nem hiba, akkor fog működni, de nem szeretem a lendningeket.

Üres. Ez a fajta adat, amelyet ebben az esetben továbbítunk a funkciónak fő. Szintén nem tud semmit sem venni kívülről, a költő Üres. - Dummy. A dugót akkor alkalmazzák, ha nem szükséges semmit vagy visszatérhet.

Ezek { } A táblázatok egy szoftverblokk, ebben az esetben a test funkció fő., a kód lesz.

visszatérés. - Ez a visszatérési érték, amelyet a fő funkció befejeződik, mivel mi vagyunk, vagyis a szám, hogy vissza kell adnunk a számot. Bár még mindig nincs értelme, mert A Microcontroller-en a Main-tól a sehol. Visszatérek nullát. A nonfig számára. És a fordító általában okos, és a kód nem generálja a kódot.
Bár, ha perverz, akkor fő. Elmehetsz az MC-hez - például a bootloader szakaszba esik, és teljesítse azt, de már van egy alacsony szintű firmware szedés, az átmeneti címek beállításához. Az alábbiakban látni fogod és megérted, hogyan kell csinálni. Minek? Ez egy másik kérdés, az esetek 99.999% -ában ez a NAFIG nem szükséges :)

Készült, tovább ment. Változó hozzáadása, ez nem feltétlenül szükséges számunkra, és nem szükséges a változók bevezetése, de tanulunk. Ha a változók a funkció testébe kerülnek - akkor helyiek és csak ebben a funkcióban léteznek. Ha elhagyja a funkciót, ezeket a változóit eltávolítják, és a RAM memóriáját fontosabb igények lehetnek. .

1 2 3 4 5 6 Int fő (érvénytelen) (aláírás nélküli char i, visszatérés 0;)

int fő (érvénytelen) (aláírás nélküli char i, visszatérés 0;)

aláírás nélküli Annyira nem megfelelő. A tény az, hogy a bináris ábrázolás, van egy vezető bit az előjel, ami azt jelenti, egy byte (char) száma + 127 / -128, de ha a jel discardes kap már 0 és 255 Általában a megjelölés nem szükséges. Hogy aláírás nélküli.
ÉN. - Ez csak a változó neve. Nem több.

Most be kell inicializálnod a kikötőket és Uart.. Természetesen elvégezheti és csatlakoztathatja a könyvtárat, és hívhat egyfajta Uartinit (9600); De akkor nem fogod tudni, ami valójában történt.

Ezt megtesszük:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Int fő (üres) (aláírás nélküli char i; #define xtal 8000000l #define baudrate 9600l #Define Bauddivider (Xtal / (16 * Baudrate) -1) #Define hi (x) ((x) \u003e\u003e 8) #define lo (x) ((x) & 0xff) ubrrl \u003d lo (Bauddivider); Ubrrh \u003d Hi (Bauddivider); Ucsra \u003d 0; Ucsrb \u003d 1.<< RXEN| 1 << TXEN| 1 << RXCIE| 0 << TXCIE; UCSRC = 1 << URSEL| 1 << UCSZ0| 1 << UCSZ1; }

int Main (üres) (aláíratlan char i; #define xtal 8000000l #define baudrate 9600l #define bauddivider (xtal / (16 * baudrate) -1) #define hi (x) ((x) \u003e\u003e 8) #define lo ( x) ((x) & 0xff) ubrrl \u003d lo (Bauddivider); ubrrh \u003d hi (bauddivider); ucsra \u003d 0; ucsrb \u003d 1<

Ijedős? Tény, hogy az igazi kód itt csak öt utolsó sor. Minden, ami #Define Ez egy makro-nyelv előfeldolgozó. Majdnem ugyanazok a felsők, mint az összeszerelőben, de a szintaxis kissé eltérő.

Ezek megkönnyítik a rutin műveleteket a szükséges együtthatók kiszámításához. Az első sorban azt mondjuk, hogy inkább Xtal Biztonságosan helyettesítheti a 80.000.000-et, és L.- Típus specifikáció, hosszú bevásárlóközpont egy processzor órafrekvencia. Azonos Átviteli sebesség. - az UART adatfrekvenciája.

bauddivider. Már bonyolultabb, a két korábbi képlet által kiszámított kifejezés helyett helyettesíthető.
Jól és Lo és SZIA Ebből az eredményből a fiatalabb és a magas rangú bájtokat veszi figyelembe, mert Egy bájtban egyértelműen nem illeszkedik. BAN BEN SZIA Az ICSE Shift történik (a makró bemeneti paramétere) nyolcszor a jobb oldalon, ennek eredményeképpen csak a legrégebbi bájt marad. B. Lo Készítsünk egy adagot és egy számot, amelynek eredményeként csak a legfiatalabb bájt marad.

Így mindent megtesz #Define Biztonságosan eldobhatja, és a kívánt számok számítanak a számológépre, és azonnal beírják őket az UBBRL \u003d vonalakba. és ubbh \u003d ... ..

Tud. De! Csináld ezt Kategorikusan lehetetlen!

Ez is dolgozni fog, de az úgynevezett mágikus számok - Azok az értékek, amelyeket érthetetlenül, ahonnan nem világos, miért és ha egy ilyen projektet néhány év alatt adományoz, akkor nehéz megérteni, hogy átkozott lesz. Igen, és most meg akarja változtatni a sebességet, vagy megváltoztathatja a kvarc frekvenciáját, és minden újra kell újraszereznie, és így megváltoztatta néhány Tsiferokot a kódban és mindent. Általában, ha nem szeretné élvezni a Bydlokodert, akkor tegye meg a kódot úgy, hogy könnyen olvasható, érthető és könnyen módosított.

Akkor minden egyszerű:
Mindezek az "Ubrrl és Co" az adóegység konfigurációjának nyilvántartásai, amelyekkel kommunikálunk a világgal. És most a szükséges értékeket hozzárendeltük a kívánt sebesség és a megfelelő mód konfigurálásával.

Felvételi nézet 1< A következőket jelenti: vedd 1 és tedd a helyére RXEN. A repülésben. RXEN. Ez a nyilvántartás 4. bitje UCSRB.így 1< 00010000 bináris számot képez, TXEN. - Ez egy harmadik bit, és 1< DAST 00001000. Egyetlen "|" Ez törött VAGYSO 00010000 | 00001000 \u003d 00011000. A fennmaradó szükséges konfigurációs biteket ugyanúgy mutatják ki, és hozzáadjuk az általános csokorhoz. Ennek eredményeként az összeszerelési szám UCSRB-ben van írva. A részleteket az MC-ben lévő adatlapon írják az USART részben. Tehát ne zavarja meg a műszaki részleteket.

Készen áll, itt az ideje, hogy mi történt. Az emuláció összeállítására és elindítására (CTRL + F7).

Hibakeresés
Mindenféle előrehaladási sáv Ran, a stúdió megváltozott, és egy sárga nyíl megjelent a fő funkció közelében. Ez az, ahol a processzor jelenleg aktuális, és a szünet szimulációja.

Az a tény, hogy eredetileg az Ubrrl \u003d Lo (Bauddivider) sorban állt; Végtére is, az a tény, hogy nincs meghatározva, ez nem kód, hanem egyszerűen előzetes számítások, akkor a szimulátor egy kicsit rögzített. De most rájött, az első utasítás befejeződött, és ha egy fára mászik I / O nézet, Az USART szakaszban, és nyerj ott az UBBRL bájton, látni fogod, hogy már létezik már! 0x33.

Készítsen még egy lépést. Nézd meg, hogyan változik egy másik regiszter tartalma. Tehát biztosítsa őket mindannyian, figyeljen arra a tényre, hogy az összes jelzett bitet mutatták ki, ahogy mondtam, és az egész bájt időpontjában áll. A következő visszatérés nem működik, a program vége.

Nyítás
Most állítsa vissza a szimuláció nulla. Kattintson ide Reset (Shift + F5). Nyitott szétszerelési felsorolás, most látni fogja, hogy mi történik a vezérlő ténylegesen. Nézet -\u003e Szétszerelés. És nem yyaaaa !!! Szerelő !!! Uzhos !!! De meg kell. Tehát később, amikor valami rosszul megy, nem mer volt a kódba, és nem kérdezte Lamer kérdéseket a fórumokon, és azonnal felmászott a veszteségbe, és figyelte, hogy hol van egy stand. Nincs semmi szörnyű ott.

Először is, a sorozat teteje lesz:

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 ugrás 00.000.002: 940C0034 JMP 0x00000034 ugrás 00.000.004: 940C0034 JMP 0x00000034 ugrás 00.000.006: 940C0034 JMP 0x00000034 ugrás 00.000.008: 940C0034 JMP 0x00000034 ugrás + 0000000A: 940C0034 JMP 0x00000034 ugrás + 0000000C: 940C0034 JMP 0x00000034 ugrás + 0000000E: 940C0034 JMP 0x00000034 ugrás 00.000.010: 940C0034 JMP 0x00000034 ugrás 00.000.012: 940C0034 JMP 0x00000034 ugrás 00.000.014: 940C0034 JMP 0x00000034 ugrás 00.000.016: 940C0034 JMP 0x00000034 ugrás 00.000.018: 940C0034 JMP 0x00000034 ugrás + 0000001A: 940C0034 JMP 0x00000034 ugrás + 0000001C : 940C0034 JMP 0x00000034 ugrás + 0000001E: 940C0034 JMP 0x00000034 ugrás 00.000.020: 940C0034 JMP 0x00000034 ugrás 00.000.022: 940C0034 JMP 0x00000034 ugrás 00.000.024: 940C0034 JMP 0x00000034 ugrás 00.000.026: 940C0034 JMP 0x00000034 ugrás 00.000.028: 940C0034 JMP 0x00000034 ugrás

00000000: 940C002A JMP 0x0000002A ugrás 00.000.002: 940C0034 JMP 0x00000034 ugrás 00.000.004: 940C0034 JMP 0x00000034 ugrás 00.000.006: 940C0034 JMP 0x00000034 ugrás 00.000.008: 940C0034 JMP 0x00000034 ugrás + 0000000A: 940C0034 JMP 0x00000034 ugrás + 0000000C: 940C0034 JMP 0x00000034 ugrás + 0000000E : 940C0034 JMP 0x00000034 ugrás 00.000.010: 940C0034 JMP 0x00000034 ugrás 00.000.012: 940C0034 JMP 0x00000034 ugrás 00.000.014: 940C0034 JMP 0x00000034 ugrás 00.000.016: 940C0034 JMP 0x00000034 ugrás 00.000.018: 940C0034 JMP 0x00000034 ugrás + 0000001A: 940C0034 JMP 0x00000034 ugrás + 0000001C: 940C0034 JMP 0x00000034 ugrás + 0000001E: 940C0034 JMP 0x00000034 ugrás 00.000.020: 940C0034 JMP 0x00000034 ugrás 00.000.022: 940C0034 JMP 0x00000034 ugrás 00.000.024: 940C0034 JMP 0x00000034 ugrás 00.000.026: 940C0034 JMP 0x00000034 ugrás 00.000.028: 940C0034 JMP 0x00000034 ugrás

Ez a megszakítási vektorok táblázata. Visszatérünk hozzá, miközben csak látjuk és ne feledje, hogy ez az. Az első oszlop a vaku flash-címe, amelyben a parancs hazudik, a harmadik Mnemonikus csapat második parancskódja, ugyanaz az összeszerelő oktatás, a csapat harmadik operandusa. Nos, automatikus megjegyzés.
Tehát, ha megnézed, akkor szilárd átmenetek vannak. És a JMP parancskódot négy byte, ez tartalmazza az átmeneti cím által rögzített hátra - a fiatalabb byte a fiatalabb címét, és a kódot az átmeneti parancs 940C

0000002b: be1f ki 0x3f, r1 az I / O helyen

A nulla-0x3f címre való felvétel Ha az I / O nézet oszlopot látja, akkor látni fogja, hogy a 0x3F-cím az SREG - Flag Register Controller regiszter címe. Azok. A programot nulla körülmények között állítjuk be.

1 2 3 4 + 0000002C: E5CF LDI R28.0x5F R28.0x5F terhelés + 0000002D: E0D4 LDI R29.0x04 R29.0x04 Terhelés azonnal + 0000002E: BFDE OUT 0X3E, R29 OUT I / O Helyszín + 0000002F: BFCD OUT 0X3D, R28 OUT I / O Helyszín

0000002C: E5CF LDI R28.0X5F R28.0x5F terhelés + 0000002D: E0D4 LDI R29.0x04 R29.0x04 terhelés + 0000002E: BFDE OUT 0X3E, R29 OUT I / O Helyszín + 0000002F: BFCD OUT 0X3D, R28 Out I / O Helyszín

Ez a köteg mutatójának betöltése. Közvetlenül az I / O regiszterekbe történő szállítás nem, csak a közbenső regiszteren keresztül. Ezért az első LDI a közbenső termékben, majd az I / O-ban. Én is többet fogok mondani a veremről. Időközben ismert, hogy ez egy ilyen dinamikus memória terület, amely a RAM végén lóg, és megőrzi a címeket és a közbenső változókat. Most rámutattunk, hogy hol lesz egy verem.

00000032: 940c0041 JMP 0x00000041 Ugrás

Ugrás a program Saaaeeee végére, és ott van egy tilalom a megszakítások és a hurok szorosan önmagában:

1 2 +00000041: 94F8 CLI globális megszakítás Letiltás +00000042: CFFF RJMP PC-0X0000 Relatív Jump

00000041: 94F8 CLI globális megszakítás Letiltás +00000042: CFFF RJMP PC-0X0000 relatív ugrás

Ez előre nem látható körülmények esetén, például a fő funkcióból származó kimenet. Az ilyen hurokból a vezérlő egy hardveres visszaállítással jeleníthető meg, vagy valószínűleg a Watchdog Dog - Watchdogból való lemerülés. Nos, vagy, ahogy fent mondtam, javítsa ki ezeket a helyeket a hex szerkesztőben és az útválasztásban, ahol van egy lélek. Figyeljen arra is, hogy kétféle JMP és RJMP átmenet van, az első közvetlen áttérés a címre. Négy bájtot igényel, és közvetlen átmenetet készíthet a memóriaterületen. Az átmenet második típusa - RJMP - relatív. A csapata két bájtot vesz igénybe, de az átmenet az aktuális pozícióból (címek) 1024 lépéssel előre vagy hátra. És paramétereiben az aktuális pont eltolását jelzik. Gyakrabban használják, mert Kétszer kevesebb helyet foglal el, és a hosszú tényezők ritkán szükségesek.

1 +000034: 940C0000 JMP 0x00000000 Ugrás

00000034: 940c0000 JMP 0x00000000 Ugrás

És ez a kód elején ugrás. Indítsa újra egyfajta. Ellenőrizheti, hogy az összes vektor itt ugrik. Ebből a kimenetből - ha lehetővé teszi a megszakítások engedélyezését (alapértelmezés szerint tilos), és megszakad, de nincs kezelő, akkor lesz egy program visszaállítása - a program eldobja a programot.

Fő funkció. Minden hasonló, akkor sem írhatja le. Csak a regiszterekre nézve már kiszámították a számot. Preprocessor fordító taxis !!! Tehát nincs "mágia" szám!

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

00000036: E383 LDI R24.0x33 Road azonnali +000037: B989 OUT 0X09, R24 Out I / O Helyszín 15: Ubrrh \u003d Hi (Bauddivider); +000038: BC10 out 0x20, R1 Out I / O Helyszín 16: Ucsra \u003d 0; +000039: B81B ki 0x0b, R1 Out I / O Helyszín 17: UCSRB \u003d 1<

És itt van a Jamb:

1 2 3 + 00003E: E080 LDI R24.0x00 Rakomány közvetlen + 0000003F: E090 LDI R25.0x00 Rakomány azonnal +00000040: 9508 RET szubrutin visszatérés

0000003E: E080 LDI R24.0x00 Rakomány közvetlen + 0000003F: E090 LDI R25.0x00 Rakomány közvetlen +00000040: 9508 RET szubrutin visszatérés

Megkérdezik, hogy miért ez a fordító hozzáadja az ilyen topmaster-t? És ez nem más, mint visszatérési értéke 0, akkor már azonosított int main (void). Szóval nyert több mint négy bájt nem érti, mi :) És ha egy void main (void), csak akkor lesz RET, de Varning lesz. Mit mondanak, hogy nem adunk vissza semmit a fő funkcióhoz. Általában tetszik neked :)

Bonyolult? Úgy tűnik, nem. A szétszerelési módban lépésről-lépésre átugorom a Procy-t, mivel a processzor egyedi utasításokat hajt végre, amely nyilvántartásokkal történik. Hogyan mozoghat a parancsok és a végső hurok.

A folytatás néhány nap alatt következik ...

Offtop:
Alexei78. A Firefox rögzítő dugója, amely megkönnyíti a navigációt a webhelyemben és a fórumon.
Beszélgetés és letöltés

Az AVR mikrokontrollerek programozásához számos fejlesztési eszköz van azonban a legnépszerűbb, kétségtelenül, egy csomagot kell elismerni AVR stúdió. . Számos oka van az ilyen népszerűségnek - ez egy ingyenes csomag, amelyet a vállalat fejlesztett ki Atel A szövegszerkesztőt, az összeszerelőt és a szimulátort ötvözi. Az AVR Studio csomagot a rögzítő hardverrel együtt használják. A javasolt cikk a példák úgy technikákat munka egy csomag, amely segít a kezdő programozók, hogy megértsék a kölcsönhatás egyes komponenseinek AVR Studio.

A cikk következő részében az SI-ben írt programok AVR Studio környezetében hibakeresésről kerülnek leírásról.

Az AVR Studio csomag szilárd fejlesztési előzményekkel rendelkezik, amely tükröződik a meglévő verziók számában. A 2003 végén verzió 4,08 adták, amely számos hasznos kiegészítéseket, és 2004 elején egy frissítést (Service Pack 1) már megjelent, hozzátéve, támogatja az AVR-vezérlők a harmadik generációs ATMEGA48 család. A család zsetonjainak előállítása 2004 második felére várható.

A csomagelosztási és szervizcsomag letölthető a www.atmel.com webhelyről, vagy kaphat egy CD-t ezzel az eloszlással az Atmel orosz forgalmazójából.

Az AVR Studio csomag munkáját kényelmesen felülvizsgálja bármely konkrét programon. Véleményként megvizsgáljuk a legegyszerűbb programra vonatkozó projekt létrehozását, amely két LED világít. A határozottságért vegyen egy mikrocirkot ATMEGA128. és csatlakoztassa a két LED-t a 31-es és 32-es következtetésekben (ezek a Port D chip Atmegata128 port 6 és 7 bitjei). AVR vezérlők Hatékony kimeneti kaszkádokkal rendelkeznek, az egyes kimenetek tipikus árama 20 mA, a maximális kimeneti áram 40 mA, és ez mind az áramlásra, mind az áramló áramra vonatkozik. Példánkban a LED-ek az anódokhoz kapcsolódnak a vezérlő következtetéseihez, és a kioltó ellenállásokon keresztül a katódok a talajhoz vannak csatlakoztatva. Ez azt jelenti, hogy a LED-t az "1" táplálással meggyújtja a megfelelő portkimenetre. A vázlatos diagram az ábrán látható. A diagram azt is mutatja, hogy az egyik programban használandó két gomb.

Itt helyénvaló kisméretű, hogy válasszon egyfajta chipet a legegyszerűbb példaként. Valóban, első pillantásra furcsanak tűnhet, miért van szükség egy ilyen erőteljes kristályra egy 64-es tűben, ahol elegendő 8 pólusú chip van Attiny12. ? Ebben a megközelítésben azonban logika van. Ismeretes, hogy szinte minden AVR vezérlő szívében ugyanaz a kernel található. A vezérlők különböznek a memóriában, az I / O portok száma és a perifériás modulok száma. Minden egyes vezérlő jellemzői - Kötő logikai név / kimeneti nyilvántartások a fizikai címekhez, a megszakítási vektorok címei, a kikötői bitek azonosítása stb. Az AVR Studio csomagban található kiterjesztésű fájlok leírása. Következésképpen egy adott típusú kristályt használva a programot önmagában fejezheti ki, és bármilyen fiatalabb kristályt. Továbbá, ha a legmagasabb rangú kristályt hibakeresésként használja, ma az Atmega1128, akkor hibakereményezhet egy programot szinte minden AVR vezérlő számára, csak hardverforrásokat kell használnia, amelyek hiányoznak a cél mikrokontrollerből. Így például hibakereményezheti a programot az ATMEGA128-on Attiny13 . Ebben az esetben a forráskód gyakorlatilag ugyanaz marad, csak a csatlakoztatott fájl neve 128def.inc a TN13DEF.INC-nál változik. Ez a megközelítés előnye is van. Például az "Extra" I / O portok használhatók a csatlakozáshoz. LCD-kijelző amely visszavonhatja a hibakeresést. Vagy használja a intrahemum emulátor, amely összeköti a JTAG port a ATMEGA128 chip (a ATTINY13 vezérlő nem rendelkezik ezzel a port). Így lehetőség van arra, hogy egyetlen hibakereső tábla, melyen a „senior” AVR vezérlő telepítve van, a hibakeresés bármely újonnan kifejlesztett rendszerek, természetes alapú AVR mikrokontrollerek. Az egyik ilyen tábla nevét megam. Ez volt a cikkben szereplő programok példáinak létrehozására. Ez egy univerzális egyoldalú vezérlő, amely az ATMEGA128 chipen alapul, amely külső RAM-ot, két portot tartalmaz RS-232. , az LCD kijelző, az intrahemnoe programozó és emulátor csatlakoztatásához A jtag jégen . A fórumon van egy hely, ahol megoszthatja a flash-rom sorozat chipet AT45 A TSOP32 / 40/48 házban és egy kétcsatornás DAC sorozatban AD5302 / AD5312 / AD5322 . Most, miután elmagyarázta az AVR szörny használatának okait, hogy meggyulladjon egy pár swatodiódist, tovább haladhat.

Az AVR Studio környezetben történő programozás során szabványos műveletek sorrendjét kell elvégeznie:

  • összeállítás
  • A projekt létrehozása a projekt \\ New Project menü kiválasztásával kezdődik. Az "Új projekt létrehozása" ablakban meg kell adnia a projekt nevét, (a mi esetünkben - minta1) és az inicializálási fájl nevét. Megnyomása után a „Tovább” gombra, a Select Debug Platform és készülék ablak jelenik meg, ahol a debug platform (szimulátor, vagy emulátor) van kiválasztva, és milyen típusú mikrokontroller.

    Választhat az egyik ajánlott intrahemny emulátorok közül, megjegyezzük, hogy minden emulátornak van saját listája a Microcircuits támogatott. A vizsgált példaként hibakeresési platformként választunk az AVR szimulátor és az ATMEGA128 chip. A "Befejezés" gomb megnyomása után kimenetünk megjelenik az AVR Studio csomag munkapái, míg üres. Ez követi a megfelelő ablakot a program forrásszövegének elhelyezéséhez. Ezt kétféleképpen lehet elvégezni, vagy tárcsázza az összes szöveget közvetlenül a szerkesztőablakban, vagy töltsön le egy meglévő fájlt. Az alábbiakban a legegyszerűbb program teljes szövege a megjegyzésekkel.

    ; "LED-vezérlés"; az AS-MEGAM DEBUG kártyára írt; A paraméter generátor frekvenciája 7,37 MHz; A LED-ek a PD6 és a PD7 következtetéseihez és ellenállásokhoz kapcsolódnak - egy megosztott vezetéken. ; Az ATMEGA128 áramkör csatlakoztatása I / O RÉSZLETEK "M128DEF.INC" fájl; A kezdő program kezdete :; Első művelet - verem inicializálása; Ha ez nem történik meg, hívja fel a szubrutint vagy megszakítást; nem fog visszatérni a szabályozást; A mutató végén a köteg van beállítva, hogy az utolsó cím a belső RAM - Ramend LDI R16, LOW (RAMEND) OUT SPL, R16 LDI R16, HIGH (Ramend) Out Sph, R16; A PD6 és PD7 következtetésekhez kapcsolódó LED-ek ellenőrzése érdekében; Ezeket a következtetéseket kiemeljük. ; Ehhez írjon "1" -t az DDRD-regiszter (DataDirection) LDI R16 (1) megfelelő bitjéhez (1<<6) | (1<<7) out DDRD,r16 ; основной цикл программы loop: ldi r16,(1<<6) ; светится один светодиод out PORTD,r16 rcall delay ; задержка ldi r16,(1<<7) ; светится второй светодиод out PORTD,r16 rcall delay ; задержка rjmp loop ; повторение цикла; процедура задержки; примерно полсекунды при частоте 7,37 МГц; три пустых вложенных цикла соответственно delay: ldi r16,30 ; 30 delay1: ldi r17,200 ; 200 delay2: ldi r18,200 ; и еще 200 итераций delay3: dec r18 brne delay3 dec r17 brne delay2 dec r16 brne delay1 ret ; возврат в главную программу

    A projekt több fájlból állhat, míg egy fájl hozzárendeli a főt. Minden művelet kényelmes az egér kontextusgombjának előállításához. A forrásfájl csatlakoztatása után az ablakok a következő űrlapot tartalmazzák.

    A projekt összeállítása a \\ Project \\ build parancs vagy az F7 gomb megnyomásával történik. A fordítási folyamat megjelenik a "Kimenet" ablakban. Ez az ablak lehet "húzza" a \\ the kimeneti parancsot.

    Elvileg már megkaptuk a kimeneti fájlt a formátumban. A cikk célja azonban az AVR stúdió környezetében végzett munka teljes ciklusának bemutatása, így a debug szakaszba megyünk. Ezt a hibakeresési csapat végzi.

    Most gyakoriságát a kvarc frekvencia 7,3728 MHz a „szimulátor” ablakot, hogy pontosan mérjük az átfutási idő a programot.

    A fennmaradó lehetőségeket változatlanul kell hagyni. Most végre egy programot lépésenkénti üzemmódban az egér vagy az F11 gomb segítségével.

    Az AVR Studio csomag olyan hatékony eszközöket tartalmaz, amelyek a hibakereső mikrokontroller belső nyilvántartásainak és I / O portjainak megtekintésére és szerkesztésére szolgálnak, valamint az idő, a program végrehajtásának. Hozzáférés az "I / O" ablakon keresztül történik.

    Tény, hogy a rendelkezésre álló információk mennyiségét a AVR Studio csomag ablakokra olyan nagy, hogy szükség van a számítógép használata a két monitor konfiguráció maximális komfortot.

    A Példánk hibakereséséhez, a D BITS-hez való hozzáféréshez fel kell tüntetni az I / O ATMEGA128 karakterláncot, majd a Portd-vonalat. Most a port, a portd, az DDRD és a PIND mindhárom regiszterje látható. Az érték, a bitek és a cím területeinek megtekintéséhez ki kell terjesztenie az ablak megfelelő határát, izzadja az ablakot a program forrásszövegével.

    Most, hogy a program lépésenkénti módban haladjon át, láthatja a nyilvántartások jelenlegi állapotainak változását a bites mezőben. Lehetőség van arra, hogy gyorsan megváltoztassák a kikötői nyilvántartások bármely bitállapotát, és ezt akár új kódot írhat az érték mezőben, vagy közvetlenül a regiszter kívánt bitére kattintva.

    Független gyakorlatok esetén a következő programot javasoljuk, amely eltér az előzőtől, hogy a LED-ek gyújtását két gomb vezérli.

    ; Példa "LED vezérlés gombokról"; az AS-MEGAM DEBUG kártyára írt; A LED-ek a PD6 és a PD7 következtetéseihez és ellenállásokhoz kapcsolódnak - egy megosztott vezetéken. ; Gombok - a PE4 és PE5 .include "M128Def.inc"; Indítsa el a fő programot:; Stack inicializálás LDI R16, alacsony (RAMEND) OUT SPL, R16 LDI R16, Magas (Ramend) Out SPH, R16; LED LED-ek inicializálása R16, (1<<6) | (1<<7) out DDRD,r16 ; инициализация выводов, к которым подключены кнопки (на вход) ; внутренние подтягивающие резисторы подключены; для этого в PORTE нужно установить соответствующие биты в единицы ldi r16,(1<<4) | (1<<5) out PORTE,r16 ; а в DDRE - в нули ldi r16,0 out DDRE,r16 ; бесконечный цикл forever: in r16,PINE ; теперь в r16 находится текущее "состояние" кнопок com r16 ; кнопка "нажимается" нулем, поэтому инвертируем регистр lsl r16 ; переносим биты 4,5 в позиции 6,7 lsl r16 ; и обновляем "показания" светодиодов andi r16,(1<<6) | (1<<7) out PORTD,r16 rjmp forever ; цикл выполняется бесконечно

    Így a legegyszerűbb programok példáján az AVR Studio csomag egyes jellemzői jelennek meg. Meg kell érteni, hogy ez csak az első ismerős, amely lehetővé teszi, hogy gyorsan használhassa az alapcsomag parancsokat. Eközben a vizsgált csomag képességei sokkal szélesebbek. Például itt a magas szintű nyelveken írt programokat hibakereményezheti. Különösen a C-fordító a Company ActiceCheft használja az AVR Studio Debugger "mint őshonos". Ehhez a forráskód összeállításakor be kell állítania a kimeneti fájl generációs opciót az AVR stúdióval kompatibilis formátumban. Ugyanakkor lehetőség van a forráskódok hibakeresésére.

    Az AVR Studio csomag számos jellemzője a külső programok összekapcsolása. Például annak biztosítására, hogy az AS2 Ellenőrző programozónak több egyszerű művelet elvégzéséhez szükséges legyen.

    A főablakos AVR stúdió Eszközök menüjében be kell választania a testreszabást;

    A Testreszabás ablakban válassza ki az Eszközök elemet;

    Kattintson duplán az egérgombra, vagy nyomja meg a betét beillesztését a billentyűzeten, adjon hozzá egy új parancsot a listához, és hívja az "AS2 programozó" -t;

    Adja meg a programozó végrehajtható fájl elérési útját közvetlenül a "Command" beviteli mezőbe, vagy kattintson a "..." gombra a mező jobb oldalán;

    Most megjelenik az Eszközök menü "Programozó AS2".

    AVR Studio 4.08 Csomageszközök lehetővé teszik a segédprogramok - pluginok csatlakoztatását. Az AVR Studio első pluginja egy grafikus szerkesztőprogram, amely leegyszerűsíti az LCD kijelző inicializálási folyamatát, amely közvetlenül kezelheti az AVR vezérlő atmega169-et. Az LCD jelző maximális logikai mérete 100 szegmens, az indikátor minden eleme a vezérlő speciális nyilvántartásában lévő bitel összhangban történik. Az egyes szegmensekre vonatkozó bizonyos bitek rutinszerű kötési eljárása egyszerűsítése érdekében a fent említett programot használhatja.

    Miközben meglátogatta az "Avr anyaországi anya" - az Atmel norvég irodáját, a cikk egyik szerzője a Lars Quener, a Programmer csoport vezetőjével beszélt, amely létrehozta és támogatja az AVR Studio csomagot. Ez a személy, egy klasszikus programozó, szakálla, pulóver és szőtt a zokni szandálok, beszélt a csomag fejlesztésének kilátásairól. A következő verzió (4.09), a felület engedélyezve lesz egy új intrahemnoe emulátor - JTagice MKII (is nevezik AT JTagice2), amely a második félévben váltja At Jtagice. Ez az emulátornak két lényeges különbsége van. Egyrészt támogatta az új egyvezetékes hibakeresési felületet a fiatalabb AVR vezérlőkhöz, a Debugwire számára. Ez az interfész érdekes, mert nem foglalja el a mikrokontroller további következtetéseit a munkájáért, ahogy azt használja a reset microcontroller kimenetének kimenetét! Másrészt (ezt a kifejezést szó szerint értheti), a JTAGICE2 emulátorban végül megjelenik az USB interfész, amely kommunikál a számítógéppel.

    Irodalom

    1. AVR Műszaki képzés Műszaki szemináriumok. Atsel. Norvégia. Decepter 2003.
    2. Nikolay Korolev, Dmitry Korolev AVR-Microcontrollers a második generáció: a fejlesztő médiuma. // Alkatrészek és technológiák, 2003 No. 7
    3. A második generáció avr-microcontrollerjei: új hardveres képességek // alkatrészek és technológiák. 2003. No. 4.
    4. Nikolay Korolev, Dmitry Korolev. AVR mikrokontrollerek: nagy kicsi. // Schemery ", 2001, №5
    5. Nikolay Korolev, Dmitry Korolev. AVR mikrokontrollerek: szoftver // alkatrészek és technológiák, 2000. 4.
    6. Nikolay Korolev. AVR: Fejlesztői hardver // Alkatrészek és technológiák, 1999 № 1
    7. Nikolay Korolev. ATMEL RISC-MICROCONTROLLERS // Chip-Hírek 1998, №2
    8. Nikolay Korolev, Dmitry Korolev AVR: Az Atmel // Microprocessor Review cég 8 bites RISC-mikrokontrollerek, 1998, №1

    Valahogy azonnal kihúzta, hogy tanácsot adjon az AVR vezérlők programozási környezetének megválasztására. Csak ne dobj rám cipőket. Egy kicsit egy kicsit

    A mikrokontrollerek programozása sokat. A média programozói szintén nem elég, és rosszul hasonlítható hozzájuk. Nincsenek jobb programozási nyelvek. Tehát meg kell választania a legmegfelelőbb nyelvet az Ön és a programozási környezet számára.

    Ha jelenleg van, álljon a kiválasztás előtt, hogy mit kezdjen dolgozni, itt van néhány ajánlás.

    Korábbi programozási élmény. Ne hagyja figyelmen kívül a programozás korábbi tapasztalatait. Még ha Baisik is volt. Még akkor is, ha hosszú idő volt az iskolában. Programozás, mint egy kerékpáros út - csak el kell kezdeni és gyorsan emlékezni mindent elfelejteni. Kezdje a beysikát - nemkívánatos - későbbiben könnyebb lesz kiválasztani valami megfelelőbb választani.

    Segítsen a környezetnek.A barátaid írják a Pascal-on? Az Ön számára egy kérdés megoldódott - írjon Pascal-on! Mindig segít a Tanácsban, a könyvtárakat a könyvtárakba dobják, kész projekteket adnak. Általában boldog lesz a közösségükre. Ha éppen ellenkezőleg, kapja meg az ellenkező eredményt. Barátok Sishers szórakoztatja Önt, aki úgy döntött, hogy tanulmányozza az összeszerelőt. Ne várjon segítséget.

    Jó AVR programozási könyv Nagyon jól fog segíteni. Sajnos nagyon kevesen vannak. Ha a kezedben van egy könyvet, és úgy gondolja, hogy minden nagyon elérhető. - Próbáld ki. Nem tanácsom az e-könyvek tanulását, mint az utolsó lehetőség, nyomtatás. Nagyon kényelmetlen a fájlfájl környezetének és szövegének váltása. Sokkal kellemesebb a könyv olvasását azonnal megpróbálja és nem zavarja váltás, ráadásul tudod, hogy a jelölés a területen, írja a gondolatok merültek fel.

    A közepes programozás egyszerűbb. Ha a nyelvi programozás számos programja van - nem kétséges, válassza ki az egyiket, ami könnyebb. Legyen kevésbé funkcionális. Hagyja össze az ijesztő felfújt kódot. A legfontosabb dolog az, hogy csak elkezd dolgozni. Miután egy egyszerű környezetben hajolsz, könnyen eljuthatsz egy fejlettebb és "helyes" környezetbe. És ne hallgass azoknak, akik azt mondják, hogy több időt veszítesz - tévednek. A tanulók a junior osztályok nem kérte, hogy olvassa el a „Háború és béke” odaadják könyvek könnyebb - képekkel.

    Könyvtárak. A könyvtárak jelenléte ellentmondásos nyelvtudás. Természetesen később nagymértékben megkönnyítik az életet, de az első "fekete dobozok" érthetetlenek, és nem nagyon segítenek a nyelv megértésében. Másrészt megkönnyíti a program elolvasását, és lehetővé teszi az újonc, nem különösebben feszültség, komplex programok létrehozása. Szóval, jelenlétük nem különösebben unatkozik. Legalábbis először.

    Hatékony kód. A programozási környezet kiválasztása a programozás tanulmányozásához csak akkor, ha a fordítás kódja rossz ötlet. Ön elsősorban kényelmesen elkezdi tanulni -, hogy a tizedik dolog a "kijáraton". Természetesen később dolgozhatsz rajta.

    Sisakrostély.A kristálytáblán lévő bármely eszközt a kikötők segítségével kell konfigurálni. Az eljárás elég erőteljes és adatlapok szükségesek. Ezenkívül vannak olyan árnyalatok, amelyekben az újonc nem csak adja meg. Ezért a közegben nagyon kívánatos a vizardok jelenlétére. A kiadások automatikus SPI, I2C, USART stb. Automatikus beállítások. Minél több eszköz van támogatva, annál jobb. Tegye ki a szükséges periférikus paramétereket, és maga a viszont létrejön egy kódot, amely megadja a megadott paramétereket. Nagyon egyszerűsíti az életet.


    Általános ajánlások Ilyen programozás a kezdeti szakaszban a lehető legegyszerűbbnek kell lennie (még akkor is, ha primitív). A programozási környezetnek könnyen meg kell tanulni (amennyiben szüksége van, hogy elkezdje, tanuljon programozást, és ne pazarolja az időt a beállítások kiválasztásában). Javasoljuk, hogy Russify. Nem is megakadályozza az orosz kézikönyvet és a programok példáit. Kívánatos a kristályból származó firmware lehetősége. Ezután a programozás alapjai elhagyásakor több összetett kagylóra léphet.


    Egy másik ajánlás, végül, dolgozzon valódi kristálygal. Ne félj égetni. Javítja a gyakorlati tapasztalatot. Munka az emulátorokkal (például a proteus), bár a forrasztópákától mentes, de soha nem fogja tudni az elégedettséget, hogy megkapja a szerzett programot, az első bögréket a LED! Megérteni, hogy mit csináltál a saját kezével, az igazi munkaköri áramkör a bizalmat és az ingeret továbblépni!

    (Meglátogatott 7 377-szer, 1 látogatás ma)

    Az LPT port programozó koncepciója az ábrán látható. A gumiabroncs korábbiaként használja a 74AC 244 vagy 74HC244 chipet (K1564AP5), 74LS244 (K5555AP5) vagy 74als244 (K1533AP5).

    A VD1 LED mikrokontroller felvételi módot jelez,

    vD2 LED - Olvasás,

    vD3 LED - A diagram jelenléte.

    A rendszer áramellátásához szükséges feszültség az ISP csatlakozóból, azaz a programozható eszközről. Ez a rendszer az újrahasznosított STK200 / 300 programozó (hozzáadott LED a könnyű kezelhetőség), így kompatibilis az összes PC programozó működő programok a STK200 / 300 rendszer. A programozóval való együttműködéshez használjon programot CVAVR.

    A programozó elvégezhető a nyomtatott áramköri lapon, és helyezze az LPT csatlakozóházba, amint az a képeken látható:




    A programozóval való munkavégzéshez kényelmes a port LPT-extenzilnel használata, amely könnyűvé válik (például a nyomtató Cableronix-kábeléből), a legfontosabb dolog a "nem sajnálja" a vezetőket Föld (18-25 láb a csatlakozó) vagy vásárolni. A programozó és a programozható mikrocirk közötti kábel nem haladhatja meg a 20-30 cm-t.

    Helló, kedves habrariták!

    Ebben a cikkben azt szeretném elmondani, hogy egy nap úgy döntöttem, hogy elkezdtem programozni a mikrokontrollerek programozását, amire szükség volt erre, és hogy végül kiderült.

    A mikrokontrollerek témája 2001-ben hosszú ideig érdekel. De aztán a programozó a lakóhely helyén problémás volt, és nem volt vásárlás az interneten és a beszéden. Ezt az ügyet a legjobb időkig kellett elhinnom. És így, egy nap rájöttem, hogy a legjobb szer jött elhagyása nélkül a házat lehet kapni mindent, amit szükséges. Úgy döntöttem, hogy megpróbálom. Szóval, mire van szükségünk:

    1. Programozó
    Számos lehetőség van a piacon - a legolcsóbb ISP (In-System programozás) programozók több dollárért, a hatalmas hibakereső programozóknak néhány százig. Nagyobb tapasztalat nélkül ebben a kérdésben először úgy döntöttem, hogy megpróbálom az egyik legegyszerűbb és legolcsóbb - USBASP-t. Egyszer vásároltam az eBay-en 12 dollárért, most még 3-4 dollárért is megtalálható. Valójában ez a Thomas Fischl programozó kínai változata. Mit mondhatok róla? Csak egy dolog - működik. Ezenkívül az ATMEGA és ATTINY sorozat nagyon sok AVR vezérlője van. A Linux alatt nem igényel illesztőprogramot.

    Firmware, meg kell csatlakoztatni a VCC, GND, RESET, SCK, MOSI Miso programozó kimenetek a megfelelő mikrokontroller kimeneteket. Az egyszerűség érdekében összegyűjtöttem a segédrendszert a férfira:

    Balra a fedélzeten - ugyanaz a mikrokontroller, amelyet villogunk.

    2. Microcontroller
    A választás egy mikrokontroller, nem különösen zavarja, és vette ATmega8 a ATMEL - 23 I / O fenyő, két 8 bites időzítők, egy 16-bites, frekvencia - akár 16 MHz, kis fogyasztás (1-3,6 mA) , olcsó ($ 2). Általában egy kezdetre - több mint elég.

    Linux alatt a vezérlő firmware-jének összeállítása és letöltése érdekében az AVR-GCC + Avrdede Bundle tökéletesen működik. Telepítési triviális. Az utasításokat követve telepítheti mindent, amire szüksége van néhány perc alatt. Az egyetlen neals, amelyet kell fizetni - AVRDude (szoftver a vezérlő rögzítésére) igényelhetnek szuperfelhasználói jogot a programozó eléréséhez. Kilépés - Run keresztül sudo (nem túl jó ötlet), vagy regisztráljon különleges UDEV jogokat. A szintaxis eltérő lehet az operációs rendszer különböző verzióiban, de az én esetemben (Linux menta 15) a következő szabály hozzáadásával történik az /etc/udev/rules.d/41-atmega.rules fájlhoz:

    # USBASP programozó alrendszer \u003d\u003d "USB", attrac (idvendor) \u003d\u003d "16c0", Att (IDProducc) \u003d\u003d "05dc", csoport \u003d "Plugdev", mód \u003d "0666"

    Ezt követően természetesen szükség van a szolgáltatás újraindítására.
    Szolgáltatás udev újraindul
    Lehet, hogy bármilyen probléma merül fel közvetlenül a parancssorból (aki kétségbe vonná), de ha sok projekt létezik, kényelmesebb a plugin, és mindent közvetlenül az Eclipse környezetből.

    A Windows alatt meg kell adnia az illesztőprogramot. A többiek nincsenek problémák. Tudományos érdekekért próbáltam az AVR Studio + Extreme Burner Bundle-t az ablakokban. Ismét minden együtt működik.

    Elkezdjük a programozást

    Az AVR vezérlők programozása mind az összeszerelő (AVR összeszerelő) és a C. Itt azt gondolom, hogy mindenkinek meg kell választania a választását, attól függően, hogy milyen feladat és preferenciái. Személy szerint először elkezdtem felvenni az összeszerelőt. Az összeszerelő programozáskor a készülék architektúrája világossá válik, és az érzés úgy tűnik, hogy közvetlenül a vezérlő belsejébe ás. Ezenkívül úgy vélem, hogy különösen kritikus programokban az összeszerelő ismerete nagyon hasznos lehet. Az AVR Assemblerrel való megismerése után az SI-en eltolódok.

    Az architektúra és az alapelvek ismeretei után úgy döntöttem, hogy valami hasznos és érdekes összegyűjtést gyűjtem. A lányom segített nekem, sakkot csinált, és egy gyönyörű este kijelentette, hogy egy időzítőnek akarja, hogy egy időzítőre nézzen. Batz! Itt van - az első projekt ötlete! Lehetőség volt arra, hogy ugyanazt az eBay-t rendeljék meg, de a saját órát akartam, fekete ... Uh ... mutatókkal és gombokkal. Semmi előbb mondott, mint kész!

    Kijelzőként úgy döntöttek, hogy két 7 szegmensű dióda jelzőt használnak. A vezérléshez elegendő 5 gomb - "Player 1", "Player 2", "Reset", "Beállítás" és "Szünet". Nos, ne felejtsd el a játék hangjelzését. Úgy néz ki, mint ez. Az alábbi ábra a mikrokontroller csatlakoztatásának általános diagramját mutatja be mutatókra és gombokra. Szüksége lesz a program forráskódjának elemzése során:

    Kolokzási repülés

    Kezdjük el, mivel a program belépési pontjából - a fő funkciók. Tény, hogy semmi sem figyelemre méltó, nem - a portok, az adatok inicializálása és a nyomógomb végtelen gombja. Nos, a SEI () hívás a megszakítások feldolgozásának felbontása, róluk egy kicsit később.

    Int fő (üresség) (init_io (); init_data (); sound_off (); sei (); míg (1) (fogantyú_buttons ();) 0;)
    Tekintsük minden funkciót külön-külön.

    Void init_io () (// beállítása ddrb \u003d 0xff; ddrd \u003d 0xff; // beállított bemenet DDRC \u003d 0B11100000; // pull-up ellenállások portc | \u003d 0B00011111; // időzítő megszakítja Timsk \u003d (1<

    Az I / O portok beállítása nagyon egyszerű - a DDRX-regiszterbe (ahol X a betű, a port jelölése) A szám, mindegyik bit, ami azt jelenti, hogy a megfelelő PIN-k lesznek-e a bemeneti eszköz (0-nak felelnek meg) vagy kimenetnek (megfelelnek) 1). Így a Seasushal a DDRB és az DDRD 0XFF-ben B és D kimeneti portokat készítettünk. Ennek megfelelően a DDRC \u003d 0B11100000 parancs; A C port első 5 portját bemeneti csapokká és a hétvégén fennmaradó maradék. Csapat portc | \u003d 0b00011111; Tartalmazza a belső meghúzási ellenállásokat a vezérlő 5 bemeneténél. A rendszer szerint a gombok csatlakoztatva vannak ezekhez a bemenetekhez, amelyek megnyomásakor a Földre zárva vannak. Így a vezérlő megérti, hogy a gombot megnyomja.

    Ezután követi a két időzítő, a Timer0 és a Timer1 beállítását. Az első frissítést használjuk az indikátorokról, és a második - az idő visszaszámlálására, miután másodpercenként a kiváltáshoz állították. Az összes konstans és az időzítő beállítási módszer részletes leírása egy bizonyos időközönként az ATMEGA8 dokumentációjában található.

    A megszakítás feldolgozása

    ISR (DISPLAY (), ha (_Buzzer\u003e 0) (_BuzZer--; ha (_buzzer \u003d\u003d 0) Sound_OFF ();)) ISR (Timer1_Compa_Vect) (ha (ActiveTimer \u003d\u003d 1 && Timer1\u003e 0) (Timer1-- ; ha (időzítő1 \u003d\u003d 0) PROCESS_TIMEOFF ();), ha (ActiveTimer \u003d\u003d 2 && Timer2\u003e 0) (időzítő2--; ha (időzítő2 \u003d\u003d 0) PROCESS_TIMEOFF

    Amikor az időzítő bekapcsol, a vezérlést a megfelelő megszakítási kezelőre továbbítják. Esetünkben ez a Timer0_OVF_VECT processzor, ami az idő kiadási eljárás mutatók és Timer1_Compa_Vect, amely feldolgozza a visszaszámlálást.

    Következtetés a mutatókra

    Void kijelző () (display_number ((Timer1 / 60) / 10, 0b00001000); _delay_ms (0,25); display_number ((Timer1 / 60)% 10, 0b00000100); _delay_ms (0,25); Display_Number (((időzítő1%) / 10, 0B00000010); _delay_ms (0,25); display_number Megjelenik ((Timer1% 60)% 10, 0B00000001); _delay_ms (0,25); display_number Megjelenik ((Timer2 / 60) / 10, 0B10000000); _delay_ms (0,25); display_number Megjelenik ((Timer2 / 60)% 10, 0B01000000); _delay_ms (0,25); display_number Megjelenik ((Timer2% 60) / 10, 0b00100000); _delay_ms (0,25); display_number Megjelenik (((Timer2% 60)% 10, 0b00010000); _delay_ms (0,25) ; portd \u003d 0;) Void Display_Number (int szám, int maszk) (Portb \u003d Number_Mask (szám); Portdd \u003d maszk;)

    A kijelző funkció dinamikus jelzési módszert használ. A tény az, hogy minden egyes indikátor 9 érintkezők (7 szegmens kontroll, 1 pont és 1 áramellátáshoz). A 4 számjegy ellenőrzése 36 érintkezőt vesz igénybe. Túl pazarló. Ezért a termelés a kibocsátások egy több számjegyű kijelző alapján szerveződik a következő elv:

    A feszültséget felváltva adja be az egyes megosztott érintkezők mindegyikére, amely lehetővé teszi, hogy kiemelje a kívánt ábrázolást a megfelelő jelzőben ugyanazokkal a 8 vezérlő érintkezővel. Megfelelően nagy kimeneti frekvenciával úgy néz ki, mint egy statikus kép. Ezért mind a 8 ellátási kapcsolat mindkét mutató a diagramon vannak csatlakoztatva 8 port a port a D, és a 16 érintkező kontroll szegmensek vannak csatlakoztatva párban és csatlakozik 8 port a port B. Így, a kijelző funkció a késedelem 0,25 MS felváltva megjeleníti a kívánt számot az egyes mutatókhoz. A vége alatt minden kimenet, amely a jelzőfények feszültségét táplálja (Command Portdd \u003d 0;). Ha ez nem történik meg, akkor az utolsó megjelenítési számjegy folytatódik, amíg a következő hívásnak nevezik a kijelző funkciónak, amely a többihez képest fényesebb lumineszcenciájához vezet.

    A prések kezelése

    Void Handle_Buttons () (fogantyú_button (key_setup); fogantyú_button (key_reset); handle_button (key_pauza); fogantyú_button (key_player1); fogantyú_button (key_player2);) Void Handle_Button (INT KEY) (INT bit, Switch (key_setup: bit) \u003d Setup_bit; szünet; tokos key_reset: bit \u003d reset_bit; szünet; tokos key_pause: bit \u003d pause_bit; szünet; tok key_player1: bit \u003d player1_bit; bit \u003d play_player2: bit \u003d player2_bit; bit \u003d alapértelmezett: visszatérés; Gomb_pin, bit) (ha (_pressed \u003d\u003d 0) (_delay_ms (debunc_time); ha (bit_is_cleer (Button_Clear (button_cle, bit)) (_pressed | \u003d billentyű, // billentyűs cselekvési kapcsoló (key_setup: PROCESSE_REETUP (); : PROCESS_RESET (), szünet; Case key_pause: PROCESS_PAUSE (), szünet; Case key_player1: PROCESS_PLAYER1 (); Case key_player2: process_player2 (); szünet;) sound_on (15);))) ;)

    Ez a funkció bekapcsolja mind az 5 gombot, és folyamatosan nyomja meg, ha ilyen történt. A megnyomás a bit_is_clear (Button_pin, Bit), azaz A gomb megnyomásakor, ha a bemeneti megfelelő csatlakoztatva van a földön, amely szerint történnek a rendszer, ha megnyomja a gombot. Késleltetett késleltetés DURATION_TIME és újraellenőrzés szükséges ahhoz, hogy többszörös szükségtelen válaszokat elkerülhesse a kapcsolatok csörgése miatt. Mentése a sajtó állapotát a megfelelő változót bitek _PRessed küszöböli újra indítja a hosszú nyomja meg a gombot.
    A megnyomási funkciók meglehetősen triviálisak, és úgy vélik, hogy további megjegyzésekben nincs szükség.

    Teljes szöveges program

    #Define f_cpu 4000000l #include #Inlude. #Inlude. #define DEBOUNCE_TIME 20 #define BUTTON_PIN tájékoztató program #define SETUP_BIT PC0 #define RESET_BIT PC1 #define PAUSE_BIT PC2 #define PLAYER1_BIT PC3 #define PLAYER2_BIT PC4 #define KEY_SETUP 0b00000001 #define KEY_RESET 0b00000010 #define KEY_PAUSE 0b00000100 #define KEY_PLAYER1 0b00001000 #define KEY_PLAYER2 0b00010000 illékony int Aktivéimer \u003d 0; Illatile int időzítő1 \u003d 0; Volatile Int Timer2 \u003d 0; Illatile int _buzzer \u003d 0; Volatile int _pressed \u003d 0; // Funkciónyilatkozatok Void init_io (); Void init_data (); Int number_mask (int Num); Void Handle_buttons (); Void Handle_Button (int gomb); Void Process_Setup (); Void Process_Reset (); VOID PROCESS_PAY (); Void Process_Timeoff (); Void PROCESS_PLAYER1 (); Void PROCESS_PLAYER2 (); Void kijelző (); Void Display_Number (int maszk, int szám); Void sound_on (int intervallum); void sound_off (); // megszakítja az ISR-t (Display (); ha (_BUZZER\u003e 0) (_BUZZER -, ha (_BUZZER \u003d\u003d 0) SOUND_OFF ();)) ISR (timer1_Compa_vect) (ha (ICTECTETIMER \u003d\u003d 1 && időzítő1\u003e 0) ( Időzítő1--; ha (Timer1 \u003d\u003d 0) PROCESS_TIMEOFF ();), ha (ActiveTimer \u003d\u003d 2 && Timer2\u003e 0) (Timer2--; ha (timer2 \u003d\u003d 0) PROCESS_TIMEOFF (init_io (); init_data (); sound_off (); sei (); míg (1) (fogantyú_buttons ();) 0;) Void_IO () (// beállítható kimenet ddrb \u003d 0xff; ddrd \u003d 0xff; // Bemenet DDRC \u003d 0B11100000; // Pull-up ellenállások Portc | \u003d 0B00011111; // Timer megszakítja Timsk \u003d (1< 5940 || Timer2\u003e 5940) (Timer1 \u003d 0, Timer2 \u003d 0;)) Void process_reset () (init_data ();) Void Process_Timeoff () (init_data (); sound_on (30);) Void PROPORITE_PAY () Void PROPORET_PLAYER1 () (ACTIVETIMER \u003d 2;) VOID PROCESSE_PLAYER2 () (aktív) _player2 () (Active) _player2 () (Active) _player2 () (Active) _player2 () (ActiveTimer \u003d 1;) Void Handle_Button (INT KEY) (billentyűzet) (billentyűzet) (billentyűzet) (bit \u003d bit \u003d setup_bit; szünet; Case key_reset: bit \u003d reset_bit; Case key_pause: bit \u003d pause_bit; szünet; case key_player1: bit \u003d player1_bit; szünet; tok key_player2: bit \u003d player2_bit, szünet; alapértelmezett: visszatérés; _delay_ms (debcome_time); ha (bit_is_clear (bot_pin, bit)) (_pressed | \u003d billentyű, // key_setup: PROCESS_SETUP (), szünet; Case key_reset: PROPESS_RESET (); Case key_pauza: PROCESS_PAUSE : PROCESS_PLAYER1 (), szünet; Case key_player2: PROCESS_PLAYER2 (); szünet;) Sound_on (15);))))))))))))))) más (_pre) SSED & \u003d ~ gomb; ) Void handle_buttons () (fogantyú_button (key_setup); hando_button (key_reset); fogantyú_button (key_pauza); fogantyú_button (key_player1); fogantyú_button (key_player2);) Void kijelző () (Display_Number (Timer1 / 60) / 10, 0B00001000) ; _delay_ms (0,25); display_number ((Timer1 / 60)% 10, 0b00000100); _delay_ms (0,25); Display_number ((Timer1% 60) / 10, 0b00000010); _delay_ms (0,25); Display_number (((időzítő1% 60); % 10, 0b00000001); _delay_ms (0,25); display_number ((Timer2 / 60) / 10, 0b10000000); _delay_ms (0,25); display_number ((Timer2 / 60)% 10, 0B01000000); _delay_ms (0,25); Display_number (( Timer2% 60) / 10, 0b00100000); _delay_ms (0,25); display_number (((Timer2% 60)% 10, 0b00010000); _delay_ms (0,25); portdd \u003d 0;) Void Display_Number (int Number_Mask) (Portb \u003d Number_Mask) Szám); portd \u003d maszk;) Void Sound_on (INT intervallum) (_buzzer \u003d intervallum, // tegye a zümmögő tű magas portc | \u003d 0B00100000;) Void Sound_Off () (// Tedd Buzzer Pin Low Portc & \u003d ~ 0B00100000;

    A prototípust egy dömpinglapon szerelték össze.