Tartalomjegyzék:

2. RÉSZ - GPIO KARSZERELÉS - RGB - FUNKCIÓHÍVÁSOK - Kapcsolók: 6 lépés
2. RÉSZ - GPIO KARSZERELÉS - RGB - FUNKCIÓHÍVÁSOK - Kapcsolók: 6 lépés

Videó: 2. RÉSZ - GPIO KARSZERELÉS - RGB - FUNKCIÓHÍVÁSOK - Kapcsolók: 6 lépés

Videó: 2. RÉSZ - GPIO KARSZERELÉS - RGB - FUNKCIÓHÍVÁSOK - Kapcsolók: 6 lépés
Videó: Arduino - GPIO portok, LED villogtatás 2. rész 2024, Július
Anonim
2. RÉSZ - GPIO KARSZERELÉS - RGB - FUNKCIÓHÍVÁSOK - Kapcsolók
2. RÉSZ - GPIO KARSZERELÉS - RGB - FUNKCIÓHÍVÁSOK - Kapcsolók

Az 1. részben megtanultuk, hogyan lehet egyetlen piros LED -et váltani a Texas Instruments MSP432 LaunchPad fejlesztőlapján, a C / C ++ helyett az összeszerelést használva.

Ebben az utasításban hasonlót fogunk tenni - vezérelni egy RGB LED -et, amely szintén ugyanazon a táblán van.

Útközben reméljük, hogy tovább bővítjük az ARM összeszereléssel kapcsolatos ismereteinket, és nem csak szórakozhatunk néhány LED megvilágításán.

1. lépés: Ugorjunk bele

Valóban, az első videó mindent elmond. Nincs sok hozzáfűznivaló.

Ennek lényege, hogy hazavigye azt az elképzelést, hogy az MSP432 minden I/O portja egy "regiszter" címblokkból áll, amelyek viszont egyenként több bitből állnak.

Továbbá a bitek ortogonális módon vannak csoportosítva. Vagyis minden egyes regisztercím 0. bitje ugyanarra a külső I/O tűre vonatkozik.

Megismételtük azt a gondolatot, hogy ehhez a porthoz több regisztercímre van szükség ahhoz, hogy akár egyetlen bittel vagy tűvel is valamit megtehessünk.

De ebben az esetben, mivel RGB LED -del van dolgunk, minden egyes regisztercímhez három bittel kell foglalkoznunk.

Megerősítettük, hogy több regiszterre van szükségünk: a DIR regiszterre, a SEL0 regiszterre, a SEL1 regiszterre és az OUTPUT regiszterre. És három bit minden alkalommal.

2. lépés: A kód javítása - Funkció hozzáadása

Image
Image

Amint azt a fenti lépésben látta, a fő programhurokban sok ismétlődő kód volt, nevezetesen amikor kikapcsoljuk a LED -eket.

Tehát hozzáadhatunk egy funkciót a programhoz. Még mindig meg kell hívnunk ezt a funkciót minden alkalommal, amikor ki akarjuk kapcsolni a LED -eket, de ez azt eredményezi, hogy a kód egy része egyetlen utasításra omlik össze.

Ha a LED-kikapcsoló kódunk sokkal több utasítással járna, ez valódi memóriamegtakarítást eredményezett volna.

A beágyazott programozás és a mikrovezérlők egy része sokkal jobban ismeri a program méretét.

A videó elmagyarázza.

Lényegében elágazó utasítást adunk a fő kódunkhoz, és van egy másik kódblokkunk, amely az elágazó függvény. És ha végeztünk, vagy a funkció végén, átugrunk a következő programra a főprogramon belül.

3. lépés: Foglalt hurok késleltetés hozzáadása

A kód Nyilatkozatok szakaszában adjon hozzá egy konstansot, hogy megkönnyítse a kívánt időzítést:

; minden szó a pontosvessző (';') után megjegyzést kezd.

; a kód ebben a részben nevet rendel az értékhez.; használhatta volna az „.equ” -t is, de ezek kissé eltérnek egymástól.; Az '.equ' (szerintem) nem változtatható meg, míg a '.set' azt jelenti, hogy megteheti; ha szeretné, módosítsa a „DLYCNT” értékét később a kódban.; A 'DLYCNT' lesz visszaszámláló érték a késleltetett alprogramban. DLYCNT.készlet 0x30000

Új késleltetési funkció hozzáadása:

késleltetés:.asmfunc; a „késleltetés” alprogram vagy funkció kezdete.

MOV R5, #DLYCNT; töltse be az R5 központi CPU -regisztert a „DLYCNT” értékhez rendelt értékkel. dlyloop; ez jelzi a késleltetési ciklus kezdetét. az assembler határozza meg a címet. SUB R5, #0x1; vonjon ki 1 -et az aktuális értékből az R5 központi CPU -regiszterben. CMP R5, #0x0; hasonlítsa össze az R5 aktuális értékét 0 -val. BGT dlyloop; ág, ha az R5 értéke nagyobb, mint 0, címkézni (cím) 'dlyloop'. BX LR; ha idáig jutottunk, akkor az R5 értéke 0. visszatérés a szubrutinból..endasmfunc; az alprogram végét jelzi.

Ezután a fő törzsben, a fő hurkon belül hívja meg vagy hívja meg ezt a késleltetési funkciót:

; ez egy kódtöredék, fő törzs vagy fő funkció (lásd a 'main.asm' fájlt).

; ez egy ciklus a „main” -ben, és megmutatja, hogyan hívjuk vagy használjuk az új „delay” funkciót.; a '#REDON' és a '#GRNON' is deklarációk (konstansok) (lásd a 'main.asm' tetején).; csak egy egyszerű módja az RGB LED meghatározott színének beállítására. hurok MOV R0, #REDON; Piros - állítsa be az R0 központi CPU -regisztert, a 'REDON' értékhez rendelve. STRB R0, [R4]; az R4 törzsregiszter korábban GPIO kimeneti címmel volt beállítva.; írja be, mi van R0 -ban, az R4 által megadott címre. BL késleltetés; elágazás az új 'késleltetés' funkcióhoz. BL ledsoff; elágazás a meglévő „ledsoff” függvényhez. BL késleltetés; ugyanígy MOV R0, #GRNON; Zöld - ugyanez STRB R0, [R4]; stb. BL késleltetés BL ledsoff BL késleltetés

A videó részletesen leírja.

4. lépés: ARM architektúra eljáráshívási szabvány (AAPCS)

Valószínűleg itt az ideje bemutatni valamit. Ez egy gyülekezeti nyelvű egyezmény. Más néven eljáráshívási szabvány az ARM architektúrához.

Ebben sok minden van, de ez csak szabvány. Ez nem gátol meg bennünket abban, hogy megtanuljuk az összeszerelési programozást, és menet közben átvehetjük ennek a szabványnak a darabjait, amint jól érezzük magunkat bizonyos tanulási fogalmakkal.

Ellenkező esetben úgy érezhetjük, mintha egy hatalmas víztömlőből isznánk. Túl sok információ.

Alapnyilvántartások

Mióta megismerkedtünk az MSP432 alapvető regisztereivel, próbáljunk most átvenni néhányat ezekből a szabványokból. Ennek megfelelünk, amikor a következő funkciót írjuk (LED be- / kikapcsolása).

1) Feltételezzük, hogy az R0 -t függvényparaméterként kell használni. Ha egy értéket szeretnénk átadni a függvénynek (szubrutin), akkor az R0 -t kell használnunk.

2) A hivatkozási nyilvántartást a rendeltetésének megfelelően kell használnunk - ez tartalmazza azt a címet, amely jelzi, hogy hova kell visszatérni az alprogram befejezése után.

Meglátod, hogyan alkalmazzuk ezeket.

5. lépés: Funkció paraméterrel - beágyazott funkciók

Megtisztíthatjuk kódunkat és csökkenthetjük a memória mennyiségét, ha az ismétlődő szakaszokat egyetlen funkcióvá egyesítjük. Az egyetlen különbség a fő hurok testében az, hogy szükségünk van egy paraméterre, hogy átadhassuk az RGB LED különböző színeit.

A részletekért nézze meg a videót. (elnézést a hosszúságért)

6. lépés: GPIO bemenet - kapcsolók hozzáadása

Tegyük érdekesebbé. Itt az ideje, hogy a kapcsolási vezérlőt hozzáadjuk az összeszerelési programunkhoz.

Ez az útmutató tartalmaz képeket, amelyek bemutatják, hogyan van a két fedélzeti kapcsoló csatlakoztatva az MSP432-hez.

Lényegében: Az 1. kapcsoló (SW1 vagy S1) a P1.1 -hez, a 2. kapcsoló (SW2 vagy S2) pedig a P1.4 -hez van csatlakoztatva.

Ez nem csak azért teszi érdekessé a dolgokat, mert a bemenetekkel nem a kimenetek helyett foglalkozunk, hanem azért is, mert ez a két kapcsoló ugyanabból a regisztercímblokkból két bitet foglal el vagy foglal el, mint az egyetlen piros LED, amely kimenet.

Ebben az utasításban foglalkoztunk az egyetlen piros LED átkapcsolásával, ezért csak kódot kell hozzáadnunk a kapcsolók kezeléséhez.

1. port Regisztrálja a címblokkot

Ne feledje, hogy ezeket az előző Instructable -ben leírtuk, de be kell vennünk egy újat:

  • 1. port bemeneti regiszter címe = 0x40004C00
  • 1. port kimeneti regiszter címe = 0x40004C02
  • Port 1 Irány Regisztrációs cím = 0x40004C04
  • 1. port ellenállás engedélyezése Regisztrációs cím = 0x40004C06
  • 1. port Válassza ki a 0 Regisztrációs cím = 0x40004C0A lehetőséget
  • Port 1 Válasszon 1 Regisztrációs cím = 0x40004C0C

Ha bemenetként használja a portokat, jó az MSP432 belső fel- vagy lehúzó ellenállásait használni.

Mivel a Launchpad fejlesztőpanele a két kapcsolót a földre kötötte (lenyomva LOW), ez azt jelenti, hogy felfelé húzó ellenállásokat kell használnunk, hogy megbizonyosodjunk arról, hogy szilárd HIGH van -e, amikor nincsenek lenyomva.

Húzza fel / húzza le az ellenállásokat

Két különböző port 1 regisztrációs címre van szükség ahhoz, hogy ezeket a kapcsolóbemeneteket felhúzó ellenállásokhoz kösse.

1) Használja az 1. port ellenállás-engedélyezési regiszterét (0x40004C06), hogy csak jelezze, hogy ellenállásokat szeretne (ehhez a két bithez), 2), majd az 1. port kimeneti regiszter (0x40004C02) segítségével állítsa az ellenállásokat felhúzásra vagy lehúzásra. Zavarosnak tűnhet, hogy kimeneti regisztert használunk a bemeneteken. A kimeneti regiszter majdnem olyan, mint a kettős cél.

Tehát, ha egy másik módot akarunk újra megfogalmazni, a kimeneti regiszter HIGH vagy LOW értéket tud küldeni egy kimenetre (például az egyetlen piros LED-re), és / vagy felhúzó vagy lehúzható ellenállások beállítására szolgál a bemenetekhez, DE CSAK, ha ezt a funkciót az Ellenállás engedélyezése regiszterben engedélyezték.

Fontos a fentiekben-ha LOW vagy HIGH értéket küld vagy állít be bármely kimeneti bitre, akkor egyidejűleg fenn kell tartania a bemeneti bitek felhúzási/lehúzási állapotát.

(a videó megpróbálja elmagyarázni)

Port bemeneti bit olvasása

  • Állítsa be a SEL0 / SEL1 értéket a GPIO funkcióhoz
  • Állítsa be a DIR regisztert a kapcsolóbitek bemenetének, de a LED kimenetének (egyidejűleg ugyanabban a bájtban)
  • Az ellenállások engedélyezése
  • Állítsa őket felhúzó ellenállásként
  • Olvassa el a portot
  • Szükség lehet az olvasott érték szűrésére, hogy csak a szükséges biteket izolálja (1. és 2. kapcsoló)

Ajánlott: