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

Melihat: 9371|Jawab: 0

Perjalanan Zigbee (9): Beberapa eksperimen dasar CC2430 yang penting - tidur sistematis dan terjaga yang terganggu

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

Pada artikel ini, kita akan membahas fungsi tidur dan metode bangun CC2430. Dalam penggunaan aktual, node CC2430 umumnya ditenagai oleh baterai, sehingga kontrol konsumsi dayanya sangat penting.

Berikut ini adalah kutipan dari manual Cina CC2430 untuk pengenalan 4 mode konsumsi daya CC2430:

Seperti yang Anda lihat dari tabel di atas, CC2430 memiliki total 4 mode daya:PM0(terjaga sepenuhnya),PM1(sedikit mengantuk),PM2(setengah terjaga dan setengah tertidur),PM3(Tidur sangat nyenyak). Semakin jauh ke belakang, semakin banyak fungsi yang dimatikan, dan konsumsi daya semakin rendah. Hubungan konversi di antara mereka adalah sebagai berikut:

menempatkanPM1、PM2BangunPM0, ada tiga cara: reset, gangguan eksternal, gangguan pengatur waktu tidur; Tapi letakkanPM3BangunPM0, hanya ada dua cara: reset, interupsi eksternal (ini karena diPM3Semua osilator berhenti bekerja, dan tentu saja pengatur waktu tidur dimatikan ~)

Mari kita lihat eksperimen kecil untuk memperkenalkan cara masuk ke mode tidur dan cara bangunPM0negara.

2. Tidur sistematis dan eksperimen bangun yang terganggu(1) Pengantar percobaaninisialisasi sistem, diPM0
→ masukPM1
→ Bangun dengan pengatur waktu tidur setelah 1 detikPM0
→ masukPM2
→ dibangunkan oleh pengatur waktu tidur setelah 2 detikPM0
→ masukPM3
→ Tunggu hingga tombol S1 ditekan, memicu interupsi eksternal dan bangunPM0
(2) Bagan alir program

(Catatan: Kotak bulat pada gambar di atas menunjukkan status kesehatan sistem)

(3) Kode sumber eksperimental dan analisis (Kotak-kotak berikut dapat diklik~File header dan definisi makro[url =] [/url]
/*
    Deskripsi eksperimental: Eksperimen tidur bangun yang terputus, yang memperkenalkan terjaga dalam tiga mode tidur
*/

#include
#define LED_ON 0
#define LED_OFF 1#defineLED1 P1_0         
#defineLED2 P1_1         
#defineLED3 P1_2         
#defineLED4 P1_3   [url =] [/url]

Subfungsi[url =] [/url]
/*Inisialisasi jam sistem
-------------------------------------------------------
*/
kosongxtal_init(kosong)
{
  TIDUR &= ~0x04;            //Semua bertenaga
  sementara(! (TIDUR &0x40));     //Osilator kristal menyala dan stabil
  CLKCON &= ~0x47;         //Pilih osilator kristal 32MHz
  TIDUR |=0x04;
}


/*Inisialisasi LED
-------------------------------------------------------
*/
kosongled_init(kosong)
{
  P1SEL =0x00;         //P1 adalah port I/O normal
  P1DIR |=0x0F;         //Keluaran P1.0 P1.1 P1.2 P1.3
  
  led1 = LED_OFF;         //Matikan semua LED
  led2 = LED_OFF;
  led3 = LED_OFF;
  led4 = LED_OFF;
}


/*Inisialisasi interupsi eksternal
-------------------------------------------------------
*/
kosongio_init(kosong)
{
    P0INP &= ~0X02;   //P0.1 memiliki pull-up dan pull-down

    EA =1;           //Gangguan total yang diizinkan
   
    IEN1 |=  0X20;   //P0IE = 1, P0 mengaktifkan interupsi
   
    PICTL |=  0X09;   //P0.1 memungkinkan interupsi, pemicu tepi jatuh
   
    P0IFG &= ~0x02;   //P0.1 Tanda interupsi jelas0
}


/*Inisialisasi interupsi pengatur waktu tidur
-------------------------------------------------------
*/
kosongsleepTimer_init(kosong)
{
  STIF=0;   //Tanda interupsi pengatur waktu tidur jelas 0
   
  STIE=1;   //Nyalakan pengatur waktu tidur terputus
   
  EA =1;     //Buka interupsi total
}


/*Atur interval terjadwal untuk pengatur waktu tidur
-------------------------------------------------------
*/
kosongsetSleepTimer(tidak ditandatanganiintdetik)
{
  tidak ditandatanganipanjangsleepTimer =0;
  
  sleepTimer |= ST0;                     //Dapatkan nilai hitungan pengatur waktu tidur saat ini
  sleepTimer |= (tidak ditandatanganipanjang)ST1 <<8;
  sleepTimer |= (tidak ditandatanganipanjang)ST2 <<16;
  
  sleepTimer += ((tidak ditandatanganipanjang)sec * (tidak ditandatanganipanjang)32768);   //Ditambah durasi waktu yang diperlukan
  
  ST2 = (tidak ditandatanganiarang)(sleepTimer >>16);   //Atur nilai perbandingan pengatur waktu tidur
  ST1 = (tidak ditandatanganiarang)(sleepTimer >>8);
  ST0 = (tidak ditandatanganiarang)pengatur waktu tidur;
}


/*Pilih Mode Daya
-------------------------------------------------------
*/
kosongPowerMode(tidak ditandatanganiarangmode)
{
  jika(mode <4)
  {
    TIDUR &=0xfc;      //Hapus SLEEP.MODE ke 0
    TIDUR |= mode;      //Pilih Mode Daya
    PCON |=0x01;        //Aktifkan mode daya ini
  }
}


/*Fungsi penundaan
-------------------------------------------------------
*/
kosongPenundaan(tidak ditandatanganiintn)
{
  tidak ditandatanganiinti,j;
  untuk(i=0; i<n; i++)
    untuk(j=0; j <1000; j++);
}
[url =] [/url]

Fungsi utama[url =] [/url]
/*Fungsi utama
-------------------------------------------------------
*/
kosongutama(kosong)
{
  xtal_init();         
  led_init();         
  
  //Status PM0, lampu menyala dan menunda
  led1 = LED_ON;         //Kecerahan LED1 menunjukkan bahwa sistem bekerja dalam mode PM0
  Penundaan(10);


  //Status PM1, lampu mati
  setSleepTimer(1);      //Atur interval waktu pengatur waktu tidur ke 1 detik
  sleepTimer_init();     //Nyalakan pengatur waktu tidur terputus
  led1 = LED_OFF;
  Mode Kekuasaan(1);         //Atur mode daya ke PM1
  
  
//Setelah 1 detik, PM1 memasuki PM0, menyala dan menunda
  led1 = LED_ON;
  Penundaan(50);
  
  //PM2, lampu mati
  setSleepTimer(2);      //Atur interval waktu untuk pengatur waktu tidur ke 2 detik
  led1 = LED_OFF;
  Mode Kekuasaan(2);         //Atur mode daya ke PM2


  
//Setelah 2 detik, PM2 memasuki PM0, menyala dan tertunda
  led1=0;
  Penundaan(50);
  
  //PM3, lampu padam  
  io_init();            //Menginisialisasi interupsi eksternal
  led1 = LED_OFF;
  Mode Kekuasaan(3);         //Atur mode daya ke PM3
  
  
//Ketika gangguan eksternal terjadi, PM3 memasuki PM0 dan menyala
  led1 = LED_ON;

  sementara(1);
}
[url =] [/url]

Prosedur layanan interupsi[url =] [/url]
/*Program layanan interupsi eksternal
-------------------------------------------------------
*/
#pragmavektor = P0INT_VECTOR
__interruptkosongP0_ISR(kosong)
{
  EA =0;                        //Gerbang terputus
  
  Penundaan(50);

  jika((P0IFG &0x02) >0)         //Kunci terputus
  {
    P0IFG &= ~0x02;               //P0.1 Tanda interupsi jelas0
  }
  P0JIKA =0;                       //Tanda interupsi P0 jelas0


  EA =1;                        //Interupsi terbuka
}


/*Pengatur waktu tidur mengganggu program servis
-------------------------------------------------------
*/
#pragmavektor= ST_VECTOR
__interruptkosongsleepTimer_IRQ(kosong)
{
  EA =0;     //Gerbang terputus
   
  STIF=0;   //Tanda interupsi pengatur waktu tidur jelas 0
  
  EA =1;     //Interupsi terbuka
}
[url =] [/url]

Cara menggunakan pengatur waktu tidur untuk membangunkan sistem dapat diringkas sebagai berikut:Buka Interupsi Pengatur Waktu Tidur → Atur Interval Waktu Tidur → Atur Mode Daya

(Catatan: langkah "Atur Interval Pengatur Waktu Tidur" harus sebelum "Atur Mode Daya", karena sistem tidak akan terus menjalankan program setelah memasuki tidur)

Selanjutnya, mari kita fokus pada subfungsi yang mengatur interval pengatur waktu tidur:setSleepTimer

Pertama-tama, pengenalan singkat tentang pengatur waktu tidur: itu berjalan32.768kHzdariTempat ke-24Timer, saat sistem berjalanSelain PM3Di semua mode daya, pengatur waktu tidur akanPengoperasian tanpa gangguan

Register yang digunakan oleh pengatur waktu tidur adalah:ST0ST1ST2。 Berikut ini adalah pengantar terperinci tentang fungsinya dari manual bahasa Cina CC2430:

Dapat dilihat bahwa fungsinya mencakup dua aspek:BacaTulis

  Baca: Digunakan untuk membaca nilai hitungan pengatur waktu saat ini, urutan pembacaan harus diikuti:Baca ST0 → Baca ST1 → Baca ST2

  Tulis: Digunakan untuk mengatur nilai perbandingan timer (ketika nilai hitungan timer = nilai perbandingan, interupsi terjadi), urutan penulisan harus mengikuti:Tulis ST2 → tulis ST1 → tulis ST0

Oke, mari kita jelaskan dalam kombinasi dengan kode sumber:

(1) Pertama, tentukan sleepTimer variabel panjang yang tidak ditandatangani (32-bit) untuk menerima nilai hitungan saat ini dari pengatur waktu tidur:

  tidak ditandatanganipanjangsleepTimer =0;
  
  sleepTimer |= ST0;                     //Dapatkan nilai hitungan pengatur waktu tidur saat ini
  sleepTimer |= (tidak ditandatanganipanjang)ST1 <<8;
  sleepTimer |= (tidak ditandatanganipanjang)ST2 <<16;

(2) Kemudian tambahkan interval waktu yang diperlukan:

  sleepTimer += ((tidak ditandatanganipanjang)sec * (tidak ditandatanganipanjang)32768);   //Ditambah durasi waktu yang diperlukan

Berikut penjelasannya singkat:

Mengapa 1s mewakili 32768? Karena timer bekerja di bawah 32.768kHz, dibutuhkan 1/32768 detik untuk setiap 1 yang ditambahkan ke timer; Tambahkan 32768, dan Anda akan membutuhkan 1 detik;

(3) Terakhir, nilai sleepTimer digunakan sebagai nilai perbandingan timer:

  ST2 = (tidak ditandatanganiarang)(sleepTimer >>16);   //Atur nilai perbandingan pengatur waktu tidur
  ST1 = (tidak ditandatanganiarang)(sleepTimer >>8);
  ST0 = (tidak ditandatanganiarang)pengatur waktu tidur;

Dengan cara ini, Anda dapat berhasil mengatur periode waktu pengatur waktu~

(Catatan: Adapun bagian lain dari kode sumber, saya percaya bahwa dikombinasikan dengan anotasi terperinci, Anda dapat dengan mudah memahami, dan saya tidak akan mengulanginya di sini)

(4) Hasil eksperimen
Program berjalan, mengamati LED1, fenomenanya adalah:LED1 berkedip (yaitu, hidup-> mati 1 kali), berkedip lagi setelah 1 detik, berkedip lagi setelah 2 detik, lalu tetap mati, lalu menekan S1, LED1 menyala.
Fenomena eksperimental sepenuhnya konsisten dengan harapan, Lebih ~

3. Kesimpulan

Oh ~ Setelah meluangkan waktu luang selama 2 hari, akhirnya saya mendapatkan log ini. Saya benar-benar menemukan bahwa menulis blog, terutama posting blog yang "ramah pembaca", memang merupakan pekerjaan fisik: ketelitian, estetika, logika... Ini semua tentang pertimbangan.

Setiap kali saya memposting kode, saya pikir itu terlalu panjang, tetapi saya enggan menggunakan alat lipat yang disertakan dengan taman blog. Oleh karena itu, dalam posting blog ini, penulis secara tentatif menambahkan beberapa elemen JQuery untuk mencapai pelipatan kode yang mulus, dan masih ada sedikit rasa pencapaian, hehe (Pemula JQuery, jangan menertawakan master~). Tapi saya tidak tahu apakah ini benar-benar meningkatkan keterbacaan artikel, dan pembaca serta teman dipersilakan untuk berkomentar:)

Bulan ini, penulis benar-benar memutuskan untuk berakar di taman blog, jadi saya menghabiskan banyak waktu luang untuk menulis posting blog. Ketika saya menulis blog untuk pertama kalinya, meskipun hanya ada sedikit komentar, sebagian besar log memiliki rasio klik-tayang lebih dari 500, yang merupakan sedikit dorongan bagi saya! Memang dibutuhkan keberanian untuk mempublikasikan konten tentang mikrokontroler di taman blog, tetapi saya akan berpegang teguh padanya~

Sembilan posting blog dari awal hingga saat ini berfokus pada penggunaan modul perangkat keras dasar pada chip CC2430. Sejauh ini, kami pada dasarnya telah melalui sebagian besar periferal pada CC2430, tetapi masih ada hal-hal seperti akses Flash, generator nomor acak, koprosesor AES, komunikasi RF, dll., yang belum disentuh. Namun, perjalanan Zigbee belum berakhir, dan penulis bermaksud untuk secara selektif mengisi kelalaian ini di topik berikutnya (implementasi protokol Z-Stack).

Dalam posting blog berikutnya, saya berencana untuk mengakhiri perjalanan pertama Zigbee dengan eksperimen yang sedikit lebih komprehensif dan diperluas - "sistem pemantauan suhu", dan menjelaskan cara menerapkan poin-poin pengetahuan yang dipelajari sebelumnya secara komprehensif.

Bahkan, tidak memenuhi syarat untuk disebut "PenjelasanSebagai pemula, penulis hanya berharap dapat saling mendorong dan membuat kemajuan bersama dalam proses penulisan gelar doktor!


</n; i++)




Mantan:Perjalanan Zigbee (8): Beberapa eksperimen dasar CC2430 penting - pengawas
Depan:Zigbee Journey (10): Eksperimen Komprehensif - Sistem Pemantauan Suhu Berdasarkan CC2430
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