Съдържание:

ЧАСТ 2 - МОНТАЖ НА GPIO ARM - RGB - ФУНКЦИОНИРАНИ ОБИВКИ - Превключватели: 6 стъпки
ЧАСТ 2 - МОНТАЖ НА GPIO ARM - RGB - ФУНКЦИОНИРАНИ ОБИВКИ - Превключватели: 6 стъпки

Видео: ЧАСТ 2 - МОНТАЖ НА GPIO ARM - RGB - ФУНКЦИОНИРАНИ ОБИВКИ - Превключватели: 6 стъпки

Видео: ЧАСТ 2 - МОНТАЖ НА GPIO ARM - RGB - ФУНКЦИОНИРАНИ ОБИВКИ - Превключватели: 6 стъпки
Видео: Вебинар "Fastwel I/O - отечественный модульный ПЛК для ответственных применений", 03.10.16 2024, Ноември
Anonim
ЧАСТ 2 - СБОРКА НА GPIO ARM - RGB - ФУНКЦИОНИРАНИ ОБИВКИ - Превключватели
ЧАСТ 2 - СБОРКА НА GPIO ARM - RGB - ФУНКЦИОНИРАНИ ОБИВКИ - Превключватели

В част 1 научихме как да превключваме един червен светодиод на платката за разработка на MSP432 LaunchPad от Texas Instruments, използвайки монтаж вместо C / C ++.

В тази инструкция ще направим нещо подобно - ще контролираме RGB LED, който също е на същата дъска.

По пътя се надяваме да разширим познанията си за сглобяването на ARM, а не просто да се забавляваме, като запалим някои светодиоди.

Стъпка 1: Да влезем направо

Наистина, първото видео казва всичко. Не много повече за добавяне.

Основната му идея е да донесе идеята, че всеки I/O порт на MSP432 се състои от блок от "регистърни" адреси, които от своя страна се състоят от няколко бита всеки.

Освен това битовете са групирани по ортогонален начин. Тоест, бит 0 от всеки регистър адрес се отнася до един и същ външен I/O пин.

Повторихме идеята, че са необходими няколко регистърни адреса за този порт, за да се направи нещо дори само с един бит или щифт.

Но че в този случай, тъй като имаме работа с RGB LED, трябва да се справим с три бита за всеки адрес на регистър.

Подкрепихме, че се нуждаем от няколко регистри: регистър DIR, регистър SEL0, регистър SEL1 и регистър OUTPUT. И всеки път по три бита.

Стъпка 2: Подобрете кода - Добавете функция

Image
Image

Както видяхте в горната стъпка, основният програмен цикъл имаше много повтарящ се код, а именно, когато изключим светодиодите.

Така че можем да добавим функция към програмата. Все още трябва да извикваме тази функция всеки път, когато искаме да изключим светодиодите, но това води до срив на част от кода до едно изявление.

Ако нашият код за изключване на LED беше по-ангажиран с много повече инструкции, това би било истинско спестяване на памет.

Част от вграденото програмиране и микроконтролерите са много по-наясно с размера на програмата.

Видеото обяснява.

По същество ние добавяме изявление за разклоняване към нашия основен код и имаме друг блок код, който е функцията, към която се разклоняваме. И след като приключим, или в края на функцията, се връщаме към следващото изявление в основната програма.

Стъпка 3: Добавете закъснение при зает цикъл

В раздела Декларации на кода добавете константа, за да улесните настройването за желаното време:

; всяка дума след точка и запетая (';') започва коментар.

; кодът в тази част присвоява име на стойност.; можете също да използвате „.equ“, но те са малко по -различни.; '.equ' (мисля) не може да бъде променен, докато '.set' означава, че можете; променете стойността на „DLYCNT“по -късно в кода, ако желаете.; 'DLYCNT' ще се използва като стойност за обратно броене в подпрограмата за забавяне. DLYCNT. Набор 0x30000

Добавете нова функция за забавяне:

забавяне:.asmfunc; началото на подпрограмата или функцията „забавяне“.

MOV R5, #DLYCNT; зареждане на ядрото на процесора R5 със стойност, присвоена на „DLYCNT“. dlyloop; това означава начало на закъснение. асемблерът определя адреса. SUB R5, #0x1; извадете 1 от текущата стойност в основния регистър на процесора R5. CMP R5, #0x0; сравнете текущата стойност в R5 с 0. BGT dlyloop; разклонение, ако стойността в R5 е по -голяма от 0, за да обозначите (адрес) „dlyloop“. BX LR; ако стигнем до тук, стойността на R5 е 0. връщане от подпрограмата..endasmfunc; маркира края на подпрограмата.

След това в основното тяло, в основния цикъл, извикайте или извикайте тази функция за забавяне:

; това е фрагмент от код, от основното тяло или основната функция (вижте файла 'main.asm').

; това е цикъл в "main" и показва как наричаме или използваме тази нова функция "delay".; "#REDON" и "#GRNON" също са декларации (константи) (вижте горната част на "main.asm").; те са просто лесен начин да зададете определения цвят на RGB LED. цикъл MOV R0, #REDON; Червен - задава регистър на процесора на ядрото R0 със стойност, присвоена на „REDON“. STRB R0, [R4]; ядрен регистър R4 е предварително настроен с GPIO изходен адрес.; напишете това, което е в R0, на адрес, посочен от R4. BL забавяне; разклонете се към новата функция „забавяне“. BL ledsoff; разклонение към съществуващата вече функция „ledsoff“. BL забавяне; също MOV R0, #GRNON; Зелено - също STRB R0, [R4]; и така нататък. BL забавяне BL ledsoff BL забавяне

Видеото влиза в детайли.

Стъпка 4: Стандарт за извикване на процедура за архитектура на ARM (AAPCS)

Вероятно е подходящ момент да представите нещо. Това е конвенция на асемблерен език. Известен също като Стандарт за извикване на процедури за ARM архитектурата.

Има много неща в това, но това е просто стандарт. Това не ни пречи да научим програмирането на сглобяване и можем да приемем части от този стандарт, докато се чувстваме комфортно с някои концепции, които изучаваме.

В противен случай може да имаме чувството, че пием от огромен маркуч за вода. Твърде много информация.

Основни регистри

Тъй като се запознахме с основните регистри на MSP432, нека се опитаме да приемем някои от тези стандарти. Ще се съобразим с това, когато напишем следващата функция (включване / изключване на светодиод).

1) Трябва да използваме R0 като параметър на функцията. Ако искаме да предадем стойност във функцията (подпрограма), трябва да използваме R0, за да го направим.

2) Трябва да използваме регистъра на връзките по предназначение - той съдържа адреса, който показва къде да се върнем, след като подпрограмата приключи.

Ще видите как ще ги приложим.

Стъпка 5: Функция с параметър - вложени функции

Можем да изчистим кода си и да намалим обема на паметта, която заема, като комбинираме повтарящи се секции в една функция. Единствената разлика в тялото на основния контур е, че се нуждаем от параметър, за да можем да предаваме различните различни цветове, които искаме да видим на RGB LED.

Вижте видеото за подробности. (съжалявам за дължината)

Стъпка 6: GPIO вход - Добавяне на превключватели

Нека го направим по -интересно. Време е да добавим малко превключване към нашата програма за сглобяване.

Този Instructable има изображения, показващи как двата бордови превключвателя са свързани към MSP432.

По същество: превключвател 1 (SW1 или S1) е свързан към P1.1, а превключвател 2 (SW2 или S2) е свързан към P1.4.

Това прави нещата малко интересни не само защото се занимаваме с входове вместо с изходи, но и защото тези два превключвателя заемат или заемат два бита от един и същ регистър на адресен блок, както и единственият червен светодиод, който е изход.

Занимавахме се с превключване на единствения червен светодиод в тази инструкция, така че просто трябва да добавим код, за да се справим с превключвателите.

Блок за адрес на регистър на порт 1

Не забравяйте, че ние обхванахме това в предишния Instructable, но трябва да включим нов:

  • Порт 1 Адрес на входящия регистър = 0x40004C00
  • Порт 1 Изходен регистър адрес = 0x40004C02
  • Порт 1 Адрес регистър на посоката = 0x40004C04
  • Порт 1 Резистор Активиране Регистър адрес = 0x40004C06
  • Порт 1 Изберете 0 Адрес на регистрация = 0x40004C0A
  • Порт 1 Изберете 1 Регистрирайте адреса = 0x40004C0C

Когато използвате портовете като входове, е добре да използвате вътрешните резистори за издърпване или изтегляне.

Тъй като платката за разработка на Launchpad е свързала двата превключвателя към земята (LOW при натискане), това означава, че трябва да използваме резистори за изтегляне, за да сме сигурни, че имаме стабилна HIGH, когато не са натиснати.

Издърпайте нагоре / издърпайте резистори

Необходими са два различни адреса на регистър на порт 1, за да се свържат тези входове на превключвателя с издърпващи се резистори.

1) Използвайте регистъра за разрешаване на резистори на порт 1 (0x40004C06), за да посочите, че искате резистори (за тези два бита), 2) и след това използвайте изходния регистър на порт 1 (0x40004C02), за да настроите резисторите като издърпващи или падащи. Може да изглежда объркващо, че използваме изходен регистър на входовете. Изходният регистър има почти двойно предназначение.

Така че, за да се посочи по друг начин, изходният регистър може или да изпрати HIGH или LOW към изход (като например единствения червен светодиод), и / или да се използва за настройване на издърпващи или падащи резистори за входове, НО САМО ако тази функция е активирана чрез регистъра за разрешаване на резистори.

Важно в горното-когато изпращате/настройвате LOW или HIGH към всеки изходен бит, ще трябва да поддържате едновременно издърпващото/падащото състояние на входните битове.

(видеото се опитва да обясни)

Четене на входен бит за порт

  • Задайте SEL0 / SEL1 за GPIO функционалност
  • Задайте регистъра DIR като вход за битовете за превключване, но като изход за светодиода (едновременно в същия байт)
  • Активиране на резистори
  • Задайте ги като издърпващи се резистори
  • Прочетете порта
  • Може да искате да филтрирате прочетената стойност, за да изолирате само необходимите битове (превключвател 1 и 2)

Препоръчано: