Daftar Isi:

Mikrokontroler AVR. Toggle LED Menggunakan Push Button Switch. Push Button Debouncing.: 4 Langkah
Mikrokontroler AVR. Toggle LED Menggunakan Push Button Switch. Push Button Debouncing.: 4 Langkah

Video: Mikrokontroler AVR. Toggle LED Menggunakan Push Button Switch. Push Button Debouncing.: 4 Langkah

Video: Mikrokontroler AVR. Toggle LED Menggunakan Push Button Switch. Push Button Debouncing.: 4 Langkah
Video: AVR Microcontroller. Toggle LED’s using a Push Button Switch. Push Button Debouncing. 2024, Juli
Anonim
Image
Image

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 akan merakit rangkaian listrik di dasar AVR ATmega328 untuk memeriksa kerja kode program.

Langkah 1: Menulis dan Membangun Aplikasi Mikrokontroler AVR dalam Kode C Menggunakan Platform Pengembangan Terintegrasi Atmel Studio 7

Menulis dan Membangun Aplikasi Mikrokontroler AVR dalam Kode C Menggunakan Platform Pengembangan Terintegrasi Atmel Studio 7
Menulis dan Membangun Aplikasi Mikrokontroler AVR dalam Kode C Menggunakan Platform Pengembangan Terintegrasi Atmel Studio 7
Menulis dan Membangun Aplikasi Mikrokontroler AVR dalam Kode C Menggunakan Platform Pengembangan Terintegrasi Atmel Studio 7
Menulis dan Membangun Aplikasi Mikrokontroler AVR dalam Kode C Menggunakan Platform Pengembangan Terintegrasi Atmel Studio 7
Menulis dan Membangun Aplikasi Mikrokontroler AVR dalam Kode C Menggunakan Platform Pengembangan Terintegrasi Atmel Studio 7
Menulis dan Membangun Aplikasi Mikrokontroler AVR dalam Kode C Menggunakan Platform Pengembangan Terintegrasi Atmel Studio 7

Jika Anda tidak memiliki Atmel Studio, Anda harus mengunduh dan menginstalnya.

www.microchip.com/mplab/avr-support/atmel-studio-7

Beberapa baris pertama kami memiliki beberapa definisi kompiler.

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 fungsi delay dalam program

Pustaka util/delay.h berisi beberapa rutinitas untuk penundaan singkat. Fungsi yang akan kita gunakan adalah _delay_ms().

Kami menggunakan definisi untuk mendeklarasikan tombol dan port serta pin LED kami. Menggunakan pernyataan definisi seperti ini memungkinkan kita hanya perlu memodifikasi 3 baris yang mudah ditemukan jika kita memindahkan LED ke pin I/O yang berbeda atau menggunakan AVR yang berbeda.

#define BUTTON1 1 // sakelar tombol terhubung ke port B pin 1

#define LED1 0 // Led1 terhubung ke port B pin 0 #define LED2 1 // Led2 terhubung ke port C pin 1 #define LED3 2 // Led3 terhubung ke port D pin 2

Dua pernyataan terakhir menentukan waktu pengaturan, dalam milidetik, untuk melepaskan sakelar dan waktu untuk menunggu sebelum mengizinkan penekanan tombol lagi. Waktu debounce perlu disesuaikan dengan waktu yang diperlukan sakelar untuk beralih dari digital high ke digital low setelah semua bouncing. Perilaku pantulan akan berbeda dari sakelar ke sakelar, tetapi 20-30 milidetik biasanya cukup memadai.

#define DEBOUNCE_TIME 25 // waktu menunggu saat tombol "de-bouncing"

#define LOCK_INPUT_TIME 300 // waktu menunggu setelah tombol ditekan

batalkan init_ports_mcu()

{

Fungsi ini dipanggil sekali saja di awal program kita untuk menginisialisasi pin input output yang akan kita gunakan.

Untuk tombolnya, kita akan menggunakan register PORT dan PIN untuk menulis dan membaca. Dengan AVR, kita membaca pin menggunakan register PINx dan menulis ke pin menggunakan register PORTx. Kita perlu menulis ke register tombol untuk mengaktifkan pull-up.

Untuk LED kita hanya perlu menggunakan register PORT untuk menulis, namun kita juga membutuhkan register arah data (DDR) karena pin I/O diatur sebagai input secara default.

Pertama, kita mengatur pin I/O LED sebagai output menggunakan register arah datanya.

DDRB=0xFFu; // Atur semua pin PORTB sebagai output.

Selanjutnya, secara eksplisit mengatur pin tombol sebagai input.

DDRB &= ~(1<

Selanjutnya, pin PORTB diatur tinggi (+5 volt) untuk menyalakannya. Pin keluaran awalnya tinggi, dan karena LED kami terhubung ke kabel aktif-tinggi, itu akan menyala kecuali kami secara eksplisit mematikannya.

Dan akhirnya, kami mengaktifkan resistor pull-up internal pada pin input yang kami gunakan untuk tombol kami. Ini dilakukan hanya dengan mengeluarkan satu ke port. Ketika dikonfigurasi sebagai input, melakukan hal itu menghasilkan pengaktifan pull-up dan ketika dikonfigurasi sebagai output, hal itu hanya akan menghasilkan tegangan tinggi.

PORTB = 0xFF; // Set semua pin PORTB sebagai HIGH. Led menyala, // juga resistor Pull Up internal dari pin pertama PORTB diaktifkan. DDRC=0xFFu; // Atur semua pin PORTC sebagai output. PORTC=0x00u; // Atur semua pin PORTC rendah yang mematikannya. DDRD=0xFFu; // Atur semua pin PORTD sebagai output. PORTD=0x00u; // Atur semua pin PORTD rendah yang mematikannya. }

char button_state yang tidak ditandatangani ()

{

Fungsi ini mengembalikan nilai boolean yang menunjukkan apakah tombol ditekan atau tidak. Ini adalah blok kode yang terus dieksekusi dalam loop tak terbatas dan dengan demikian polling status tombol. Ini juga tempat kami mendebounce sakelar.

Sekarang, ingat bahwa ketika kita menekan sakelar, pin input output ditarik ke ground. Jadi, kami menunggu pin turun.

/* tombol ditekan saat BUTTON1 bit kosong */

jika (!(PIN & (1<

Kami melakukannya dengan memeriksa apakah bitnya jelas. Jika bit jelas, menunjukkan bahwa tombol ditekan, pertama-tama kita tunda untuk jumlah waktu yang ditentukan oleh DEBOUNCE_TIME yaitu 25 ms dan kemudian periksa status tombol lagi. Jika tombol ditekan setelah 25 mdtk, maka sakelar dianggap telah di-debounce dan siap untuk memicu suatu peristiwa, jadi kami mengembalikan 1 ke rutinitas pemanggilan kami. Jika tombol tidak ditekan, kami mengembalikan 0 ke rutinitas panggilan kami.

_delay_ms(DEBOUNCE_TIME);

jika (!(PIN & (1<

int utama (kosong)

{

Rutinitas utama kami. Fungsi utama adalah unik dan terpisah dari semua fungsi lainnya. Setiap program C harus memiliki tepat satu fungsi main(). main adalah tempat AVR mulai mengeksekusi kode Anda ketika daya pertama kali menyala, jadi ini adalah titik masuk program.

unsigned char n_led = 1; // awalnya nomor LED menyala sekarang

Panggilan fungsi untuk menginisialisasi pin I/O yang digunakan:

init_ports_mcu();

loop tak terbatas tempat program kami berjalan:

sementara (1)

{

Ketika button_state mengembalikan satu yang menunjukkan bahwa tombol telah ditekan dan di-debounce, kemudian mengubah status LED saat ini secara bergantian sesuai dengan parameter n_led.

if (button_state()) // Jika tombol ditekan, alihkan status LED dan tunda selama 300 md (#define LOCK_INPUT_TIME)

{ switch(n_led){ kasus 1: PORTB ^= (1<<LED1); PORTC ^= (1<<LED2); merusak;

Pernyataan-pernyataan ini menggunakan operator bitwise C. Kali ini menggunakan operator OR eksklusif. Ketika Anda XOR PORT dengan nilai bit dari bit yang ingin Anda alihkan, bit tersebut diubah tanpa mempengaruhi bit lainnya.

kasus 2:

PORTC ^= (1<<LED2); PORTD ^= (1<<LED3); merusak; kasus 3: PORTD ^= (1<<LED3); PORTB ^= (1<<LED1); n_led=0; // setel ulang pemutusan nomor LED; } n_led++; // LED berikutnya menyala _delay_ms(LOCK_INPUT_TIME); } } kembali (0); }

Jadi sekarang, ketika Anda menjalankan program ini, Anda harus dapat menekan tombol untuk mengaktifkan LED. Karena penundaan kami yang ditentukan oleh LOCK_INPUT_TIME, Anda dapat menekan dan menahan tombol yang akan menyebabkan LED mati dan hidup dengan kecepatan yang konsisten (sedikit lebih dari setiap 275 md).

Pemrograman selesai.

Langkah selanjutnya adalah membangun proyek dan memprogram file hex ke dalam mikrokontroler menggunakan program avrdude.

Anda dapat mengunduh file main.c dengan program dalam kode c:

Langkah 2: Mentransfer File HEX Program Ke Memori Flash Chip

Mentransfer File HEX Program Ke Memori Flash Chip
Mentransfer File HEX Program Ke Memori Flash Chip
Mentransfer File HEX Program Ke Memori Flash Chip
Mentransfer File HEX Program Ke Memori Flash Chip

Unduh dan instal AVRDUDE. Versi terbaru yang tersedia adalah 6.3: Unduh file zip

Pertama, salin file hex program ke direktori AVRDUDE. Dalam kasus saya ini ButtonAVR.hex

Kemudian, 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:ButtonAVR.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 3: Pengalihan Perangkat Keras Beralih

Saklar Perangkat Keras Debouncing
Saklar Perangkat Keras Debouncing

Selain debouncing sakelar perangkat lunak, kita dapat menggunakan teknik debouncing sakelar perangkat keras. Ide dasar di balik teknik tersebut adalah menggunakan kapasitor untuk menyaring perubahan cepat pada sinyal sakelar.

Berapa nilai kapasitor yang harus dipilih? Ini pada akhirnya akan tergantung pada seberapa buruk kinerja tombol terkait masalah khusus ini. Beberapa tombol dapat menampilkan perilaku memantul yang luar biasa, namun yang lain hanya memiliki sedikit. Nilai kapasitor rendah seperti 1,0 nanofarad akan bereaksi sangat cepat, dengan sedikit atau tanpa efek pada pantulan. Sebaliknya, nilai kapasitor yang lebih tinggi seperti 220 nanofarad (yang masih cukup kecil dalam hal kapasitor) akan memberikan transisi yang lambat dari tegangan awal ke tegangan akhir (5 volt ke 0 volt). Transisi yang terlihat dengan kapasitas 220 nanofarad masih cukup cepat dalam arti dunia nyata, dan dengan demikian dapat digunakan pada tombol yang berkinerja buruk.

Langkah 4: Sirkuit Listrik

Sirkuit Listrik
Sirkuit Listrik
Sirkuit Listrik
Sirkuit Listrik
Sirkuit Listrik
Sirkuit Listrik

Hubungkan komponen sesuai dengan diagram skematik.

Direkomendasikan: