* NIP - Inti Periferal Independen dalam mikrokontroler Microchip, juga dikenal sebagai CIP - Inti Periferal Independen.
Bagian 4
Artikel sebelumnya [
1 ], [
2 ] dan [
3 ] dikhususkan untuk Mikrokontroler Microchip Periferal Core Independen (NEV): sel logika yang dapat dikonfigurasi, port input / output dengan fungsi pembatas saat ini, dan ADC dengan komputer, beberapa fitur perangkat seperti itu diperlihatkan. Biarkan saya mengingatkan Anda bahwa independensi tersirat bukan dari jenis inti PIC mikrokontroler (BaseLine, Mid-Range, Enhanced Mid-Range, PIC18, 16-, 32-bit), tetapi dari operasi inti, mis. pelaksanaan tugas-tugas yang ditugaskan secara independen ke pinggiran status CPU. Periferal seperti itu, dan khususnya kemungkinan mengkonfigurasinya untuk kolaborasi dan sintesis fungsi perangkat keras, dirancang untuk melepaskan komponen perangkat lunak dan mengurangi konsumsi daya.
Dalam artikel singkat ini saya ingin menunjukkan contoh implementasi penerimaan "custom", antarmuka komunikasi non-standar menggunakan Peripherals Independent of the Kernel.
Pengkodean informasi PWM sangat umum ketika sinyal diskrit, log. 1 dan log. 0, dikodekan oleh lebar pulsa. Pertimbangkan opsi untuk menerima dan mendekode sinyal tersebut menggunakan pengontrol PIC Periferal Inti-Independen.
Decoding PWM dari Sinyal Sensor AM2302
Dalam proyek DIY, sensor suhu dan kelembaban DHT22 (AM2302) sering digunakan. Sensor memiliki 3 output, informasi ditransmisikan melalui satu kabel. Menanggapi permintaan (level rendah dengan durasi sekitar 1 ms), sensor merespons dengan bit awal, dan kemudian urutan 40 bit, di mana informasi dikodekan dalam durasi pulsa: log. "0" - impuls 30mk dtk, log. "1" - 70mk dtk (nilai tipikal). Respons dari sensor berisi 5 byte: 2 kelembaban data, 2 byte suhu dan 1 byte kontrol.
Fig. 1. Penjelasan prinsip pembuatan sinyal sensor DHT22.Jaringan memiliki banyak contoh bekerja dengan sensor seperti itu di Arduino. Beberapa implementasi perpustakaan menggunakan konstruksi seperti:
loopCnt = TIMEOUT; while(PIN) { if(--loopCount == 0) return ErrorTimeout; } if (loopCnt < cntOne) { // bit =1 … } else { // bit =0 … }
Dalam implementasi seperti itu, saya melihat masalah berikut:
- program untuk seluruh waktu pengukuran (> 5 ms) "hang" dalam kode pengukuran;
- terjadinya interupsi yang cukup lama akan mengganggu pembacaan data dari sensor;
- potensi masalah dengan bekerja pada frekuensi clock rendah mikrokontroler;
Algoritme program dari solusi tersebut kira-kira memiliki bentuk berikut (lihat Gambar. 2)
Fig. 2. Algoritma untuk menerima dan mendekode sinyal sensor secara terprogram.Di bawah ini dianggap varian dari penerimaan perangkat keras / decoding protokol dengan overhead perangkat lunak minimal.
Idenya adalah untuk mengisolasi pulsa clock dari bitstream, diikuti oleh arah sinyal asli dan clock pulse ke modul perangkat keras SPI. Dalam hal ini, program mikrokontroler hanya dapat mengambil 5 byte data secara berurutan dari SPI.
Bagian dari CIP adalah timer dengan kemampuan untuk memicu peristiwa (perubahan status input atau perangkat lain). Yaitu mengubah status input dapat memicu timer, lihat sinyal TMR6 pada Gambar. 3. Ketika penghitung waktu mencapai nilai yang ditetapkan, penghitungannya berhenti dan penghitung waktu berada dalam status TMR6 = PR6 (daftar periode PR). Status pengatur waktu dapat menjadi input untuk Configurable Logic Cell (CLC, lihat bagian 1).
Dengan demikian, menggunakan pengatur waktu dan Sel Logika, kita dapat menghasilkan sinyal yang cocok untuk diterapkan pada input jam SCK dari modul SPI. Untuk mengekstraksi informasi, durasi blok tersebut harus memiliki nilai rata-rata antara durasi nol dan satu. Kemudian SPI dapat memperbaiki bit sesuai dengan pembusukan blok (lihat Gambar. 3 sinyal SCK).
Sinyal dari sensor akan memiliki pulsa palsu yang dihasilkan dari permintaan dan mulai pulsa. Agar pulsa ini tidak mengganggu operasi, Anda harus mengaktifkan SPI hanya selama durasi pulsa informasi, atau memotong pulsa yang tidak perlu. Kami juga dapat mengatasi masalah ini menggunakan CIP.
Timer lain berfungsi sebagai penghitung pulsa dengan mengalihkan resesi: tulis angka 2 pada register periode, timer menghitung 2 pulsa pertama (lihat sinyal TMR4 pada Gambar 3) dan menghentikan penghitungan (lihat sinyal EN pada Gambar 3), yang melalui blok sel logis memungkinkan penerbitan pulsa yang tersisa ke input SPI.
Fig. 3. Diagram yang menjelaskan penerimaan sinyal sensor DHT22.Fungsi logis dari pembangkitan sinyal SCK diimplementasikan pada satu sel logis (CLC), rangkaian lengkap dalam konfigurasi AND-OR ditunjukkan pada Gambar. 4.
Output dari sel logika terhubung ke input SCK, dan sinyal sensor DHT22 terhubung ke MOSI dari modul SPI. Semua koneksi dibuat di dalam mikrokontroler (Gbr. 5). Untuk pemantauan dan debugging, sinyal dapat di-output ke port-port mikrokontroler.
Fig. 4. Konfigurasi sel logika CLC dalam mikrokontroler PIC.Fig. 5. Struktur lengkap konfigurasi pinggiran.Jika tampaknya 2 timer untuk tugas mendekode protokol sensor adalah pemborosan sumber daya, maka penghitung hingga dua dapat "dikumpulkan" pada sel logis CLC gratis.
Secara total, tugas decoding turun ke algoritma yang sangat sederhana: mikrokontroler dan periferalnya diinisialisasi, jika perlu, modul SPI dihidupkan dan permintaan pengukuran dihasilkan (log. "0" untuk ~ 1ms).
Tetap membaca data dari buffer ketika interupsi dari SPI terjadi.
Fig. 6. Algoritma untuk bekerja dengan sensor DHT22 saat menggunakan tunggul.
Gbr. 7. Sinyal dari port mikrokontroler. Signal SSP1IF - gangguan pada penerimaan byte oleh modul SPI.Gambar 7 menunjukkan diagram sinyal, di mana:
DHT (dat) - sinyal pada garis sinyal sensor - diumpankan ke input modul MOSI SPI;
TMR6! = RP6 - jam khusus - kirim ke SCK modul SPI;
SSP1IF - sinyal interupsi (kesiapan data dalam buffer SPI) - pada kenyataannya, sinyal ini menunjukkan beban inti mikrokontroler - membaca data hasil.
Decoding protokol PWM lainnya
Protokol PWM "kawat tunggal" yang serupa digunakan dalam kendali jarak jauh IR untuk peralatan rumah tangga. Seringkali selama transmisi IR, pengkodean dengan posisi pulsa digunakan ketika durasinya konstan dan jeda bervariasi. Opsi ini juga disebut "Variable Pause Encoding". Bahkan, ini adalah pengkodean PWM yang sama, tetapi dengan sinyal terbalik. Di hadapan sel-sel logis, inversi bukan masalah, apalagi, penerima IR membalikkan sinyal yang diterima. Dalam gbr. Gambar 8 menunjukkan sinyal setelah penerima menerima dari dua konsol yang berbeda.

Gbr. 8. Opsi pengkodean untuk kontrol jarak jauh IR.Kedua konsol memiliki protokol yang berbeda, tetapi protokol ini mudah didekodekan dengan cara yang dijelaskan di atas, satu-satunya hal adalah bahwa perlu untuk menentukan awal pengiriman untuk menyinkronkan dimasukkannya SPI, karena penerima IR dapat menangkap gangguan.

Fig. 9. Sinyal diterjemahkan menggunakan SPI.Tidak semua remote control IR memiliki encoding PWM. Beberapa protokol, misalnya RC5, memiliki pengkodean fase (kode Manchester, "0" ditransmisikan sebagai 10, dan "1" sebagai 01) [4]. Penguraian kode Manchester menggunakan pinggiran kernel independen yang telah kita bahas sebelumnya di bagian pertama [1].
Ringkasan
Alih-alih hampir 100% dari beban CPU mikrokontroler untuk tugas mendekode protokol PWM dalam versi Arduino (ya, saya tahu, masalahnya dapat diselesaikan secara lebih efisien menggunakan modul tangkap atau perangkat lain), kami mentransfer penerimaan paket informasi ke perangkat keras. Bagian depan sinyal input mulai timer, status timer menentukan output dari blok sel logis, output dari sel logis diumpankan ke SPI.
Penggunaan periferal yang tidak tergantung pada inti memungkinkan optimalisasi penggunaan sumber daya, mentransfer beberapa tugas ke perangkat keras, menyederhanakan kode, dan mengurangi konsumsi.
Sastra
1.
Sel Log yang Dapat Dikonfigurasi dalam pengontrol PIC.2.
50 warna tunggul. Port input / output3.
50 warna tunggul. ADC dan ADC dengan komputer mikrokontroler Microchip4.
sbprojects.com/knowledge/ir/rc5.php