架构师_程序员_码农网

Потребителско име Извличане на парола
Регистрация

QQ登录

Само една стъпка, за да започнете

Търсене
Преглед:4624|Отговор: 0
打印 上一主题 下一主题

[转]Zigbee之旅(三):几个重要的CC2430基础实验--Външно прекъсване

[Copy link]
Асансьор директно към 跳转到指定楼层
собственика на сградата
发表于 2014-10-30 23:16:46|只看该作者回帖奖励|Преглед в обратна посока|Режим на четене
I. Продължаване от предишното към следващото

  В предишната лекция се запознахме с основния процес на разработване на програми за CC2430 в IAR чрез малък експеримент с най-простия мигащ светодиод. Ножът поне беше наточен (въпреки че не съм много добър в това точене на камъни) и сега е време да започнем да колим бъгове :). По-нататък нека научим няколко основни експеримента с CC2430. Всеки малък експеримент, разделен на "експериментално въведение", "блок-схема на програмата", "експериментален изходен код и анализ" три части на описанието.

  В тази статия е обяснено външното прекъсване.

Второ, външното прекъсване(1) Въведение в експеримента

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

  Прекъсванията се разделят на външни прекъсвания и вътрешни прекъсвания, CC2430 съдържа общо 18 източника на прекъсвания (конкретно описание на прекъсванията и дефиниция на вектора на прекъсване, можете да намерите в " Ръководство за китайски език на CC2430 ").

  Сега нека разгледаме електрическата схема на тази развойна платка:

  Развойната платка е свързана към бутона S1 и P0.1, като ефектът, който този експеримент иска да постигне, е да задейства прекъсването на P0.1 чрез натискане на бутона S1 и след това да контролира светването/изгасването на LED1 в подпрограмата за обслужване на прекъсването.

(2) Принцип на експеримента и блок-схема

  Блок-схемата на експеримента е следната:

2011021811430713.png
c













(
3) Експериментален изходен код// заглавен файл#include // подфункция за забавяне#define led1 P1_0#define led2 P1_1#define led3 P1_2#define led4 P1_3void Delay( unsigned n) { & &



nbsp; unsigned tt;for (tt = 0;tt<n;tt++);for (tt = 0;tt<n;tt++);for (tt = 0;tt<n;tt++); &






nbsp; for (tt = 0;tt<n;tt++);for (tt = 0;tt<n;tt++); }//32M кристална инициализацияvoid xtal_init( void ) { SLEEP &=~0x04; &
nbsp; //всичко захранванеwhile (!
(SLEEP & 0x40 )); //кристалният осцилатор е включен и стабилен CLKCON &=~0x47; &






nbsp; /Изберете 32MHz кристален осцилатор SLEEP |=0x04; }//Инициализация на светодиодитеvoid led_init( void ) { P1SEL =0x00; &nbsp


; //P1 е нормален входно-изходен порт P1DIR |=0x0F; //P1.0 P1.1 P1.2 P1.3 Изход








led1 = 0; led2 = 0; led3 = 0; led4 = 0; }// инициализация наio и външно прекъсванеvoid io_init( void ) { P0INP &=~0X02;



/ /P0.1 има издърпване и изтегляне EA =1; //Общо разрешаване на прекъсването P0IE =1; &



nbsp; //Прекъсване на P0 PICTL |=0X09; //Прекъсване на порт P0.1, задействане на падащ фронт P0IFG &=~0x02







; //P0.1 interrupt flag clear 0 };//main functionvoid main( void ) { xtal_init(); led_init();








io_init();while ( 1); //чакане за прекъсване }//подпрограма за обслужване на прекъсвания#pragma vector = P0INT_VECTOR__interrupt void P0_ISR( void ) { EA =0;

/ / изключване на прекъсването Delay





( 10000 ); Delay(10000 ); Delay(10000); Delay(10000 ); Delay(10000 ); Delay(10000 ); &

nbsp; if ((P0IFG & 0x02 ) >0 ) //ключово прекъсване { P0IFG &=~0x02; &


nbsp; //П0.1 флаг за прекъсване clear 0 led1 = !led1; } P0IF =0; &

nbsp; //P0 флаг за прекъсване clear 0 EA =1; &
nbsp; // включване на прекъсването }

  Първо инициализирайте Unity Clock: изберете 32MHz кристален осцилатор.

  След това инициализирайте светодиодите: задайте P1 като входно-изходен порт с общо предназначение, задайте посоката P1.0 ~ P1.3 като изход и след това изключете 4-те светодиода.

  След това конфигурирайте съответните SFR регистри за външни прекъсвания и включете разрешаването на прекъсването на всички нива, включвайки 3 SFR: EA, IEN1, PICTL (за подробно описание на всеки SFR, моля, вижте " Ръководство за китайски език на CC2430 "):

     EA -- общо разрешение за прекъсване;

     IEN1.5 -- разрешение за прекъсване на P0;

     PICTL.3 -- разрешаване на прекъсването на порт P0.1;

     PICTL.0 -- задаване на падащ фронт на входа на порт P0.1 за задействане на прекъсване.

  След това използвайте while(1) в основната функция, за да изчакате прекъсването.

CC2430 Съвети
(1) Синтаксис за присвояване на битове Резюме
Много често се налага да присвоим стойност (0 или 1) на бит в еднобайтова SFR, за да управляваме точно хардуерно устройство.
  

Някои SFR
поддържат адресиране на битове, като TCON, P0 и т.н., в този момент присвояването на бит е много просто, просто направете запитване към заглавния файл ioCC2430.h в частта SFR Bit Access (Достъп до бита) дефиницията на бита може да бъде:
P0_0 = 0; // P0 първият бит на присвояване на стойността 0
P0_0 = 1; / / / P0 първият бит на присвояване на стойността 1
Има
обаче SFR, които не поддържат
адресиране на битове, както в случая с
присвояването на стойността на първия бит на първия бит на
втория
бит
.
Някои SFR обаче
не поддържат битово адресиране, като например PICTL в този експеримент, когато искате да присвоите стойност на един от тях, синтаксисът е следният:
PICTL &= ~0x01; //присвояване на стойност 0 на първия бит
PICTL |= 0x01; //присвояване на стойност 1 на първия бит
Можете да запомните, че &
amp;= ~, |= ~, |= ~, |= ~,
|= P0_0
=
1; //присвояване на стойност 1 на първия бит на P0
. amp;= ~, |= тези два често срещани синтаксиса за присвояване на битове.
(2) Обобщение на разрешаването на прекъсвания
Когато в дадена програма участва прекъсване, то трябва да бъде разрешено, преди да се задейства прекъсването.
  

Системата за разрешаване на прекъсвания на C51, нейната йерархична структура е много очевидна:
шеф на прекъсванията: EA е шефът, отговорен за общото разрешаване на прекъсванията:
EA = 1;
капитан на отцепването на
прекъсванията: следващият е за всеки функционален компонент (като P0, таймер 1 и т.н.), който разрешава контрола, като SFR обикновено е адресируем с битове, наименованието обикновено съдържа IE (Разрешаване на прекъсвания):
P0IE = 1;
членове на
екипа за прекъсвания
: отцепване, но поради
прекъсване напрограмата
,
прекъсването
трябва да бъде разрешено преди задействане на прекъсването.

Всеки член на екипа за прекъсване
: екип, но тъй като всеки функционален компонент съдържа и множество прекъсвания, така че последното ниво е за всеки контрол на разрешаването на прекъсването, такъв SFR обикновено не е адресируем с бит, наименованието обикновено съдържа IE (Interrupt Enable) или IM (Interrupt Mask):
PICTL | = 0x01;
не е необходимо
да се запомнят SFRs за прекъсване Не е необходимо да запомняте SFRs за прекъсвания, стига да разбирате йерархията, а след това да се консултирате с ръководството или заглавните файлове, когато ги използвате.
(3) Писане на програми за прекъсвания
Използването на прекъсвания в дадена програма обикновено се състои от две части: писане на подпрограма за обслужване на прекъсвания и отваряне на разрешение за прекъсване.

Разрешението за прекъсване беше въведено по-горе, по-долу е представено кратко въведение в подготовката на подпрограма за обслужване на прекъсването:
Първо, посочете вектора на прекъсването, може да бъде в заглавния файл ioCC2430.h в частта Interrupt Vectors (Вектори на прекъсване) на заявката, синтаксисът е следният:
# pragma vector = Interrupt Vectors (Вектори на прекъсване)
и след това следва подготовката на обработчика на прекъсването, структурата е следната:
___
interrupt void Function Name (___)


i
nterrupt void function name(void)
{
//на прекъсване
//обработка на прекъсване
//изчистване на флага за прекъсване 0
//изключване на прекъсването
}

III. Заключение

  В тази статия е представен прост метод за реализация на външно прекъсване на базата на CC2430, като основата е прекъсването, след което представяме друг много важен модул - таймер. CC2430 има общо четири таймера, които могат да бъдат разделени на три категории: таймер 1, таймер 2, таймер 3/4 (3 и 4 от използването на един и същ основен). същото).


</n;tt++).
</n;tt++);.
</n;tt++).
</n;tt++); </n;tt++); </n;tt++); </n;tt++); </n;tt++).
</n;tt++).




Предишна: [Re-]Zigbee Journey (II): първата програма CC2430 - експеримент с мигане на светодиода
Следваща: [Re-]Zigbee Journey (4): Няколко важни основни експеримента с CC2430 - прекъсвания на таймера
Мрежата на фермерите на кода, публикувана само в процеса на практиката, срещнала технически трудности, не подвеждайте другите.
Трябва да влезете в системата, преди да можете да публикувате обратно Вход | Регистрация

Тази версия на интегралните правила


ОТКАЗ ОТ ПОЛЗВАНЕ: Целият софтуер, материали за програмиране или статии, публикувани от Code Farmer, са ограничени за използване само за учебни и изследователски цели; горното съдържание не трябва да се използва за търговски или незаконни цели, в противен случай всички последици ще бъдат понесени от самите потребители. Този сайт информация от мрежата, спор за авторски права няма нищо общо с този сайт. Трябва напълно да премахнете горното съдържание от компютъра си в рамките на 24 часа след изтеглянето му. Ако програмата ви харесва, моля, подкрепете оригиналния софтуер, купете регистрацията и получете по-добро оригинално обслужване. Ако има някакво нарушение, моля, свържете се с нас по имейл, за да се справим с него.

Поща To:help@itsvse.com

QQ| ( 鲁ICP备14021824号-2)|Карта на сайта

GMT+8, 2024-9-17 14:49

Бърз отговорВърнете се в началотоВърнете се в списъка