Merhabalar, bir önceki yazımızda PIC için yazdığımız bir merhaba dünya kodunun içini dışını hallaç pamuğuna çevirmiş ve sayısız ibretlerle keyiflenmiştik. Bu yazımızda da PIC16’nın bir pinini nasıl giriş yaparız, nasıl çıkış yaparız, bir giriş pininden nasıl değer okuruz, bir çıkış pinine nasıl değer yazarız gibi işlemlere değineceğiz 🙂 Sözün özü, hayatı bir dizi gerilimsel işaretle mıncıklayacağız 🙂
Şimdi, yine bir kütüphane kullanmadan (ya da sadece kendi yazdığımız kütüphaneleri kullanarak) bir karaşimşek kodu yazalım =) Karaşimşek kodu meşhurdur dostlar =) es geçmeyelim!
Tıpkı PIC mikrodentleyicilerinin bizler için “araç” olması gibi, karaşimşek kodu da anlatmak istediklerimizi anlatmak üzere kullanacağımız bir araç olacak. Amacımız ibretleri birer birer kapmak. Sözü sakız edip uzatmadan hemen kodumuzu yazalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
/* * File: main.c * Author: ozenozkaya * * Created on 02 Haziran 2015 Sali, 12:47 */ #define F_OSC (1000000UL) #define REG_TRISB (*( volatile unsigned char*)0x086) #define REG_PORTB (*( volatile unsigned char*)0x006) static void InitializeLedArray(void); static void DummyDelayMs(unsigned int delay_ms); void main() { unsigned char led_index=0; InitializeLedArray(); while(1) { for(led_index=0; led_index<7; led_index++) { REG_PORTB=REG_PORTB<<1; DummyDelayMs(100); } for(led_index=0; led_index<7; led_index++) { REG_PORTB=REG_PORTB>>1; DummyDelayMs(100); } } } static void InitializeLedArray(void) { REG_TRISB = 0; REG_PORTB = 1; DummyDelayMs(100); } static void DummyDelayMs(unsigned int delay_ms) { unsigned long cnt=0; unsigned long delay_limit_ms= delay_ms*(F_OSC/120000); for(cnt=0;cnt<delay_limit_ms;cnt++); } |
Evet efendim kodumuz yukarıda yer aldığı gibi. Çıktısını göstermeden önce, dilerseniz kodu bir açıklayayım. İlk aşamada bekletme (delay) işlemlerini yapabilmek için çalışma frekansını giriyoruz. Buna göre çalışma frekansı 1.000.000 Hz yani 1MHZ olarak aşağıdaki gibi belirleniyor.
1 |
#define F_OSC (1000000UL) |
Ardından, bir önceki yazımızda anlattığımız üzere kendi çabalarımızla register tanımını yapıyoruz. Malum bu yazı dizisinde bir hedef de PIC’i bahane edip, bir mikrokontrolöre kütüphane nasıl yazılır onu da öğrenmek. Önceki yazıda myTRISB diye yaptığımız register tanımı Ağaoğlu MyTRISB projesi ile isim benzerliği göstermesin diye isimlendirmeyi birazcık değiştirdik 😛
1 2 |
#define REG_TRISB (*( volatile unsigned char*)0x086) #define REG_PORTB (*( volatile unsigned char*)0x006) |
Bunlar malumunuz; efektif şekilde tanımlanmış kütükler. Ben afedersiniz kütük diyorum ama onun İngilizcesi “register”. Neyse bir sonraki aşamada main’e geçecek olursak önce pin’lere ilk değer veriliyor ki o kısım zaten önceki, merhaba dünya örneğinin aynısı. Ardından el yordamı ile yazdığımız DummyDelayMs fonksiyonuna değineyim.
1 2 3 4 5 6 |
static void DummyDelayMs(unsigned int delay_ms) { unsigned long cnt=0; unsigned long delay_limit_ms= delay_ms*(F_OSC/120000); for(cnt=0;cnt<delay_limit_ms;cnt++); } |
Bu fonksiyonun işi, cnt değişkeninin değerini insafsızca ve ahlaksızca artırarak CPU’nun diğer işleri yapmasını engellemek. Bu da hödükçe bir beklemeye sebep oluyor. Çalışıyor mu? Çalışıyor! Oradaki 120000 sayısını empirik olarak buluyoruz. Proteusta bir OSC kullanıp zamanı ölçerek bulmak mümkün. Hesapla kitapla da yaklaşık olarak bulmak mümkündür. Neyse biz işimize devam edelim. Aşağıdaki kod ise karaşimşek işini yapmaktadır.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
while(1) { for(led_index=0; led_index<7; led_index++) { REG_PORTB=REG_PORTB<<1; DummyDelayMs(100); } for(led_index=0; led_index<7; led_index++) { REG_PORTB=REG_PORTB>>1; DummyDelayMs(100); } } |
100ms’de bir led bir kaydırılıyor. Bu kodun çıktısı ise aşağıdaki gibi oluyor 🙂
Bu yazı bu kadarcık olsun 🙂 Başka bir yazıda devam edeceğiz.
Önceki Sayfa Sonraki Sayfa
Teşekkürler yazılarınızı sabırsızlıkla bekliyorum
Teşekkürler Salim Bey, bu sıralar epey bir yoğunluk var ancak bu haftasonu tekrar devam edeceğim yazılara.
Teşekkürler yazılarınızı sabırsızlıkla bekliyorum
Teşekkürler Salim Bey, bu sıralar epey bir yoğunluk var ancak bu haftasonu tekrar devam edeceğim yazılara.