Posted by : MC 15 Temmuz 2015 Çarşamba

Merhabalar

Yeni bir yazı dizisi ile yeniden karşınızdayız.
Bu yazı dizimizde neler olacak.Gömülü sistemlerde yaygın olarak kullanılan C programlama dilini örnek uygulamalar dahilinde nasıl kullanıldığını sizlere bölüm bölüm anlatmaya çalışacağız.

Dilerseniz arm işlemciler üzerinde gerçekleştirilmiş basit bir elektronik kapı kilidi uygulaması ile yola çıkalım


Şekilde görüldüğü üzere arm bir işlemci üzerinde portA kullanılarak bir elektronik kilit sistemi tasarlanmış.Bu elektronik kilit sisteminde PortA nın 0 dan 6 ya kadar olan pinleri input olarak kullanılmış ve her bir pine toggle anahtar takılmış.Bu anahtarların kullanım amacı ise belirli bir şifre rotastonu uygulandığında,PortA nın output olarak atana 7 numaları pinini aktif ederek selenoid kontrolü ile elektronik kapı kilidimizi açmak.

İlk olarak yapmamız gereken işlemci üreticisinin yayınlamış olduğu klavuzdan portA ile ilgili olan register adreslerimizi bulmak.Daha sonrasında bu adresleri yazılımımızda tanımlayarak,örneğimizde olduğu gibi ilgili pinlerimizi inputlar ve outputlar haline getirmeyi amaçlayacağız.

#define GPIO_PORTA_DATA_R (*((volatile unsigned long *)0x400043FC))
#define GPIO_PORTA_DIR_R (*((volatile unsigned long *)0x40004400))
#define GPIO_PORTA_DEN_R (*((volatile unsigned long *)0x4000451C))
#define SYSCTL_PRGPIO_R (*((volatile unsigned long *)0x400FEA08))


Bu kısımda portA ile ilgili registerlarımızı işlemci üreticisinin bize sunmus olduğu adreslerden çekiyoruz.

Önemli noktalardan biri, eğer ki bazı datalarımızın değişmez olarak sürekliliğinin sağlanmasını istiyorsak bu dataları global olarak tanımlamamızda fayda var böylelikler değişmez datalarımız flash Rom hafızada güvenli bir şekilde tutulmuş olur.

Bu örneğimizde bizim flash romda saklamak istediğimiz datalarımızdan biri de kapıyı açmak için tanımlayacağımız 7 bitlik kilit pin numaramız olacaktır.


const unsigned char key=0x23; // The key code 0100011 (binary)

 

Sabit char tipinde bir değişken olarak tanımladığımız kilit pinimize 0x23 hex yani binary olarak 0100011 değerini atadık.


Gelelim programramımızın akış diyagramına :
Yukarıdaki şekilde de görüleceği üzere bir adet cnt adı altında counterımız mevcut.Her programlamada ihtiyaç duyulan main fonksiyonun akabinde port ayarları gerçekleştirilmiş ve hemen ardından selenoidin bağlı olduğu pin yardımı ile elektronik kilit kilitli duruma getirilmiş.Burada aklınıza takıla sorulardan biri neden gecikme kullanılıyor olabilir.Toggle anahtarlarda sıklıkla karşılaşılan bir bouncing-sıçrama efekti mevcut olabiliyor.Bu efekti elimine edebilmek açısından programlama tarafında delayler yani gecikmeler sıklıkla kullanılabiliyor.Burada 4000 sayıcı ayarlaması ise 10ms gecikme uygulamak amacı ile kullanılmış.Anahtarlarımızdan bize gelecek olan şifrenin sağlıklı bir biçimde okunabilmesi açısından.


Programın başlangıç değerleri verildikten sonra anahtaların konumlarına bakılıyor.Eğer ki anahtar konumlarına karşılık gelen 7 bitlik anahtar pin değerimiz counter sıfırlandığı anda bize programda tanımladığımız pin değerini verir ise selenoid on durumuna getirilerek kapının açılması sağlanıyor.Şifrenin uyuşmaması durumunda ise counter yani sayıcı 4000 e set edilerek anahtar girdisi bekleme durumuna geri dönülüyor.

Dilerseniz örneğimize çok kısa bir ara verelim ve gömülü sistemlerde basit bir if kullanımı üzerinde duralım

#define PORTB (*((volatile unsigned long *)0x400053FC))#define PORTE (*((volatile unsigned long *)0x400243FC))void Example(void){
if((PORTE&0x04)==0){ /* PORTE nin 2 nolu biti */
PORTB = 0; /* porte nin biti 0 ise portB yi 0 yap*/
}else{
PORTB = 100; /* porte nin 2 nolu biti 1 ise portb ye 100 ata */
}
}

Bu örnekte de dikkat edersek ilk iki satırda #define larımız yine bize işlemci üreticisi tarafından sunulan port B ve E registerlarının adreslerini vermekte.
Void yani boş döndürülecek bir fonksiyon içerisinde ise port E nin 2 nolu bitinin 0 olması ya da olmaması durumu bir if fonksiyonu içerisinde karşılaştırılmıs ve 0 koşulunu sağlaması durumunda ise port b içerisinde 0, sıfırdan farklı yanı 1 olması durumunda ise port b içerisine 100 değerinin atanması sağlanmış.

Gömülü sistemlerde en önemli unsurlardan biride program direktifleri.Bu direktifler genellikle işlemci üreticileri tarafından sağlanabildiği gibi daha önce yazmış olan ve paylaşımcı ruha sahip gönüllü kullanıcılar tarafından da internet ortamında bulunabiliyor :)

Nasıl ki arduino ile ilgilendiğinizde kendi sitesinde yüzlerce kütüphane elde edebileceğiniz gibi internet ortamında da bazı kaynak kod sitelerinden bağımsız kullanıcıların kendileri için yazmış oldukları kütüphaneleri yayınlamaları durumunda bu kütüphaneleri indirerek faydalanabiliyorsunuz.Bu durum da onlardan farklı değil.

Bu kütüphaneler program yapılarının hemen başında bizim de yazımızın başında #define olarak kullandığımız gibi #include ile programa dahil edilirler.

Ne işe yararlar: Bizim programlama da define ettiğimiz her registerı ve port adreslerini içerisinde barındırabileceği gibi bize kolaylık sağlayacak bir çok fonsiyonun da içinde tanımlı olması muhtemeldir.

#include "tm4c123gh6pm.h" // TM4C123 I/O port isim ve adreslerini tutar.

Artık elektronik kilit örneğimize geri dönebiliriz.

Elektronik kili devremizin program kaynak kodlarında önce yapısına bir göz atalım 

programımız 4 ana temel unsurdan oluşuyor
1.İşlemci üreticisinden gelen h uzantılı header dosyamıs.

/* ****file tm4c123gh6pm.h************ */
#define GPIO_PORTA_DATA_R(*((volatile unsigned long *)0x400043FC))
#define GPIO_PORTA_DIR_R (*((volatile unsigned long *)0x40004400))
#define GPIO_PORTA_DEN_R (*((volatile unsigned long *)0x4000451C))
#define SYSCTL_
#define GPIO_PORTA_DIR_R (*((volatile unsigned long *)0x40004400))
#define GPIO_PORTA_DEN_R (*((volatile unsigned long *)0x4000451C))
#define SYSCTL_PRGPIO_R (*((volatile unsigned long *)0x400FEA08))

Daha öncede bahsettiğimiz gibi porta registerının tüm yönlendirmeleri bu header file ışığı altında gerçekleştiriliyor.

2. PortA üzerinde gerçekleştireceğimiz io fonksiyonlarımız için header dosyamız.

Bu kısımda header dosyamız ana kaynak kodumuzun içerisinde fonksiyonlarımızı teker teker tanımlamamızı önlemenin yanı sıra aynı kaynak kodlarımızı farklı projelerde de kullanmamıza olanak sağlıyor.Siz isterseniz aynı kaynak kodunuzda bu kutuphaneleri teker teker tanımlayabilirsiniz ancak projenizin sürdürülebilirliği ve diğer programcılar tarafından anlaşılabilirliği sekteye uğrayabileceği gibi ileride aynı kaynak koduna ihtiyaç duymanız halinde tekrar tekrar tanımlamanıza ihtiyaç olacak ve size muazzam zaman kaybına neden olacaktır.


/* ****file LOCK.h ************ */
void Lock_Init(void);
void Lock_Set(int flag);
unsigned long Lock_Input(void);


3. PortA fonsksiyonlarının tanımlandığı .c uzantılı kaynak dosyamız

Bu kaynak kodu içerisinde ana kaynak kodumuza ekleyeceğimiz LOCK.h header dosyası ile tanımladığımız fonksiyon yapılarını yazıyoruz.

/* ****file Lock.C ************ */#include "tm4c123gh6pm.h"void Lock_Init(void){ volatile unsigned long delay;
SYSCTL_PRGPIO_R |= 0x01; // kilidi aktif et
delay = SYSCTL_PRGPIO_R; // bouncing engelleyici delay
GPIO_PORTA_DIR_R = 0x80; // PA7 çıkış - PA0 - 6 giriş
GPIO_PORTA_DEN_R = 0xFF; // digital port olarak aktif et
}
void Lock_Set(int flag){
if(flag){
GPIO_PORTA_DATA_R = 0x80;
}else{
GPIO_PORTA_DATA_R = 0;
}
}unsigned long Lock_Input(void){
return GPIO_PORTA_DATA_R&0x7F; // 0 to 127
}

4. Ana kaynak kodumuz main.c

Sistemin sürekli olarak içerisinde dönecek olduğu dosyamız.Daha önceki 3 adımda tanımladığımı gerek kaynak kodları gerekse header dosyalarını bu ana yani main kaynak kodu içerisinde çağırarak onları program işleyiş şemamıza uygun olarak kullanacağız.



const unsigned char key=0x23; // anahtar pinimiz 0100011 (binary)#include "Lock.h"

void main(void){ unsigned char input; unsigned long cnt;
Lock_Init(); // kilidi ayarla
cnt = 4000;
while(1){
key = Lock_Input();
if(key == input){
cnt--; // bounce etkisini engeller
if(cnt == 0){ // bounce etkisi bitti
Lock_Set(1); // kapıyı aç
}
}else{
Lock_Set(0); // kapıyı kilitle
cnt = 4000; //delay zamanını 4000 yap
}
}
}
Bir sonraki yazımızda tekrar görüşmek dileği ile

yorumlarınız bizim için önemli

Bültene abone ol | Yorumlara abone ol

ELEKTRO BLOGGER A HOŞGELDINIZ

ARAMA YAP

EN COK OKUNANLAR

- Copyright © ELEKTRO-BLOGGER Blogger