Përmbajtje:

PJESA 2 - KUVENDI I ARMIT GPIO - RGB - THIRRJET E FUNKSIONIT - Çelsat: 6 hapa
PJESA 2 - KUVENDI I ARMIT GPIO - RGB - THIRRJET E FUNKSIONIT - Çelsat: 6 hapa

Video: PJESA 2 - KUVENDI I ARMIT GPIO - RGB - THIRRJET E FUNKSIONIT - Çelsat: 6 hapa

Video: PJESA 2 - KUVENDI I ARMIT GPIO - RGB - THIRRJET E FUNKSIONIT - Çelsat: 6 hapa
Video: Соколов Николай - Убийство Царской семьи (2 часть из 2-х). Читает Илья Прудовский 2024, Dhjetor
Anonim
PJESA 2 - KUVENDI I ARMIT GPIO - RGB - THIRRJET E FUNKSIONIT - Çelsat
PJESA 2 - KUVENDI I ARMIT GPIO - RGB - THIRRJET E FUNKSIONIT - Çelsat

Në Pjesën 1, mësuam se si të kalojmë një LED të vetëm të Kuq në bordin e zhvillimit MSP432 LaunchPad nga Texas Instruments, duke përdorur montim në vend të C / C ++.

Në këtë Instructable, ne do të bëjmë diçka të ngjashme - kontrollojmë një LED RGB që është gjithashtu në të njëjtën tabelë.

Gjatë rrugës, ne shpresojmë të zgjerojmë njohuritë tona për asamblenë e ARM -së, dhe jo vetëm të argëtohemi duke ndezur disa LED.

Hapi 1: Le të hidhemi menjëherë

Me të vërtetë, videoja e parë i thotë të gjitha. Nuk ka më shumë për të shtuar.

Pika kryesore e saj është të çosh në shtëpi idenë se çdo port I/O në MSP432 përbëhet nga një bllok adresash "regjistrues", të cilat nga ana e tyre përbëhen nga disa bit secila.

Për më tepër, bitët grupohen në një mënyrë ortogonale. Kjo do të thotë, bit 0 i secilës adresë të regjistrit i referohet të njëjtës pin të jashtëm I/O.

Ne përsërisim idenë se duhen disa adresa regjistri për atë port, për të bërë diçka edhe me një bit ose pin.

Por që në këtë rast, meqenëse kemi të bëjmë me një LED RGB, duhet të merremi me tre bit për secilën adresë regjistri.

Ne u përforcuam se kemi nevojë për disa regjistra: regjistri DIR, regjistri SEL0, regjistri SEL1 dhe regjistri OUTPUT. Dhe tre copë çdo herë.

Hapi 2: Përmirësoni kodin - Shtoni një funksion

Image
Image

Siç e keni parë në hapin e mësipërm, laku kryesor i programit kishte shumë kod të përsëritur, domethënë, kur fikim LED -të.

Kështu që ne mund të shtojmë një funksion në program. Ne ende duhet ta thërrasim atë funksion sa herë që duam të fikim LED -të, por kjo bën që një pjesë e kodit të shembet në një deklaratë të vetme.

Sikur kodi ynë LED-off të ishte përfshirë më shumë me shumë udhëzime, ky do të kishte qenë një ruajtës i vërtetë i kujtesës.

Pjesë e programimit të integruar dhe mikro-kontrolluesve është të qenit shumë më të vetëdijshëm për madhësinë e programit.

Video shpjegon.

Në thelb, ne shtojmë një deklaratë të degëzimit në kodin tonë kryesor dhe kemi një bllok tjetër të kodit që është funksioni në të cilin degëzohemi. Dhe pastaj pasi të kemi mbaruar, ose në fund të funksionit, ne degëzohemi përsëri në deklaratën tjetër brenda programit kryesor.

Hapi 3: Shtoni një vonesë me zinxhir të zënë

Në pjesën Deklaratat e kodit, shtoni një konstante për ta bërë më të lehtë të ndryshoni për kohën e dëshiruar:

; çdo fjalë pas një gjysmë koloni (';') fillon një koment.

; kodi në këtë pjesë i jep një emër një vlere.; ju gjithashtu mund të përdorni '.equ', por ato janë paksa të ndryshme.; '.equ' (mendoj) nuk mund të ndryshohet, ndërsa '.set' do të thotë që mundeni; ndryshoni vlerën e 'DLYCNT' më vonë në kod nëse dëshironi. 'DLYCNT' do të përdoret si vlerë e numërimit mbrapsht në nënrutinën e vonesës. DLYCNT.vendos 0x30000

Shtoni një funksion të ri vonesë:

vonesa:.asmfunc; fillimi i nënrutinës ose funksionit të 'vonesës'.

MOV R5, #DLYCNT; ngarkoni regjistrin bazë të CPU -së R5 me vlerë të caktuar në 'DLYCNT'. dlyloop; kjo shënon fillimin e lakut të vonesës. montuesi përcakton adresën. SUB R5, #0x1; zbres një 1 nga vlera aktuale në regjistrin bazë të CPU R5. CMP R5, #0x0; krahaso vlerën aktuale në R5 në 0. BGT dlyloop; degëzoni nëse vlera në R5 është më e madhe 0, për të etiketuar (adresën) 'dlyloop'. BX LR; nëse arrijmë këtu, vlera R5 ishte 0. kthim nga nënrutina..endasmfunc; shënon fundin e nënrutinës.

Pastaj në trupin kryesor, brenda lakut kryesor, thirrni ose thërrisni funksionin e vonesës:

; ky është një fragment kodi, i trupit kryesor ose funksionit kryesor (shih skedarin 'main.asm').

; ky është një lak në 'main' dhe tregon se si e thërrasim ose përdorim atë funksion të ri 'vonesë'.; '#REDON' dhe '#GRNON' janë gjithashtu deklarata (konstante) (shiko në krye të 'main.asm').; ato janë vetëm një mënyrë e thjeshtë për të vendosur ngjyrën e specifikuar të RGB LED. lak MOV R0, #REDON; Kuqe - vendos regjistrin bazë të CPU -së R0 me vlerë të caktuar për 'REDON'. STRB R0, [R4]; regjistri bazë R4 ishte vendosur më parë me një adresë dalëse GPIO.; shkruani atë që është në R0, në adresën e specifikuar nga R4. BL vonesë; degëzoni në funksionin e ri të 'vonesës'. BL ledsoff; degë në funksionin para-ekzistues 'ledsoff'. BL vonesë; e njëjta gjë MOV R0, #GRNON; E gjelbër - e njëjta gjë STRB R0, [R4]; dhe kështu me radhë. BL vonesë BL ledsoff BL vonesë

Videoja hyn në detaje.

Hapi 4: Standardi i Thirrjes së Procedurës së Arkitekturës ARM (AAPCS)

Ndoshta është një kohë e mirë për të prezantuar diçka. It'sshtë një konventë në gjuhën e asamblesë. Gjithashtu i njohur si Standardi i Thirrjes së Procedurës për Arkitekturën ARM.

Ka shumë për këtë, por është vetëm një standard. Nuk na pengon të mësojmë programimin e asamblesë, dhe ne mund të adoptojmë pjesë të atij standardi ndërsa shkojmë, pasi të ndihemi rehat me disa koncepte që po mësojmë.

Përndryshe, mund të ndihemi sikur po pimë nga një zorrë e madhe uji. Shumë informacion.

Regjistrat Kryesorë

Meqenëse jemi njohur me regjistrat kryesorë të MSP432, le të përpiqemi tani të miratojmë disa nga këto standarde. Ne do të pajtohemi me këtë kur shkruajmë funksionin tjetër (ndizni / fikni një LED).

1) Supozohet të përdorim R0 si parametër funksioni. Nëse dëshirojmë të kalojmë një vlerë në funksion (nënrutinë), duhet të përdorim R0 për ta bërë këtë.

2) Ne do të përdorim Regjistrin e Lidhjeve për qëllimin e tij të synuar - ai mban adresën që tregon se ku të ktheheni pasi të ketë përfunduar nënrutina.

Do të shihni se si i zbatojmë këto.

Hapi 5: Funksioni me Parametër - Funksione të Folezuara

Ne mund të pastrojmë kodin tonë dhe të zvogëlojmë sasinë e kujtesës që zë duke kombinuar seksione të përsëritura në një funksion të vetëm. Dallimi i vetëm në trupin e lakut kryesor është se ne kemi nevojë për një parametër në mënyrë që të kalojmë ngjyrat e ndryshme të ndryshme që duam të shohim nga LED RGB.

Hidhini një sy videos për detaje. (me falni per gjatesine)

Hapi 6: Hyrja GPIO - Shto çelësa

Le ta bëjmë atë më interesante. Timeshtë koha për të shtuar një kontroll kontrolli në programin tonë të montimit.

Ky udhëzues ka imazhe që tregojnë se si dy çelsat në bord janë të lidhur me MSP432.

Në thelb: Ndërprerësi 1 (SW1 ose S1) është i lidhur me P1.1, dhe Çelësi 2 (SW2 ose S2) është i lidhur me P1.4.

Kjo i bën gjërat pak interesante jo vetëm sepse kemi të bëjmë me hyrje në vend të daljeve, por edhe për shkak se këta dy ndërprerës zënë ose zënë dy bite të të njëjtit bllok adresash regjistri siç bën LED i vetëm i kuq që është një dalje.

Ne u morëm me ndërrimin e LED të kuq të vetëm në këtë Instructable, kështu që ne vetëm duhet të shtojmë kod për të trajtuar çelsat.

Porti 1 Blloku i Adresës së Regjistrimit

Mos harroni se ne i mbuluam ato në udhëzuesin e mëparshëm, por duhet të përfshijmë një të re:

  • Port 1 Adresa e regjistrit hyrës = 0x40004C00
  • Port 1 Adresa e Regjistrit të Daljes = 0x40004C02
  • Port 1 Drejtimi Adresa e regjistrit = 0x40004C04
  • Port 1 Resistor Aktivizo adresën e regjistrit = 0x40004C06
  • Porti 1 Zgjidhni 0 Adresa e regjistrimit = 0x40004C0A
  • Porti 1 Zgjidhni 1 Regjistroni adresën = 0x40004C0C

Kur përdorni portat si hyrje, është mirë të përdorni rezistorët e brendshëm tërheqës ose tërheqës të MSP432.

Meqenëse bordi i zhvillimit Launchpad i ka lidhur të dy çelësat në tokë (LOW kur shtypen), kjo do të thotë që ne duhet të përdorim rezistorë tërheqës UP për t'u siguruar që kemi një HIGH të fortë kur ato nuk shtypen.

Tërhiqni / Tërheqni Rezistencat

Duhen dy adresa të ndryshme të Regjistrit Port 1 për t'i lidhur ato hyrje të ndërruesve me rezistorët tërheqës.

1) Përdorni regjistrin Port-Resistor-Enable (0x40004C06) për të treguar vetëm se doni rezistorë (për ato dy bit), 2) dhe më pas përdorni regjistrin Port 1 Output (0x40004C02) për të vendosur rezistorët si tërheqës ose tërheqës. Mund të duket konfuze që ne po përdorim një regjistër dalës në hyrje. Regjistri Output ka pothuajse një qëllim të dyfishtë.

Pra, për të ri-deklaruar një mënyrë tjetër, regjistri Output ose mund të dërgojë një HIGH ose LOW në një dalje (si LED i vetëm i kuq), dhe / ose përdoret për të vendosur rezistorë tërheqës ose tërheqës për hyrjet, POR VETYM nëse kjo veçori është aktivizuar përmes regjistrit Resistor-Enable.

E rëndësishme në sa më sipër-kur dërgoni/vendosni një LOW ose HIGH në çdo bit dalës, do t'ju duhet të ruani gjendjen tërheqëse/tërheqëse të bitëve hyrës njëkohësisht.

(video përpiqet të shpjegojë)

Leximi i një biti të hyrjes në port

  • Vendosni SEL0 / SEL1 për funksionimin GPIO
  • Vendosni regjistrin DIR si hyrje për bitët e ndërruesve, por si dalje për LED (njëkohësisht në të njëjtin bajt)
  • Aktivizo rezistorët
  • Vendosini ato si rezistente tërheqëse
  • Lexoni portin
  • Ju mund të dëshironi të filtroni vlerën e lexuar për të izoluar vetëm bitët që ju nevojiten (kaloni 1 dhe 2)

Recommended: