- Mengapa Timer ketika kita memiliki Delay ()?
- Timer mikrokontroler PIC:
- Penjelasan Pemrograman dan Kerja:
- Diagram Sirkuit dan Simulasi Proteus:
Ini akan menjadi tutorial kelima dalam Seri Tutorial PIC kami, yang akan membantu Anda mempelajari dan menggunakan Pewaktu di PIC16F877A. Pada tutorial sebelumnya kita sudah memulai dengan Pengenalan PIC dan MPLABX IDE, kemudian kita buat program PIC pertama kita untuk mengedipkan LED menggunakan PIC kemudian membuat LED Blinking Sequence dengan menggunakan fungsi delay pada Mikrokontroler PIC. Sekarang mari kita gunakan urutan LED Blinking yang sama yang telah kita gunakan di perangkat keras tutorial sebelumnya dan dengan ini kita akan Belajar Bagaimana menggunakan Timer di PIC MCU kita. Kami baru saja menambahkan satu tombol lagi di papan LED untuk tutorial ini. Ikuti tutorial untuk mempelajari lebih lanjut.
Pengatur waktu adalah salah satu pekerjaan penting bagi programmer tertanam. Setiap aplikasi yang kami desain entah bagaimana akan melibatkan aplikasi waktu, seperti MENGAKTIFKAN atau MENONAKTIFKAN sesuatu setelah interval waktu yang ditentukan. Oke, tapi mengapa kita membutuhkan timer ketika kita sudah memiliki makro penundaan (__delay_ms ()) melakukan hal yang sama !!
Mengapa Timer ketika kita memiliki Delay ()?
Makro Delay disebut penundaan "dump". Karena selama menjalankan fungsi Delay, MCU menempatkan dump dengan hanya membuat penundaan. Selama proses ini, MCU tidak dapat mendengarkan nilai ADC-nya atau membaca apa pun dari Register-nya. Oleh karena itu, tidak disarankan untuk menggunakan fungsi Delay kecuali untuk aplikasi seperti LED berkedip dimana waktu tunda tidak perlu akurat atau lama.
Makro penundaan juga memiliki kekurangan berikut,
- Nilai penundaan harus konstan untuk makro penundaan; itu tidak dapat diubah selama eksekusi program. Oleh karena itu tetaplah programmer didefinisikan.
- Penundaan ini tidak akan akurat jika dibandingkan dengan penggunaan Timer.
- Nilai penundaan yang lebih besar tidak dapat dibuat menggunakan makro, misalnya penundaan setengah jam tidak dapat dibuat oleh makro penundaan. Delay maksimum yang dapat digunakan didasarkan pada osilator Crystal yang digunakan.
Timer mikrokontroler PIC:
Secara fisik, timer adalah register yang nilainya terus meningkat menjadi 255, dan kemudian dimulai lagi: 0, 1, 2, 3, 4… 255…. 0, 1, 2, 3……etc.
The PIC16F877A PIC MCU memiliki tiga Timer Modul. Mereka diberi nama sebagai Timer0, Timer1 dan Timer2. Timer 0 dan Timer 2 adalah Timer 8-bit dan Timer 1 adalah Timer 16-bit. Dalam tutorial ini kita akan menggunakan Timer 0 untuk aplikasi kita. Setelah kita memahami Timer 0, maka akan mudah untuk mengerjakan Timer 1 dan Timer 2 juga.
Penghitung / penghitung modul Timer0 memiliki beberapa fitur berikut:
- Penghitung waktu 8-bit
- Dapat dibaca dan ditulis
- Prescaler yang dapat diprogram perangkat lunak 8-bit
- Pilih jam internal atau eksternal
- Interupsi overflow dari FFh ke 00h
- Pilih tepi untuk jam eksternal
Untuk mulai menggunakan timer, kita harus memahami beberapa istilah mewah seperti timer 8-bit / 16-bit, Prescaler, Timer interrupts, dan Focs. Sekarang, mari kita lihat apa artinya masing-masing. Seperti yang dikatakan sebelumnya, ada 8-bit dan 16-bit Timer di PIC MCU kami, perbedaan utama di antara mereka adalah bahwa Timer 16-bit memiliki Resolusi yang jauh lebih baik daripada Timer 8-bit.
Prescaler adalah sebutan untuk bagian dari mikrokontroler yang membagi jam osilator sebelum mencapai logika yang meningkatkan status timer. Kisaran id prescaler adalah dari 1 hingga 256 dan nilai Prescaler dapat diatur menggunakan OPTION Register (Yang sama yang kami gunakan untuk resistor pull up). Misal jika nilai prescaler adalah 64, maka untuk setiap pulsa ke 64 Timer akan bertambah 1.
Saat pengatur waktu bertambah dan ketika mencapai nilai maksimum 255, itu akan memicu interupsi dan menginisialisasi dirinya sendiri ke 0 kembali. Interupsi ini disebut sebagai Interupsi Timer. Interupsi ini menginformasikan MCU bahwa waktu khusus ini telah berlalu.
The Fosc singkatan Frekuensi Oscillator, itu adalah frekuensi Crystal digunakan. Waktu yang dibutuhkan untuk register Timer tergantung pada nilai Prescaler dan nilai Fosc.
Penjelasan Pemrograman dan Kerja:
Dalam tutorial ini kita akan mengatur dua tombol sebagai dua input dan 8 LED sebagai 8 output. Tombol pertama akan digunakan untuk mengatur waktu tunda (500ms untuk setiap dorongan) dan tombol kedua akan digunakan untuk memulai urutan timer yang berkedip. Misalnya, jika tombol pertama ditekan tiga kali (500 * 3 = 1500ms) penundaan akan disetel selama 1,5 detik dan ketika tombol dua ditekan, setiap LED akan menyala dan mati dengan penundaan waktu yang telah ditentukan. Lihat Video Demonstrasi di akhir Tutorial ini.
Sekarang, dengan dasar-dasar ini dalam pikiran mari kita lihat program yang diberikan di akhir bagian Kode.
Tidak apa-apa jika Anda tidak mendapatkan program tersebut, tetapi jika Anda mendapatkannya !! Beri diri Anda cookie dan buang program untuk menikmati hasil Anda. Untuk yang lain, saya akan membagi program menjadi bagian-bagian yang berarti dan menjelaskan kepada Anda apa yang terjadi di setiap blok.
Seperti biasa, beberapa baris pertama kode adalah pengaturan Konfigurasi dan file header, saya tidak akan menjelaskan ini karena saya telah melakukannya di tutorial saya sebelumnya.
Selanjutnya, mari kita lewati semua baris dan langsung menuju ke fungsi utama void, di dalamnya kita memiliki konfigurasi PORT untuk Timer0.
void main () {/ ***** Konfigurasi Port untuk Timer ****** / OPTION_REG = 0b00000101; // Timer0 dengan freq eksternal dan 64 sebagai prescalar // Juga Mengaktifkan PULL UPs TMR0 = 100; // Muat nilai waktu untuk 0,0019968s; delayValue bisa antara 0-256 hanya TMR0IE = 1; // Aktifkan bit interupsi pengatur waktu dalam register PIE1 GIE = 1; // Aktifkan Global Interrupt PEIE = 1; // Aktifkan Interupsi Periferal / *********** ______ *********** /
Untuk memahami ini kita harus melihat OPTION Register di datasheet PIC kita.
Seperti yang dibahas dalam tutorial sebelumnya, bit 7 digunakan untuk mengaktifkan resistor pull up lemah untuk PORTB. Lihat gambar di atas, bit 3 dibuat 0 untuk menginstruksikan MCU bahwa prescaler berikut yang sedang disetel harus digunakan untuk Timer dan bukan untuk WatchDogTimer (WDT). Mode pengatur waktu dipilih dengan menghapus bit 5 T0CS
(OPTION_REG <5>)
Sekarang bits2-0 digunakan untuk mengatur nilai prescaler untuk pengatur waktu. Seperti yang ditunjukkan pada tabel di atas untuk menyetel nilai prescaler 64, bit harus disetel sebagai 101.
Selanjutnya, mari kita lihat Register yang terkait dengan Timer0
Timer akan mulai bertambah setelah disetel dan meluap setelah mencapai nilai 256, untuk mengaktifkan interupsi Timer selama titik ini register TMR0IE harus disetel tinggi. Karena Timer 0 itu sendiri adalah perangkat, kita harus mengaktifkan Interupsi Periferal dengan membuat PEIE = 1. Akhirnya kita harus mengaktifkan Interupsi Global sehingga MCU akan diberitahu tentang Interupsi selama operasi apa pun, ini dilakukan dengan membuat GIE = 1.
Penundaan = ((256-REG_val) * (Prescal * 4)) / Fosc
Rumus di atas digunakan untuk menghitung nilai Delay.
Dimana
REG_val = 100;
Prescal = 64
Fosc = 20000000
Ini pada perhitungan memberi, Penundaan = 0.0019968s
Set baris berikutnya adalah mengatur Port I / O.
/ ***** Konfigurasi Port untuk I / O ****** / TRISB0 = 1; // Perintahkan MCU bahwa PORTB pin 0 digunakan sebagai input untuk tombol 1. TRISB1 = 1; // Perintahkan MCU bahwa PORTB pin 1 digunakan sebagai input untuk tombol 1. TRISD = 0x00; // Perintahkan MCU bahwa semua pin pada PORT D adalah keluaran PORTD = 0x00; // Inisialisasi semua pin ke 0 / *********** ______ *********** /
Ini sama dengan tutorial kami sebelumnya karena kami menggunakan perangkat keras yang sama. Kecuali bahwa kami telah menambahkan tombol lain sebagai input. Ini dilakukan dengan garis TRISB1 = 1.
Selanjutnya, inside out infinite while loop kita memiliki dua blok kode. Satu digunakan untuk mendapatkan masukan pengatur waktu dari pengguna dan yang lainnya untuk menjalankan urutan penundaan di atas LED. Saya telah menjelaskannya dengan menggunakan komentar pada setiap baris.
sedangkan (1) {count = 0; // Jangan menjalankan timer saat berada di loop utama // ******* Dapatkan penundaan nomor dari pengguna **** ////// if (RB0 == 0 && flag == 0) // When masukan diberikan {get_scnds + = 1; // get_scnds = get_scnds + http: // Bendera variabel kenaikan = 1; } if (RB0 == 1) // Untuk mencegah incrementation flag = 0; / *********** ______ *********** /
Variabel yang disebut get_scnds bertambah setiap kali pengguna menekan tombol 1. Variabel flag (ditentukan oleh perangkat lunak) digunakan untuk menahan proses penambahan sampai pengguna melepaskan jarinya dari tombol.
// ******* Jalankan urutan dengan penundaan **** ////// while (RB1 == 0) {PORTD = 0b00000001 <
Blok berikutnya beraksi jika tombol dua ditekan. Karena pengguna telah menentukan waktu tunda yang diperlukan menggunakan tombol satu dan telah disimpan dalam variabel get_scnds. Kami menggunakan variabel yang disebut hscnd, variabel ini dikontrol oleh ISR (Interrupt service routine).
The rutin layanan interupsi adalah Interrupt yang akan dipanggil setiap kali Timer0 adalah overflows. Mari kita lihat bagaimana itu dikendalikan oleh ISR di blok berikutnya, seperti kita ingin menambah waktu tunda setengah detik (0,5 detik) pada setiap tombol tekan maka kita perlu menambah variabel hscnd untuk setiap setengah detik. Karena kami telah memprogram pengatur waktu kami untuk overflow untuk setiap 0,0019968s (~ 2ms), jadi untuk menghitung variabel hitungan setengah detik harus 250 karena 250 * 2ms = 0,5 detik. Jadi ketika hitungan mendapat 250 (250 * 2ms = 0,5 detik), berarti sudah setengah detik jadi kita naikkan hscnd sebanyak 1 dan menginisialisasi hitungan ke nol.
void interrupt timer_isr () {if (TMR0IF == 1) // Flag timer telah dipicu karena timer overflow {TMR0 = 100; // Muat Nilai pengatur waktu TMR0IF = 0; // Hapus penghitung waktu bendera interupsi ++; } jika (hitung == 250) {hscnd + = 1; // hscnd akan bertambah untuk setiap setengah detik hitungan = 0; }}
Jadi kami menggunakan nilai ini dan membandingkannya dengan hscnd kami dan menggeser LED kami berdasarkan waktu yang ditentukan pengguna. Ini juga sangat mirip dengan tutorial terakhir.
Itu saja program kami mengerti dan bekerja.
Diagram Sirkuit dan Simulasi Proteus:
Seperti biasa mari kita verifikasi keluaran menggunakan Proteus terlebih dahulu, saya telah menautkan di sini file skema Proteus.
Tambahkan tombol ke papan LED kami sebelumnya dan perangkat keras kami siap digunakan. Seharusnya terlihat seperti ini:
Setelah koneksi selesai, Unggah kode dan verifikasi hasilnya. Jika Anda memiliki masalah, silakan gunakan bagian komentar. Juga periksa Video di bawah ini untuk memahami keseluruhan proses.