Përmbajtje:

KUVENDI I ARMIT GPIO - T.I. KIT MESIMI I SISTEMIT ROBOTIKS - LAB 6: 3 Hapa
KUVENDI I ARMIT GPIO - T.I. KIT MESIMI I SISTEMIT ROBOTIKS - LAB 6: 3 Hapa

Video: KUVENDI I ARMIT GPIO - T.I. KIT MESIMI I SISTEMIT ROBOTIKS - LAB 6: 3 Hapa

Video: KUVENDI I ARMIT GPIO - T.I. KIT MESIMI I SISTEMIT ROBOTIKS - LAB 6: 3 Hapa
Video: Попытка запрета русского языка в парламенте Кыргызстана 2024, Korrik
Anonim
KUVENDI I ARMIT GPIO - T. I. KIT MESIMI I SISTEMIT ROBOTIKS - LAB 6
KUVENDI I ARMIT GPIO - T. I. KIT MESIMI I SISTEMIT ROBOTIKS - LAB 6

Përshëndetje, Në një udhëzues të mëparshëm për mësimin e asamblesë ARM duke përdorur Texas Instruments TI-RSLK (përdor mikrokontrolluesin MSP432), aka Lab 3 nëse jeni duke bërë T. I. Sigurisht, ne kaluam disa udhëzime shumë themelore të tilla si shkrimi në një regjistër dhe mbyllja me kusht. Ne kaluam përmes ekzekutimit duke përdorur Eclipse IDE.

Programet adoleshente që ne ekzekutuam nuk bënë asgjë për të bashkëvepruar me botën e jashtme.

Lloj i mërzitshëm.

Le të përpiqemi ta ndryshojmë atë pak sot duke mësuar pak për portat hyrëse/dalëse, veçanërisht, kunjat dixhitale GPIO.

Ndodh që ky MSP432 vjen në një bord zhvillimi tashmë ka dy çelsin me butona, një RGB LED dhe një LED të kuq, të gjitha të lidhura me disa porte GPIO.

Kjo do të thotë që ndërsa mësojmë të vendosim dhe manipulojmë këto kunja përmes montimit, ne mund t'i shohim vizualisht ato efekte.

Shumë më interesante sesa thjesht të kalosh përmes korrigjuesit.

(Ne ende do të hapim - ky do të jetë funksioni ynë i 'vonesës'):-D

Hapi 1: Le të Provojmë të Shkruajmë / Lexojmë Nga RAM

Para se të kalojmë në qasjen dhe kontrollin e GPIO, duhet të bëjmë një hap të vogël.

Le të fillojmë duke lexuar dhe shkruar vetëm në një adresë standarde të kujtesës. Ne e dimë nga Instructable e mëparshme (shiko imazhet atje) që RAM fillon në 0x2000 0000, kështu që le ta përdorim atë adresë.

Ne do të lëvizim të dhënat midis një regjistri bazë (R0) dhe 0x2000 0000.

Ne fillojmë me një strukturë bazë të skedarit ose përmbajtjen e një programi montimi. Ju lutemi referojuni këtij Udhëzuesi për të krijuar një projekt montimi duke përdorur TI's Code Composer Studio (CCS), dhe disa projekte shembull.

.thumb

.tekst.align 2.global kryesor.thumbfunc kryesore kryesore:.asmfunc; -------------------------------------- --------------------------------------------------; (kodi ynë do të shkojë këtu); ---------------------------------------------- --------------------------------------..endasmfunc.përfundim

Dua të shtoj diçka të re në pjesën kryesore, nëse ka disa deklarata (direktiva). Do të bëhet më e qartë më vonë.

ACONST.vendos 0x20000000; ne do ta përdorim këtë më poshtë (është një konstante)

; padyshim, '0x' tregon atë që vijon është një vlerë gjashtëkëndore.

Pra, përmbajtja jonë e skedarit fillestar tani duket kështu:

.thumb

.tekst.align 2 KUND. R. vendos 0x20000000; ne do ta përdorim këtë më poshtë (është një konstante); padyshim, '0x' tregon atë që vijon është një vlerë gjashtëkëndore..global kryesore.thumbfunc kryesore kryesore:.asmfunc; ------------------------------------------ ------------------------------------------; (kodi ynë do të shkojë këtu); ---------------------------------------------- --------------------------------------..endasmfunc.përfundim

Tani që kemi sa më sipër, le të shtojmë kodin midis vijave të ndërprera.

Ne fillojmë me shkrimin në një vendndodhje RAM. Së pari ne do të vendosim modelin e të dhënave, një vlerë, që do të shkruajmë në RAM. Ne përdorim një regjistër bazë për të përcaktuar atë vlerë ose të dhëna.

Shënim: mbani mend se në kod, çdo rresht që ka një gjysmë-zorrë (';') do të thotë se është e gjitha një koment pas asaj gjysmë-zorrë.

;-----------------------------------------------------------------------------------------------

; SHKRIM; ---------------------------------------------------- --------------------------------------------------- MOV R0, #0x55; regjistri bazë R0 do të përmbajë të dhënat që duam të shkruajmë në vendndodhjen e RAM -it.; padyshim, '0x' tregon atë që vijon është një vlerë gjashtëkëndore.

Tjetra, le të hedhim një vështrim në deklaratat që NUK funksionojnë.

; MOV MOV nuk është i përdorshëm për të shkruar të dhëna në një vendndodhje RAM.

; MOV është vetëm për të dhënat e menjëhershme në regjistër; ose nga një regjistër në tjetrin; dmth, MOV R1, R0.; STR duhet të përdor STR.; STR R0, = ACONST; Term i keq në shprehje (the '='); STR R0, 0x20000000; Mënyra e adresimit ilegal për udhëzimet në dyqan; STR R0, ACONST; Mënyra e adresimit ilegal për udhëzimet në dyqan

Pa shpjeguar shumë, ne u përpoqëm ta përdorim atë 'ACONST' më lart. Në thelb, është një stand-in ose konstante në vend që të përdorni një vlerë të mirëfilltë si 0x20000000.

Ne nuk ishim në gjendje të shkruanim për të shkruar në vendndodhjen RAM duke përdorur sa më sipër. Le të provojmë diçka tjetër.

; duket se duhet të përdorim një regjistër tjetër që përmban vendndodhjen e RAM -it në

; porosi për të ruajtur në atë vend RAM MOV R1, #0x20000000; vendosni vendndodhjen e RAM -it (jo përmbajtjen e tij, por vendndodhjen) në R1.; padyshim, '0x' tregon atë që vijon është një vlerë gjashtëkëndore. STR R0, [R1]; shkruani atë që është në R0 (0x55) në RAM (0x20000000) duke përdorur R1.; ne përdorim një regjistër tjetër (R1) që ka adresën e vendndodhjes RAM; në mënyrë që të shkruani në atë vendndodhje RAM.

Një mënyrë tjetër për të bërë sa më sipër, por duke përdorur 'ACONST' në vend të vlerës së drejtpërdrejtë të adresës:

; le të bëjmë përsëri më lart, por le të përdorim një simbol në vend të një vlere të mirëfilltë të vendndodhjes së RAM -it.

; ne duam të përdorim 'ACONST' si stand-in për 0x20000000.; ne ende duhet të bëjmë '#' për të nënkuptuar një vlerë të menjëhershme,; kështu (shiko në krye), na u desh të përdorim direktivën ".set".; për ta vërtetuar këtë, le të ndryshojmë modelin e të dhënave në R0. MOV R0, #0xAA; ok ne jemi gati t'i shkruajmë RAM -it duke përdorur simbolin në vend të vlerës së drejtpërdrejtë të adresës MOV R1, #ACONST STR R0, [R1]

Videoja hyn në më shumë detaje, si dhe kalon përmes leximit nga vendi i kujtesës.

Ju gjithashtu mund të shihni burimin e bashkangjitur.asm file.

Hapi 2: Disa informacione bazë të portit

Image
Image
Disa informacione bazë të portit
Disa informacione bazë të portit
Disa informacione bazë të portit
Disa informacione bazë të portit

Tani që kemi një ide të mirë se si t'i shkruajmë / lexojmë nga një vendndodhje RAM, kjo do të na ndihmojë të kuptojmë më mirë se si të kontrollojmë dhe përdorim pinin GPIO

Pra, si bashkëveprojmë me kunjat GPIO? Nga vështrimi ynë i mëparshëm në këtë mikrokontrollues dhe udhëzimet e tij ARM, ne dimë si të veprojmë me regjistrat e tij të brendshëm dhe dimë se si të ndërveprojmë me adresat e kujtesës (RAM). Por kunjat e GPIO?

Ndodh që ato kunja të jenë të hartuara në kujtesë, kështu që ne mund t'i trajtojmë ato njësoj si adresat e kujtesës.

Kjo do të thotë që ne duhet të dimë se cilat janë ato adresa.

Më poshtë janë adresat fillestare të portit. Nga rruga, për MSP432, një "port" është një koleksion kunjash, dhe jo vetëm një kunj. Nëse jeni të njohur me Raspberry Pi, besoj se është ndryshe nga sa situata këtu.

Rrathët blu në imazhin e mësipërm tregojnë shkrimin në tabelë për dy ndërprerës dhe LED. Linjat blu tregojnë LED -të aktuale. Nuk do të na duhet të prekim kërcyesit e kokës.

Kam bërë portet me të cilat merremi me shkronja të zeza më poshtë.

  • GPIO P1: 0x4000 4C00 + 0 (madje edhe adresat)
  • GPIO P2: 0x4000 4C00 + 1 (adresa tek)
  • GPIO P3: 0x4000 4C00 + 20 (madje edhe adresat)
  • GPIO P4: 0x4000 4C00 + 21 (adresa tek)
  • GPIO P5: 0x4000 4C00 + 40 (madje edhe adresat)
  • GPIO P6: 0x4000 4C00 + 41 (adresa tek)
  • GPIO P7: 0x4000 4C00 + 60 (madje edhe adresat)
  • GPIO P8: 0x4000 4C00 + 61 (adresa tek)
  • GPIO P9: 0x4000 4C00 + 80 (madje edhe adresat)
  • GPIO P10: 0x4000 4C00 + 81 (adresa tek)

Nuk kemi mbaruar akoma. Kemi nevojë për më shumë informacion.

Për të kontrolluar një port, na duhen disa adresa. Kjo është arsyeja pse në listën e mësipërme, ne shohim "adresa çift" ose "adresa tek".

Blloqet e Adresave të Regjistrimit I/O

Do të na duhen adresa të tjera, të tilla si:

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

Dhe ne mund të kemi nevojë për të tjerët.

Ok, ne tani e dimë gamën e adresave të regjistrit GPIO për të kontrolluar LED -in e vetëm të kuq.

Një shënim shumë i rëndësishëm: Çdo Port I/O në bordin MSP432 LaunchPad është një koleksion i disa (zakonisht 8) kunjash ose linjash, dhe secila mund të vendoset individualisht si një hyrje ose dalje.

Kjo do të thotë, për shembull, që nëse po vendosni vlera për "Adresa e Regjistrit të Drejtorisë së Portit 1", duhet të shqetësoheni se cilin bit (ose bit) po vendosni ose ndryshoni në atë adresë. Më shumë për këtë më vonë.

Sekuenca e Programimit të Portit GPIO

Pjesa e fundit që na nevojitet, është një proces ose algoritëm për t'u përdorur, për të kontrolluar LED.

Inicimi i njëhershëm:

  • Konfiguroni P1.0 (P1SEL1REG: P1SEL0REG Register) <--- 0x00, 0x00 për funksionimin normal të GPIO.
  • Vendosni regjistrin e drejtimit biti 1 i P1DIRREG si dalje, ose LART.

Lak:

Shkruani LART HIGH në bitin 0 të regjistrit P1OUTREG për të ndezur LED -in e Kuq

  • Thirrni një funksion vonesë
  • Shkruani LOW në bit 0 të regjistrit P1OUTREG për të fikur LED -in e Kuq
  • Thirrni një funksion vonesë
  • Përsëriteni lakun

Cili funksion hyrës / dalës (konfiguroni SEL0 dhe SEL1)

Shumë nga kunjat në LaunchPad kanë përdorime të shumta. Për shembull, e njëjta pin mund të jetë standard GPIO dixhital, ose mund të përdoret gjithashtu në komunikimet serike UART, ose I2C.

Për të përdorur ndonjë funksion specifik për atë pin, duhet të zgjidhni atë funksion. Ju duhet të konfiguroni funksionin e kunjit.

Ekziston një imazh më lart për këtë hap që përpiqet të shpjegojë këtë koncept në formë vizuale.

Adresat SEL0 dhe SEL1 formojnë një kombinim çift që veprojnë si një lloj përzgjedhjeje funksionesh / veçorish.

Për qëllimet tona, ne duam GPIO dixhitale standarde për bit 0. Kjo do të thotë që ne kemi nevojë për bit 0 për SEL0 dhe SEL1 që të jenë të ulëta.

Sekuenca e Programimit të Portit (Përsëri)

1. Shkruani 0x00 në P1 SEL 0 Regjistrohuni (adresa 0x40004C0A). Kjo vendos një LOW për bit 0

2. Shkruani 0x00 në P1 SEL 1 Regjistrohu (adresa 0x40004C0C). Kjo vendos një LOW për bit 0, duke vendosur për GPIO.

3. Shkruani 0x01 në P1 Regjistrin DIR (adresa 0x40004C04). Kjo vendos një LART HIGH për bit 0, që do të thotë dalje.

4. Ndizni LED duke shkruar një 0x01 në P1 OUTPUT Register (adresa 0x40004C02)

5. Bëni një lloj vonese (ose thjesht një hap gjatë korrigjimit)

6. Fikni LED duke shkruar një regjistër 0x00 në P1 OUTPUT (adresa 0x40004C02)

7. Bëni një lloj vonese (ose thjesht një hap gjatë korrigjimit)

8. Përsëritni hapat 4 deri në 7.

Videoja e shoqëruar për këtë hap na çon në të gjithë procesin në një demonstrim të drejtpërdrejtë, ndërsa ne kalojmë një hap dhe flasim përmes çdo udhëzimi të montimit dhe shfaqim veprimin LED. Ju lutemi falni gjatësinë e videos.

Hapi 3: A e kapët të metën e vetme në video?

Në videon që përshkon të gjithë procesin e programimit dhe ndezjes së LED, ka pasur një hap shtesë në lakun kryesor, që mund të ishte zhvendosur deri në fillimin e njëhershëm.

Faleminderit që gjetët kohë për të kaluar nëpër këtë Udhëzues.

Tjetra zgjerohet mbi atë që kemi filluar këtu.

Recommended: