Apa yang harus saya lakukan untuk membaca input digital (tombol tekan) pada ATmega16 ? Apakah saya harus mengaktifkan pullup-resistor atau dapatkah saya menggunakan 10 kohm? Apa yang akan menjadi kode sederhana? Cukup sederhana 'Nyalakan LED saat ditekan'.
Apakah ada tutorial pemula? Saya telah mencoba googling dan AVR Freaks , tetapi semuanya berkembang menjadi pertarungan di sana dan saya tidak mendapatkan jawaban saya. Saya benar-benar belum menemukan tutorial tentang hal ini. Banyak hal tertentu tetapi tidak ada yang sederhana tentang mikrokontroler AVR saya ...
Jawaban:
Salam Brasil!
Pertama-tama terima kasih Joby untuk contoh Anda. Kedua, contohnya hanya memiliki kesalahan kecil. Angka 0x20 tidak benar. Seharusnya 0x04. Juga, seperti saran, saya tidak akan menggunakan angka heksadesimal seperti 0xFB, 0x20, atau 0x04 dalam kode. Saya akan menyarankan menggunakan definisi port PIN yang ditemukan di io.h dan yang lainnya dirujuk oleh file header. Saya telah menulis ulang contoh Joby di bawah ini, dengan beberapa komentar untuk para pemula.
/ *
komentar untuk pemula
komentar # 1: (1 << PD2) menghasilkan binary 00000100. Operasi "~" membalik semua digit, yaitu, biner sekarang adalah 11111011. Akhirnya & = menerapkan logika "DAN" antara DDRD dan 11111011 dan hasilnya ditempatkan lagi dalam memori DDRD. Catatan: Apa yang dilakukan operator "DAN" adalah untuk setiap bit dalam memori DDRD, ia membandingkannya dengan angka biner di atas. Jika bit dalam DDRD adalah 0 dan bit dalam biner pada posisi gigitan yang sama adalah 1, maka bit yang dihasilkan adalah 0, jika DDRD adalah 1 dan bit dalam biner adalah 1, bit yang dihasilkan adalah 1, dan jika bit dalam DDRD adalah 1 atau 0 dan bit dalam biner adalah 0 maka bit yang dihasilkan selalu 0. Singkatnya, perintah DDRD & = ~ (1 << PD2) hanya mengubah bit PD2 ke nol dan membiarkan yang lainnya (nol atau yang) tidak tersentuh. Tampaknya sedikit rumit, tetapi setelah Anda terbiasa, itu adalah cara terbaik untuk mengubah sedikit gigitan tanpa mengubah bit lainnya.
comment # 2 : (1 << PD2) menghasilkan binary 00000100. Menggunakan logika yang sama "AND" yang dijelaskan dalam komentar # 1, perintah "PIND & 0000100" hanya memeriksa jika PIND2 (pin input kami di mana tombol push terhubung) ke) diatur ke tinggi atau tidak. Semua pin lainnya akan FALSE karena bit biner diatur ke 0, dan karena bit biner # 2 diatur ke 1, pernyataan IF akan BENAR hanya jika input PD2 disetel ke tinggi atau FALSE jika input PD2 adalah diatur ke rendah.
komentar # 3 : Mengikuti logika yang dijelaskan dalam komentar # 1, perintah ini menetapkan pin PINB2 pada port PORTB menjadi tegangan tinggi. Jika LED Anda terhubung dengan benar ke port pin ini dengan resistor ~ 300 ohm, dan resistor itu terhubung ke ground, LED akan menyala.
komentar # 4 : LED harus dimatikan karena alasan yang sama yang dijelaskan dalam komentar sebelumnya.
Pertimbangan terakhir:
a) Untuk menghindari osilasi tegangan pada pin input PD2 ketika tombol push tidak ditekan (sirkuit terbuka), saya sangat menyarankan untuk menempatkan resistor pull-down (1 kOhm atau lebih tinggi), sehingga LED tidak menyala secara tidak sengaja karena untuk osilasi tegangan acak ini.
b) Catatan sangkalan: Ide-ide yang diuraikan di sini hanya akan digunakan sebagai pendidikan dan tidak boleh digunakan dalam sistem nyata sebelum berkonsultasi dengan seorang ahli dalam bidang elektronik.
* /
sumber
https://www.mainframe.cx/~ckuethe/avr-c-tutorial/
https://www.mainframe.cx/~ckuethe/avr-c-tutorial/#digital-in
sumber
Hackaday telah menulis banyak untuk pemrograman AVR, ia memiliki banyak info hebat yang dapat membantu Anda
http://hackaday.com/2010/11/19/avr-programming-04-writing-code-etc/
http://hackaday.com/2010/11/05/avr-programming-03-reading-and-compiling-code/
http://hackaday.com/2010/10/25/avr-programming-02-the-hardware/
http://hackaday.com/2010/10/23/avr-programming-introduction/
sumber
Nah ini untuk AT90Usb1287, sebuah ATMega, tetapi hal-hal tombol dasar harus kurang lebih sama. Cukup ganti nama IO.
sumber
Hal lain yang perlu dipertimbangkan ketika berhadapan dengan input digital dari sakelar mekanis adalah kontak memantul - mengubah apa yang seharusnya menjadi satu tombol tekan menjadi apa yang tampak seperti beberapa dorongan.
Untuk sesuatu seperti menyalakan LED ketika tombol ditekan, Anda mungkin tidak perlu khawatir tentang pelepasan. Untuk sesuatu yang sedikit lebih rumit (seperti menghidupkan LED pada tombol tekan), debouncing adalah suatu keharusan.
Jack Ganssle memiliki Panduan yang bagus untuk Debouncing
sumber