Բովանդակություն:

ՄԱՍ 2 - GPIO ARM ASEMBLY - RGB - FUNCTION CALLS - Անջատիչներ `6 քայլ
ՄԱՍ 2 - GPIO ARM ASEMBLY - RGB - FUNCTION CALLS - Անջատիչներ `6 քայլ

Video: ՄԱՍ 2 - GPIO ARM ASEMBLY - RGB - FUNCTION CALLS - Անջատիչներ `6 քայլ

Video: ՄԱՍ 2 - GPIO ARM ASEMBLY - RGB - FUNCTION CALLS - Անջատիչներ `6 քայլ
Video: Lecture 6: GPIO Output: Lighting up a LED 2024, Հուլիսի
Anonim
ՄԱՍ 2 - GPIO ARM ASEMBLY - RGB - FUNCTION CALLS - Անջատիչներ
ՄԱՍ 2 - GPIO ARM ASEMBLY - RGB - FUNCTION CALLS - Անջատիչներ

Մաս 1 -ում մենք սովորեցինք, թե ինչպես միացնել մեկ կարմիր լուսադիոդ MSP432 LaunchPad զարգացման տախտակի վրա Texas Instruments- ից ՝ օգտագործելով C / C ++ - ի փոխարեն հավաքում:

Այս Instructable- ում մենք կանենք նմանատիպ մի բան `վերահսկել RGB LED- ը, որը նույնպես նույն տախտակի վրա է:

Theանապարհին, մենք հուսով ենք, որ կշարունակենք մեր գիտելիքները ARM հավաքի մասին, և ոչ միայն կզվարճանանք մի քանի LED լուսավորելով:

Քայլ 1: Եկեք անմիջապես ցատկենք

Իրոք, առաջին տեսանյութը ամեն ինչ ասում է: Ավելացնելու շատ բան չկա:

Դրա հիմնական նպատակը այն գաղափարն է, որ MSP432- ի յուրաքանչյուր I/O նավահանգիստ բաղկացած է «գրանցման» հասցեների բլոկից, որոնք իրենց հերթին բաղկացած են յուրաքանչյուրից մի քանի բիթից:

Ավելին, բիթերը խմբավորված են ուղղանկյուն ձևով: Այսինքն, յուրաքանչյուր գրանցամատյանի հասցեի բիթ 0 -ը վերաբերում է նույն արտաքին մուտքի/ելքային քորոցին:

Մենք կրկնել ենք այն գաղափարը, որ այդ նավահանգստի համար անհրաժեշտ է գրանցման մի քանի հասցե ՝ նույնիսկ մեկ բիթով կամ կապով ինչ -որ բան անելու համար:

Բայց որ այս դեպքում, քանի որ մենք գործ ունենք RGB LED- ի հետ, յուրաքանչյուր գրանցման հասցեի համար պետք է զբաղվել երեք բիթով:

Մենք ամրապնդեցինք, որ մեզ պետք են մի քանի գրանցամատյաններ `DIR գրանցամատյանը, SEL0 գրանցամատյանը, SEL1 գրանցամատյանը և OUTPUT գրանցամատյանը: Եվ ամեն անգամ երեք բիթ:

Քայլ 2. Բարելավել կոդը - Ավելացնել գործառույթ

Image
Image

Ինչպես տեսաք վերը նշված քայլին, հիմնական ծրագրի օղակը շատ կրկնվող կոդ ուներ, այն է ՝ LED- ները անջատելիս:

Այսպիսով, մենք կարող ենք մի գործառույթ ավելացնել ծրագրին: Մենք դեռ պետք է կանչենք այդ գործառույթը ամեն անգամ, երբ ցանկանում ենք անջատել LED- ները, բայց դա հանգեցնում է նրան, որ ծածկագրի մի մասը փլուզվում է մեկ հայտարարության մեջ:

Եթե մեր LED- անջատման կոդն ավելի շատ ներգրավված լիներ շատ այլ հրահանգների մեջ, սա իսկական հիշողության խնայող կլիներ:

Ներդրված ծրագրավորման և միկրոկարգավորիչների մի մասը շատ ավելի տեղյակ է ծրագրի չափի մասին:

Տեսանյութը բացատրում է.

Ըստ էության, մենք մեր հիմնական կոդին ավելացնում ենք ճյուղավորված հայտարարություն, և մենք ունենք մեկ այլ բլոկ, որը այն գործառույթն է, որին մենք ճյուղավորվում ենք: Եվ հետո, երբ ավարտենք աշխատանքը կամ գործառույթի ավարտը, մենք վերադառնում ենք դեպի հիմնական հայտարարության հաջորդ հայտարարությունը:

Քայլ 3: Ավելացրեք զբաղված հանգույցի հետաձգում

Կոդի Հռչակագրեր բաժնում ավելացրեք հաստատուն, որպեսզի հեշտ լինի փոփոխել ցանկալի ժամանակը.

; կիսագնդից հետո ցանկացած բառ (';') սկսում է մեկնաբանություն:

; այս մասի կոդը արժեքին տալիս է անուն:; Դուք նույնպես կարող էիք օգտագործել.equ, բայց դրանք մի փոքր տարբեր են:; '.equ' (կարծում եմ) հնարավոր չէ փոխել, մինչդեռ '.set' նշանակում է, որ կարող եք. եթե ցանկանում եք, փոփոխեք «DLYCNT» - ի արժեքը հետագայում:; «DLYCNT» - ը կօգտագործվի որպես հետհաշվարկի արժեք հետաձգման ենթածրագրում: DLYCNT.կարգավորել 0x30000

Ավելացնել հետաձգման նոր գործառույթ.

հետաձգում..asmfunc; «հետաձգման» ենթածրագրի կամ գործառույթի սկիզբը:

MOV R5, #DLYCNT; բեռնել հիմնական CPU գրանցամատյանը R5 ՝ «DLYCNT» - ին հատկացված արժեքով: dlyloop; սա նշում է հետաձգման օղակի սկիզբը: հավաքողը որոշում է հասցեն: SUB R5, #0x1; հիմնական CPU գրանցամատյանում R5- ն հանել 1 -ը ընթացիկ արժեքից: CMP R5, #0x0; համեմատել ընթացիկ արժեքը R5- ի հետ 0. BGT dlyloop; ճյուղավորեք, եթե արժեքը R5- ում ավելի մեծ է 0, պիտակավորելու (հասցե) «dlyloop»: BX LR; եթե մենք հասանք այստեղ, նշանակում է, որ R5 արժեքը եղել է 0. վերադարձ ենթածրագրից:.endasmfunc; նշում է ենթածրագրի ավարտը:

Այնուհետև հիմնական մարմնում ՝ հիմնական հանգույցի մեջ, կանչեք կամ կանչեք այդ հետաձգման գործառույթը.

; սա կոդի հատված է `հիմնական մարմնի կամ հիմնական գործառույթի (տես ֆայլը 'main.asm'):

; սա հանգույց է «հիմնական» -ում և ցույց է տալիս, թե ինչպես ենք կանչում կամ օգտագործում այդ նոր «հետաձգման» գործառույթը:; «#REDON» - ը և «#GRNON» - ը նույնպես հայտարարություններ են (հաստատուններ) (տե՛ս «main.asm» - ի վերևը):; դրանք պարզապես հեշտ միջոց են RGB LED- ի նշված գույնը սահմանելու համար: հանգույց MOV R0, #REDON; Կարմիր - սահմանել հիմնական CPU գրանցամատյան R0 ՝ «REDON» - ին հատկացված արժեքով: STRB R0, [R4]; հիմնական գրանցամատյանը R4 նախկինում սահմանվել էր GPIO ելքային հասցեով:; գրեք այն, ինչ կա R0- ում, R4- ով նշված հասցեով: BL հետաձգում; մասնաճյուղ դեպի նոր «հետաձգման» գործառույթը: BL ledsoff; մասնաճյուղ ՝ գոյություն ունեցող «ledsoff» գործառույթին: BL հետաձգում; ditto MOV R0, #GRNON; Կանաչ - ditto STRB R0, [R4]; եւ այլն: BL հետաձգում BL ledsoff BL հետաձգում

Տեսանյութը մանրամասնվում է:

Քայլ 4. ARM Architecture Procedure Call Standard (AAPCS)

Հավանաբար լավ ժամանակ է ինչ -որ բան ներկայացնելու համար: Դա հավաքների լեզվով կոնվենցիա է: Նաև հայտնի է որպես ARM ճարտարապետության ընթացակարգային կանչի ստանդարտ:

Սրա մեջ շատ բան կա, բայց դա պարզապես չափանիշ է: Դա մեզ հետ չի պահում հավաքների ծրագրավորում սովորելուց, և մենք կարող ենք ընդունել այդ չափանիշի կտորները, երբ առաջ ենք գնում, երբ մեզ հարմարավետ զգանք որոշ սովորած հասկացությունների հետ:

Հակառակ դեպքում, մենք կարող ենք զգալ, որ խմում ենք հսկայական ջրի գուլպաներից: Չափից շատ տեղեկություններ:

Հիմնական գրանցամատյաններ

Քանի որ մենք ծանոթացել ենք MSP432- ի հիմնական գրանցամատյաններին, եկեք փորձենք այժմ ընդունել այս չափանիշներից մի քանիսը: Մենք կհամապատասխանենք դրան, երբ գրում ենք հաջորդ գործառույթը (միացնել / անջատել LED- ն):

1) Ենթադրվում է, որ R0- ն օգտագործենք որպես գործառույթի պարամետր: Եթե մենք ցանկանում ենք մի արժեք փոխանցել գործառույթին (ենթածրագրի), մենք պետք է օգտագործենք R0 դա անելու համար:

2) Մենք պետք է օգտագործենք Հղումների գրանցամատյանը իր նպատակային նպատակների համար. Այն ունի այն հասցեն, որը ցույց է տալիս, թե ուր վերադառնալ ենթածրագրի ավարտից հետո:

Դուք կտեսնեք, թե ինչպես ենք դրանք կիրառում:

Քայլ 5. Գործառույթ պարամետրով `ներդրված գործառույթներ

Մենք կարող ենք մաքրել մեր ծածկագիրը և նվազեցնել այն զբաղեցրած հիշողության ծավալը ՝ կրկնվող հատվածները մեկ գործառույթի մեջ համատեղելով: Հիմնական հանգույցի միակ տարբերությունն այն է, որ մեզ անհրաժեշտ է պարամետր, որպեսզի կարողանանք փոխանցել RGB LED- ի տարբեր գույները, որոնք ցանկանում ենք տեսնել:

Մանրամասների համար նայեք տեսանյութին: (կներեք երկարության համար)

Քայլ 6: GPIO մուտքագրում - Ավելացրեք անջատիչներ

Եկեք այն դարձնենք ավելի հետաքրքիր: Assemblyամանակն է մի քանի անջատիչ-վերահսկողություն ավելացնել մեր հավաքման ծրագրին:

Այս հրահանգն ունի պատկերներ, որոնք ցույց են տալիս, թե ինչպես են երկու անջատիչ սարքերը միացված MSP432- ին:

Ըստ էության. Անջատիչ 1 (SW1 կամ S1) միացված է P1.1- ին, իսկ անջատիչը 2 (SW2 կամ S2) միացված է P1.4- ին:

Սա ինչ -որ բան հետաքրքիր է դարձնում ոչ միայն այն պատճառով, որ մենք ելքերի փոխարեն գործ ունենք մուտքերի հետ, այլ նաև այն պատճառով, որ այս երկու անջատիչները զբաղեցնում կամ զբաղեցնում են նույն գրանցամատյան հասցեի բլոկի երկու բիթ, ինչպես և մեկ կարմիր LED- ը, որը ելք է:

Մենք զբաղվեցինք այս Ուղեցույցում միայնակ կարմիր LED- ի փոփոխությամբ, այնպես որ մենք պարզապես պետք է կոդ ավելացնենք անջատիչները կարգավորելու համար:

Պորտ 1 Գրանցման հասցեի արգելափակում

Հիշեք, որ մենք դրանք ընդգրկել ենք նախորդ Instructable- ում, բայց մենք պետք է ներառենք նորը.

  • Պորտ 1 Մուտքային գրանցամատյանի հասցեն = 0x40004C00
  • Պորտ 1 Ելքային գրանցման հասցե = 0x40004C02
  • Նավահանգիստ 1 Ուղղություն Գրանցման հասցե = 0x40004C04
  • Պորտ 1 դիմադրություն Միացնել գրանցման հասցեն = 0x40004C06
  • Պորտ 1 Ընտրեք 0 Գրանցման հասցե = 0x40004C0A
  • Պորտ 1 Ընտրեք 1 Գրանցման հասցե = 0x40004C0C

Երբ նավահանգիստներն օգտագործում են որպես մուտք, լավ է օգտագործել MSP432- ի ներքին քաշվող կամ քաշվող դիմադրիչները:

Քանի որ Launchpad- ի զարգացման տախտակը երկու անջատիչին միացրել է գետնին (LOW- ը սեղմելիս), դա նշանակում է, որ մենք պետք է օգտագործենք քաշեք UP ռեզիստորները `համոզվելու համար, որ մենք ունենք ամուր HIGH, երբ դրանք չեն սեղմվում:

Քաշեք / քաշեք ներքևի դիմադրիչները

Պորտ 1 ռեգիստրի երկու տարբեր հասցեներ են պահանջվում, որպեսզի այդ անջատիչ մուտքերը կապեն ձգվող դիմադրիչների հետ:

1) Օգտագործեք Port 1 Resistor-Enable գրանցամատյանը (0x40004C06) `պարզապես նշելու համար, որ ցանկանում եք ռեզիստորներ (այդ երկու բիթերի համար), 2) և այնուհետև օգտագործեք Պորտ 1 ելքային գրանցամատյանը (0x40004C02) ՝ դիմադրիչները որպես քաշվող կամ քաշող իջեցնելու համար: Դա կարող է շփոթեցուցիչ թվալ, որ մենք մուտքերի վրա օգտագործում ենք Ելքային գրանցամատյան: Ելքային գրանցամատյանը գրեթե նման է երկակի նշանակության:

Այսպիսով, այլ կերպ վերահաստատելու համար, Ելքային գրանցամատյանը կարող է կամ բարձր կամ ցածր ուղարկել ելք (օրինակ ՝ մեկ կարմիր LED), և / կամ այն օգտագործվում է մուտքերի համար քաշվող կամ ներքև դիմադրիչներ սահմանելու համար:, ԲԱՅ ՄԻԱՅՆ, եթե այդ հնարավորությունը միացված է Resistor-Enable գրանցամատյանի միջոցով:

Կարևոր է վերը նշվածում. Ցանկացած ելքային բիթին LOW կամ HIGH ուղարկելը/սահմանելը, ձեզ հարկավոր է միաժամանակ պահպանել մուտքային բիթերի քաշքշման/քաշման վիճակը:

(տեսանյութը փորձում է բացատրել)

Նավահանգստի մուտքի բիթ կարդալը

  • Սահմանեք SEL0 / SEL1- ը GPIO ֆունկցիոնալության համար
  • Սահմանեք DIR գրանցամատյանը որպես մուտքի անջատիչ բիթերի համար, բայց որպես ելք LED- ի համար (միաժամանակ նույն բայթում)
  • Միացնել դիմադրիչները
  • Սահմանեք դրանք որպես ձգվող դիմադրիչներ
  • Կարդացեք նավահանգիստը
  • Հնարավոր է, որ ցանկանաք զտել ընթերցված արժեքը ՝ անհրաժեշտ բիթերը մեկուսացնելու համար (անջատիչ 1 և 2)

Խորհուրդ ենք տալիս: