Bagaimana cara membaca input digital pada ATmega16?


18

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 ...


4
Ini akan dijawab di hampir semua tutorial pemula, dan saya khawatir jawaban lengkap di sini akan merusak pemahaman Anda lebih dari bantuan. Upaya apa yang telah Anda lakukan untuk belajar sebelumnya?
Yann Vernier

Tidak yakin apakah Anda melihat posting saya atau apakah Anda dapat melihatnya (maaf masih agak bingung tentang situs ini ...) Tetapi saya tahu kodenya, katakanlah pertanyaan saya adalah: apakah saya hanya menghubungkan pin ke GND dan yang rendah?
penasaran

2
Mengapa tidak mengedit posting Anda untuk mencerminkan hal ini dengan lebih akurat dan memasukkan posting di bawah ini dalam posting asli juga.
Amos

Coba Dari-Scratch AVR Tutorial ini halaman AVR Freaks. Anda akan menemukan lebih banyak barang di sana.
Leon Heller

Jawaban:


24

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.

# include <avr/io.h>

int main (void)
{
    // set all pins on PORTB for output
    DDRB = 0xFF;

    // set port pin PORTD2 as input and leave the others pins 
    // in their originally state (inputs or outputs, it doesn't matter)
    DDRD &= ~(1 << PD2);        // see comment #1

    while (1) 
    {
        if (PIND & (1<<PD2))    // see comment #2
            PORTB |= (1<<PB2);  // see comment #3
        else
            PORTB &= ~(1<<PB2); // see comment #4
    }
    return 0;
}

/ *

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.

* /


3
Saya tidak menyarankan Anda untuk memberikan email Anda karena berkorespondensi dengan email membuat komunikasi menjadi pribadi. Jadi tidak ada orang lain yang bisa mendapat manfaat. Tetapi jika Anda benar-benar ingin memberikan email Anda untuk komunikasi pribadi, tempat terbaik untuk melakukannya adalah di profil Anda.
Daniel Grillo

Bukankah sebaliknya - # 3 mematikan led, # 4 menyalakan led?
sitilge

2

https://www.mainframe.cx/~ckuethe/avr-c-tutorial/

https://www.mainframe.cx/~ckuethe/avr-c-tutorial/#digital-in

#include <avr/io.h>

/*
 * Assumptions:
 *  - LED connected to PORTB.2
 *  - Switch connected to PORTD.2
 */

int main (void)
{
    /* set PORTB for output*/
    DDRB = 0xFF;
    /* set PORTD for input*/
    DDRD &= 0xFB;
    PORTD |= 0x04;

    while (1) {
        if (PIND & 0x04)
            PORTB &= ~0x20;
        else
            PORTB |= 0x20;
    }
    return 0;
}

Terima kasih kepada @joby Taffey untuk tautan yang disediakan. Saya sedang mencari fungsi EEPROM dan saya mendapat banyak bantuan dari: mainframe.cx/~ckuethe/avr-c-tutorial/lesson11.c Terima kasih banyak.
Bishal Paudel



0

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.