ATmega16'daki dijital girişi nasıl okurum?


18

ATmega16'da bir dijital girişi (basma düğmesi) okumak için ne yapmam gerekir ? Pull-dirençleri etkinleştirmem gerekiyor mu yoksa 10 kohm'luk bir akım kullanabilir miyim? Bazı basit kodlar ne olurdu? Sadece basit bir 'Bir şey basıldığında LED'i açın'.

Yeni başlayanların eğitimi var mı? Google'ı ve AVR Freaks'ı denedim , ancak her şey orada bir kavgaya dönüşüyor ve cevabımı alamıyorum. Bu konu hakkında hiçbir eğitim bulamadım. AVR mikro denetleyicimle ilgili basit bir şey yok ama çok fazla şey ...


4
Bu, hemen hemen her yeni başlayan öğreticide cevaplanacaktır ve burada tam bir yanıtın, anlayışınızı yardımdan daha fazla zedeleyeceğinden korkuyorum. Öğrenmek için hangi çabayı gösterdiniz?
Yann Vernier

Eğer benim yazı gördüm ya da görmek mümkün değil emin değilim (üzgünüm hala bu site hakkında karışık ...) Ama kodu biliyorum, diyelim ki soru: Ben sadece GND ve düşük bir pin bağlamak mı?
meraklı

2
Neden daha doğru bir şekilde yansıtmak ve aşağıdaki gönderiyi orijinal yayına dahil etmek için yayınınızı düzenlemiyorsunuz?
Amos

Bu AVR Ucubeler sayfasındaki Sıfırdan AVR Eğiticisini deneyin . Orada çok daha fazla şey bulacaksınız.
Leon Heller

Yanıtlar:


24

Brezilya selamlar!

Her şeyden önce örnek için Joby teşekkürler. İkincisi, örneğinin küçük bir hatası var. 0x20 sayısı doğru değil. 0x04 olmalıdır. Ayrıca, sadece bir öneri olarak, kodda 0xFB, 0x20 veya 0x04 gibi onaltılık sayılar kullanmaz. Ben io.h ve üstbilgi dosyası tarafından başvurulan diğerleri bulunan PIN bağlantı noktası tanımlarını kullanmanızı öneririm. Joby'nin örneğini yeni başlayanlar için bazı yorumlarla birlikte yeniden yazdım.

# 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;
}

/ *

yeni başlayanlar için yorumlar

yorum # 1: (1 << PD2) ikili 00000100 üretir. "~" İşlemi tüm basamakları çevirir, yani ikili şimdi 11111011'dir. Sonunda & = DDRD ile 11111011 arasında "VE" mantığını uygular ve sonuç tekrar yerleştirilir DDRD bellekte. Not: "VE" operatörünün yaptığı şey, DDRD belleğindeki her bit için yukarıdaki ikili sayı ile karşılaştırılır. DDRD'deki bit 0 ise ve aynı ısırma konumundaki ikili dosyadaki bit 1 ise, DDRD 1 ise ve ikili dosyadaki bit 1 ise, sonuçtaki bit 1 ve DDRD'deki bit 1 veya 0'dır ve ikili dosyadaki bit 0'dır, sonuçta elde edilen bit her zaman 0'dır. Özetle, DDRD & = ~ (1 << PD2) komutu sadece PD2 bitini sıfıra değiştirir ve diğerlerini (sıfırlar veya olanlar) dokunmadan bırakır. Biraz karmaşık görünüyor, ama buna alıştıktan sonra, diğer bitleri değiştirmeden bir ısırıkta biraz değiştirmenin en iyi yolu.

comment # 2 : (1 << PD2) ikili 00000100'ü üretir. # 1 numaralı açıklamada açıklanan aynı "VE" mantığını kullanarak, "PIND & 0000100" komutu yalnızca PIND2'nin (basma düğmesinin bağlı olduğu giriş pinimiz) to) yüksek olarak ayarlanmış veya ayarlanmamış. İkili bitler 0 olarak ayarlandığından ve diğer ikili bit # 2 olarak ayarlandığından, diğer tüm pinler FALSE olur, IF ifadesi yalnızca PD2 girişi yüksek olarak ayarlanmışsa TRUE olur veya PD2 girişi ise FALSE olur düşük olarak ayarlayın.

comment # 3 : Yorum # 1'de açıklanan mantığın ardından, bu komut PORTB portundaki çıkış pimi PINB2'sini yüksek voltaja ayarlar. LED'iniz ~ 300 ohm'luk bir dirençle bu pim portuna doğru bağlanmışsa ve bu direnç toprağa bağlıysa, LED açılmalıdır.

comment # 4 : LED, önceki yorumlarda açıklananlarla aynı nedenlerle sönmelidir.

Son muhakemeler:

a) Basma düğmesine basılmadığında (açık devre) PD2 giriş piminde voltaj salınımını önlemek için, LED'in yanlışlıkla yanmaması için bir aşağı çekme direnci (1 kOhm veya daha yüksek) yerleştirmenizi öneririm. bu rastgele voltaj salınımına.

b) Sorumluluk reddi notu: Burada açıklanan fikirler yalnızca eğitim amaçlı kullanılmalıdır ve elektronik uzmanına danışmadan herhangi bir gerçek sistemde KULLANILMAMALIDIR.

* /


3
E-postanızı vermenizi teşvik etmiyorum çünkü e-postayla yazışmak iletişimi özel kılıyor. Yani hiç kimse bundan yararlanamaz. Ancak, özel iletişim için e-postanızı gerçekten vermek istiyorsanız, bunu yapmak için en iyi yer profilinizde.
Daniel Grillo

Tersi değil mi - # 3 led'i kapatır, # 4 led'i açar mı?
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;
}

Verilen bağlantı için @joby Taffey'e teşekkür ederiz. EEPROM işlevlerini arıyordum ve şu kaynaktan çok yardım aldım: mainframe.cx/~ckuethe/avr-c-tutorial/lesson11.c Çok teşekkür ederim.
Bishal Paudel



0

Mekanik bir anahtardan gelen dijital bir girişle uğraşırken göz önünde bulundurulması gereken başka bir şey, temasların zıplamasıdır - tek bir düğmenin ne olması gerektiğini değiştirmek, birden fazla basma gibi görünecektir.

Düğme basılı tutulduğunda bir LED'i açmak gibi bir şey için, muhtemelen ayrılma konusunda endişelenmenize gerek yoktur. Biraz daha karmaşık bir şey için (düğmeye basıldığında LED'i değiştirmek gibi), ayrılma bir zorunluluktur.

Jack Ganssle Debouncing için iyi bir rehber var

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.