Saya telah menggunakan PIC16F877
( lembar data ) untuk beberapa proyek. Untuk interupsi penggantian pin eksternal tunggal, Anda dapat menggunakan PORTB0
interupsi. Tapi sekarang saya perlu mendukung 8 interupsi penggantian pin eksternal independen, dalam satu sirkuit.
Dalam datasheet dikatakan ada 15 interupsi PIC16F877
, tetapi saya kira itu dihitung termasuk timer overflow interupsi dll ... yang tidak berguna dalam kasus ini.
Inilah yang dikatakan lembar data tentang INTCON
daftar.
Bisakah saya memiliki 4 interupsi independen menggunakan bit0 RBIF
,? Ini mewakili perubahan PB7:PB4
. Bagaimana saya bisa mengidentifikasi pin mana yang berubah, apakah dengan membaca nilai port dalam rutin interupsi?
Bahkan saya mendapat jawaban positif di atas, saya butuh 8 interupsi? tentu saja saya masih bisa menggunakan INTE
, untuk PORTB0
perubahan. Lalu 4 + 1 = 5
, tapi bagaimana dengan 3 lainnya? (Namun karena semua 8 peristiwa interupsi memiliki tipe yang sama, 4 + 1 + 3 = 8
masalahnya tampak jelek, bukan?)
Tidak ada tugas berat lain yang diharapkan dari mikrokontroler lain yang memantau 8 pin. (Berbicara tentang tugas-tugas lain, itu harus mempertahankan satu set variabel penghitung yang terpisah dan sering mengirimkan sekitar 4 byte ke PC secara seri)
Setiap saran dipersilahkan. Bahkan jika itu tentang mengubah mikro-controller untuk yang lebih cocok (tapi uh .. jangan bilang pergi dari PIC
s).
sumber
Jawaban:
Ini adalah kode pseudo-C untuk menjelaskan satu ide. Menggunakan dan eksklusif ATAU untuk mengetahui pin mana yang telah berubah dan akan memanggil penangan Anda yang berbeda dalam satu interupsi RBIE. Bergantung pada seberapa kritisnya aplikasi ini, Anda mungkin ingin memeriksa bagaimana PIC menangani situasi seperti perubahan port saat interupsi dijalankan untuk memastikan Anda tidak akan melewatkan acara apa pun.
sumber
RB7:RB4
4 pin saja. Tapi saya meminta cara untuk memonitor 8 pin. ada saran?and four interrupts for the RB0:RB3
? PIC16F877 tidak mendukung gangguan apa punRB1:RB3
, eh?Bagian itu hanya memiliki 4 interupsi perubahan pin dan beberapa lainnya yang dapat Anda atur di tepi yang dipilih. Salah satu strategi adalah mendeteksi perubahan dalam nilai 8 bit secara eksternal, kemudian menyela ketidakcocokan. Itu menjadi berantakan di perangkat keras, tetapi akan jadi apa yang Anda inginkan.
Parameter penting yang belum Anda nyatakan adalah seberapa cepat Anda perlu merespons perubahan pin, dan berapa waktu minimum perubahan pin akan tetap berlaku. Tergantung pada jawabannya, Anda dapat memilih berdasarkan interupsi reguler dalam firmware. 16F877 dapat berjalan pada kecepatan instruksi 5 MHz, dan memeriksa perubahan hanya akan membutuhkan beberapa instruksi. Katakanlah Anda mengatur interupsi setiap 50 instruksi. Itu akan menyisakan sebagian besar waktu prosesor untuk kode latar depan. Tingkat interupsi akan menjadi 100 kHz dan periode 10 μs. Tentu saja kode latar depan masih perlu melihat bendera perubahan dan melakukan sesuatu tentang hal itu, sehingga waktu respons akan lebih dari 10 μs, tetapi Anda belum mengatakan apa-apa tentang apa yang perlu Anda lakukan ketika perubahan terdeteksi. Jika ini hanya perlu merespons dalam waktu manusia,
sumber
once per second
akan cukup. Ketika perubahan pin (hanya satu sisi, katakan naik) terdeteksi, penghitung (variabel) harus ditambahkan. Pada loop utama, ia harus memonitor nilai penghitung dan ketika seseorang mendapatkan lebih tinggi dari nilai tertentu, empat byte harus ditransmisikan melaluiUSART
PC. Kemudian atur ulang nilai penghitung yang relevan ke nol. Sederhana seperti itu. Saya kira opsi pemungutan suara akan berjalan dengan baik bukan?Anda dapat menggunakan gerbang input 8-NAND seperti yang disebutkan oleh @Brian Drummond untuk meningkatkan interupsi atas pin INT dan juga menghubungkan sumber interupsi Anda ke 8-Bit Parallel-In / Serial-Out Shift Register seperti "74HC165N", jadi Anda perlu hanya membaca data dari Shift Register itu setelah interupsi naik dan yang akan memberi Anda informasi tentang sumber interupsi Anda yang sebenarnya ... ini mungkin bukan cara tercepat, tetapi mudah diperluas dan akan menggunakan tidak lebih dari 5 pin, dan jika Anda menambahkan sistem pengontrol alamat (MUX, LATCH, ...), maka Anda hanya perlu satu pinus untuk pemberitahuan interupsi dan pin lainnya dapat digunakan kembali pada waktu yang berbeda untuk sumber daya yang berbeda;)
sumber