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

Изглед: 7368|Отговор: 0

Zigbee Journey (3): Няколко важни основни експеримента с CC2430 – външно прекъсване

[Копирай линк]
Публикувано в 30.10.2014 г. 23:16:46 ч. | | | |
1. Свързване на горния и долния етаж

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

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

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

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

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

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

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

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

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


(3) Експериментален изходен код//头文件
#include

//延时子函数
#defineled1 P1_0
#defineLED2 P1_1
#defineled3 P1_2
#defineLED4 P1_3

ПразнотаЗабавяне(без подписn)   
{
  без подписtt;
  за(tt =0; tt<n; tt++);
  за(tt =0; tt<n; tt++);
  за(tt =0; tt<n; tt++);
  за(tt =0; tt<n; tt++);
  за(tt =0; tt<n; tt++);
}

//32M晶振初始化
Празнотаxtal_init(Празнота)
{
  СЪН &= ~0x04;            //都上电
  докато(! (СЪН &0x40));     //晶体振荡器开启且稳定
  CLKCON &= ~0x47;           //Изберете кристален осцилатор с честота 32MHz
  СЪН |=0x04;
}

//LED灯初始化
Празнотаled_init(Празнота)
{
  P1SEL =0x00;         P1 е нормалният I/O порт
  P1DIR |=0x0F;         P1.0 P1.1 P1.2 P1.3 изход
  
  led1 = 0;
  lead2 = 0;
  led3 = 0;
  led4 = 0;
}

//io及外部中断初始化
Празнотаio_init(Празнота)
{
    P0INP &= ~0X02;   //P0.1有上拉、下拉

    EA =1;           //总中断使能
   
    P0IE =1;   //P0中断使能
   
    ПИКТЛ |=  0X09;   //P0.1口中断使能,下降沿触发
   
    P0IFG &= ~0x02;   //P0.1中断标志清0
};

//主函数
Празнотаосновно(Празнота)   
{
  xtal_init();
  led_init();  
  io_init();

  докато(1);   //等待中断
}

//中断服务子程序
#pragma вектор = P0INT_VECTOR
__interrupt ПразнотаP0_ISR(Празнота)
{
  EA =0;                        Портата е прекъсната  

  Забавяне(10000);  
  Забавяне(10000);
  Забавяне(10000);
  Забавяне(10000);
  Забавяне(10000);

  ако((P0IFG &0x02) >0)         //按键中断
  {
    P0IFG &= ~0x02;               //P0.1中断标志清0
    led1 = !led1;
  }
  P0IF =0;                       //P0中断标志清0

  EA =1;                        //开中断
}

Първо, инициализирайте системния такт: изберете кристален осцилатор с честота 32MHz.

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

След това конфигурирайте съответните SFR регистри за външни прекъсвания, за да активират прекъсвания на всички нива, включващи 3 SFR:EAIEN1PICTL(За подробности за всяка SFR, моля, вижтеCC2430 Китайски наръчник》):

EA- Активиране на тотално прекъсване;

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

    PICTL.3—— Активиране на прекъсване на порта P0.1;

    PICTL.0—— Настройте входния ръб на порта P0.1 да предизвиква задействане на прекъсване.

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

Съвети за CC2430
(1) Обобщение на синтаксиса за присвояване на битове
Често трябва да присвоим бит (0 или 1) на един байт от SFR, за да контролираме точно хардуерното устройство.
Има SFRАдресиране на поддръжка на битовеНапример, TCON, P0 и др., по това време разпределението на контрапунктите е много просто, просто направете заявка за дефиницията на бита в секцията SFR Bit Access на заглавния файл ioCC2430.h:
P0_0 = 0; // присвояване 0 на първата цифра на P0
P0_0 = 1; // присвояване на стойност 1 на първата цифра на P0  

Но някои SFR не съществуватБитовото адресиране не се поддържа, както в този експериментPICTL, в този момент искате да присвоите стойност на един от тях, синтаксисът е следният:
PICTL &= ~0x01;   Присвоете стойност 0 на първата цифра
PICTL |= 0x01;     Присвоете стойност 1 на първата цифра

Можеш да си спомниш&= ~|=Тези два често използвани синтаксиса за присвояване на битове.
(2) Обобщение на прекъсването
Когато прекъсване е включено в програмата, то трябва да бъде активирано преди прекъсването да бъде задействано.
Йерархията на системата за активиране на прекъсвания с C51 е много очевидна:
Бос на прекъсване: EAе шефът, отговоренОсновниАктивирай прекъсване:
EA = 1;

  Всеки прекъснат командир на взвод: Следва за всеки единФункционални части(като P0, таймер 1 и др.), такива SFR обикновено са битово адресируеми, а името обикновено съдържа IE (Interrupt Enable):
P0IE = 1;

  Всеки член на отбора беше прекъснат: Отряд Но тъй като всяка функция съдържа и множество прекъсвания, последното ниво е за товаВсяко прекъсванеТози тип SFR обикновено е безбитов и неадресируем, и обикновено съдържа IE (Interrupt Enable) или IM (Прекъсваща маска) в името:
ПИКТЛ |=0x01;

Няма нужда да механично прекъсвате SFR, просто разберете йерархията му и след това отделете време да проверите ръководството или заглавния файл.
(3) Прекъсване на писането на програми
Използването на прекъсвания в програма обикновено включва две части: писане на подпрограмата за услуга за прекъсвания и отваряне на активирането на прекъсванията. Функцията за прекъсване е въведена по-горе, а по-долу е кратко въведение в писането на подпрограмата за услуга за прекъсване:
Първо уточнетеВектор на прекъсване, който може да бъде запитан в секцията Interrupt Vectors на заглавния файл ioCC2430.h, със следния синтаксис:
#pragma вектор = вектор на прекъсване

След това веднага след това запишете обработващия прекъсвач, който е структуриран по следния начин:
__interrupt празно име на функцията (void)
  {
    //开中断
    //中断处理
    //中断标志清0
    //关中断
  }



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

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


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




Предишен:Zigbee Journey (2): Първата програма CC2430 - експеримент с LED светлинно мигане
Следващ:Zigbee Journey (4): Няколко важни основни експеримента с CC2430 - прекъсване на таймера
Отричане:
Целият софтуер, програмни материали или статии, публикувани от Code Farmer Network, са само за учебни и изследователски цели; Горното съдържание не трябва да се използва за търговски или незаконни цели, в противен случай потребителите ще понесат всички последствия. Информацията на този сайт идва от интернет, а споровете за авторски права нямат нищо общо с този сайт. Трябва напълно да изтриете горното съдържание от компютъра си в рамките на 24 часа след изтеглянето. Ако ви харесва програмата, моля, подкрепете оригинален софтуер, купете регистрация и получете по-добри услуги. Ако има нарушение, моля, свържете се с нас по имейл.

Mail To:help@itsvse.com