Elektronik / Mikrodenetleyici Projeleri/

AVR’ye Merhaba

Final sınavları başlayınca insana nereden geldiğini bilmediğim bir sıkıntı basıyor. Geçen senelerde bu sıkıntı anlarında sitemi düzenler ya da photoshop ile header tasarladım fakat bu dönem bir değişiklik yapıp, başka tür bir mikrodenetleyiciye giriş yapmak istedim.

8051 ile başlayan mikrodenetleyici maceram, PIC ile ilerlemiş fakat nedense hiç bir zaman Atmel’in ürettiği AVR’ye bulaşmamıştım. Hemen bu eksiğimi gidermek, en azından ben buna el attım demek için kolları sıvadım. Öncelikle PIC’ten AVR’ye geçiş yapacaklar için söylemem gereken birinci şey şu: AVR için gerekli derleyiciler bedava!

Evet yanlış duymadınız, PIC mikrodenetleyicilerde olduğu gibi yok deneme süresiymiş, yok başka bir şeymiş uğraşmıyorsunuz. Bu, eğer bir firma iseniz, çok büyük bir avantaj demek.

Ayrıca belirtmem gerekiyor, Atmega16’nın datasheet’i bugüne kadar gördüğüm en güzel, en açıklayıcı datasheetlerden biri. Utanmasa sizin yerinize kodunuzu yazacak.

“Vay bu çok güzelmiş” diyorsanız, sırayla yapmanız gerekenler ise şöyle:

– Öncelikle WinAVR‘yi bilgisayarımıza kuruyoruz.
– Daha sonra Eclipse sitesinden Eclipse IDE for C/C++ Developer pakedini indiriyoruz, hemen bir yere dosyaları çıkartıp çalıştırıyoruz.

– Daha sonra ise Eclipse’in Help sekmesinden Install New Software/Add kısmına basıp Location bölümüne “http://avr-eclipse.sourceforge.net/updatesite/” yazarak, eklentiyi yüklüyoruz ve hepsi bu.

Artık yeni proje oluşturup, AVR mikrodenetleyicinizi seçip kullanabilirsiniz. WinAVR’de ANSI C kullanıldığı için, daha önce PIC için hazırladığım donanım kütüphanelerimi çok az değiştirip kullanmak gerçekten çok rahat. Buradan hâlâ Pic Basic, CCS C kullananlara duyurulur.

Ben ilk örneğimi, Atmega16’nın ADC’lerinden bilgi okuyup, bunu LCD’de göstermek için uyguladım. Aşağıda uygulamaya ait resmi ve yazdığım basit kodları bulabilirsiniz. Üzerinde herhangi bir değişiklik yapıp kullanabilirsiniz.

Yalnız kodu iyi incelerseniz PIC’teki TRISx yerine DDRx’nin geldiğini, PORT’larn PIC’teki gibi RB0 gibi bit bit kontrol edilemediğini göreceksiniz. İlk AVR denemelerinizde buna dikkat edip, ‘maskeleme’ ne imiş öğrenmeniz gerekiyor. Gerisi yine size kalmış.

Sonuç olarak söylemem gerekirse; AVR ne denli güzelse, finaller de o denli sıkıcı.

Herkese çalışmalarında, bana da finallerde başarılar.

adc-okuma-ornegi

ADC Okuma Örneği:

/* **** www.FxDev.org ****
 * ADC'den Gerilim ve Sıcaklık Ölçen Program
 */

#include "avr/io.h"
#include "util/delay.h"
#include "lcd.h"

#define ADC_REF_AREF 0x00
#define ADC_REF_AVCC 0x40
#define ADC_REF_INT  0xC0

unsigned char ADC_REF_TYPE;

void adc_init(unsigned char ADC_REF)
{
	ADCSRA = 0x87;
	ADC_REF_TYPE = ADC_REF;
}

unsigned int read_adc(unsigned char adc_channel)
{
	ADMUX = ADC_REF_TYPE | adc_channel;
	ADCSRA |= 0x40;
	while (ADCSRA & 0x40);
	return ADC;
}

int main(void)
{
	unsigned int sicaklik,voltaj;
	PORTC=0x00;
	DDRC=0xFF;

	lcd_init();

	adc_init(ADC_REF_AVCC);

	lcd_yaz("FxDev.org Sunar!");
	lcd_gotoxy(2,1);
	lcd_yaz("AVR'ye Merhaba..");
	_delay_ms(1500);
	lcd_clear();

	lcd_gotoxy(1,1);
	veri_yolla('C');
	veri_yolla(0xDF);
	veri_yolla(':');
	lcd_gotoxy(2,1);
	lcd_yaz("V :");

	for(;;)
	{
		lcd_gotoxy(1,4);	// Okunan değer LCD'ye yazılıyor
		sicaklik=read_adc(0)*48; // Hesaplama yapılıyor
		_delay_us(50);
		veri_yolla(sicaklik/1000+48);
		veri_yolla((sicaklik%1000)/100+48);
		veri_yolla('.');
		veri_yolla((sicaklik%100)/10+48);
		veri_yolla(sicaklik%10+48);
		veri_yolla(0xDF);
		veri_yolla('C');
		lcd_gotoxy(2,4);
		voltaj=(int)(read_adc(1)/2.048);
		_delay_us(50);
		veri_yolla(voltaj/1000+48);
		veri_yolla((voltaj%1000)/100+48);
		veri_yolla('.');
		veri_yolla((voltaj%100)/10+48);
		veri_yolla(voltaj%10+48);
		veri_yolla('V');
	}
}
  1. yiğit 2013/05/16
  2. ömer 2013/05/16
  3. Fatih İNANÇ 2013/05/16
  4. Kadir Can 2013/05/16
  5. Ercan Erbaş 2013/05/16
  6. FxDev 2013/05/16
  7. fatih 2013/05/16
  8. Samet Akçay 2013/05/16
  9. FxDev 2013/05/16

Yorum

Soru: