Artikel ini adalah artikel cermin dari terjemahan mesin, silakan klik di sini untuk melompat ke artikel aslinya.

Melihat: 7368|Jawab: 0

Perjalanan Zigbee (3): Beberapa eksperimen dasar CC2430 penting - interupsi eksternal

[Salin tautan]
Diposting pada 30/10/2014 23.16.46 | | | |
1. Menghubungkan tingkat atas dan bawah

Dalam kuliah sebelumnya, kami membiasakan diri dengan proses dasar IAR mengembangkan program CC2430 melalui eksperimen berkedip LED sederhana. Pisaunya telah diasah (meskipun batu asah saya tidak bagus), dan sekarang saya akan mulai menyembelih serangga :). Selanjutnya, mari kita pelajari beberapa eksperimen dasar CC2430. Setiap eksperimen kecil dibagi menjadi tiga bagian: "Pengenalan Eksperimen", "Bagan Alur Program", dan "Kode Sumber dan Analisis Eksperimental".

Artikel ini menjelaskan interupsi eksternal.

2. Gangguan eksternal(1) Pengantar percobaan

Interupsi adalah mekanisme internal mikrokontroler untuk memproses peristiwa internal atau eksternal secara real time. Ketika peristiwa internal atau eksternal terjadi, sistem interupsi mikrokontroler akan memaksa CPU untuk menjeda program yang sedang dijalankan dan sebagai gantinya memproses peristiwa interupsi.

Interupsi dibagi menjadi interupsi eksternal dan internal, dan CC2430 berisi total 18 sumber interupsi (untuk deskripsi interupsi spesifik dan definisi vektor interupsi, silakan lihat "CC2430 Manual Bahasa Cina》)。

Sekarang mari kita lihat diagram sirkuit papan pengembangan ini:

Tombol S1 telah terhubung ke P0.1 pada papan pengembangan, dan efek dari percobaan ini adalah memicu interupsi P0.1 melalui tombol S1, dan kemudian mengontrol on/off LED1 di subprogram layanan interupsi.

(2) Prinsip eksperimental dan diagram alir

Bagan alir eksperimental adalah sebagai berikut:


(3) Kode sumber eksperimental//头文件
#include

//延时子函数
#defineLED1 P1_0
#defineLED2 P1_1
#defineLED3 P1_2
#defineLED4 P1_3

kosongPenundaan(tidak ditandatanganin)   
{
  tidak ditandatanganitt;
  untuk(tt =0; tt<n; tt++);
  untuk(tt =0; tt<n; tt++);
  untuk(tt =0; tt<n; tt++);
  untuk(tt =0; tt<n; tt++);
  untuk(tt =0; tt<n; tt++);
}

//32M晶振初始化
kosongxtal_init(kosong)
{
  TIDUR &= ~0x04;            //都上电
  sementara(! (TIDUR &0x40));     //晶体振荡器开启且稳定
  CLKCON &= ~0x47;           //Pilih osilator kristal 32MHz
  TIDUR |=0x04;
}

//LED灯初始化
kosongled_init(kosong)
{
  P1SEL =0x00;         P1 adalah port I/O normal
  P1DIR |=0x0F;         Keluaran P1.0 P1.1 P1.2 P1.3
  
  led1 = 0;
  led2 = 0;
  led3 = 0;
  led4 = 0;
}

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

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

//主函数
kosongutama(kosong)   
{
  xtal_init();
  led_init();  
  io_init();

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

//中断服务子程序
#pragma vektor = P0INT_VECTOR
__interrupt kosongP0_ISR(kosong)
{
  EA =0;                        Gerbang terputus  

  Penundaan(10000);  
  Penundaan(10000);
  Penundaan(10000);
  Penundaan(10000);
  Penundaan(10000);

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

  EA =1;                        //开中断
}

Pertama, inisialisasi jam sistem: pilih osilator kristal 32MHz.

Kemudian inisialisasi LED: atur P1 sebagai port I/O umum, atur arah P1.0 ~ P1.3 sebagai output, lalu matikan 4 lampu LED.

Selanjutnya, konfigurasikan register SFR yang relevan untuk interupsi eksternal untuk mengaktifkan interupsi di semua tingkatan, yang melibatkan 3 SFR:EAIEN1PICTL(Untuk detail setiap SFR, silakan lihatCC2430 Manual Bahasa Cina》):

EA- Mengaktifkan interupsi total;

    IEN1.5- P0 mengaktifkan interupsi;

    PICTL.3—— P0.1 interupsi port mengaktifkan;

    PICTL.0—— Atur drop edge input port P0.1 untuk menyebabkan pemicu interupsi.

Kemudian gunakan while(1) di fungsi utama dan tunggu interupsi.

CC2430 Tips
(1) Ringkasan sintaks penetapan bit
Sering kali, kita perlu menetapkan bit (0 atau 1) ke satu byte SFR untuk mengontrol perangkat keras secara tepat.
Ada SFRMendukung pengalamatan bitMisalnya, TCON, P0, dll., saat ini, penetapan counterpoint sangat sederhana, cukup kueri definisi bit di bagian SFR Bit Access dari file header ioCC2430.h:
P0_0 = 0; // tetapkan 0 ke digit pertama P0
P0_0 = 1; // tetapkan nilai 1 ke digit pertama P0  

Tetapi beberapa SFR tidak ada di sanaPengalamatan bit tidak didukung, seperti dalam percobaan iniPICTL, saat ini, Anda ingin menetapkan nilai ke salah satunya, sintaksnya adalah sebagai berikut:
PICTL &= ~0x01;   Tetapkan nilai 0 ke digit pertama
PICTL |= 0x01;     Tetapkan nilai 1 ke digit pertama

Anda dapat mengingat&= ~|=Dua sintaks penetapan bit yang umum digunakan ini.
(2) Ringkasan pemberdayaan interupsi
Ketika interupsi terlibat dalam program, itu harus diaktifkan sebelum interupsi dipicu.
Hierarki sistem pengaktifan interupsi C51 sangat jelas:
Mengganggu Bos: EAadalah bos, bertanggung jawabUmumAktifkan Interupsi:
EA = 1;

  Setiap pemimpin regu yang terputus: Berikutnya adalah untuk masing-masingBagian fungsional(seperti P0, timer 1, dll.), SFR tersebut umumnya dapat dialamatkan bit, dan namanya umumnya berisi IE (Interrupt Enable):
P0IE = 1;

  Setiap anggota tim diinterupsi: Squad Tetapi karena setiap fitur juga berisi beberapa interupsi di dalamnya, level terakhir adalah untuk iniSetiap interupsiJenis SFR ini umumnya bitless dan tidak dapat dialamatkan, dan biasanya berisi IE (Interrupt Enable) atau IM (Interrupt Mask) dalam nama:
PICTL |=0x01;

Tidak perlu menghafal interupsi SFR, cukup pahami hierarkinya dan kemudian luangkan waktu untuk mencari file manual atau header.
(3) Mengganggu penulisan program
Penggunaan interupsi dalam suatu program umumnya mencakup dua bagian: penulisan subprogram layanan interupsi dan pembukaan pemberdayaan interupsi. Fungsi interupsi telah diperkenalkan di atas, dan berikut ini adalah pengantar singkat untuk penulisan subprogram layanan interupsi:
Tentukan terlebih dahuluVektor putus, yang dapat dikueri di bagian Vektor Interupsi dari file header ioCC2430.h, dengan sintaks berikut:
#pragma vektor = vektor interupsi

Kemudian tulis penangan interupsi segera setelahnya, yang disusun sebagai berikut:
__interrupt nama fungsi void (void)
  {
    //开中断
    //中断处理
    //中断标志清0
    //关中断
  }



3. Kesimpulan

Artikel ini memperkenalkan metode implementasi interupsi eksternal sederhana berdasarkan CC2430, dan setelah dasar interupsi, kami akan memperkenalkan modul lain yang sangat penting - pengatur waktu. CC2430 memiliki total 4 pengatur waktu, yang dapat dibagi menjadi tiga kategori: pengatur waktu 1, pengatur waktu 2, pengatur waktu 3/4 (3 dan 4 pada dasarnya adalah penggunaan yang sama).


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




Mantan:Zigbee Journey (2): Program CC2430 pertama - eksperimen berkedip lampu LED
Depan:Perjalanan Zigbee (4): Beberapa eksperimen dasar CC2430 penting - interupsi pengatur waktu
Sanggahan:
Semua perangkat lunak, materi pemrograman, atau artikel yang diterbitkan oleh Code Farmer Network hanya untuk tujuan pembelajaran dan penelitian; Konten di atas tidak boleh digunakan untuk tujuan komersial atau ilegal, jika tidak, pengguna akan menanggung semua konsekuensi. Informasi di situs ini berasal dari Internet, dan sengketa hak cipta tidak ada hubungannya dengan situs ini. Anda harus sepenuhnya menghapus konten di atas dari komputer Anda dalam waktu 24 jam setelah pengunduhan. Jika Anda menyukai program ini, harap dukung perangkat lunak asli, pembelian pendaftaran, dan dapatkan layanan asli yang lebih baik. Jika ada pelanggaran, silakan hubungi kami melalui email.

Mail To:help@itsvse.com