- Защо се нуждаем от прекъсване?
- Видове прекъсвания в MSP430
- Прекъсване на програмата за управление в MSP430
- Верига MSP430 за тестване на GPIO прекъсване
- Програмиране на MSP430 за прекъсвания
- Качване на програма в MSP430 от CCS
- Програма за прекъсване на MSP430
Помислете за прост цифров часовник, който е програмиран да ви показва само времето, сега си представете, че искате да промените часовата му зона. Какво би направил? Просто натискате бутон, който се променя в менюто, което ви позволява да промените часовата зона. Тук системата не може да предвиди вашето външно прекъсване до процесите си на задържане на времето и не може да ви помоли да изчакате, тъй като е заета да увеличава стойността на секундите на вашия часовник. Тук прекъсванията са полезни.
Прекъсванията не винаги трябва да бъдат външни; може да бъде и вътрешен. Повечето пъти при вградено прекъсване също улеснява комуникацията между две периферни устройства на процесора. Помислете, че предварително зададеният таймер се нулира и прекъсването се задейства, когато времето достигне стойността в регистъра на таймера. Манипулаторът на прекъсвания може да се използва за иницииране на други периферни устройства като DMA.
В този урок използвахме външните прекъсвания на MSP430 за превключване на различни светодиоди. Когато външното прекъсване е дадено от промяната на състоянието с помощта на бутон, управлението се прехвърля (предварително изчерпано) към ISR и прави необходимото. За да знаете основите като настройка на CCS среда за стартовата площадка MSP430G2, следвайте тази връзка, като започнете с MSP430 с помощта на CCS, защото няма да навлизаме в подробности за това в този урок. Също така проверете други уроци, базирани на MSP430, използващи Energia IDE и CCS, като следвате връзката.
Защо се нуждаем от прекъсване?
Прекъсванията са необходими, за да се запазят режийните разходи във вградената система. Те се извикват, когато трябва да бъдат изпълнени задачите с по-висок приоритет чрез предварително изваждане на текущата изпълняваща се задача. Той може да се използва и за събуждане на процесора от режими с ниска мощност. Когато се събуди от преход на ръба на външен сигнал през GPIO порт, ISR се изпълнява и процесорът отново се връща в режим на ниска мощност.
Видове прекъсвания в MSP430
На прекъсва в MSP430 идват под следния видове-
- Нулиране на системата
- Немаскируемо прекъсване
- Маскируемо прекъсване
- Векторирани и Невекторирани прекъсвания
Нулиране на системата:
Това може да възникне поради захранващо напрежение (Vcc) и поради нисък сигнал в щифта RST / NMI с избран режим за нулиране и може да възникне поради причини като преливане на таймера на пазача и нарушение на ключа за сигурност.
Немаскируемо прекъсване:
Тези прекъсвания не могат да бъдат маскирани от инструкциите на процесора. След като се разреши Общото прекъсване, немаскируемото прекъсване не може да бъде отклонено от обработката. Това се генерира от източници като грешки на осцилатора и ръб, даден ръчно на RST / NMI (в режим NMI).
Маскируемо прекъсване:
Когато възникне прекъсване и ако то може да бъде маскирано от инструкция на процесора, тогава това е Maskable Interrupt. Не е необходимо те винаги да бъдат външни. Те също зависят от периферните устройства и техните функции. Използваните тук прекъсвания на външни портове попадат в тази категория.
Векторирани прекъсвания и Невекторирани прекъсвания:
Vectored: В този случай устройствата, които прекъсват, ни предоставят източника на прекъсването, като предават векторния адрес на прекъсването. Тук адресът на ISR е фиксиран и контролът се прехвърля на този адрес, а ISR се грижи за останалото.
Без вектори: Тук всички прекъсвания имат обща ISR. Когато възникне прекъсване от не-векторен източник, управлението се прехвърля на общия адрес, на който всички не-векторирани прекъсвания споделят.
Прекъсване на програмата за управление в MSP430
Когато настъпи прекъсването, MCLK се включва и CPU се извиква обратно от състояние OFF. Тъй като управлението на програмата се прехвърля на ISR адреса след появата на прекъсването, стойностите в брояча на програмата и регистъра на състоянието се преместват в стека.
Последователно регистърът на състоянието се изчиства, като по този начин се изчиства GIE и се прекратява режимът с ниска мощност. Прекъсването с най-висок приоритет се избира и изпълнява чрез поставяне на векторния адрес на прекъсването в брояча на програмата. Преди да стигнем до нашия примерен код за прекъсване MSP430 GPIO, важно е да разберем работата на порт регистрите, участващи в него.
Портови регистри за GPIO контрол на MSP430:
PxDIR: Това е регистър за управление на посоката на порта. Това позволява на програмиста да избере конкретно своята функция, като напише 0 или 1. Ако пин е избран като 1, тогава той действа като изход. Считайте порт 1 за 8-битов порт и ако изводите 2 и 3 трябва да бъдат назначени като изходни портове, тогава регистърът P1DIR трябва да бъде зададен със стойността 0x0C.
PxIN: Това е регистър само за четене и текущите стойности в порта могат да бъдат прочетени с помощта на този регистър.
PxOUT: Този конкретен регистър може да се използва за директно записване на стойности в портовете. Това е възможно само когато регистърът за изтегляне / изтегляне е деактивиран.
PxREN: Това е 8-битов регистър, използван за активиране или деактивиране на регистъра за изтегляне / изтегляне. Когато щифтът е зададен като 1 в регистъра PxREN и PxOUT, тогава конкретният щифт се изтегля нагоре.
PxDIR |
PxREN |
PxOUT |
I / O Config |
0 |
0 |
х |
Вход с деактивирани резистори |
0 |
1 |
0 |
Въвеждане с активирано вътрешно падащо меню |
0 |
1 |
1 |
Вход с активирана вътрешна издърпване |
1 |
х |
х |
Изход - PxREN няма ефект |
PxSEL и PxSEL2: Тъй като всички щифтове в MSP430 са мултиплексирани, конкретната функция трябва да бъде избрана, преди да я използвате. Когато и регистрите PxSEL и PxSEL2 са зададени като 0 за определен пин, тогава се избира входно / изходното устройство с общо предназначение. Когато PxSEL е зададен като 1, се избира основната периферна функция и т.н.
PxIE: Активира или деактивира прекъсвания за определен щифт в порт x.
PxIES: Избира ръба, при който се генерира прекъсване. За 0 се избира възходящ ръб, а за 1 падащ ръб.
Верига MSP430 за тестване на GPIO прекъсване
Веригата MSP430, използвана за тестване на нашия пример за прекъсване на MSP430, е показана по-долу.
Земята на платката се използва за заземяване както на светодиода, така и на бутона. Диагонално противоположните страни на бутона са нормално отворени клеми и се свързват при натискане на бутона. Преди светодиода е свързан резистор, за да се избегне високата консумация на ток от светодиода. Обикновено се използват ниски резистори в диапазона от 100ohm - 220ohm.
Използваме 3 различни кода, за да разберем по-добре прекъсванията на порта. Първите два кода използват същата схема, както в схемата на схемата 1. Нека се потопим в кода. След установяване на връзките настройката ми изглежда така.
Програмиране на MSP430 за прекъсвания
Пълната програма за прекъсване на MSP430 може да бъде намерена в долната част на тази страница, обяснението на кода е както следва.
Долният ред спира таймера за наблюдение от работа. Таймерът за наблюдение обикновено извършва две операции. Единият предотвратява безкрайните цикли на контролера, като нулира контролера, а другият е, че той задейства периодични събития, използвайки вградения таймер. Когато микроконтролерът е нулиран (или включен), той е в режим на таймер и има тенденция да нулира MCU след 32 милисекунди. Тази линия спира контролера от това.
WDTCTL = WDTPW + WDTHOLD;
Задаването на регистъра P1DIR на стойност 0x07 задава посоката на pin0, pin1 и pin2 като изход. Настройването на P1OUT на 0x30 го конфигурира като вход с активирани вътрешни издърпващи резистори на pin4 и pin5. Задаването на P1REN на 0x30 позволява вътрешното издърпване на тези щифтове. P1IE позволява прекъсване, където P1IES избира високия към ниския преход като край на прекъсването на тези щифтове.
P1DIR - = 0x07; P1OUT = 0x30; P1REN - = 0x30; P1IE - = 0x30; P1IES - = 0x30; P1IFG & = ~ 0x30;
Следващият ред позволява режим на ниска мощност и активира GIE в регистъра на състоянието, така че прекъсванията да могат да бъдат получени.
__bis_SR_register (LPM4bits + GIE)
Броячът на програмата се задава с адреса на вектора на порт 1 с помощта на макроса.
PORT1_VECTOR . #pragma vector = PORT1_VECTOR __interrupt void Port_1 (void)
Кодът по-долу превключва всеки от светодиодите, свързани към pin0, pin1, pin2 един по един.
ако (брои% 3 == 0) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; преброяване ++; } иначе ако (преброявам% 3 == 1) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; преброяване ++; } else { P1OUT ^ = BIT2; P1IFG & = ~ 0x30; преброяване ++; }
Електрическа схема 2:
По същия начин, нека опитаме с различен щифт, за да разберем концепцията много по-добре. Така че тук бутонът е свързан към щифт 2.0 вместо към щифт 1.5. модифицираната схема е както следва. Отново тази схема се използва за тестване на програмата за прекъсване на бутона MSP430.
Тук порт 2 се използва за въвеждане. Така че трябва да се използва различен вектор на прекъсване. P1.4 и P2.0 вземат входовете.
Тъй като порт 2 се използва само за вход, P2DIR е зададен като 0. За да зададете pin0 на порт 2 като вход с активирани вътрешни издърпващи резистори, регистрите P2OUT и P2REN трябва да бъдат зададени със стойност 1. За да активирате прекъсване на pin0 на порт 2, а също и за избор на ръба на прекъсването, P2IE и P2IES се задават със стойност 1. За нулиране на флага в порт 2, P2IFG се изчиства, така че флагът може да бъде зададен отново на възникване на прекъсването.
P2DIR - = 0x00; P2OUT = 0x01; P2REN - = 0x01; P2IE - = 0x01; P2IES - = 0x01; P2IFG & = ~ 0x01;
Когато източникът на прекъсване е от порт 1, тогава светодиодът, свързан към щифт1 на порт 1, свети. Когато източникът на прекъсване принадлежи към порт 2, тогава светодиодът, свързан към pin2 на порт 1, свети.
#pragma vector = PORT1_VECTOR __ прекъсване void Port_1 (void) { P1OUT ^ = BIT1; P1IFG & = ~ 0x10; за (i = 0; i <20000; i ++) { } P1OUT ^ = BIT1; } #pragma vector = PORT2_VECTOR __interrupt void Port_2 (void) { P1OUT ^ = BIT2; P2IFG & = ~ 0x01; за (j = 0; j <20000; j ++) { } P1OUT ^ = BIT2; }
Качване на програма в MSP430 от CCS
За да заредите проекта в стартовата панел и да отстраните грешки, изберете проекта и щракнете върху иконата за отстраняване на грешки в лентата с инструменти. Като алтернатива натиснете F11 или щракнете върху RunàDebug, за да влезете в режим за отстраняване на грешки.
След като режимът за отстраняване на грешки влезе, натиснете зеления бутон за изпълнение, за да стартирате свободно заредения код в MCU. Сега, когато бутонът е натиснат надолу, прекъсването се задейства от промяната в ръба, като по този начин се предизвиква промяната в състоянието на светодиода.
Програма за прекъсване на MSP430
След като кодът бъде качен успешно, можем да го тестваме, като просто използваме бутона. Светодиодният шаблон ще се промени според нашата програма, когато се даде прекъсване с помощта на бутона.
Цялата работа може да бъде намерена във видеото, свързано по-долу. Надявам се, че ви е харесал урока и сте научили нещо полезно. Ако имате някакви въпроси, оставете ги в раздела за коментари или използвайте форумите ни за други технически въпроси.