13 Haziran 2015 Cumartesi

SDCC ile Led Yakma(PIC16F6886) – Ders02


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ı,
  • Düşük voltaj programlama yapmayacağımızı

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”

1 yorum: