Talaan ng mga Nilalaman:

BAHAGI 2 - GPIO ARM ASSEMBLY - RGB - FONCTION CALLS - Mga switch: 6 na Hakbang
BAHAGI 2 - GPIO ARM ASSEMBLY - RGB - FONCTION CALLS - Mga switch: 6 na Hakbang

Video: BAHAGI 2 - GPIO ARM ASSEMBLY - RGB - FONCTION CALLS - Mga switch: 6 na Hakbang

Video: BAHAGI 2 - GPIO ARM ASSEMBLY - RGB - FONCTION CALLS - Mga switch: 6 na Hakbang
Video: BTT Manta M8P v2 - Basics with CB1 v2.2 2024, Nobyembre
Anonim
BAHAGI 2 - GPIO ARM ASSEMBLY - RGB - FONCTION CALLS - Mga switch
BAHAGI 2 - GPIO ARM ASSEMBLY - RGB - FONCTION CALLS - Mga switch

Sa Bahagi 1, natutunan namin kung paano mag-toggle ng isang solong Red LED sa MSP432 LaunchPad development board mula sa Texas Instruments, gamit ang pagpupulong sa halip na C / C ++.

Sa Instructable na ito, gagawa kami ng katulad na bagay - kontrolin ang isang RGB LED na nasa parehong board din.

Sa daan, inaasahan naming mapalawak ang aming kaalaman sa pagpupulong ng ARM, at hindi lamang masaya ang pag-iilaw ng ilang mga LED.

Hakbang 1: Tumalon Tayong Tama

Totoo, ang unang video ay nagsasabi sa lahat ng ito. Hindi na magdagdag pa.

Ang pangunahing punto nito ay upang maiuwi ang ideya na ang bawat port ng I / O sa MSP432 ay binubuo ng isang bloke ng mga "rehistro" na mga address, na kung saan ay binubuo ng maraming piraso bawat isa.

Bukod dito, ang mga piraso ay naka-grupo sa isang orthogonal na pamamaraan. Iyon ay, bit 0 ng bawat rehistro address ay tumutukoy sa parehong panlabas na I / O pin.

Inulit namin ang ideya na tumatagal ng maraming mga address sa pagrehistro para sa port na iyon, upang makagawa ng isang bagay kahit na kahit isang piraso o pin lamang.

Ngunit sa kasong ito, dahil nakikipag-usap kami sa isang RGB LED, kailangan naming harapin ang tatlong mga piraso para sa bawat rehistro.

Pinatibay namin na kailangan namin ng maraming mga rehistro: ang DIR register, ang SEL0 register, ang SEL1 register, at ang OUTPUT register. At tatlong piraso sa bawat oras.

Hakbang 2: Pagbutihin ang Code - Magdagdag ng isang Pag-andar

Image
Image

Tulad ng nakita mo sa itaas na Hakbang, ang pangunahing loop ng programa ay may maraming paulit-ulit na code, lalo, kapag pinapatay namin ang mga LED.

Kaya maaari kaming magdagdag ng isang pagpapaandar sa programa. Kailangan pa rin nating tawagan ang pagpapaandar na iyon sa tuwing nais naming patayin ang mga LED, ngunit nagiging sanhi ito ng pagbagsak ng ilan sa code sa isang solong pahayag.

Kung ang aming LED-off code ay mas kasangkot sa maraming iba pang mga tagubilin, ito ay magiging isang tunay na tagatipid ng memorya.

Bahagi ng naka-embed na programa at mga micro-controler ay higit na may kamalayan sa laki ng programa.

Ipinapaliwanag ng video.

Mahalaga, nagdagdag kami ng isang sumasanga na pahayag sa aming pangunahing code, at mayroon kaming isa pang bloke ng code na ang pagpapaandar na ipinapasok namin. At pagkatapos ay tapos na tayo, o sa pagtatapos ng pagpapaandar, bumalik kami sa susunod na pahayag sa loob ng pangunahing programa.

Hakbang 3: Magdagdag ng isang Busy-Loop Delay

Sa seksyon ng Mga Pagpapahayag ng code, magdagdag ng isang pare-pareho upang gawing madali upang mag-tweek para sa nais na tiyempo:

; anumang mga salita pagkatapos ng isang semi-colon (';') ay nagsisimula ng isang komento.

; ang code sa bahaging ito ay nagtatalaga ng isang pangalan sa isang halaga.; maaari mo ring ginamit ang '.equ' ngunit sila ay bahagyang magkakaiba.; Ang '.equ' (sa palagay ko) ay hindi mababago, samantalang ang '.set' ay nangangahulugang maaari mong; baguhin ang halaga ng 'DLYCNT' sa ibang pagkakataon sa code kung nais mo.; 'DLYCNT' ay gagamitin bilang halaga ng countdown sa pagkaantala ng subroutine. DLYCNT.set 0x30000

Magdagdag ng bagong pagpapaandar na pagkaantala:

antala:.asmfunc; ang pagsisimula ng 'pagkaantala' subroutine o pagpapaandar.

MOV R5, #DLYCNT; load core cpu register R5 na may halagang itinalaga sa 'DLYCNT'. dlyloop; nagmamarka ito ng pagsisimula ng pagkaantala ng loop. tinutukoy ng assembler ang address. SUB R5, # 0x1; ibawas ang isang 1 mula sa kasalukuyang halaga sa core cpu register R5. CMP R5, # 0x0; ihambing ang kasalukuyang halaga sa R5 hanggang 0. BGT dlyloop; sangay kung ang halaga sa R5 ay mas mataas sa 0, upang lagyan ng label ang (address) na 'dlyloop'. BX LR; kung nakarating kami dito, nangangahulugang ang halagang R5 ay 0. pagbalik mula sa subroutine..endasmfunc; marka ng pagtatapos ng subroutine.

Pagkatapos sa pangunahing katawan, sa loob ng pangunahing loop, ipatawag o tawagan ang pagpapaandar na pagkaantala:

; ito ay isang code fragment, ng pangunahing katawan o pangunahing pagpapaandar (tingnan ang file 'main.asm').

; ito ay isang loop sa 'pangunahing', at ipinapakita kung paano namin tawagan o gamitin ang bagong pagpapaandar na 'pagkaantala'.; ang '#REDON' at '#GRNON' ay mga deklarasyon din (pare-pareho) (tingnan ang tuktok ng 'main.asm').; ang mga ito ay isang madaling paraan lamang upang maitakda ang tinukoy na kulay ng RGB LED. loop MOV R0, #REDON; Pula - itakda ang pangunahing cpu register R0 na may halagang itinalaga sa 'REDON'. Ang STRB R0, [R4]; ang pangunahing rehistro ng R4 ay dating itinakda sa isang GPIO output address.; isulat kung ano ang nasa R0, sa address na tinukoy ng R4. BL antala; sumasanga sa bagong pagpapaandar na 'pagkaantala'. BL ledsoff; sangay sa paunang mayroon nang function na 'ledsoff'. BL antala; ditto MOV R0, #GRNON; Green - ditto STRB R0, [R4]; at iba pa. BL antala BL ledsoff BL pagkaantala

Naging detalye ang video.

Hakbang 4: Pamantayan sa Pagtawag sa ARM Architecture Procedure (AAPCS)

Marahil ay isang magandang panahon upang ipakilala ang isang bagay. Ito ay isang kombensiyon na wika ng pagpupulong. Kilala rin bilang Pamantayan sa Tawag ng Pamamaraan para sa Arkitekturang ARM.

Maraming ito, ngunit pamantayan lamang ito. Hindi ito mapipigilan sa amin na matuto ng programa sa pagpupulong, at maaari kaming magpatibay ng mga piraso ng pamantayang iyon sa pagpunta namin, sa sandaling komportable kami sa ilang mga konsepto na natututunan namin.

Kung hindi man, maaari naming pakiramdam na umiinom kami mula sa isang malaking hose ng tubig. Masyadong maraming impormasyon.

Mga Pangunahing Rehistro

Dahil naging pamilyar kami sa mga pangunahing rehistro ng MSP432, subukang subukan natin ngayon ang ilan sa mga pamantayang ito. Sumasang-ayon kami dito kapag isinulat namin ang susunod na pagpapaandar (i-on / i-off ang isang LED).

1) Kami ay dapat na gumamit ng R0 bilang isang parameter ng pag-andar. Kung nais naming ipasa ang isang halaga sa pagpapaandar (subroutine), dapat nating gamitin ang R0 upang magawa ito.

2) Gagamitin namin ang Link ng Link para sa nilalayon nitong layunin - hawak nito ang address na nagpapahiwatig kung saan babalik pagkatapos makumpleto ang subroutine.

Makikita mo kung paano namin mailalapat ang mga ito.

Hakbang 5: Pag-andar Sa Parameter - May Salad na Mga Pag-andar

Maaari nating linisin ang aming code at mabawasan ang dami ng memorya na sinasakop nito sa pamamagitan ng pagsasama ng paulit-ulit na mga seksyon sa isang solong pagpapaandar. Ang pagkakaiba lamang sa pangunahing katawan ng loop ay kailangan namin ng isang parameter upang mapasa namin ang iba't ibang magkakaibang mga kulay na nais naming makita ng RGB LED.

Tingnan ang video para sa mga detalye. (sorry sa haba)

Hakbang 6: GPIO Input - Magdagdag ng Mga switch

Gawin itong mas kawili-wili. Panahon na upang magdagdag ng ilang switch-control sa aming programa sa pagpupulong.

Ang Instructable na ito ay may mga imahe na nagpapakita kung paano nakakonekta ang dalawang on-board switch sa MSP432.

Mahalaga: Ang Switch 1 (SW1 o S1) ay konektado sa P1.1, at ang Switch 2 (SW2 o S2) ay konektado sa P1.4.

Ginagawa nitong medyo nakakainteres ang mga bagay hindi lamang dahil nakikipag-usap kami sa mga input sa halip na mga output, ngunit dahil din sa dalawang switch na ito ay sakupin o kumuha ng dalawang piraso ng parehong rehistro ng rehistro tulad ng ginagawa ng solong pulang LED na isang output.

Nakipag-usap kami sa pag-toggle ng solong pulang LED sa Instructable na ito, kaya kailangan lang namin magdagdag ng code upang mahawakan ang mga switch.

Port 1 Rehistro sa Address Block

Tandaan na saklaw namin ang mga ito sa nakaraang Nakagagawa, ngunit kailangan naming magsama ng bago:

  • Address ng Rehistro sa Input ng Port 1 = 0x40004C00
  • Port 1 Output Rehistro address = 0x40004C02
  • Address ng Rehistro sa Port 1 Direksyon = 0x40004C04
  • Port 1 Resistor Paganahin ang Rehistro address = 0x40004C06
  • Port 1 Piliin ang 0 Rehistro address = 0x40004C0A
  • Port 1 Piliin ang 1 Rehistro sa address = 0x40004C0C

Kapag ginagamit ang mga port bilang mga input, mahusay na gamitin ang panloob na pull-up o pull-down resistors ng MSP432.

Dahil ang Launchpad development board ay nag-wire ang dalawang switch sa ground (LOW kapag pinindot), nangangahulugan ito na dapat naming gamitin ang pull UP resistors upang matiyak na mayroon kaming solidong TAAS kapag hindi nila pinindot.

Pull Up / Pull Down Resistors

Ito ay tumatagal ng dalawang magkakaibang mga Port 1 Rehistro address upang itali ang mga switch ng input sa mga pull-up resistors.

1) Gamitin ang pagrehistro sa Port 1 Resistor-Enable (0x40004C06) upang ipahiwatig lamang na nais mo ang mga resistor (para sa dalawang bit na iyon), 2) at pagkatapos ay gamitin ang Port 1 Output register (0x40004C02) upang itakda ang mga resistors bilang alinman sa pull-up o pull -down. Maaaring mukhang nakalilito na gumagamit kami ng isang Output register sa mga input. Ang rehistro ng Output ay halos tulad ng isang dalawahang layunin.

Kaya, upang muling sabihin ang ibang paraan, ang rehistro ng Output ay maaaring magpadala ng isang TAAS o mababa sa isang output (tulad ng solong pulang LED), at / o ginagamit ito upang itakda ang mga pull-up o pull-down na resistor para sa mga input, NGUNIT lamang kung ang tampok na iyon ay pinagana sa pamamagitan ng rehistro ng Resistor-Enable.

Mahalaga sa itaas - kapag nagpapadala / nagtatakda ng isang mababa o mataas sa anumang output output, kakailanganin mong mapanatili ang pull-up / pull-down na estado ng mga input bit nang sabay-sabay.

(sinusubukan ng video na ipaliwanag)

Pagbasa ng Isang Port Input Bit

  • Itakda ang SEL0 / SEL1 para sa pagpapaandar ng GPIO
  • Itakda ang DIR register bilang input para sa mga switch bit, ngunit bilang output para sa LED (sabay-sabay sa parehong byte)
  • Paganahin ang mga resistors
  • Itakda ang mga ito bilang mga resistors na pull-up
  • Basahin ang port
  • Maaari mong hilinging salain ang binasang halaga upang ihiwalay lamang ang mga piraso na kailangan mo (lumipat ng 1 at 2)

Inirerekumendang: