- Mengapa Pemasa apabila kita mengalami Kelewatan ()?
- Pemasa mikrokontroler PIC:
- Pengaturcaraan dan Penjelasan Kerja:
- Diagram Litar dan Simulasi Proteus:
Ini akan menjadi tutorial kelima dalam Siri Tutorial PIC kami, yang akan membantu anda mempelajari dan menggunakan Pemasa dalam PIC16F877A. Dalam tutorial sebelumnya, kami telah memulakan dengan Pengenalan PIC dan MPLABX IDE, kemudian kami menulis program PIC pertama kami untuk mengedipkan LED menggunakan PIC dan kemudian membuat Urutan Berkedip LED dengan menggunakan fungsi kelewatan dalam PIC Microcontroller. Sekarang mari kita gunakan urutan LED Berkedip yang sama yang telah kita gunakan dalam perkakasan tutorial sebelumnya dan dengan ini kita akan Belajar Cara Menggunakan Pemasa di MCU PIC kita. Kami baru sahaja menambah satu butang di papan LED untuk tutorial ini. Ikuti tutorial untuk mengetahui lebih lanjut.
Pemasa adalah salah satu tenaga kerja penting untuk pengaturcara terbenam. Setiap aplikasi yang kami reka entah bagaimana akan melibatkan aplikasi waktu, seperti menghidupkan atau mematikan sesuatu setelah selang waktu yang ditentukan. Baiklah, tetapi mengapa kita memerlukan pemasa apabila kita sudah mempunyai makro kelewatan (__delay_ms ()) melakukan perkara yang sama !!
Mengapa Pemasa apabila kita mengalami Kelewatan ()?
Makro Kelewatan disebut kelewatan "dump". Kerana semasa pelaksanaan fungsi Delay MCU duduk dump dengan hanya membuat kelewatan. Semasa proses ini MCU tidak dapat mendengar nilai ADC atau membaca apa-apa dari Daftarnya. Oleh itu, tidak digalakkan menggunakan fungsi Kelewatan kecuali untuk aplikasi seperti LED berkelip di mana kelewatan Waktu tidak tepat atau panjang.
Makro kelewatan juga mempunyai jangka pendek berikut,
- Nilai kelewatan mestilah pemalar untuk makro kelewatan; ia tidak boleh diubah semasa pelaksanaan program. Oleh itu ia tetap ditentukan oleh pengaturcara.
- Kelewatan tidak akan tepat berbanding dengan menggunakan Pemasa.
- Nilai kelewatan yang lebih besar tidak dapat dibuat menggunakan makro, contohnya penundaan setengah jam tidak dapat dibuat oleh makro tunda. Kelewatan maksimum yang boleh digunakan adalah berdasarkan Crystal oscillator yang digunakan.
Pemasa mikrokontroler PIC:
Secara fizikal, pemasa adalah daftar yang nilainya terus meningkat menjadi 255, dan kemudian bermula lagi: 0, 1, 2, 3, 4… 255…. 0, 1, 2, 3……dan lain-lain.
The PIC16F877A PIC MCU mempunyai tiga Modul Timer. Mereka adalah nama sebagai Timer0, Timer1 dan Timer2. Pemasa 0 dan Pemasa 2 adalah Pemasa 8-bit dan Pemasa 1 adalah Pemasa 16-bit. Dalam tutorial ini kita akan menggunakan Pemasa 0 untuk aplikasi kita. Setelah kita memahami Pemasa 0, kita juga akan mudah menggunakan Timer 1 dan Timer 2.
Pemasa / kaunter modul Timer0 mempunyai ciri-ciri berikut:
- Pemasa / pembilang 8-bit
- Boleh dibaca dan ditulis
- Prescaler 8-bit perisian yang boleh diprogramkan
- Pilih jam dalaman atau luaran
- Ganggu semasa limpahan dari FFh hingga 00h
- Edge pilih untuk jam luaran
Untuk mula menggunakan pemasa, kita harus memahami beberapa istilah mewah seperti pemasa 8-bit / 16-bit, Prescaler, pemasa interupsi dan Focs. Sekarang, mari kita lihat apa sebenarnya maksud masing-masing. Seperti yang dinyatakan sebelum ini terdapat Timer 8-bit dan 16-bit di PIC MCU kami, perbezaan utama antara mereka adalah bahawa Pemasa 16-bit mempunyai Resolusi yang jauh lebih baik daripada Pemasa 8-bit.
Prescaler adalah nama untuk bahagian mikrokontroler yang membahagi jam pengayun sebelum ia akan mencapai logik yang meningkatkan status pemasa. Julat id prescaler adalah dari 1 hingga 256 dan nilai Prescaler dapat ditetapkan menggunakan OPTION Register (Yang sama dengan yang kami gunakan untuk pull up resistors). Sebagai contoh jika nilai prescaler adalah 64, maka untuk setiap nadi ke- 64, Timer akan meningkat oleh 1.
Apabila pemasa meningkat dan ketika mencapai nilai maksimum 255, ia akan memicu gangguan dan menginisialisasi dirinya menjadi 0 kembali lagi. Gangguan ini disebut sebagai Pengganggu Pemasa. Gangguan ini memberitahu MCU bahawa masa ini telah berlalu.
The Fosc bermaksud Kekerapan yang Oscillator, ia adalah kekerapan Crystal digunakan. Masa yang diambil untuk daftar Pemasa bergantung pada nilai Prescaler dan nilai Fosc.
Pengaturcaraan dan Penjelasan Kerja:
Dalam tutorial ini kita akan menetapkan dua butang sebagai dua input dan 8 LED sebagai 8 output. Butang pertama akan digunakan untuk menetapkan kelewatan waktu (500ms untuk setiap tekan) dan butang kedua akan digunakan untuk memulakan sekejap urutan pemasa. Contohnya, jika butang pertama ditekan tiga kali (500 * 3 = 1500ms) kelewatan akan ditetapkan selama 1.5 saat dan apabila butang dua ditekan, setiap LED akan menyala dan mati dengan kelewatan masa yang telah ditetapkan. Tonton Video Demonstrasi di akhir Tutorial ini.
Sekarang, dengan mempertimbangkan asas-asas ini, mari kita lihat program kami yang diberikan pada bahagian akhir di bahagian Code.
Tidak mengapa jika anda tidak mendapat program, tetapi jika anda berjaya !! Beri diri anda cookie dan buang program untuk menikmati hasil anda. Bagi yang lain, saya akan membahagikan program ini kepada bahagian-bahagian yang bermakna dan menjelaskan kepada anda apa yang berlaku di setiap blok.
Seperti biasa beberapa baris pertama kod adalah tetapan Konfigurasi dan fail tajuk, saya tidak akan menerangkannya kerana saya sudah melakukannya dalam tutorial sebelumnya.
Seterusnya, mari kita melangkau semua garis dan melompat terus ke fungsi utama kekosongan, di mana kita mempunyai konfigurasi PORT untuk Timer0.
batal main () {/ ***** Konfigurasi Port untuk Pemasa ****** / OPTION_REG = 0b00000101; // Timer0 dengan freq luaran dan 64 sebagai prescalar // Juga Membolehkan PULL UPs TMR0 = 100; // Muatkan nilai masa untuk 0.0019968s; delayValue boleh antara 0-256 hanya TMR0IE = 1; // Aktifkan bit gangguan pemasa dalam daftar PIE1 GIE = 1; // Dayakan Global Interrupt PEIE = 1; // Dayakan Periferal Interrupt / *********** ______ *********** /
Untuk memahami ini, kita perlu melihat Daftar PILIHAN di lembaran data PIC kami.
Seperti yang dibincangkan dalam tutorial sebelumnya, bit 7 digunakan untuk mengaktifkan Resistor penarik lemah untuk PORTB. Lihat gambar di atas, bit 3 dibuat 0 untuk mengarahkan MCU bahawa prescaler berikut yang sedang ditetapkan harus digunakan untuk Pemasa dan bukan untuk WatchDogTimer (WDT). Mod pemasa dipilih dengan membersihkan bit 5 T0CS
(PILIHAN_REG <5>)
Sekarang, bits2-0 digunakan untuk menetapkan nilai prescaler untuk pemasa. Seperti yang ditunjukkan dalam jadual di atas untuk menetapkan nilai prescaler 64, bit mesti ditetapkan sebagai 101.
Seterusnya, mari kita lihat Daftar yang berkaitan dengan Timer0
Pemasa akan mula meningkat setelah ditetapkan dan meluap setelah mencapai nilai 256, untuk membolehkan Pemasa terganggu selama ini, daftar TMR0IE harus ditetapkan tinggi. Oleh kerana Timer 0 itu sendiri adalah periferal, kita harus mengaktifkan Peripheral Interrupt dengan membuat PEIE = 1. Akhirnya kita harus mengaktifkan Global Interrupt sehingga MCU akan diberitahu mengenai Interrupt semasa operasi, ini dilakukan dengan membuat GIE = 1.
Kelewatan = ((256-REG_val) * (Prescal * 4)) / Fosc
Formula di atas digunakan untuk mengira nilai Kelewatan.
Di mana
REG_val = 100;
Prescal = 64
Fosc = 20000000
Pengiraan ini memberi, Kelewatan = 0.0019968s
Kumpulan baris seterusnya adalah menetapkan Pelabuhan I / O.
/ ***** Konfigurasi Port untuk I / O ****** / TRISB0 = 1; // Arahkan kepada MCU bahawa pin PORTB 0 digunakan sebagai input untuk butang 1. TRISB1 = 1; // Arahkan kepada MCU bahawa pin PORTB 1 digunakan sebagai input untuk butang 1. TRISD = 0x00; // Arahkan MCU bahawa semua pin pada PORT D adalah output PORTD = 0x00; // Memulakan semua pin ke 0 / *********** ______ *********** /
Ini sama dengan tutorial sebelumnya kerana kami menggunakan perkakasan yang sama. Kecuali bahawa kami telah menambahkan butang lain sebagai input. Ini dilakukan oleh garis TRISB1 = 1.
Seterusnya, luar dan dalam tak terhingga manakala gelung kita mempunyai dua blok kod. Satu digunakan untuk mendapatkan input pemasa dari pengguna dan yang lain untuk menjalankan urutan penundaan terhadap LED. Saya telah menerangkannya dengan menggunakan komen terhadap setiap baris.
sementara (1) {kiraan = 0; // Jangan jalankan pemasa semasa dalam gelung utama // ******* Dapatkan kelewatan nombor dari pengguna **** ////// if (RB0 == 0 && flag == 0) // Bila input diberikan {get_scnds + = 1; // get_scnds = get_scnds + http: // Bendera pemboleh ubah kenaikan = 1; } if (RB0 == 1) // Untuk mengelakkan kenaikan bendera berterusan = 0; / *********** ______ *********** /
Pemboleh ubah yang disebut get_scnds meningkat setiap kali pengguna menekan butang 1. Pemboleh ubah bendera (ditentukan perisian) digunakan untuk menahan proses kenaikan sehingga pengguna mengeluarkan jarinya dari butang.
// ******* Jalankan urutan dengan kelewatan **** ////// sementara (RB1 == 0) {PORTD = 0b00000001 <
Blok seterusnya akan bertindak sekiranya butang dua ditekan. Oleh kerana pengguna telah menentukan kelewatan masa yang diperlukan menggunakan butang satu dan ia telah disimpan dalam get_scnds pemboleh ubah . Kami menggunakan pemboleh ubah yang disebut hscnd, pemboleh ubah ini dikendalikan oleh ISR (Interrupt service rutin).
The perkhidmatan rutin sampukan adalah sampukan yang akan dipanggil setiap kali Timer0 adalah limpahan. Mari kita lihat bagaimana ia dikendalikan oleh ISR di blok seterusnya, seperti kita ingin menambah kelewatan masa sebanyak setengah saat (0.5s) pada setiap tekan butang maka kita perlu meningkatkan pemboleh ubah hscnd untuk setiap setengah saat. Seperti yang kita telah diprogramkan pemasa kami kepada lebih aliran bagi tiap-tiap 0.0019968s (~ 2ms), jadi untuk mengira separuh kedua kiraan pembolehubah harus 250 kerana 250 * 2ms = 0.5 saat. Oleh itu, apabila kiraan mendapat 250 (250 * 2 ms = 0,5 saat), ini bermakna sudah setengah saat jadi kita menambah hscnd dengan 1 dan memulakan kiraan menjadi sifar.
batal interrupt timer_isr () {if (TMR0IF == 1) // Bendera pemasa telah dicetuskan kerana limpahan pemasa {TMR0 = 100; // Muatkan pemasa Nilai TMR0IF = 0; // Hapus kiraan bendera gangguan pemasa ++; } jika (kiraan == 250) {hscnd + = 1; // hscnd akan bertambah untuk setiap kiraan setengah saat = 0; }}
Oleh itu, kami menggunakan nilai ini dan membandingkannya dengan hscnd kami dan mengalihkan LED kami berdasarkan masa yang ditentukan pengguna. Ia juga sangat serupa dengan tutorial terakhir.
Itu sahaja program kami difahami dan berfungsi.
Diagram Litar dan Simulasi Proteus:
Seperti biasa mari kita mengesahkan output menggunakan Proteus terlebih dahulu, saya telah menghubungkan di sini fail skema Proteus.
Tambahkan butang ke papan LED kami sebelumnya dan perkakasan kami sudah siap digunakan. Ia mesti kelihatan seperti ini:
Setelah sambungan selesai, Muat naik kod dan sahkan keluarannya. Sekiranya anda mempunyai masalah, sila gunakan bahagian komen. Lihat juga Video di bawah untuk memahami keseluruhan proses.