Turinys:

2 DALIS - „GPIO ARM“MONTAVIMAS - RGB - FUNKCINIAI SKAMBINIMAI - Jungikliai: 6 žingsniai
2 DALIS - „GPIO ARM“MONTAVIMAS - RGB - FUNKCINIAI SKAMBINIMAI - Jungikliai: 6 žingsniai

Video: 2 DALIS - „GPIO ARM“MONTAVIMAS - RGB - FUNKCINIAI SKAMBINIMAI - Jungikliai: 6 žingsniai

Video: 2 DALIS - „GPIO ARM“MONTAVIMAS - RGB - FUNKCINIAI SKAMBINIMAI - Jungikliai: 6 žingsniai
Video: Raspberry Pi GPIO Tutorial: The Basics Explained 2024, Liepa
Anonim
2 DALIS. „GPIO ARM“MONTAVIMAS - RGB - FUNKCINIAI SKAMBINIMAI - Jungikliai
2 DALIS. „GPIO ARM“MONTAVIMAS - RGB - FUNKCINIAI SKAMBINIMAI - Jungikliai

1 dalyje sužinojome, kaip perjungti vieną raudoną šviesos diodą MSP432 „LaunchPad“kūrimo plokštėje iš „Texas Instruments“, naudojant surinkimą, o ne C / C ++.

Šioje instrukcijoje mes padarysime kažką panašaus - valdysime RGB šviesos diodą, kuris taip pat yra toje pačioje plokštėje.

Pakeliui tikimės papildyti žinias apie ARM surinkimą, o ne tik smagiai apšviesti kai kuriuos šviesos diodus.

1 žingsnis: šokinėkime tiesiai

Tiesą sakant, pirmasis vaizdo įrašas viską pasako. Nelabai ką pridurti.

Pagrindinis jo tikslas yra paskatinti mintį, kad kiekvienas MSP432 įvesties/išvesties prievadas susideda iš „registro“adresų bloko, kurį savo ruožtu sudaro keli bitai.

Be to, bitai yra sugrupuoti stačiakampiu būdu. Tai yra, kiekvieno registro adreso 0 bitas nurodo tą patį išorinį įvesties/išvesties kaištį.

Pakartojome mintį, kad tam uostui reikalingi keli registro adresai, norint ką nors padaryti net vienu bitu ar kaiščiu.

Bet šiuo atveju, kadangi mes susiduriame su RGB šviesos diodu, turime tvarkyti tris bitus kiekvienam registro adresui.

Mes patvirtinome, kad mums reikia kelių registrų: DIR registro, SEL0 registro, SEL1 registro ir OUTPUT registro. Ir tris kartus kiekvieną kartą.

2 žingsnis: patobulinkite kodą - pridėkite funkciją

Image
Image

Kaip matėte aukščiau esančiame žingsnyje, pagrindinė programos kilpa turėjo daug pakartotinio kodo, būtent, kai išjungiame šviesos diodus.

Taigi mes galime pridėti funkciją prie programos. Mes vis tiek turime iškviesti šią funkciją kiekvieną kartą, kai norime išjungti šviesos diodus, tačiau dėl to dalis kodo sutrinka į vieną teiginį.

Jei mūsų LED išjungimo kodas būtų labiau įtrauktas į daug daugiau instrukcijų, tai būtų tikra atminties taupymo priemonė.

Dalis įterpto programavimo ir mikrovaldiklių yra daug geriau žinomi apie programos dydį.

Vaizdo įrašas paaiškina.

Iš esmės prie pagrindinio kodo pridedame išsišakojantį teiginį ir turime dar vieną kodo bloką, kuris yra funkcija, prie kurios mes šakojamės. Ir tada, kai baigsime arba pasibaigs funkcija, mes grįšime prie kito pagrindinės programos teiginio.

3 veiksmas: pridėkite užimto ciklo uždelsimą

Kodo skiltyje „Deklaracijos“pridėkite konstantą, kad būtų lengviau nustatyti norimą laiką:

; bet kokie žodžiai po kabliataškio (';') pradeda komentarą.

; šios dalies kodas reikšmei priskiria pavadinimą.; taip pat galėjote naudoti „.equ“, tačiau jie šiek tiek skiriasi.; „.equ“(manau) negalima pakeisti, o „.set“reiškia, kad galite; jei norite, vėliau pakeiskite „DLYCNT“reikšmę kode.; „DLYCNT“bus naudojamas kaip atgalinės atskaitos laikas vėlavimo paprogramėje. DLYCNT. Rinkinys 0x30000

Pridėkite naują atidėjimo funkciją:

uždelsimas:.asmfunc; „atidėjimo“paprogramės arba funkcijos pradžia.

MOV R5, #DLYCNT; įkelkite pagrindinį procesoriaus registrą R5, kurio vertė priskirta „DLYCNT“. dlyloop; tai žymi delsos ciklo pradžią. surinkėjas nustato adresą. SUB R5, #0x1; atimkite 1 iš dabartinės reikšmės pagrindiniame procesoriaus registre R5. CMP R5, #0x0; palyginti dabartinę R5 reikšmę su 0. BGT dlyloop; šakos, jei R5 vertė yra didesnė 0, pažymėti (adresas) „dlyloop“. BX LR; jei mes čia patekome, reiškia, kad R5 vertė buvo 0. grąža iš paprogramės..endasmfunc; žymi paprogramės pabaigą.

Tada pagrindiniame korpuse, pagrindinėje kilpoje, iškvieskite arba iškvieskite tą atidėjimo funkciją:

; tai yra kodo fragmentas, pagrindinis tekstas arba pagrindinė funkcija (žr. failą „main.asm“).

; tai yra ciklas „pagrindinėje“ir parodo, kaip mes vadiname ar naudojame tą naują „uždelsimo“funkciją.; „#REDON“ir „#GRNON“taip pat yra deklaracijos (konstantos) (žr. „main.asm“viršuje).; tai tik paprastas būdas nustatyti nurodytą RGB šviesos diodų spalvą. kilpa MOV R0, #REDON; Raudona - nustatykite pagrindinį procesoriaus registrą R0, kurio vertė priskirta „REDON“. STRB R0, [R4]; pagrindinis registras R4 anksčiau buvo nustatytas su GPIO išvesties adresu.; parašykite, kas yra R0, į R4 nurodytą adresą. BL uždelsimas; šakotis į naują „uždelsimo“funkciją. BL ledsoff; atšaka prie jau egzistuojančios „ledsoff“funkcijos. BL uždelsimas; taip pat MOV R0, #GRNON; žalia - taip pat STRB R0, [R4]; ir taip toliau. BL delsos BL delsos BL delsos

Vaizdo įraše išsamiai aprašoma.

4 žingsnis: ARM architektūros procedūros iškvietimo standartas (AAPCS)

Tikriausiai tinkamas laikas kažką pristatyti. Tai suvažiavimo kalbos konvencija. Taip pat žinomas kaip procedūrų iškvietimo standartas ARM architektūrai.

Tai yra daug, bet tai tik standartas. Tai netrukdo mums mokytis surinkimo programavimo, ir mes galime priimti šio standarto dalis, kai einame, kai tik jaučiamės patogiai su kai kuriomis mokomomis sąvokomis.

Priešingu atveju galime jausti, kad geriame iš didžiulės vandens žarnos. Per daug informacijos.

Pagrindiniai registrai

Kadangi mes susipažinome su pagrindiniais MSP432 registrais, pabandykime dabar priimti kai kuriuos iš šių standartų. Mes to laikysimės rašydami kitą funkciją (įjunkite / išjunkite šviesos diodą).

1) Turime naudoti R0 kaip funkcijos parametrą. Jei norime perduoti reikšmę į funkciją (paprogramę), tai turėtume naudoti R0.

2) Nuorodų registrą turime naudoti pagal paskirtį - jame yra adresas, nurodantis, kur grįžti pasibaigus paprogramei.

Pamatysite, kaip mes juos pritaikysime.

5 veiksmas: funkcija su parametru - įdėtos funkcijos

Mes galime išvalyti savo kodą ir sumažinti atminties kiekį, kurį jis užima, sujungdami pakartotinius skyrius į vieną funkciją. Vienintelis pagrindinės kilpos korpuso skirtumas yra tas, kad mums reikia parametro, kad galėtume perduoti įvairias norimas matyti RGB šviesos diodų spalvas.

Norėdami sužinoti daugiau, žiūrėkite vaizdo įrašą. (atsiprašau už ilgį)

6 veiksmas: GPIO įvestis - pridėkite jungiklius

Padarykime tai įdomiau. Atėjo laikas pridėti jungiklio valdymą prie mūsų surinkimo programos.

Šioje instrukcijoje yra vaizdų, rodančių, kaip du borto jungikliai yra prijungti prie MSP432.

Iš esmės: 1 jungiklis (SW1 arba S1) prijungtas prie P1.1, o 2 jungiklis (SW2 arba S2) prijungtas prie P1.4.

Tai daro dalykus šiek tiek įdomius ne tik todėl, kad mes dirbame su įėjimais, o ne išėjimais, bet ir todėl, kad šie du jungikliai užima arba užima du to paties registro adreso bloko bitus, kaip ir vienas raudonas šviesos diodas, kuris yra išėjimas.

Šiame „Instructable“sprendėme vieno raudono šviesos diodo perjungimą, todėl mums tiesiog reikia pridėti kodą, kad būtų galima valdyti jungiklius.

1 prievadas Registruoti adreso bloką

Atminkite, kad tai aptarėme ankstesniame „Instructable“, tačiau turime įtraukti naują:

  • 1 prievado įvesties registro adresas = 0x40004C00
  • 1 prievado išvesties registro adresas = 0x40004C02
  • 1 prievado krypties registro adresas = 0x40004C04
  • 1 prievado rezistorius įjungti registro adresą = 0x40004C06
  • 1 prievadas Pasirinkite 0 Registruoti adresą = 0x40004C0A
  • 1 prievadas Pasirinkite 1 Registro adresas = 0x40004C0C

Naudojant prievadus kaip įvestis, gerai naudoti MSP432 vidinius traukiamus arba nuleidžiamus rezistorius.

Kadangi „Launchpad“kūrimo plokštė prijungė du jungiklius prie žemės (žemas, kai paspaudžiamas), tai reiškia, kad turėtume naudoti „UP UP“rezistorius, kad įsitikintume, jog turime tvirtą AUKŠTUMĄ, kai jie nespaudžiami.

Ištraukite / nuleiskite rezistorius

Norint prijungti šiuos jungiklio įėjimus prie traukiamųjų rezistorių, reikia dviejų skirtingų 1 prievado registro adresų.

1) Naudokite 1 prievado rezistorių įjungimo registrą (0x40004C06), kad tiesiog nurodytumėte, jog norite rezistorių (tiems dviem bitams), 2), tada naudokite 1 prievado išvesties registrą (0x40004C02), kad nustatytumėte rezistorius kaip traukiamus arba ištraukiamus. Gali atrodyti painu, kad įvestyse naudojame išvesties registrą. Išvesties registras turi beveik dvigubą tikslą.

Taigi, norėdamas pakartoti kitą būdą, išvesties registras gali išsiųsti AUKŠTĄ arba ŽEMĄ į išvestį (pvz., Vieną raudoną šviesos diodą) ir (arba) jis naudojamas įvesties traukimo arba ištraukimo rezistoriams nustatyti, BET TIK tada, kai ši funkcija buvo įjungta naudojant rezistorių įjungimo registrą.

Svarbu aukščiau-siunčiant/nustatant LOW arba HIGH bet kuriam išvesties bitui, vienu metu turite išlaikyti įvesties bitų traukimo/ištraukimo būseną.

(vaizdo įrašas bando paaiškinti)

Prievado įvesties bitų skaitymas

  • Nustatykite SEL0 / SEL1 GPIO funkcijoms
  • Nustatykite DIR registrą kaip jungiklio bitų įvestį, bet kaip šviesos diodo išvestį (vienu metu tame pačiame baite)
  • Įjunkite rezistorius
  • Nustatykite juos kaip traukiamus rezistorius
  • Skaitykite uostą
  • Galbūt norėsite filtruoti nuskaitytą vertę, kad išskirtumėte tik tuos bitus, kurių jums reikia (1 ir 2 jungikliai)

Rekomenduojamas: