Labels

Flash Labels by Blog Okulu


Ders 5 - AVR GCC Kullanımı ve Derleme İşlemi

Atmel serisi için ilk yazdığımız kod, basit bir şekilde bir LED'i yakıp söndürmekteydi. Bu C dosyasını Programmer's Notepad'de açıp Make All tuşuna bastığımız zaman 'Procces Exit Code: 0' yazısını derleme işleminin sonunda görmeliyiz. Eğer bu satır, derleme işlemi sonucunda çıkmıyorsa muhtemelen programın bir yerinde hata vardır ve programınızı tekrar gözden geçirmeniz gerekmektedir.
İkinci örnek ise, bu yazıda verilecek olan seri haberleşme örneğidir.
Atmega168 için : basic-out-atmega168.c
Atmega8 için : basic-out.c
Programı başından itibaren satır satır inceleyecek olursak;
#define FOSC 16000000
#define BAUD 9600
#define MYUBRR FOSC/16/BAUD-1
Bu satırlarda ilk olarak osilatör frekansı belirlenmiş, daha sonra seri haberleşme için baud hızı belirlenmiş ve son olarak ise seri haberleşme için UBRR saklayıcısına yüklenmesi gereken değer hesaplanmıştır. Bunun için daha hassas bir hesaplama da yapılabilir.
#define MYUBRR (((((FOSC * 10) / (16L * BAUD)) + 5) / 10) - 1)
UBRR hesaplaması yapan kullanışlı bir program
static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);
Bu satır ise printf() fonksiyonu için hafızada bir tampon oluşturmaktadır. Daha detaylı bilgi için ioinit() fonksiyonunu inceleyebilirsiniz.
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
Bu satırda ise Tx ve Rx pinleri aktif edilmektedir. RXEN0 saklayıcısındaki değer kütüphane dosyalarında 5 olarak tanımlanmıştır. 1<<RXEN0 demek ise binary 0b00000001 sayısını 5 bit sola kaydır demektir. Yani yeni sayımız 0b00100000 olmaktadır. Burada sabit olarak 5 de kullanılabilirdi fakat RXEN0 saklayıcısının ön tanımlı değeri farklı modellere göre değişebileceğinden sadece bu saklayıcının ismini bilmemiz yeterlidir. İçerisinde hangi değer olduğunu bilmek zorunda değiliz.
Hemen yanındaki 1<<TXEN0 kısmı da ilk anlatılanla aynı işi yapmaktadır. Aradaki | işlemi ise bu iki kısmı mantıksal olarak toplamaktadır.
printf("Test it! x = %d", x);
Bu satır ise C'nin standart fonksiyonu olan çıktı sağlama fonksiyonu printf() tir. Tırnak içerisindeki kısımlar olduğu gibi ekrana yazılır. Sadece %d yazan kısım yerine hemen virgülden sonra verilen x in değeri yazılır. Burada %d demek oraya integer(tam sayı) bir değişken yazılacak demektir. Aşağıda HyperTerminal programının ekran çıktısında bunu daha da iyi anlayacaksınız.
Şimdi, basic-out-atmega168.c programını derleyip breadboard üzerindeki devremizde deneyelim. C dosyasını Programmer's Notepad editöründe açıp derledikten sonra, Tools->[WinAVR] seçeneğinden breadboard üzerindeki Atmega168'i programlayabilirsiniz. Sonra HyperTerminal'de 9600 bps'lik bir yeni bir haberleşme başlatmanız gerekmektedir.

Atmega168 ve Seri Haberleşme

sbi(PORTC, STATUS_LED);
Bu fonksiyon parametreleri içerisinde verilen PORT bilgilerine göre istenilen pini lojik 1 yapmaya yarar. Bunun için başta aşağıdaki tanımlamayı yapmanız gerekmektedir.
#define sbi(var, mask) ((var) |= (uint8_t)(1 << mask))
sbi fonksiyonu istenilen biti lojik 1, cbi fonksiyonu ise istenilen biti lojik 0 yapar.
#define STATUS_LED 0
Bu tanımlamayı da yaptıktan sonra sbi ve cbi fonksiyonlarını kullanarak STATUS_LED'i yakıp söndürebiliriz.
sbi(PORTC,STATUS_LED); //STATUS_LED yandı
cbi(PORTC,STATUS_LED); //STATUS_LED söndü
PORTC'nin STATUS_LED bağladığımız pini ise Atmega168'in 23.pinidir.
Şimdi basic-in-atmega168.c (ATmega8 için basic-in.c) programını derleyip breadboard üzerindeki devrenize yükleyin.


Bu program klavyeden girilen herhangi bir karakteri HyperTerminal ekranında göstermektedir. Eğer ENTER, X veya g tuşlarından herhangi birine basarsanız normalden daha farklı bir çıktı görürsünüz. Bunun için aşağıdaki sorgular kullanılmıştır.


key_press = uart_getchar();
printf("I heard : %c\n", key_press);
if(key_press == 'g') printf(" GO!\n");
if(key_press == 'X') printf(" EXIT\n");
if(key_press == 13) printf(" RETURN\n");

uart_getchar() fonksiyonu klavyeden basılan tuşun ASCII karşılığını key_press değişkenine atamaktadır. Ve if sorguları ise bunun g,X veya ENTER tuşlarından biri olup olmadığını sorgulamak içindir. Printf() fonksiyonundaki %c değeri ise ekrana yazılacak değerin bir karakter olduğunu belirtmektedir. Eğer burada, yukarıdaki gibi %d kullanılsaydı ekrana, basılan tuşun ASCII kodu yazılacaktı. Ve son olarak \n ile bir alt satıra geçilmektedir.

0 yorum:

Yorum Gönder

 
devoplyer © 2013. Katkılar Biribiziokuyor.com Blogger
Top