Daftar Isi:

Mikrokontroler AVR. LED Flasher Menggunakan Timer. Timer Interupsi. Mode CTC Timer: 6 Langkah
Mikrokontroler AVR. LED Flasher Menggunakan Timer. Timer Interupsi. Mode CTC Timer: 6 Langkah

Video: Mikrokontroler AVR. LED Flasher Menggunakan Timer. Timer Interupsi. Mode CTC Timer: 6 Langkah

Video: Mikrokontroler AVR. LED Flasher Menggunakan Timer. Timer Interupsi. Mode CTC Timer: 6 Langkah
Video: Timer 0 in avr | Avr tutorials 2024, November
Anonim
Image
Image

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

Pernyataan Masalah 1: Ayo Flash Pertama LED (hijau) Setiap 50 Ms
Pernyataan Masalah 1: Ayo Flash Pertama LED (hijau) Setiap 50 Ms

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

Pernyataan Masalah 1: Ayo Flash Pertama LED (hijau) Setiap 50 Ms
Pernyataan Masalah 1: Ayo Flash Pertama LED (hijau) Setiap 50 Ms
Pernyataan Masalah 1: Ayo Flash Pertama LED (hijau) Setiap 50 Ms
Pernyataan Masalah 1: Ayo 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

Pernyataan Masalah 2: Mari Flash LED Kedua (biru) Setiap 1 detik
Pernyataan Masalah 2: Mari Flash LED Kedua (biru) Setiap 1 detik
Pernyataan Masalah 2: Mari Flash LED Kedua (biru) Setiap 1 detik
Pernyataan Masalah 2: Mari Flash LED Kedua (biru) Setiap 1 detik
Pernyataan Masalah 2: Mari Flash LED Kedua (biru) Setiap 1 detik
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

Pernyataan Masalah 3: Mari Flash Ketiga LED (merah) Setiap 16 ms
Pernyataan Masalah 3: Mari Flash Ketiga LED (merah) Setiap 16 ms
Pernyataan Masalah 3: Mari Flash Ketiga LED (merah) Setiap 16 ms
Pernyataan Masalah 3: Mari Flash Ketiga LED (merah) Setiap 16 ms
Pernyataan Masalah 3: Mari Flash Ketiga LED (merah) Setiap 16ms
Pernyataan Masalah 3: Mari Flash Ketiga LED (merah) Setiap 16ms
Pernyataan Masalah 3: Mari Flash Ketiga LED (merah) Setiap 16 ms
Pernyataan Masalah 3: Mari Flash Ketiga LED (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

Menulis Kode untuk Program di C. Mengunggah File HEX Ke Memori Flash Mikrokontroler
Menulis Kode untuk Program di C. Mengunggah File HEX Ke Memori Flash Mikrokontroler
Menulis Kode untuk Program di C. Mengunggah File HEX Ke Memori Flash Mikrokontroler
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

Membuat Sirkuit Listrik
Membuat Sirkuit Listrik
Membuat Sirkuit Listrik
Membuat Sirkuit Listrik
Membuat Sirkuit Listrik
Membuat Sirkuit Listrik

Hubungkan komponen sesuai dengan diagram skematik.

Direkomendasikan: