Avr Programlama 1: Merhaba Dünya 3
Okuyucularımızın hatırlayacağı üzere önceki yazılarımızda Atmega328P'yi kullanarak giriş çıkış portlarını nasıl kullanacağımızı öğrenmiştik. Giriş çıkışlar ile igili serinin son yazısında ise girdilerin okunması ve mikrodenetleyicimizin içerisinde bulunan dahili yukarı çekme dirençlerinin nasıl kullanılacığının üzerinde duracağız.
Dahili Yukarı Çekme Dirençleri (Internal Pull-up Resistors)
Atmega 328P'nin veri kitapçığının I/O Ports isimli başlığına bakacak olursanız, aşağıdaki devreye benzer bir çizimle karşılaşırsınız. Burada bir Fet ile pinin bir direnç aracılığıyla beslemeye bağlandığı sembolize edilmiştir.

Bu işlemi gerçekleştirebilmeniz için kullanmak istediğiniz pinin giriş yapılması ve PORTX yazacındaki ilgili bitin mantık 1 seviyesine yükseltilmesi gerekmektedir. Atmega328P'de portlar varsayılan olarak giriş olarak ayarlanmıştır. Dahili yukarı çekme direncinin varlığını gözlemleyebilmek için basit bir kod yazıp, yukarı çekme direncinin bağlı olduğu pine bir LED bağlayalım.
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
/* Replace with your application code */
while (1)
{
PORTC|=(1<<2);
_delay_ms(1000);
PORTC&=~(1<<2);
_delay_ms(1000);
}
}
Pratikte bu yaptığımız işlemin hiçbir geçerliliği yok. Yukarı çekme dirençleri sürekli açılıp kapatılmaz. Burada fiziksel bir yapının varlığını kavramınız için böyle bir yaklaşım sergiledim. Sayısal sistemlerde girişler boşta bırakılamaz. Pinler etraftan aldıkları gürültü ile mantıksal durumlarını değiştirebilir. Bu durum değişimlerinden etkilenmemek için bacaklar genelde 10k'lık bir direnç ile GND(Pull-Down) veya VCC(Pull-Up) hattına bağlanır. Bu direncin değeri sistemden sisteme değişebilir. Bu direnci dışarıdan bağlayabileceğiniz gibi dahili direnci de kullanabilirsiniz.
Girişlerin Okunması
Uygulamayı biraz daha derinleştirelim ve PC2 pinine bağlanan bir butonun durumunu okuyalım. Okunan duruma göre PB0'a bağlı LED'i yakalım.

/*
* yazi3_merhaba dunya.c
*
* Created: 27.06.2021 19:29:19
* Author : Muhammed
*/
#include <avr/io.h>
int main(void)
{
DDRB=(1<<DDB0);//PB0 çıkış olarak ayarlandı.
PORTC=(1<<PORTC2);//PC2'ye bağlı yukarı çekme direnci etkinleştirildi.
/* Replace with your application code */
while (1)
{
if (PINC==0b00000100)//PC2 mantık 1 seviyesinde mi?
{
PORTB|=(1<<PORTB0);//PB0 mantık 1 seviyesine yükseltildi.
}
else{
PORTB&=~(1<<PORTB0);//PB0 mantık 0 seviyesine düşürüldü.
}
}
}
Programlamaya aşina biriyseniz yorum satırlarından programda ne yapmaya çalıştığımızı anlamış olmalısınız. Öncelikle PB0'ı çıkış olarak ayarlayıp PC2'ye bağlı yukarı çekme direncini etkinleştirdik. Yukarıda bahsettiğimiz gibi giriş olarak tanımlanan pinin mantıksal durumları PINx yazaçlarından okunur. Bu yüzden PINC'nin içeriğini okuyup 0x04 ile karşılaştırdık. Sonrasında ise oluşan koşullar neticesinde mikrodenetleyicimizin işletmesini istediğimiz senaryoyu yazdık. Bu program ile butona bastığınız sürece LED'iniz ışık yaymaya devam edecektir.
Pinlerde Bulunan Kenetleme Diyotları
Atmega328P' nin giriş pinlerinde besleme hatlarına bağlı ikişer tane diyot bulunur. Bu diyotların amacı pine dışarıdan gelen yüksek voltajı sınırlandırmadır.

Burada atlanılamaması gereken nokta pinin önüne bir direnç koyma zorunluluğunuzdur. Bu direnç akımı sınırlayarak diyotlarınızı koruyacaktır. Devre tasarımı bu yazının konusu olmadığından fazla detaylara girmiyorum. Dileyen internette ufak bir arama ile konunun detaylarına erişebilir. Digikey'in konu hakkındaki yazısına ulaşmak için bağlantıya tıklayabilirsiniz.
Anahtar Kelimeler:Clamp diodes, İnput protection in digital electronics
Her ne kadar veri kitapçığındaki bu dahili koruma ESD koruması olarak adlandırılmış olsa da genelde ESD koruması için girişlere TVS diyotları bağlanır.
Bir başka problem ise girişlere bağlanan buton gibi mekanik yapıların oluşturduğu bozuk sinyallerdir, bu sinyalleri bastırmak için yazılımsal olduğu kadar donanımsal yollarda kullanılır. Genelde bu sorunun önüne geçmek için geliştiriciler programlarına bekleme koyarlar. Bu yöntemi her programda kullanamayabilirsiniz. Yukarıda verdiğim bağlantıda bu bozuk sinyalin RC devresi ile nasıl düzeltilebileceği de anlatılmış. Bu konuyu başka bir yazıda daha detaylı ele alacak olsam da konu hakkında bilgi sahibi olabilmeniz için sizi Barış Hoca'nın internet sitesine yönlendiriyorum. Bu bağlantıda donanımsal ve yazılımsal olarak uygulanan ark engelleme(debouncing)metotları anlatılmış. Ayrıca sitede Atmel programlama hakkında güzel yazılar var.
Genel olarak özetlersek Merhaba Dünya serisi ile mikrodenetleyici programlamaya giriş yapmış olduk. Burada edindiğiniz bilgiler temel niteliği oluşturduğundan biraz gayret ile herhangi bir marka altında programlarınızı yazabilirsiniz.
Comments