Diğer yazı yada
derslerimizde sdcc nin nasıl bir derleyici olduğu, boş haldeki en
basit kod ile konsolda derlemenin nasıl yapıldığı ve
mikrodenetleyiciye özel başlık dosyalarının nasıl belirtilmesi
gibi bilgilerin sahibi olduk. Bu dersimizde 16F6886
mikrodenetleyicisinin B0 portuna bağlı bir ledin 3 sn süre ile
yanıp sönmesini sağlayan bir program yazacağız. Diğer bir husus
ise bu mikrodenetleyiciye ait dahili osilatörün kullanılmasını
da öğrenmiş olacağız. İsterseniz şimdi kodumuza bir göz
atalım.
//
Copyright (C) 2015 Durali Kiraz
#define
NO_BIT_DEFINES
#include
<pic14regs.h> //Mikrodenetleyici Ayar adreslerini ve
seçenekleri içerir
#include
<stdint.h> //uint16_t tanımı için gerekli
//
Osilatör seçme bitleri (INTOSCIO oscillator: I/O function on
RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN),
//
dahili osilatör kullanılacak
//
wacthdog timer devredışı
//
düşük voltaj programlama devredışı
//
Bu tanımların dışında kalan Sigortaların kalanı varsayılan
olarak bırakılır.
__code
uint16_t __at (_CONFIG1) __configword = _INTRC_OSC_NOCLKOUT &&
_WDTE_OFF && _LVP_OFF;
#define
LED_PORT PORTBbits.RB0
#define
LED_TRIS TRISBbits.TRISB0
//
kalibrasyonsuz delay, sadece bir dizi döngü yinelemeleri için
beklemeyi sağlar.
void
delay(uint16_t milisaniye)
{
uint16_t
i;
for
(i = 0; i < milisaniye; i++)
{
//
Döngüde optimizasyon için bu asm komutu eklenmiştir.
__asm
nop __endasm;
}
}
void
main(void)
{
LED_TRIS
= 0; // Pin çıkış olarak ayarlandı
LED_PORT
= 0; // LED sönük
while(1)
LED_PORT
= 1; // LED Yanıyor
delay(30000);
// ~500ms @ 4MHz 3 sn bekle
LED_PORT
= 0; // LED Sönük
delay(30000);
// ~500ms @ 4MHz 3 sn bekle
}
}
Bu kodu çalıştıracak
devreyede bir göz atalım isterseniz. Ha bu arada devre görüntüsünü
kicad programında çizdim. Beni kicad ile tanıştıran C.Emre ÖZ
kardeşime teşekkürlerimi sunuyorum.
İlk satırda geçen
#define
NO_BIT_DEFINES ifadesi
ile <pic14regs.h>
ve
pic16f886.h
başlık dosyasında tanımlı
bulunan bit tanımlamalarını kullanmayacağımızı derleyiciye
bildiriyoruz. (başlık
dosyalarının için incelerseniz bu önişlemci komutuyla konulmuş
kısıtlamaları görmüş olursunuz.) Böyle
yaptığımız için aşağıdaki tanımlamaları kendimiz yeniden
yapmamız gerekiyordu. Kod üzerinde gözüktüğü gibi bunlarıda
şu şekilde yaptık :
#define
LED_PORT PORTBbits.RB0
#define
LED_TRIS TRISBbits.TRISB0
Yukardaki
kodların öncesinde çok dikkat etmeniz gereken sigorta (fuse)
tanımlarının yapıldığı satırda ise
-
Dahili osilatörün kullanılacağını ve osilatör portlarınında I/O olarak kullanılacağını,
-
Watch Dog Timer kesme sayacının devredışı bırakıldığını,
-
bildirmiş
oluyoruz. Bu tanımlama satırındaki
__code
uint16_t __at (_CONFIG1) __configword =
ifadenin
“pic14” ailesinde sigorta tanımlamalarını yapmanın tek yolu
olduğunu farkettim. Diğer “pic16” ailesinde ise #progma
önişlemci
komutu kullanılabilmekte. Şimdilik kafanız karışmasın. Sadece
sigorta tanımlamalarını yapmanın iki yolu var. Şu an bunu
bilmeniz yeterli. Detaylı
bilgiyi “sdccman.pdf” sdcc nin kendi dökümanında
bulabilirsiniz.
Birde
nurtopu gibi “delay” fonsiyonumuz var. Biz kitaplıklardaki hazır
delay fonksiyonlarından kullanmak yerine kendimiz yazmışız. Bu
delay fonksiyonu 4 MHZ lik osilatör frekansıyla uyumludur. Dahili
osilatör seçimi eğer “OSCON” registerını değiştirmezsek 4
MHz atanmış olur. Ayrıca bu register her mikrodenetleyicide
bulunmaz bunu ek not olarak vereyim.
Ana
main fonksiyonumuzu açıklayacak olursak ilk satırda LED_TRIS
= 0; ile
LED_TRIS in işaret ettiği TRISBbits.TRISB0
a
ait biti değiştiriyoruz. Bu değişim sonucunda B0 portu çıkış
olarak ayarlanmış oluyor. LED_PORT = 0; ile
de işaret ettiği RB0 portundaki
led söndürülür. While(1)
bizim sonsuz döngümüzü başlatır. Eskilerin tabiriyle “fasit
daire” ye girer. Bu döngü içinde sırayla
-
Led yakılır,
-
3 sn ye beklenir,
-
Led söndürülür,
-
3 sn ye beklenir
Böylece
bu döngü sonsuza kadar sürüp gider.
Bügünkü
dersimizde umarım biraz daha fazla şeyler anlatabilmişimdir.
Aslında bahsetmek istediğim çok şey var ama konuyu dağıtmaktan
çekindiğim için fazla detaya girip kafanızı karıştırmak
istemiyorum. Belirtmek istediğim diğer bir husus ise bu örneğin
hemen hemen aynısını 16F628A mikrodenetleyicisi için oluşturdum.
Onuda inşaallah sonraki derslerimizde anlatırım. Şimdilik
hoşçakalın.
Duralikiraz.blogspot.com
14
Haziran 2015
“Muvaffakiyet
Allahtandır”
Teşekkürler. şimdi çok daha faydalı oluyor....
YanıtlaSil