Daftar Isi:
- Langkah 1: Deskripsi
- Langkah 2: Pernyataan Masalah 1: Mari Flash Pertama LED (hijau) Setiap 50 Ms
- Langkah 3: Pernyataan Masalah 2: Mari Flash LED Kedua (biru) Setiap 1 detik
- Langkah 4: Pernyataan Masalah 3: Mari Flash LED Ketiga (merah) Setiap 16 ms
- Langkah 5: Menulis Kode untuk Program di C. Mengunggah File HEX Ke Memori Flash Mikrokontroler
- Langkah 6: Membuat Sirkuit Listrik
Video: Mikrokontroler AVR. LED Flasher Menggunakan Timer. Timer Interupsi. Mode CTC Timer: 6 Langkah
2024 Pengarang: John Day | [email protected]. Terakhir diubah: 2024-01-30 09:56
Halo semuanya!
Timer merupakan konsep penting dalam bidang elektronika. Setiap komponen elektronik bekerja pada basis waktu. Basis waktu ini membantu menjaga semua pekerjaan tetap sinkron. Semua mikrokontroler bekerja pada beberapa frekuensi clock yang telah ditentukan, mereka semua memiliki ketentuan untuk mengatur timer. AVR membanggakan memiliki timer yang sangat akurat, tepat dan dapat diandalkan. Ini menawarkan banyak fitur di dalamnya, sehingga menjadikannya topik yang luas. Bagian terbaiknya adalah timer benar-benar independen dari CPU. Dengan demikian, ia berjalan paralel dengan CPU dan tidak ada intervensi CPU, yang membuat penghitung waktu cukup akurat. Pada bagian ini saya menjelaskan konsep dasar dari AVR Timer. Saya menulis program sederhana dalam kode C untuk mengontrol flasher LED, menggunakan timer.
Langkah 1: Deskripsi
Di ATMega328 ada tiga jenis timer:
Timer/Counter0 (TC0) - adalah modul Timer/Counter 8-bit tujuan umum, dengan dua Unit OutputCompare independen, dan dukungan PWM;
Timer/Counter1 (TC1) - Unit Timer/Counter 16-bit memungkinkan waktu eksekusi program yang akurat (manajemen kejadian), pembangkitan gelombang, dan pengukuran waktu sinyal;
Timer/Counter2 (TC2) -adalah tujuan umum, saluran, modul Timer/Counter 8-bit dengan PWM dan Operasi Asynchronous;
Langkah 2: Pernyataan Masalah 1: Mari Flash Pertama LED (hijau) Setiap 50 Ms
Metodologi:
- menggunakan prescaler Timer0 untuk mengurangi sinyal listrik frekuensi tinggi ke frekuensi yang lebih rendah dengan pembagian bilangan bulat;
- menggunakan interupsi setiap kali Timer0 meluap;
Timer0 (8 bit) menghitung dari 0 hingga 255 setelah itu, mereka meluap, nilai ini berubah pada setiap pulsa clock.
F_CPU=16MHz: Periode waktu jam = 1000ms / 16000000Hz = 0,0000625ms
Hitungan pengatur waktu = (Penundaan yang Diperlukan / Periode Waktu Jam)-1 = (50 md / 0,0000625 md) = 799999
Jam telah berdetak 799999 kali untuk memberikan penundaan hanya 50 ms!
Kita dapat menggunakan teknik pembagian frekuensi yang disebut prescaling untuk mengurangi jumlah timer. AVR menawarkan kepada kita nilai prescaler berikut untuk dipilih: 8, 64, 256 dan 1024. Lihat tabel yang merangkum hasil penggunaan prescaler yang berbeda.
Nilai penghitung harus selalu berupa bilangan bulat. Mari pilih prescaler 256!
Di sebagian besar mikrokontroler, ada sesuatu yang disebut Interrupt. Interupsi ini dapat diaktifkan setiap kali kondisi tertentu terpenuhi. Sekarang setiap kali interupsi dipecat, AVR berhenti dan menyimpan eksekusi rutinitas utama, menghadiri panggilan interupsi (dengan mengeksekusi rutin khusus, yang disebut Rutin Layanan Interupsi, ISR) dan setelah selesai, kembali ke rutinitas utama dan terus menjalankannya.
Karena penundaan yang diperlukan (50ms) lebih besar dari penundaan maksimum yang mungkin: 4, 096ms = 1000ms / 62500Hz * 256, jelas pengatur waktu akan meluap. Dan setiap kali timer meluap, interupsi dipecat.
Berapa kali interupsi harus dipecat?
50ms / 4.096ms = 3125/256 = 12.207 Jika timer telah meluap 12 kali, 12 * 4.096ms = 49.152ms akan berlalu. Pada iterasi ke-13, kita membutuhkan delay 50ms – 49.152ms = 0.848ms.
Pada frekuensi 62500Hz (prescaler = 256), setiap tick membutuhkan waktu 0,016 ms. Jadi untuk mencapai penundaan 0,848 ms, diperlukan 0,848 ms / 0,016 ms = 53 kutu. Jadi, pada iterasi ke-13, kami hanya mengizinkan timer menghitung hingga 53, lalu mengatur ulang.
Inisialisasi Timer0/Counter (lihat gambar):
TCCR0B |= (1 << CS02) // mengatur timer dengan prescaler = 256 TCNT0 = 0 // menginisialisasi penghitung TIMSK0 |= (1 << TOIE0) // mengaktifkan interupsi overflow sei() // mengaktifkan interupsi global tot_overflow = 0 // inisialisasi variabel penghitung overflow
Langkah 3: Pernyataan Masalah 2: Mari Flash LED Kedua (biru) Setiap 1 detik
Metodologi:
- menggunakan prescaler Timer1 untuk mengurangi sinyal listrik frekuensi tinggi ke frekuensi yang lebih rendah dengan pembagian bilangan bulat;
- menggunakan Clear Timer on Compare (CTC) Mode;
- menggunakan Interupsi dengan Mode CTC;
Timer1 (16 bit) dihitung dari 0 hingga 65534 setelah itu, mereka meluap. Nilai ini berubah pada setiap pulsa clock.
F_CPU=16MHz: Periode waktu jam = 1000ms / 16000000Hz = 0,0000625msJumlah timer = (Penundaan yang Diperlukan / Periode Waktu Jam)-1 = (1000ms / 0,0000625ms) = 15999999
Jam telah berdetak 15999999 kali untuk memberikan penundaan 1 detik!
Kita dapat menggunakan teknik pembagian frekuensi yang disebut prescaling untuk mengurangi jumlah timer. AVR menawarkan kepada kita nilai prescaler berikut untuk dipilih: 8, 64, 256 dan 1024. Lihat tabel yang merangkum hasil penggunaan prescaler yang berbeda. Nilai penghitung harus selalu berupa bilangan bulat. Mari pilih prescaler 256!
Dalam mode Clear timer on Compare(CTC), register OCR1A atau ICR1 digunakan untuk memanipulasi resolusi counter. Dalam mode CTC penghitung dihapus ke nol ketika nilai penghitung (TCNT1) cocok dengan OCR1A atau ICR1. OCR1A atau ICR1 menentukan nilai tertinggi untuk penghitung, demikian juga resolusinya. Mode ini memungkinkan kontrol yang lebih besar dari frekuensi output pertandingan yang dibandingkan. Mode ini juga menyederhanakan operasi penghitungan kejadian eksternal. Kita harus memberitahu AVR untuk mereset Timer1/Counter segera setelah nilainya mencapai nilai 62500, sehingga mencapai delay 1 detik.
Inisialisasi Timer1/Counter (lihat gambar):
TCCR1B |= (1 << WGM12)|(1 << CS12) // mengatur timer dengan prescaler = 256 dan mode CTC TCNT1 = 0 // menginisialisasi penghitung TIMSK1 |= (1 << OCIE1A) // mengaktifkan bandingkan interupsi OCR1A = 62500 // inisialisasi nilai perbandingan
Langkah 4: Pernyataan Masalah 3: Mari Flash LED Ketiga (merah) Setiap 16 ms
Metodologi:
- menggunakan prescaler Timer2 untuk mengurangi sinyal listrik frekuensi tinggi ke frekuensi yang lebih rendah dengan pembagian bilangan bulat;
- menggunakan Clear Timer on Compare (CTC) Mode;
- menggunakan Mode CTC Perangkat Keras tanpa interupsi;
Timer2 (8 bit) dihitung dari 0 hingga 255 setelah itu, mereka meluap. Nilai ini berubah pada setiap pulsa clock.
F_CPU=16MHz: Periode waktu jam = 1000ms / 16000000Hz = 0,0000625ms
Hitungan timer = (Penundaan yang Diperlukan / Periode Waktu Jam)-1 = (16ms / 0,0000625ms) = 255999
Jam telah berdetak 255999 kali untuk memberikan penundaan 16 ms!
Lihat tabel yang merangkum hasil penggunaan prescaler yang berbeda. Nilai penghitung harus selalu berupa bilangan bulat. Ayo pilih prescaler 1024!
Dalam mode CTC penghitung dihapus ke nol ketika nilai penghitung (TCNT2) cocok dengan OCR2A atau ICR2. Pin PB3 juga merupakan pin Output Compare dari TIMER2 - OC2A (lihat diagram).
Timer/Counter2 Control Register A – TCCR2A Bit 7:6 – COM2A1:0 – Compare Output Mode untuk Compare Unit A. Karena kita perlu mengaktifkan LED, kita memilih opsi: Toggle OC2A pada Compare Match Setiap kali suatu compare match terjadi, Pin OC2A diaktifkan secara otomatis. Tidak perlu memeriksa bit bendera apa pun, tidak perlu memperhatikan interupsi apa pun.
Inisialisasi Timer2/Counter
TCCR2A |= (1 << COM2A0)|(1 << WGM21) // setel pin OC2A timer dalam mode sakelar dan mode CTC TCCR2B |= (1 << CS22)|(1 << CS21)|(1 << CS20) // mengatur timer dengan prescaler = 1024 TCNT2 = 0 // menginisialisasi penghitung OCR2A = 250 // menginisialisasi nilai perbandingan
Langkah 5: Menulis Kode untuk Program di C. Mengunggah File HEX Ke Memori Flash Mikrokontroler
Penulisan dan pembuatan aplikasi mikrokontroler AVR dalam C Code menggunakan Integrated Development Platform - Atmel Studio.
F_CPU mendefinisikan frekuensi clock dalam Hertz dan umum dalam program yang menggunakan perpustakaan avr-libc. Dalam hal ini digunakan oleh rutinitas tunda untuk menentukan cara menghitung waktu tunda.
#ifndef F_CPU
#define F_CPU 16000000UL // memberitahukan frekuensi kristal pengontrol (16 MHz AVR ATMega328P) #endif
#include // header untuk mengaktifkan kontrol aliran data melalui pin. Mendefinisikan pin, port, dll.
File penyertaan pertama adalah bagian dari avr-libc dan akan digunakan di hampir semua proyek AVR yang Anda kerjakan. io.h akan menentukan CPU yang Anda gunakan (itulah sebabnya Anda menentukan bagian saat kompilasi) dan pada gilirannya menyertakan header definisi IO yang sesuai untuk chip yang kami gunakan. Ini hanya mendefinisikan konstanta untuk semua pin, port, register khusus, dll.
#include // header untuk mengaktifkan interupsi
uint8_t tot_overflow yang mudah menguap; // variabel global untuk menghitung jumlah overflows
Metodologi Pernyataan Masalah: LED Flash First (Hijau) setiap 50 ms
- menggunakan prescaler Timer0 untuk mengurangi sinyal listrik frekuensi tinggi ke frekuensi yang lebih rendah dengan pembagian bilangan bulat;
- menggunakan interupsi setiap kali Timer0 meluap;
void timer0_init() // inisialisasi timer0, interupsi dan variabel
{ TCCR0B |= (1 << CS02); // mengatur timer dengan prescaler = 256 TCNT0 = 0; // inisialisasi penghitung TIMSK0 |= (1 << TOIE0); // aktifkan overflow nterrupt sei(); // aktifkan interupsi global tot_overflow = 0; // inisialisasi variabel counter overflow }
Metodologi Pernyataan Masalah: Flash LED Kedua (biru) setiap 1 detik
- menggunakan prescaler Timer1 untuk mengurangi sinyal listrik frekuensi tinggi ke frekuensi yang lebih rendah dengan pembagian bilangan bulat;
- menggunakan Clear Timer on Compare (CTC) Mode;
- menggunakan Interupsi dengan Mode CTC;
void timer1_init() // menginisialisasi timer1, interupsi dan variabel{ TCCR1B |= (1 << WGM12)|(1 << CS12); // set up timer dengan prescaler = 256 dan mode CTC TCNT1 = 0; // inisialisasi penghitung OCR1A = 62500; // menginisialisasi nilai perbandingan TIMSK1 |= (1 << OCIE1A); // aktifkan bandingkan interupsi}
Metodologi Pernyataan Masalah: Flash ketiga LED (merah) setiap 16ms
- menggunakan prescaler Timer2 untuk mengurangi sinyal listrik frekuensi tinggi ke frekuensi yang lebih rendah dengan pembagian bilangan bulat;
- menggunakan Clear Timer on Compare (CTC) Mode;
- menggunakan Mode CTC Perangkat Keras tanpa interupsi;
void timer2_init() // inisialisasi timer2{ TCCR2A |= (1 << COM2A0)|(1 << WGM21); // setel pin OC2A timer dalam mode sakelar dan mode CTC TCCR2B |= (1 << CS22)|(1 << CS21)|(1 << CS20); // set up timer dengan prescaler = 1024 TCNT2 = 0; // inisialisasi penghitung OCR2A = 250; // inisialisasi nilai perbandingan }
Rutinitas layanan interupsi overflow TIMER0 dipanggil setiap kali TCNT0 overflow:
ISR(TIMER0_OVF_vect)
{ tot_overflow++; // melacak jumlah overflow }
ISR ini dipecat setiap kali kecocokan terjadi karenanya, toggle dipimpin di sini sendiri:
ISR (TIMER1_COMPA_vect){ PORTC ^= (1 << 1); // alihkan led di sini}
int utama (kosong)
{ DDRB |= (1 << 0); // sambungkan 1 (hijau) led ke pin PB0 DDRC |= (1 << 1); // sambungkan 2 led (biru) ke pin PC1 DDRB |= (1 << 3); // sambungkan 3 led (merah) ke pin PB3 (OC2A) timer0_init(); // inisialisasi timer0 timer1_init(); // inisialisasi timer1 timer2_init(); // inisialisasi timer2 while(1) // loop selamanya {
Jika Timer0 telah meluap 12 kali, 12 * 4.096ms = 49.152ms akan berlalu. Pada iterasi ke-13, kita membutuhkan delay 50ms – 49.152ms = 0.848ms. Jadi, pada iterasi ke-13, kami hanya mengizinkan timer menghitung hingga 53, lalu mengatur ulang.
if (tot_overflow >= 12) // periksa apakah tidak. dari overflow = 12 CATATAN: '>=' digunakan
{ if (TCNT0 >= 53) // periksa apakah hitungan timer mencapai 53 { PORTB ^= (1 << 0); // matikan TCNT0 yang dipimpin = 0; // reset penghitung tot_overflow = 0; // setel ulang penghitung luapan } } } }
Mengunggah file HEX ke memori flash mikrokontroler:
ketik di jendela prompt DOS perintah:
avrdude –c [nama programmer] –p m328p –u –U flash:w:[nama file hex Anda]Dalam kasus saya ini adalah: avrdude –c ISPProgv1 –p m328p –u –U flash:w:Timers.hex
Perintah ini menulis file hex ke memori mikrokontroler. Tonton video dengan deskripsi terperinci tentang pembakaran memori flash mikrokontroler:
Pembakaran memori flash mikrokontroler…
Oke! Sekarang, mikrokontroler bekerja sesuai dengan instruksi program kami. Mari kita periksa!
Langkah 6: Membuat Sirkuit Listrik
Hubungkan komponen sesuai dengan diagram skematik.
Direkomendasikan:
Mikrokontroler AVR. Toggle LED Menggunakan Push Button Switch. Push Button Debouncing.: 4 Langkah
Mikrokontroler AVR. Toggle LED Menggunakan Push Button Switch. Push Button Debouncing.: Pada bagian ini, kita akan mempelajari Cara membuat kode program C untuk ATMega328PU untuk mengubah status ketiga LED sesuai input dari sakelar tombol. Juga, kami telah mengeksplorasi solusi untuk masalah adalah 'Switch Bounce'. Seperti biasanya, kami
MENGGUNAKAN EXtreme Burner untuk Pemrograman Mikrokontroler AVR: 8 Langkah
MENGGUNAKAN EXtreme Burner untuk Pemrograman Mikrokontroler AVR: Semua Anda pengguna AVR di luar sana, dan mereka yang baru saja memasuki aliran, Beberapa dari Anda mulai dengan mikrokontroler PIC dan beberapa mulai dengan AVR ATMEL, ini ditulis untuk Anda! Jadi Anda membeli USBASP karena murah dan efektif untuk mem-flash
Konfigurasi Bit Fuse Mikrokontroler AVR. Membuat dan Mengunggah di Memori Flash Mikrokontroler Program Berkedip LED.: 5 Langkah
Konfigurasi Bit Fuse Mikrokontroler AVR. Membuat dan Mengupload di Flash Memory Mikrokontroler Program LED Blinking.: Dalam hal ini kita akan membuat program sederhana dalam kode C dan membakarnya ke dalam memori mikrokontroler. Kami akan menulis program kami sendiri dan mengkompilasi file hex, menggunakan Atmel Studio sebagai platform pengembangan terintegrasi. Kami akan mengkonfigurasi fuse bi
Interfacing Mikrokontroler 8051 Dengan Lcd dalam Mode 4-bit: 5 Langkah (dengan Gambar)
Menghubungkan Mikrokontroler 8051 Dengan Lcd dalam Mode 4-bit: Dalam tutorial ini kami akan memberi tahu Anda tentang bagaimana kita dapat menghubungkan lcd dengan 8051 dalam mode 4-bit
Kecerahan LED Interupsi Arduino USA: 6 Langkah
Kecerahan LED Interupsi Arduino USA: Dalam proyek ini, kami akan membuat tampilan LED Merah, Putih, dan Biru dengan potensiometer dan tombol tekan. Kedengarannya mudah, tetapi kami juga akan menggunakan interupsi untuk ini. Jadi ketika tombol push ditekan, nilai dari potensiometer akan diatur