İçindekiler:

AVR Mikrodenetleyici. Bir Basmalı Düğme Anahtarı Kullanarak LED'leri Değiştirin. Düğmeden Zıplamadan Çıkarma: 4 Adım
AVR Mikrodenetleyici. Bir Basmalı Düğme Anahtarı Kullanarak LED'leri Değiştirin. Düğmeden Zıplamadan Çıkarma: 4 Adım

Video: AVR Mikrodenetleyici. Bir Basmalı Düğme Anahtarı Kullanarak LED'leri Değiştirin. Düğmeden Zıplamadan Çıkarma: 4 Adım

Video: AVR Mikrodenetleyici. Bir Basmalı Düğme Anahtarı Kullanarak LED'leri Değiştirin. Düğmeden Zıplamadan Çıkarma: 4 Adım
Video: On Off Anahtar (Düğme) Bağlantısı Switch connections Anahtar ile Led çalıştırmak Ev Yapımı El yapımı 2024, Aralık
Anonim
Image
Image

Bu bölümde, bir düğme anahtarından gelen girişe göre üç LED'in durumunu değiştirmek için ATMega328PU için program C kodunu nasıl yapacağımızı öğreneceğiz. Ayrıca, 'Switch Bounce' sorununa bir çözüm araştırdık. Genellikle olduğu gibi, program kodunun çalışmasını kontrol etmek için elektrik devresini AVR ATmega328'in tabanına monte edeceğiz.

Adım 1: Entegre Geliştirme Platformunu Kullanarak C Kodunda AVR Mikrodenetleyici Uygulaması Yazma ve Oluşturma Atmel Studio 7

Entegre Geliştirme Platformunu Kullanarak C Kodunda AVR Mikrodenetleyici Uygulaması Yazma ve Oluşturma Atmel Studio 7
Entegre Geliştirme Platformunu Kullanarak C Kodunda AVR Mikrodenetleyici Uygulaması Yazma ve Oluşturma Atmel Studio 7
Entegre Geliştirme Platformunu Kullanarak C Kodunda AVR Mikrodenetleyici Uygulaması Yazma ve Oluşturma Atmel Studio 7
Entegre Geliştirme Platformunu Kullanarak C Kodunda AVR Mikrodenetleyici Uygulaması Yazma ve Oluşturma Atmel Studio 7
Entegre Geliştirme Platformunu Kullanarak C Kodunda AVR Mikrodenetleyici Uygulaması Yazma ve Oluşturma Atmel Studio 7
Entegre Geliştirme Platformunu Kullanarak C Kodunda AVR Mikrodenetleyici Uygulaması Yazma ve Oluşturma Atmel Studio 7

Atmel Studio'nuz yoksa, indirip kurmalısınız.

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

Elimizdeki ilk birkaç satır bazı derleyici tanımları.

F_CPU, Hertz cinsinden saat frekansını tanımlar ve avr-libc kitaplığını kullanan programlarda yaygındır. Bu durumda gecikme rutinleri tarafından zaman gecikmelerinin nasıl hesaplanacağını belirlemek için kullanılır.

#ifndef F_CPU

#define F_CPU 16000000UL // denetleyici kristal frekansını söylüyor (16 MHz AVR ATMega328P) #endif

#include // pinler üzerinde veri akışı kontrolünü etkinleştirmek için üstbilgi. Pinleri, portları vb. tanımlar.

İlk içerme dosyası avr-libc'nin bir parçasıdır ve üzerinde çalıştığınız hemen hemen tüm AVR projelerinde kullanılacaktır. io.h, kullandığınız CPU'yu belirleyecektir (bu nedenle, derlerken parçayı belirtirsiniz) ve sırayla, kullandığımız çip için uygun IO tanım başlığını içerir. Tüm pinleriniz, portlarınız, özel kayıtlarınız vb. için sabitleri tanımlar.

#include // programda gecikme fonksiyonunu etkinleştirmek için başlık

util/delay.h kitaplığı kısa gecikmeler için bazı rutinler içerir. Kullanacağımız fonksiyon _delay_ms().

Düğmemizi ve LED'in bağlantı noktalarını ve pinlerini bildirmek için tanımlar kullanırız. Bunun gibi tanımlı ifadeleri kullanmak, LED'i farklı bir G/Ç pinine hareket ettirirsek veya farklı bir AVR kullanırsak, yalnızca bulunması kolay 3 satırı değiştirmemize izin verir.

#define BUTTON1 1 // B bağlantı noktası pin 1'e bağlı buton anahtarı

#define LED1 0 // Led1 port B pin 0'a bağlı #define LED2 1 // Led2 port C pin 1'e bağlı #define LED3 2 // Led3 port D pin 2'ye bağlı

Son iki ifade, anahtarın iptal edilmesi için milisaniye cinsinden kurulum sürelerini ve düğmeye bir kez daha basılmasına izin vermeden önce bekleme süresini tanımlar. Geri dönme süresinin, tüm sıçramalardan sonra anahtarın dijital bir yüksekten dijital bir alçağa geçmesi için geçen süreye ayarlanması gerekir. Sıçrama davranışı anahtardan anahtara farklılık gösterecektir, ancak 20-30 milisaniye genellikle oldukça yeterlidir.

#define DEBOUNCE_TIME 25 // "zıplamadan çıkma" butonu sırasında bekleme süresi

#define LOCK_INPUT_TIME 300 // butona basıldıktan sonra bekleme süresi

geçersiz init_ports_mcu()

{

Bu fonksiyon, kullanacağımız giriş çıkış pinlerini başlatmak için programımızın başında sadece bir kez çağrılır.

Buton için yazma ve okuma için PORT ve PIN kayıtlarını kullanacağız. AVR'lerde bir pini PINx register'ını kullanarak okuyoruz ve bir pin'e onun PORTx register'ını kullanarak yazıyoruz. Pull-up'ları etkinleştirmek için buton kaydına yazmamız gerekiyor.

LED için sadece yazmak için PORT kaydını kullanmamız gerekiyor, ancak G/Ç pinleri varsayılan olarak giriş olarak ayarlandığından veri yönü kaydına (DDR) da ihtiyacımız var.

İlk olarak, veri yönü kaydını kullanarak LED'in I/O pinlerini çıkış olarak ayarlıyoruz.

DDRB=0xFFu; // PORTB'nin tüm pinlerini çıkış olarak ayarlayın.

Ardından, düğme pinini açıkça bir giriş olarak ayarlayın.

DDRB &= ~(1<

Ardından, PORTB pinleri onu açmak için yüksek (+5 volt) ayarlanır. Çıkış pinleri başlangıçta yüksektir ve LED'imiz aktif-yüksek kablolandığından, özellikle kapatmadıkça açılacaktır.

Ve son olarak, butonumuz için kullandığımız giriş pininde dahili pull-up direncini etkinleştiriyoruz. Bu, porta bir tane göndererek yapılır. Bir giriş olarak konfigüre edildiğinde, bunun yapılması pull-up'ların etkinleştirilmesiyle sonuçlanır ve bir çıkış olarak konfigüre edildiğinde, bunu yapmak sadece yüksek bir voltaj verir.

PORTB = 0xFF; // PORTB'nin tüm pinlerini HIGH olarak ayarlayın. Led açık, // ayrıca ilk pin PORTB'nin dahili Pull Up direnci etkinleştirilir. DDRC=0xFFu; // PORTC'nin tüm pinlerini çıkış olarak ayarlayın. PORTC=0x00u; // PORTC'nin tüm pinlerini kapatacak şekilde düşük ayarlayın. DDRD=0xFFu; // PORTD'nin tüm pinlerini çıkış olarak ayarlayın. PORTD=0x00u; // PORTD'nin tüm pinlerini düşük olarak ayarlayın, bu da onu kapatır. }

imzasız karakter button_state()

{

Bu işlev, düğmeye basılıp basılmadığını gösteren bir boole değeri döndürür. Bu, sonsuz döngüde sürekli olarak yürütülen ve bu nedenle düğmenin durumunu sorgulayan kod bloğudur. Burası aynı zamanda anahtarı devre dışı bıraktığımız yer.

Şimdi, anahtara bastığımızda giriş çıkış pininin toprağa çekildiğini unutmayın. Bu yüzden pinin düşmesini bekliyoruz.

/* BUTTON1 biti temizlendiğinde butona basılır */

if (!(PINB & (1<)

Bunu bitin temiz olup olmadığını kontrol ederek yapıyoruz. Butona basıldığını gösteren bit temizse, önce DEBOUNCE_TIME ile tanımlanan 25ms süre kadar bekleyip butonun durumunu tekrar kontrol ederiz. Düğmeye 25 ms'den sonra basılırsa, anahtarın geri döndüğü ve bir olayı tetiklemeye hazır olduğu kabul edilir ve böylece çağrı rutinimize 1 geri döneriz. Düğmeye basılmazsa, arama rutinimize 0 döndürürüz.

_delay_ms(DEBOUNCE_TIME);

if (!(PINB & (1<)

int ana (boş)

{

Ana rutinimiz. Ana işlev benzersizdir ve diğer tüm işlevlerden farklıdır. Her C programının tam olarak bir main() işlevi olmalıdır. main, güç ilk açıldığında AVR'nin kodunuzu yürütmeye başladığı yerdir, bu nedenle programın giriş noktasıdır.

unsigned char n_led = 1; // başlangıçta LED numarası şimdi yanıyor

Kullanılan G/Ç pinlerini başlatmak için işlevin çağrısı:

init_ports_mcu();

programımızın çalıştığı sonsuz döngü:

süre (1)

{

button_state, butonun basıldığını ve geri döndüğünü gösteren bir döndürdüğünde, ardından LED'lerin mevcut durumunu n_led parametresine göre değiştirir.

if (button_state()) // Düğmeye basılırsa, LED'in durumunu değiştirin ve 300ms geciktirin (#define LOCK_INPUT_TIME)

{ switch(n_led){ durum 1: PORTB ^= (1<<LED1); PORTC ^= (1<<LED2); kırmak;

Bu ifadeler, C bitsel operatörleri kullanır. Bu sefer özel VEYA operatörünü kullanıyor. PORT'u değiştirmek istediğiniz bitin bit değeriyle XOR yaptığınızda, o bit, diğer bitleri etkilemeden değiştirilir.

durum 2:

PORTC ^= (1<<LED2); PORTD ^= (1<<LED3); kırmak; durum 3: PORTD ^= (1<<LED3); PORTB ^= (1<<LED1); n_led=0; // LED sayı kesmesini sıfırla; } n_led++; // sonraki LED yanıyor _delay_ms(LOCK_INPUT_TIME); } } dönüş (0); }

Şimdi, bu programı çalıştırdığınızda, LED'ler arasında geçiş yapmak için düğmeye basabilmeniz gerekir. LOCK_INPUT_TIME ile tanımlanan gecikmemiz nedeniyle, LED'lerin sabit bir oranda (her 275ms'den biraz fazla) sönüp açılmasına neden olacak düğmeye basıp basılı tutabilirsiniz.

Programlama tamamlandı.

Sonraki adım, projeyi oluşturmak ve avrdude programını kullanarak hex dosyasını mikrodenetleyiciye programlamaktır.

main.c dosyasını programla birlikte c koduyla indirebilirsiniz:

Adım 2: Programın HEX Dosyasını Chip'in Flash Belleğine Aktarma

Programın HEX Dosyasının Chip'in Flash Belleğine Aktarılması
Programın HEX Dosyasının Chip'in Flash Belleğine Aktarılması
Programın HEX Dosyasının Chip'in Flash Belleğine Aktarılması
Programın HEX Dosyasının Chip'in Flash Belleğine Aktarılması

AVRDUDE.dll indirin ve kurun. Mevcut en son sürüm 6.3'tür: Zip dosyasını indirin

Öncelikle programın hex dosyasını AVRDUDE dizinine kopyalayın. Benim durumumda ButtonAVR.hex

Ardından, DOS komut penceresine şu komutu yazın: avrdude –c [programcının adı] –p m328p –u –U flash:w:[hex dosyanızın adı].

Benim durumumda: avrdude –c ISPProgv1 –p m328p –u –U flash:w:ButtonAVR.hex

Bu komut, hex dosyasını mikrodenetleyicinin belleğine yazar.

Mikrodenetleyici flash bellek yazma işleminin ayrıntılı bir açıklamasıyla videoyu izleyin:

Mikrodenetleyici flash bellek yakma…

Tamam! Artık mikrodenetleyici programımızın talimatlarına göre çalışmaktadır. Hadi kontrol edelim!

3. Adım: Donanım Anahtarının Geri Dönmesi

Donanım Anahtarının Geri Dönmesi
Donanım Anahtarının Geri Dönmesi

Yazılım anahtarı geri döndürmeye ek olarak, donanım anahtarı geri döndürme tekniğini kullanabiliriz. Bu tekniğin arkasındaki temel fikir, anahtar sinyalindeki hızlı değişiklikleri filtrelemek için bir kapasitör kullanmaktır.

Hangi değerde kapasitör seçilmelidir? Bu, sonuçta, düğmenin bu belirli sorunla ilgili olarak ne kadar kötü performans gösterdiğine bağlı olacaktır. Bazı düğmeler muazzam bir zıplama davranışı gösterebilir, ancak diğerlerinde çok az olacaktır. 1.0 nanofarad gibi düşük bir kapasitör değeri, sıçrama üzerinde çok az veya hiç etkisi olmadan çok hızlı tepki verir. Tersine, 220 nanofarad gibi daha yüksek bir kapasitör değeri (kapasitörler açısından hala oldukça küçüktür) başlangıç voltajından bitiş voltajına (5 volttan 0 volta) yavaş bir geçiş sağlayacaktır. 220 nanofarad kapasite ile görülen geçiş, gerçek dünya anlamında hala oldukça hızlıdır ve bu nedenle düşük performans gösteren düğmelerde kullanılabilir.

Adım 4: Elektrik Devresi

Elektrik devresi
Elektrik devresi
Elektrik devresi
Elektrik devresi
Elektrik devresi
Elektrik devresi

Bileşenleri şematik diyagrama göre bağlayın.

Önerilen: