Apakah saya benar dalam berpikir bahwa jika Anda memiliki dua pin yang menyebabkan interupsi AVR PCINT yang sama, (misalnya vektor PCINT0 disebabkan oleh pin PCINT0 atau PCINT1 - Saya pikir penamaan yang tumpang tindih antara vektor dan pin membingungkan) satu-satunya cara untuk menentukan pin mana (s) menyebabkan interupsi untuk merekam keadaan mereka setelah setiap interupsi dan membandingkan nilai sebelumnya dan saat ini dari semua pin yang diaktifkan di PCMSKn?
avr
interrupts
atmel
Tom Davies
sumber
sumber
Jawaban:
Ini!
Alasannya ada 8 pin eksternal yang berbeda untuk vektor interupsi adalah untuk memudahkan tata letak PCB atau menggunakan pin yang berbeda jika ada konflik dengan fungsi pin lainnya.
Cukup banyak, katakanlah Anda hanya peduli tentang PB0 (PCINT0) dan PB1 (PCINT1). Jadi perubahan pin memungkinkan mask PCMSK0 akan diatur ke 0x03.
Jadi jika
pins
0x01 Anda tahu itu PB0 ... Dan jika Anda perlu tahu apa yang berubah, Anda perlu membandingkannyapreviousPins
, persis seperti yang Anda pikirkan.Perlu diingat dalam beberapa kasus,
pins
mungkin tidak akurat jika pin telah berubah sejak interupsi tetapi sebelumnyapins = (PINB & 0x03)
.Pilihan lain adalah menggunakan vektor interupsi terpisah dengan satu pin dari masing-masing vektor sehingga Anda tahu mana yang diubah. Sekali lagi, ini juga memiliki beberapa masalah, seperti prioritas interupsi dan sekali CPU memasuki ISR, global interrupt mengaktifkan bit
I-bit
diSREG
akan dihapus sehingga semua interupsi lainnya dinonaktifkan, meskipun Anda dapat mengaturnya di dalam interupsi jika Anda inginkan, yang akan menjadi interupsi bersarang.Untuk informasi lebih lanjut, lihat catatan aplikasi Atmel Menggunakan Interupsi Eksternal untuk Perangkat megaAVR.
Memperbarui
Ini adalah contoh kode lengkap yang baru saya temukan di sini .
sumber
Pada seri ATTINY
INTFLAGS
register yang lebih baru akan memberi tahu Anda apa bit port yang menyebabkan interupsi.Berikut ini kutipan dari datasheet:
sumber