Isi kandungan:

Mikrokontroler AVR. Togol LED Menggunakan Suis Tombol Tekan. Menolak Butang Tekan: 4 Langkah
Mikrokontroler AVR. Togol LED Menggunakan Suis Tombol Tekan. Menolak Butang Tekan: 4 Langkah

Video: Mikrokontroler AVR. Togol LED Menggunakan Suis Tombol Tekan. Menolak Butang Tekan: 4 Langkah

Video: Mikrokontroler AVR. Togol LED Menggunakan Suis Tombol Tekan. Menolak Butang Tekan: 4 Langkah
Video: How to make a LED digital counter using 7- Segment Display 2024, Jun
Anonim
Image
Image

Di bahagian ini, kita akan belajar Cara membuat kod program C untuk ATMega328PU untuk menukar status ketiga LED sesuai dengan input dari tombol suis. Kami juga telah mencari jalan keluar untuk masalah ini ialah 'Switch Bounce'. Seperti biasa, kami akan memasang litar elektrik di dasar AVR ATmega328 untuk memeriksa kerja kod program.

Langkah 1: Menulis dan Membangun Aplikasi Mikrokontroler AVR dalam Kod C Menggunakan Platform Pembangunan Bersepadu Atmel Studio 7

Menulis dan Membangun Aplikasi Mikrokontroler AVR dalam Kod C Menggunakan Platform Pembangunan Bersepadu Atmel Studio 7
Menulis dan Membangun Aplikasi Mikrokontroler AVR dalam Kod C Menggunakan Platform Pembangunan Bersepadu Atmel Studio 7
Menulis dan Membangun Aplikasi Mikrokontroler AVR dalam Kod C Menggunakan Platform Pembangunan Bersepadu Atmel Studio 7
Menulis dan Membangun Aplikasi Mikrokontroler AVR dalam Kod C Menggunakan Platform Pembangunan Bersepadu Atmel Studio 7
Menulis dan Membangun Aplikasi Mikrokontroler AVR dalam Kod C Menggunakan Platform Pembangunan Bersepadu Atmel Studio 7
Menulis dan Membangun Aplikasi Mikrokontroler AVR dalam Kod C Menggunakan Platform Pembangunan Bersepadu Atmel Studio 7

Sekiranya anda tidak mempunyai Atmel Studio, anda harus memuat turun dan memasangnya.

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

Beberapa baris pertama kami mempunyai beberapa definisi penyusun.

F_CPU menentukan frekuensi jam dalam Hertz dan biasa dalam program yang menggunakan perpustakaan avr-libc. Dalam kes ini digunakan oleh rutin penundaan untuk menentukan cara mengira kelewatan waktu.

#ifndef F_CPU

#define F_CPU 16000000UL // memberitahu frekuensi kristal pengawal (16 MHz AVR ATMega328P) #endif

#include // header untuk membolehkan kawalan aliran data ke atas pin. Mentakrifkan pin, port, dll.

Fail termasuk yang pertama adalah sebahagian daripada avr-libc dan akan digunakan dalam hampir semua projek AVR yang anda jalankan. io.h akan menentukan CPU yang anda gunakan (sebab itulah anda menentukan bahagian ketika menyusun) dan seterusnya memasukkan tajuk definisi IO yang sesuai untuk cip yang kami gunakan. Ini hanya menentukan pemalar untuk semua pin, port, daftar khas, dll.

#include // header untuk mengaktifkan fungsi kelewatan dalam program

Pustaka util / delay.h mengandungi beberapa rutin untuk kelewatan pendek. Fungsi yang akan kita gunakan, adalah _delay_ms ().

Kami menggunakan definisi untuk menyatakan butang dan port LED dan pin kami. Dengan menggunakan pernyataan yang mendefinisikan seperti ini, kita hanya perlu mengubah 3 baris yang mudah dicari jika kita memindahkan LED ke pin I / O yang berbeza atau menggunakan AVR yang berbeza.

#define BUTTON1 1 suis butang disambungkan ke port B pin 1

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

Dua yang terakhir menentukan masa penyediaan pernyataan, dalam milisaat, untuk melepaskan suis dan masa untuk menunggu sebelum membenarkan penekanan butang yang lain. Masa debounce perlu disesuaikan dengan masa yang diperlukan untuk beralih dari digital tinggi ke digital rendah setelah semua pentalan. Tingkah laku lantunan akan berbeza dari suis ke suis, tetapi 20-30 milisaat biasanya cukup mencukupi.

#define DEBOUNCE_TIME 25 // masa untuk menunggu sementara butang "nyah-bangkit"

#tentukan LOCK_INPUT_TIME 300 // masa menunggu selepas butang ditekan

batal init_ports_mcu ()

{

Fungsi ini dipanggil sekali dalam permulaan program kami untuk memulakan pin output input yang akan kami gunakan.

Untuk butang, kami akan menggunakan register PORT dan PIN untuk menulis dan membaca. Dengan AVR, kami membaca pin menggunakan PINx register dan kami menulis pin menggunakan register PORTx. Kita perlu menulis ke daftar butang untuk membolehkan penarikan.

Untuk LED kita hanya perlu menggunakan register PORT untuk menulis, namun kita juga memerlukan register arah data (DDR) kerana pin I / O disiapkan sebagai input secara lalai.

Pertama, kami menetapkan pin I / O LED sebagai output menggunakan register arah data.

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

Seterusnya, tetapkan pin butang sebagai input secara jelas.

DDRB & = ~ (1 <

Seterusnya, pin PORTB ditetapkan tinggi (+5 volt) untuk menghidupkannya. Pin output pada mulanya tinggi, dan kerana LED kami aktif tinggi kabel, ia akan dihidupkan melainkan jika kami mematikannya secara jelas.

Dan akhirnya, kami mengaktifkan perintang tarik dalaman pada pin input yang kami gunakan untuk butang kami. Ini dilakukan hanya dengan mengeluarkan satu ke port. Ketika dikonfigurasi sebagai input, melakukannya menghasilkan memungkinkan pull-up dan ketika dikonfigurasi sebagai output, melakukannya hanya akan menghasilkan voltan tinggi.

PORTB = 0xFF; // Tetapkan semua pin PORTB sebagai TINGGI. Led dihidupkan, // juga perintang Pull Up dalaman pin pertama PORTB diaktifkan. DDRC = 0xFFu; // Tetapkan semua pin PORTC sebagai output. PORTC = 0x00u; // Tetapkan semua pin PORTC rendah yang mematikannya. DDRD = 0xFFu; // Tetapkan semua pin PORTD sebagai output. PORTD = 0x00u; // Tetapkan semua pin PORTD rendah yang mematikannya. }

butang_state char tidak bertanda ()

{

Fungsi ini mengembalikan nilai boolean yang menunjukkan sama ada butang ditekan atau tidak. Ini adalah sekatan kod dengan terus dijalankan dalam gelung infinate dan dengan itu mengundi keadaan butang. Di sinilah kita melepaskan suis.

Sekarang, ingat bahawa ketika kita menekan suis, pin output input ditarik ke tanah. Oleh itu, kami sedang menunggu pin menjadi rendah.

/ * butang ditekan ketika BUTTON1 bit kosong * /

jika (! (PINB & (1 <

Kami melakukannya dengan memeriksa sama ada bitnya jelas. Sekiranya bit jelas, yang menunjukkan bahawa butang tertekan, pertama-tama kami melambatkan masa yang ditentukan oleh DEBOUNCE_TIME iaitu 25ms dan kemudian periksa keadaan butang sekali lagi. Sekiranya butang tertekan setelah 25ms, maka suis dianggap dinyahaktifkan dan siap untuk mencetuskan acara dan oleh itu kami kembali ke rutin panggilan kami. Sekiranya butang tidak tertekan, kami kembali 0 ke rutin panggilan kami.

_delay_ms (DEBOUNCE_TIME);

jika (! (PINB & (1 <

int utama (tidak sah)

{

Rutin utama kami. Fungsi utamanya unik dan terpisah dari semua fungsi lain. Setiap program C mesti mempunyai satu fungsi () utama. utama adalah di mana AVR mula melaksanakan kod anda ketika kuasa pertama kali menyala, jadi ini adalah titik masuk program.

char tidak bertanda n_led = 1; // pada mulanya nombor LED dihidupkan sekarang

Panggilan fungsi untuk memulakan pin I / O yang sedang digunakan:

init_ports_mcu ();

gelung tak terhingga di mana program kami dijalankan:

semasa (1)

{

Apabila tombol_state mengembalikan satu yang menunjukkan bahawa butang itu ditekan dan dilepaskan, kemudian beralih status LED pada gilirannya mengikut parameter n_led.

if (button_state ()) // Jika butang ditekan, alihkan keadaan LED dan tunda selama 300ms (#tentukan LOCK_INPUT_TIME)

{suis (n_led) {kes 1: PORTB ^ = (1 << LED1); PORTC ^ = (1 << LED2); rehat;

Pernyataan ini menggunakan operator C bitwise. Kali ini ia menggunakan pengendali ATAU eksklusif. Apabila anda XOR PORT dengan nilai bit dari bit yang anda mahu togol, satu bit itu akan berubah tanpa mempengaruhi bit yang lain.

kes 2:

PORTC ^ = (1 << LED2); PORTD ^ = (1 << LED3); rehat; kes 3: PORTD ^ = (1 << LED3); PORTB ^ = (1 << LED1); n_led = 0; // tetapkan semula pemecahan nombor LED; } n_led ++; // LED seterusnya dihidupkan _delay_ms (LOCK_INPUT_TIME); }} kembali (0); }

Jadi sekarang, semasa anda menjalankan program ini, anda seharusnya dapat menekan butang tekan untuk menukar LED. Oleh kerana kelewatan kami yang ditentukan oleh LOCK_INPUT_TIME, anda boleh menekan dan menahan butang yang akan menyebabkan lampu LED mati dan menyala pada kadar yang konsisten (sedikit lebih daripada setiap 275ms).

Pengaturcaraan selesai.

Langkah seterusnya adalah membina projek dan memprogram fail hex ke dalam mikrokontroler menggunakan program avrdude.

Anda boleh memuat turun fail main.c dengan program dalam kod c:

Langkah 2: Memindahkan Fail Program HEX Ke Memori Cip Flash

Memindahkan Fail Program HEX Ke Memori Cip Kilat
Memindahkan Fail Program HEX Ke Memori Cip Kilat
Memindahkan Fail Program HEX Ke Memori Cip Kilat
Memindahkan Fail Program HEX Ke Memori Cip Kilat

Muat turun dan pasang AVRDUDE. Versi terkini yang tersedia ialah 6.3: Muat turun fail zip

Pertama, salin fail hex program ke direktori AVRDUDE. Dalam kes saya, ia adalah ButtonAVR.hex

Kemudian, ketik tetingkap prompt DOS arahan: avrdude –c [nama programmer] –p m328p –u –U flash: w: [nama fail hex anda].

Dalam kes saya adalah: avrdude –c ISPProgv1 –p m328p –u –U flash: w: ButtonAVR.hex

Perintah ini menulis fail hex ke memori mikrokontroler.

Tonton video dengan penerangan terperinci mengenai memori kilat mikrokontroler terbakar:

Pembakaran memori kilat mikrokontroler…

Okey! Kini, mikrokontroler berfungsi mengikut arahan program kami. Mari kita periksa!

Langkah 3: Penukaran Alat Perkakasan

Penukaran Perkakasan Perkakasan
Penukaran Perkakasan Perkakasan

Sebagai tambahan kepada pengalihan pertukaran perisian, kita boleh menggunakan teknik penyahtinjaan pertukaran perkakasan. Idea asas di sebalik teknik tersebut adalah menggunakan kapasitor untuk menyaring perubahan pantas pada isyarat suis.

Kapasitor nilai apa yang harus dipilih? Ini akhirnya akan bergantung pada seberapa buruk prestasi butang mengenai masalah ini. Beberapa butang dapat memperlihatkan tingkah laku memantul yang luar biasa, tetapi yang lain akan mempunyai sedikit. Nilai kapasitor rendah seperti 1.0 nanofarads akan bertindak balas dengan cepat, dengan sedikit atau tidak ada kesan pada pantulan. Sebaliknya, nilai kapasitor yang lebih tinggi seperti 220 nanofarads (yang masih cukup kecil dari segi kapasitor) akan memberikan peralihan perlahan dari voltan permulaan ke akhir (5 volt hingga 0 volt). Peralihan yang dilihat dengan kapasiti 220 nanofarad masih cukup pantas dalam arti dunia nyata, dan dengan demikian dapat digunakan pada butang yang berkinerja buruk.

Langkah 4: Litar Elektrik

Litar Elektrik
Litar Elektrik
Litar Elektrik
Litar Elektrik
Litar Elektrik
Litar Elektrik

Sambungkan komponen mengikut gambarajah skematik.

Disyorkan: