- Mengapa Kita Perlu Interupsi?
- Jenis Interupsi di MSP430
- Kontrol Program Interupsi di MSP430
- Sirkuit MSP430 untuk Menguji Interupsi GPIO
- Pemrograman MSP430 untuk Interupsi
- Mengupload Program ke MSP430 dari CCS
- Program Interupsi di MSP430
Bayangkan jam tangan digital sederhana yang diprogram hanya untuk menunjukkan waktu, sekarang bayangkan Anda ingin mengubah zona waktunya. Apa yang akan kamu lakukan? Anda cukup menekan tombol yang berubah ke menu yang memungkinkan Anda mengubah zona waktu. Di sini, sistem tidak dapat memprediksi interupsi eksternal Anda ke proses pencatatan waktu dan tidak dapat meminta Anda untuk menunggu karena sibuk menambah nilai detik pada jam tangan Anda. Di sinilah interupsi berguna.
Interupsi tidak selalu bersifat eksternal; itu bisa internal juga. Sering kali dalam interupsi Tertanam juga memfasilitasi komunikasi antara dua periferal CPU. Pertimbangkan pengatur waktu pra-setel disetel ulang dan interupsi dipicu ketika waktu mencapai nilai dalam register pengatur waktu. Penangan interupsi dapat digunakan untuk memulai periferal lain seperti DMA.
Dalam tutorial ini, kami telah menggunakan interupsi eksternal pada MSP430 untuk mengaktifkan LED yang berbeda. Ketika interupsi eksternal diberikan oleh perubahan status menggunakan tombol-tekan, kontrol ditransfer (dikosongkan) ke ISR dan itu melakukan yang diperlukan. Untuk mengetahui dasar-dasar seperti pengaturan lingkungan CCS untuk launchpad MSP430G2, ikuti tautan ini untuk memulai dengan MSP430 menggunakan CCS karena kami tidak akan membahasnya secara detail dalam tutorial ini. Periksa juga tutorial berbasis MSP430 lainnya menggunakan Energia IDE dan CCS dengan mengikuti tautan.
Mengapa Kita Perlu Interupsi?
Interupsi diperlukan untuk menghemat overhead polling dalam sistem tertanam. Mereka dipanggil saat tugas dengan prioritas lebih tinggi diperlukan untuk dijalankan dengan mendahului tugas yang sedang berjalan. Ini juga dapat digunakan untuk membangunkan CPU dari mode daya rendah juga. Ketika dibangunkan oleh transisi tepi sinyal eksternal melalui port GPIO, ISR dijalankan dan CPU kembali ke Mode Daya Rendah.
Jenis Interupsi di MSP430
The menyela di MSP430 datang di bawah jenis- berikut
- Atur Ulang Sistem
- Interupsi Non-Maskable
- Interupsi Maskable
- Interupsi Vektor dan Non-Vektor
Atur Ulang Sistem:
Ini dapat terjadi karena tegangan suplai (Vcc) dan karena sinyal rendah pada pin RST / NMI dengan mode Reset dipilih dan juga dapat terjadi karena alasan seperti pengatur waktu pengawas overflow dan pelanggaran kunci keamanan.
Interupsi Non-Maskable:
Interupsi ini tidak dapat ditutupi oleh instruksi CPU. Setelah General Interrupt diaktifkan, non-maskable interrupt tidak dapat dialihkan dari pemrosesan. Ini dihasilkan oleh sumber seperti kesalahan Osilator dan tepi yang diberikan secara manual ke RST / NMI (dalam mode NMI).
Interupsi Maskable:
Ketika interupsi terjadi dan jika dapat ditutup oleh instruksi CPU, maka itu adalah Interupsi Maskable. Mereka tidak perlu selalu eksternal. Mereka juga bergantung pada periferal dan fungsinya. Interupsi port eksternal yang digunakan di sini termasuk dalam kategori ini.
Interupsi Vektor dan Interupsi Non-Vektor:
Vectored: Dalam kasus ini, perangkat yang mengganggu memberi kami sumber interupsi dengan meneruskan alamat vektor interupsi. Di sini alamat ISR ditetapkan dan kontrolnya ditransfer ke alamat itu dan ISR akan mengurus sisanya.
Non-Vectored: Di sini semua interupsi memiliki ISR yang sama. Ketika interupsi terjadi dari sumber non-vektor, kontrol ditransfer ke alamat umum, tempat semua interupsi Non-vektor berbagi.
Kontrol Program Interupsi di MSP430
Ketika interupsi terjadi, MCLK dihidupkan dan CPU dipanggil kembali dari keadaan OFF. Karena kontrol program dipindahkan ke alamat ISR setelah terjadinya interupsi, nilai dalam pencacah program dan register status dipindahkan ke stack.
Secara berurutan, Status Register dihapus, dengan demikian menghapus GIE dan menghentikan mode daya rendah. Interupsi dengan prioritas tertinggi dipilih dan dijalankan dengan menempatkan alamat vektor interupsi di penghitung program. Sebelum kita sampai ke Kode Contoh Interupsi MSP430 GPIO, penting untuk memahami cara kerja register Port yang terlibat di dalamnya.
Port Register untuk Kontrol GPIO pada MSP430:
PxDIR: Ini adalah register kendali arah pelabuhan. Hal ini memungkinkan programmer untuk secara khusus memilih fungsinya dengan menulis 0 atau 1. Jika pin dipilih sebagai 1, maka ia bertindak sebagai output. Pertimbangkan port 1 sebagai port 8-bit, dan jika pin 2 dan 3 akan ditetapkan sebagai port keluaran, maka register P1DIR harus disetel dengan nilai 0x0C.
PxIN: Register ini hanya read only dan nilai saat ini di port dapat dibaca menggunakan register ini.
PxOUT: Register khusus ini dapat digunakan untuk menulis nilai ke port secara langsung. Ini hanya mungkin jika register pullup / pulldown dinonaktifkan.
PxREN: Ini adalah register 8-bit yang digunakan untuk mengaktifkan atau menonaktifkan register pullup / pulldown. Jika sebuah pin disetel sebagai 1 di register PxREN dan PxOUT, maka pin tersebut ditarik ke atas.
PxDIR |
PxREN |
PxOUT |
Konfigurasi I / O |
0 |
0 |
X |
Input dengan resistor dinonaktifkan |
0 |
1 |
0 |
Input dengan pull-down internal diaktifkan |
0 |
1 |
1 |
Masukan dengan pullup internal diaktifkan |
1 |
X |
X |
Output - PxREN tidak berpengaruh |
PxSEL dan PxSEL2: Karena semua pin pada MSP430 memiliki multipleks, fungsi tertentu harus dipilih sebelum digunakan. Jika register PxSEL dan PxSEL2 ditetapkan sebagai 0 untuk pin tertentu, maka I / O serba guna dipilih. Jika PxSEL disetel ke 1, fungsi periferal primer dipilih, dan seterusnya.
PxIE: Ini mengaktifkan atau menonaktifkan interupsi untuk pin tertentu di port x.
PxIES: Memilih tepi di mana interupsi dihasilkan. Untuk 0, tepi naik dipilih dan untuk 1, tepi jatuh dipilih.
Sirkuit MSP430 untuk Menguji Interupsi GPIO
Sirkuit MSP430 yang digunakan untuk menguji kode Contoh Interupsi MSP430 kami ditunjukkan di bawah ini.
Tanah papan digunakan untuk membumikan LED dan tombol. Sisi yang berlawanan secara diagonal dari tombol tekan biasanya merupakan terminal terbuka dan terhubung saat tombol tekan ditekan. Sebuah resistor dihubungkan sebelum LED untuk menghindari konsumsi arus tinggi oleh LED. Biasanya, resistor rendah dalam kisaran 100ohm - 220ohm digunakan.
Kami menggunakan 3 kode berbeda untuk mendapatkan pemahaman yang lebih baik tentang port Interrupts. Dua kode pertama menggunakan sirkuit yang sama seperti pada Diagram Sirkuit 1. Mari kita selami kodenya. Setelah koneksi dibuat, pengaturan saya terlihat seperti ini.
Pemrograman MSP430 untuk Interupsi
Program Interupsi MSP430 lengkap dapat ditemukan di bagian bawah halaman ini, penjelasan kodenya adalah sebagai berikut.
Baris di bawah ini menghentikan pengatur waktu pengawas dari operasi. Timer pengawas biasanya melakukan dua operasi. Salah satunya adalah mencegah pengontrol dari loop tak terbatas dengan mengatur ulang pengontrol dan yang lainnya adalah memicu peristiwa berkala menggunakan pengatur waktu bawaan. Saat mikrokontroler disetel ulang (atau dinyalakan), ia berada dalam mode pengatur waktu dan cenderung menyetel ulang MCU setelah 32 milidetik. Baris ini menghentikan pengontrol dari melakukan itu.
WDTCTL = WDTPW + WDTHOLD;
Mengatur register P1DIR ke nilai 0x07 mengatur arah pin0, pin1, dan pin2 sebagai output. Mengatur P1OUT ke 0x30 akan mengkonfigurasinya sebagai input dengan resistor pullup internal yang diaktifkan pada pin4 dan pin5. Pengaturan P1REN ke 0x30 memungkinkan penarikan internal pada pin ini. P1IE mengaktifkan interupsi, di mana P1IES memilih transisi tinggi ke rendah sebagai tepi interupsi pada pin ini.
P1DIR - = 0x07; P1OUT = 0x30; P1REN - = 0x30; P1IE - = 0x30; P1IES - = 0x30; P1IFG & = ~ 0x30;
Baris berikutnya mengaktifkan mode daya rendah dan mengaktifkan GIE dalam register status sehingga interupsi dapat diterima.
__bis_SR_register (LPM4bits + GIE)
Penghitung program diatur dengan alamat vektor port 1 menggunakan makro.
PORT1_VECTOR . #pragma vector = PORT1_VECTOR __interrupt void Port_1 (batal)
Kode di bawah ini mengaktifkan setiap LED yang terhubung ke pin0, pin1, pin2 satu per satu.
jika (hitung% 3 == 0) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; hitung ++; } lain jika (hitung% 3 == 1) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; hitung ++; } lain { P1OUT ^ = BIT2; P1IFG & = ~ 0x30; hitung ++; }
Diagram Sirkuit 2:
Demikian pula, mari kita coba pin lain untuk memahami konsep dengan lebih baik. Jadi di sini tombol tekan terhubung ke pin 2.0, bukan ke pin 1.5. sirkuit yang dimodifikasi adalah sebagai berikut. Sekali lagi sirkuit ini digunakan untuk menguji program interupsi tombol MSP430.
Di sini port 2 digunakan untuk input. Jadi vektor interupsi yang berbeda harus digunakan. P1.4 dan P2.0 mengambil input.
Karena port 2 hanya digunakan untuk input, P2DIR diatur sebagai 0. Untuk mengatur pin0 dari port 2 sebagai input dengan resistor pull-up internal diaktifkan, register P2OUT dan P2REN harus diatur dengan nilai 1. Untuk mengaktifkan interupsi pada pin0 port 2 dan juga untuk memilih tepi interupsi, P2IE dan P2IES diatur dengan nilai 1. Untuk mereset flag pada port 2, P2IFG dihapus, sehingga flag dapat diset lagi pada terjadinya interupsi.
P2DIR - = 0x00; P2OUT = 0x01; P2REN - = 0x01; P2IE - = 0x01; P2IES - = 0x01; P2IFG & = ~ 0x01;
Ketika sumber interupsi dari port 1, maka LED yang terhubung ke pin1 dari port 1 menyala. Ketika sumber interupsi milik port 2, maka LED yang terhubung ke pin2 port 1 menyala.
#pragma vector = PORT1_VECTOR __interrupt void Port_1 (void) { P1OUT ^ = BIT1; P1IFG & = ~ 0x10; untuk (i = 0; i <20000; i ++) { } P1OUT ^ = BIT1; } #pragma vector = PORT2_VECTOR __interrupt void Port_2 (void) { P1OUT ^ = BIT2; P2IFG & = ~ 0x01; untuk (j = 0; j <20000; j ++) { } P1OUT ^ = BIT2; }
Mengupload Program ke MSP430 dari CCS
Untuk memuat proyek ke launchpad dan men-debugnya, pilih proyek, dan klik ikon debug di toolbar. Atau, tekan F11 atau klik RunàDebug untuk masuk ke mode debug.
Setelah mode debug masuk, tekan tombol run warna hijau untuk menjalankan kode yang dimuat di MCU dengan bebas. Sekarang, saat tombol ditekan, interupsi dipicu oleh perubahan tepi, sehingga memicu perubahan status LED.
Program Interupsi di MSP430
Setelah kode berhasil diupload, kita bisa mengujinya hanya dengan menggunakan push button. Pola LED akan berubah sesuai dengan program kami setiap kali interupsi diberikan menggunakan tombol tekan.
Pekerjaan lengkap dapat ditemukan di video yang ditautkan di bawah ini. Semoga Anda menikmati tutorial ini dan mempelajari sesuatu yang bermanfaat. Jika Anda memiliki pertanyaan, tinggalkan di bagian komentar atau gunakan forum kami untuk pertanyaan teknis lainnya.