- Bahan yang Dibutuhkan:
- Apa itu interupsi dan di mana menggunakannya:
- Diagram Sirkuit dan Penjelasan:
- Simulasi Interupsi pada Mikrokontroler PIC:
- Penjelasan Kode:
- Bekerja dari PIC16F877A Interupsi:
Dalam tutorial ini kita akan belajar bagaimana menggunakan Interupsi Eksternal di Mikrokontroler PIC dan mengapa / di mana kita akan membutuhkannya. Ini adalah bagian dari urutan Tutorial PIC di mana kami mulai mempelajari Mikrokontroler PIC dari awal; karenanya tutorial ini mengasumsikan bahwa Anda sudah terbiasa dengan cara memprogram PIC MCU menggunakan MPLABX dan cara menghubungkan LCD dengan PIC. Jika tidak, silakan kembali ke tautan masing-masing dan baca melalui, karena saya akan melewatkan sebagian besar informasi yang sudah dibahas di sana.
Bahan yang Dibutuhkan:
- Papan Perf PIC16F877A
- Layar LCD 16x2
- Tekan tombol
- Menghubungkan Kabel
- Papan Roti
- PicKit 3
Apa itu interupsi dan di mana menggunakannya:
Sebelum membahas cara memprogram interupsi mikrokontroler PIC, mari kita pahami apa itu Interupsi sebenarnya dan di mana kita perlu menggunakannya. Lebih lanjut, ada banyak jenis interupsi di Mikrokontroler dan PIC16F877A memiliki sekitar 15 di antaranya. Mari kita tidak mengacaukan semuanya di kepala kita untuk saat ini.
Begitu! apa yang dimaksud dengan interupsi di Mikrokontroler?
Seperti yang kita semua tahu, mikrokontroler digunakan untuk melakukan serangkaian aktivasi yang telah ditentukan sebelumnya (terprogram) yang memicu keluaran yang diperlukan berdasarkan masukan. Namun, saat Mikrokontroler Anda sibuk dengan menjalankan satu bagian kode, mungkin ada situasi darurat di mana bagian lain dari kode Anda perlu segera diperhatikan. Potongan kode lain yang membutuhkan perhatian segera ini harus diperlakukan sebagai interupsi.
Sebagai contoh: Mari kita anggap bahwa Anda sedang memainkan game favorit Anda di ponsel Anda dan pengontrol (asumsi) di dalam ponsel Anda sibuk membuang semua grafik yang diperlukan agar Anda dapat menikmati game tersebut. Tapi, tiba-tiba pacar Anda menelepon ke nomor Anda. Sekarang, hal terburuk yang terjadi adalah pengontrol ponsel Anda mengabaikan panggilan pacar Anda karena Anda sibuk bermain game. Untuk mencegah mimpi buruk ini terjadi, kami menggunakan sesuatu yang disebut interupsi.
Interupsi ini akan selalu menjadi daftar aktif untuk beberapa tindakan tertentu yang akan terjadi dan ketika terjadi mereka mengeksekusi sepotong kode dan kemudian kembali ke fungsi normal. Potongan kode ini disebut interrupt service routine (ISR). Salah satu proyek praktek yang mewajibkan interupsi adalah “Speedometer Digital dan Sirkuit Odometer menggunakan Mikrokontroler PIC”
Di Mikrokontroler ada dua jenis interupsi utama. Mereka adalah Interupsi Eksternal dan Interupsi Internal. Interupsi internal terjadi di dalam Microntroller untuk menjalankan tugas, misalnya Interupsi Timer, Interupsi ADC, dll. Interupsi ini dipicu oleh perangkat lunak untuk menyelesaikan operasi Timer atau operasi ADC masing-masing.
Interupsi eksternal adalah salah satu yang dapat dipicu oleh pengguna. Dalam program ini kita akan belajar bagaimana menggunakan interupsi Eksternal dengan menggunakan tombol tekan untuk memicu interupsi. Kami akan menggunakan LCD untuk menampilkan angka yang bertambah dari 0 hingga 1000 dan ketika interupsi dipicu kami harus memberi tahu tentang hal itu dari ISR Rutin Layanan Interupsi dan kemudian melanjutkan kembali untuk menambah angka.
Diagram Sirkuit dan Penjelasan:
Diagram sirkuit untuk menggunakan interupsi PIC16F877 diberikan pada gambar di atas. Anda hanya perlu menghubungkan LCD ke PIC seperti yang kita lakukan dalam tutorial interfacing LCD.
Sekarang untuk menghubungkan pin interupsi, kita harus melihat lembar data untuk mengetahui pin PIC mana yang digunakan untuk interupsi Eksternal. Dalam kasus kami di PIC16F877A pin 33 rd RBO / INT digunakan untuk interupsi eksternal. Anda tidak dapat menggunakan pin lain selain pin ini. Sambungan pin untuk diagram sirkuit ini ditunjukkan pada tabel di bawah.
S.Tidak: |
Nomor PIN |
Nama Pin |
Terhubung dengan |
1 |
21 |
RD2 |
RS LCD |
2 |
22 |
RD3 |
E dari LCD |
3 |
27 |
RD4 |
D4 LCD |
4 |
28 |
RD5 |
D5 LCD |
5 |
29 |
RD6 |
D6 LCD |
6 |
30 |
RD7 |
D7 LCD |
7 |
33 |
RBO / INT |
Tekan tombol |
Kami telah mengaktifkan resistor pull up internal pada PORT B, oleh karena itu kami dapat langsung menghubungkan pin RB0 ke ground melalui tombol Push. Jadi, setiap kali pin ini RENDAH, interupsi akan dipicu.
Koneksi dapat dibuat di papan Roti seperti yang ditunjukkan di bawah ini.
Jika Anda telah mengikuti tutorial kami, Anda pasti sudah terbiasa dengan Perf Board yang saya gunakan di sini. Jika tidak, Anda tidak perlu terlalu memikirkannya cukup dengan mengikuti diagram rangkaian dan Anda akan mendapatkan semuanya bekerja.
Simulasi Interupsi pada Mikrokontroler PIC:
Simulasi untuk proyek ini dibuat dengan menggunakan Proteus.
Saat Anda mensimulasikan proyek, Anda akan melihat urutan angka yang bertambah pada layar LCD. Ini terjadi di dalam loop utama dan setiap kali tombol ditekan, LCD akan menampilkan bahwa ia telah masuk ke dalam ISR. Anda dapat membuat modifikasi pada kode dan mencoba mengujinya di sini.
Penjelasan Kode:
Kode lengkap untuk proyek ini dapat ditemukan di akhir tutorial ini. Namun program ini dibagi menjadi beberapa bagian penting dan dijelaskan di bawah ini untuk pemahaman Anda yang lebih baik.
Seperti semua program, kita harus memulai kode dengan menentukan konfigurasi pin untuk pin yang kita gunakan dalam program kita. Juga di sini kita perlu mendefinisikan bahwa kita menggunakan RB0 / INT sebagai pin interupsi eksternal dan bukan sebagai pin input atau output. Baris kode di bawah ini memungkinkan resistor pull-up internal pada portB dengan membuat bit ke- 7 sebagai 0.
OPTION_REG = 0b00000000;
Kemudian kami mengaktifkan Global / Peripheral interrupts dan menyatakan bahwa kami menggunakan RB0 sebagai pin interupsi eksternal.
GIE = 1; // Aktifkan Global Interrupt PEIE = 1; // Aktifkan Peripheral Interrupt INTE = 1; // Aktifkan RB0 sebagai pin Interupsi eksternal
Setelah pin RB0 didefinisikan sebagai pin interupsi eksternal, setiap kali pin tersebut melemah, flag interupsi eksternal INTF akan menjadi 1 dan kode di dalam fungsi void interrupt akan dijalankan karena Interrupt Service Routine (ISR) akan dipanggil.
void interrupt ISR_example () {if (INTF == 1) // External Interrupt terdeteksi {Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Masuk ISR"); INTF = 0; // hapus flag interupsi setelah selesai dengan itu __delay_ms (2000); Lcd_Clear (); }}
Seperti yang Anda lihat, saya telah menamai fungsi interupsi sebagai ISR_example. Anda dapat menamainya sesuai keinginan Anda. Di dalam fungsi interupsi kita akan memeriksa apakah bendera INTF tinggi dan melakukan tindakan yang diperlukan. Sangat penting untuk menghapus flag interupsi setelah Anda selesai dengan rutinitas. Hanya dengan begitu program akan kembali ke fungsi utama yang batal. Kliring ini harus dilakukan dengan perangkat lunak menggunakan jalur
INTF = 0; // hapus bendera interupsi setelah selesai dengannya
Di dalam fungsi utama, kami hanya menambah angka untuk setiap 500 ms dan menampilkannya di layar LCD. Kami tidak memiliki jalur khusus untuk memeriksa status pin RB0. Interupsi akan selalu aktif dan setiap kali tombol tekan ditekan akan melompat keluar dari main void dan mengeksekusi baris di ISR.
Lcd_Set_Cursor (2,1); Lcd_Print_String ("Di Dalam Loop Utama"); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Angka:"); Lcd_Print_Char (ch1 + '0'); Lcd_Print_Char (ch2 + '0'); Lcd_Print_Char (ch3 + '0'); Lcd_Print_Char (ch4 + '0'); __delay_ms (500); nomor ++;
Bekerja dari PIC16F877A Interupsi:
Setelah Anda memahami cara kerja interupsi, Anda dapat mencobanya pada perangkat keras dan mengotak-atiknya. Program yang diberikan di sini adalah contoh interupsi eksternal yang sangat mendasar di mana ia hanya mengubah tampilan layar LCD saat interupsi terdeteksi.
Pekerjaan lengkap dari proyek ini dapat ditemukan di video yang diberikan di bawah ini. Semoga Anda mengerti tentang interupsi dan di mana / bagaimana menggunakannya. Jika Anda ragu, Anda dapat menghubungi saya melalui forum atau melalui bagian komentar.