Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 7368|Yanıt: 0

Zigbee Yolculuğu (3): Birkaç önemli CC2430 temel deneyi - dış kesinti

[Bağlantıyı kopyala]
Yayınlandı 30.10.2014 23:16:46 | | | |
1. Üst ve alt katların birbirine bağlanması

Önceki derste, IAR'ın CC2430 programını basit bir LED yanıp sönme deneyi ile geliştirme sürecini öğrendik. Bıçak zaten biliyor (gerçi eşleme taşım iyi değil), şimdi böcek kesmeye :) başlayacağım. Sonra, CC2430'un birkaç temel deneyini öğrenelim. Her küçük deney üç bölüme ayrılır: "Deney Girişi", "Program Akış Şeması" ve "Deneysel Kaynak Kodu ve Analiz".

Bu makale dış kesintileri açıklamaktadır.

2. Dış kesinti(1) Deneye giriş

Kesintiler, mikrodenetleyicilerin iç veya harici olayları gerçek zamanlı olarak işlemesi için iç mekanizmadır. Dahili veya harici bir olay meydana geldiğinde, mikrodenetleyicinin kesme sistemi CPU'yu çalıştıran programı duraklatmaya zorlar ve bunun yerine kesme olayını işlemeye çalışır.

Kesintiler harici ve iç kesintilere ayrılır ve CC2430 toplamda 18 kesinti kaynağı içerir (kesinti vektörlerinin özel kesinti açıklamaları ve tanımları için lütfen "CC2430 Çin Kılavuzu》)。

Şimdi bu geliştirme kartının devre diyagramına bir göz atalım:

S1 düğmesi, geliştirme kartındaki P0.1'e bağlanmıştır ve bu deneyin etkisi, P0.1'in kesintisini S1 düğmesi üzerinden tetiklemek ve ardından kesme hizmeti alt programında LED1'in açılıp kapatılmasını kontrol etmektir.

(2) Deneysel ilke ve akış şeması

Deneysel akış şeması şöyledir:


(3) Deneysel kaynak kodu//头文件
#include

//延时子函数
#defineled1 P1_0
#defineled2 P1_1
#defineled3 P1_2
#defineled4 P1_3

VoidGecikme(imzasızn)   
{
  imzasıztt;
  için(tt =0; tt<n; tt++);
  için(tt =0; tt<n; tt++);
  için(tt =0; tt<n; tt++);
  için(tt =0; tt<n; tt++);
  için(tt =0; tt<n; tt++);
}

//32M晶振初始化
Voidxtal_init(Void)
{
  UYKU &= ~0x04;            //都上电
  while(! (UYKU &0x40));     //晶体振荡器开启且稳定
  CLKCON &= ~0x47;           //32MHz kristal osilatör seçin
  UYKU |=0x04;
}

//LED灯初始化
Voidled_init(Void)
{
  P1SEL =0x00;         P1 normal I/O portudur
  P1DIR |=0x0F;         P1.0 P1.1 P1.2 P1.3 çıkışı
  
  led1 = 0;
  led2 = 0;
  led3 = 0;
  led4 = 0;
}

//io及外部中断初始化
Voidio_init(Void)
{
    P0INP &= ~0X02;   //P0.1有上拉、下拉

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

//主函数
Voidmain(Void)   
{
  xtal_init();
  led_init();  
  io_init();

  while(1);   //等待中断
}

//中断服务子程序
#pragma vektör = P0INT_VECTOR
__interrupt VoidP0_ISR(Void)
{
  EA =0;                        Kapı kesintiye girdi  

  Gecikme(10000);  
  Gecikme(10000);
  Gecikme(10000);
  Gecikme(10000);
  Gecikme(10000);

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

  EA =1;                        //开中断
}

İlk olarak, sistem saatini başlatın: 32MHz kristal osilatör seçin.

Sonra LED'leri başlatın: P1'i genel G/O portu olarak ayarlayın, çıkış olarak P1.0 ~ P1.3 yönünü ayarlayın ve ardından 4 LED ışığını kapatın.

Sonra, harici kesintiler için ilgili SFR kayıtlarını tüm seviyelerde kesintileri etkinleştirecek şekilde yapılandırın; bu da 3 SFR içerir:EAIEN1PICTL(Her SFR hakkında detaylar için lütfenCC2430 Çin Kılavuzu》):

EA- Toplam kesinti etkinleştirilmeli;

    IEN1.5- P0 kesintisi etkinleştirir;

    PICTL.3—— P0.1 port kesintisi etkinleştirildi;

    PICTL.0—— P0.1 port giriş bırakma kenarını kesme tetiklenmesine neden olacak şekilde ayarlayın.

Sonra ana fonksiyonda while(1) kullanın ve kesintiyi bekleyin.

CC2430 İpuçları
(1) Bit atama sözdiziminin özeti
Çoğu zaman, donanım cihazını tam olarak kontrol etmek için tek bir bayt SFR'ye bir bit (0 veya 1) atamamız gerekir.
SFR varDestek bit adreslemeÖrneğin, TCON, P0 vb. için şu anda karşı noktaların atanması çok basittir, sadece ioCC2430.h başlık dosyasının SFR Bit Erişim bölümünde bit tanımını sorgulayın:
P0_0 = 0; // P0'un ilk rakamına 0 atan
P0_0 = 1; // P0'un ilk rakamına 1 değeri atayın  

Ama bazı SFR'ler yokBit adresleme desteklenmemektedir, bu deneyde olduğu gibiPICTL, bu sırada, birine bir değer vermek isterseniz, sözdizimi şöyledir:
PICTL &= ~0x01;   İlk rakamın 0 değerini atayın
PICTL |= 0x01;     İlk rakamın 1 değerini atayın

Hatırlayabilirsin&= ~|=Bu iki yaygın kullanılan bit atama sözdizimi.
(2) Kesinti etkinleştirme özeti
Programda bir kesme varsa, kesme tetiklenmeden önce etkinleştirilmelidir.
C51 kesme etkinleştirme sisteminin hiyerarşisi çok açıktır:
Interrupt Boss: EApatron mı, sorumluGenelKesinti Etkinleştir:
EA = 1;

  Her kesintiye uğrayan birim lideri: Sonraki her biri içinFonksiyonel parçalar(örneğin P0, zamanlayıcı 1 vb.), bu tür SFR'ler genellikle bit adreslenebilirdir ve isim genellikle IE (Kesme Etkinleştirme) içerir:
P0IE = 1;

  Her takım üyesi kesildi: Takım Ancak her özellik içinde birden fazla kesme olduğu için, son seviye buna aittirHer kesintiBu tür SFR genellikle bitsiz ve adreslenemezdir ve genellikle adında IE (Kesme Etkinleştirme) veya IM (Kesme Maskası) bulunur:
PICTL |=0x01;

SFR'yi ezbere kesmek zorunda değilsiniz, sadece hiyerarşisini anlayın ve sonra el kitabını veya başlık dosyasını araştırmak için zaman ayırın.
(3) Program yazımını kesin
Bir programda kesintilerin kullanımı genellikle iki bölümden oluşur: kesme hizmeti alt programının yazılması ve kesinti etkinleştirmesinin açılması. Kesme fonksiyonu yukarıda tanıtılmıştır ve aşağıda kesme hizmeti alt programının yazımına kısa bir giriş verilmiştir:
Önce belirtinKırılma vektörü, bu soru ioCC2430.h başlık dosyasının Kesme Vektörleri bölümünde aşağıdaki sözdizimi ile sorgulanabilir:
#pragma vektör = kesme vektörü

Hemen ardından kesme işleyicisini yazın, bu yapı şu şekilde yapılıyor:
__interrupt void fonksiyon adı (void)
  {
    //开中断
    //中断处理
    //中断标志清0
    //关中断
  }



3. Sonuç

Bu makale, CC2430 temelli basit harici kesintilerin uygulama yöntemini tanıtır ve kesmelerin temelinden sonra başka çok önemli bir modülü - zamanlayıcıları tanıtacağız. CC2430'un toplamda 4 zamanlayıcısı vardır ve bunlar üç kategoriye ayrılabilir: zamanlayıcı 1, zamanlayıcı 2, zamanlayıcı 3/4 (3 ve 4 temelde aynı kullanım).


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




Önceki:Zigbee Journey (2): İlk CC2430 programı - LED ışık yanıp sönme deneyi
Önümüzdeki:Zigbee Yolculuğu (4): Birkaç önemli CC2430 temel deneyi - zamanlayıcı kesintisi
Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com