Arkadaşlar bu dersimizde Pic mikrodenetleyicisi üzerinden dijital çıkış sinyalleri almayı inceleyeceğiz. Öncelikle şunu açıklayalım ki pic mikrodenetleyicilerinde portları çıkış ya da giriş olarak yönlendirmek zorunda değiliz. Programın akışına göre denetleyici portların pinlerini otomatik olarak giriş ya da çıkış olarak yönlendirmektedir. Ancak daha hızlı bir yönlendirme için #use fast_io(portAdi) fonksiyonu ile port istediğimiz portun istediğimiz pinlerini giriş ya da çıkış olarak yönlendirebileceğimizi belirtmiştirk.
Biz bu dersimizde 16F877A denetleyicisinin yalnızca D portunu çıkış olarak kullanacağız. Diğer portları kullanmayacağız.
Şimdi gelelim dijital çıkış alabileceğimiz fonksiyonlara;
Bu komutumuz portun pinlerinin giriş çıkış durumunu döndürür. Hangi pinin giriş hangi pinin çıkış olduğunu göstermek için kullanılır.
Sözdizimi: get_tris_portAdi()
Örnek olarak D portunun pinlerinin giriş olarak mı, yoksa çıkış olarak mı ayarlandığına bakalım;
1 2 3 4 5 6 |
set_tris(0x7F); // 7F değerinin binary karşılığı 0b01111111 dir // d portu 7 nolu pini 0 (çıkış) diğerleri 1(giriş) olarak ayarlandı int durum = get_tris_d(); // bilgi değişkeni üzerindeki değer 7F yani 0b01111111 oldu |
Bu komutumuz, istediğimiz portun istediğimiz pinini 1 (true) yapmak için kullanılır. Bu komutu kullandığımızda belirttiğimiz pinin voltaj değeri +5v olur.
Sözdizimi; output_high(pinAdi)
Örneğin D portunun sıfırıncı çıkışını 1 (+5v) yapalım;
1 2 |
output_high(pin_D0); // D portunun sıfırıncı pinini 1 yani +5V yaptık |
Bu komutumuz, istediğimiz portun istediğimiz pinini 0 (false) yapmak için kullanılır. Bu komutu kullandığımızda belirttiğimiz pinin voltaj değeri 0v olur.
Sözdizimi; output_low(pinAdi)
Örneğin D portunun sıfırıncı çıkışını 0 (0v) yapalım;
1 2 |
output_low(pin_D0); // D portunun sıfırıncı pinini 0 yani 0V yaptık |
Bu komut istediğimiz portun, istediğimiz pinine bit değeri vermek için kullanılır. Yukarıdaki bahsettiğimiz output_high ve output_low komutunun her ikisini de yapabilir.
Sözdizimi: output_bit(pinAdi, deger)
Örneğin D portunun birinci çıkışını 1, ikinci çıkışını 0 yapalım;
1 2 |
output_bit(PIND1,1); // D portunun birinci pinini 1 yap output_bit(PIND2,0); // Dportunun ikinci pinini 0 yap |
Bu komut istediğimiz portun tüm çıkışlarına belli bir değeri yazdırmak için kullanılır. Yani tüm çıkışlara birden bu fonksiyonla 1 ya da 0 değeri gönderebiliriz. D portu 8 bitlik çıkış veren bir port olduğu için göndereceğimiz değer 8 bitlik değer olmak zorundadır. Yani maksimum göndereceğimiz değerler; decimal 255, hexadecimal 0xFF ya da binary 0b11111111 olmak zorundadır. Eğer bir sayının solunda herhangi bir değer yoksa o sayı Decimal (10 tabanlı) sayıyı, eğer”0x” varsa o sayı Hexadecimal (16 tabanlı) sayıyı ya da solunda “0b” varsa o sayı Binary (2 tabanlı) sayıyı temsil eder.
Sayı tabanları konusunda daha detaylı bilgi almak için Sayı Sistemlerinin Birbiri Arasında Dönüşümü dersimizi ziyaret edebilirsiniz.
Daha kolay dönüştürme işlemleri için Sayı Dönüştürücü aracımızı deneyebilirsiniz.
Sözdizimi: output_portAdi(deger)
Örneğin D portunun pinlerine sırasıyla 01100111 verisini gönderelim;
1 2 3 4 5 6 7 8 9 10 11 12 |
output_D(0b01100111); /* * Yukarıdaki komut ile birlikte D portunun * 0 nolu pini 1 * 1 nolu pini 1 * 2 nolu pini 1 * 3 nolu pini 0 * 4 nolu pini 0 * 5 nolu pini 1 * 6 nolu pini 1 * 7 nolu pini 0 oldu */ |
İstenilen pinin çıkış durumunu terslemek için kullanılır. Yani pin değeri 1 ise 0, 0 ise 1 yapmak için kullanılır.
Sözdizimi; output_toggle(pin_adi)
Örnek olarak D portunun 3 numaralı pininin durumunu değiştirelim;
1 2 |
output_toggle(pin_D3); // D portunun 3 numaralı pininin çıkış durumunu değiştirir |
Şimdi bir uygulama yapalım. D portuna bağlı ledler baştan sona sırayla yansın ve hepsi yandığında yine baştan sona sırayla sönsün;
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 |
#include <16f877A.h> // Mikrodenetleyici tanımlama dosyasını ekliyoruz #use delay(crystal=20000000) // Kristal osilatör frekansını giriyoruz #use fast_io(d) // D portunu yönlendireceğimizi belirtiyoruz void main(){ // Ana fonksiyonumuz başlangıcı set_tris_d(0xff); // D portunun tüm pinleri çıkış olarak kullanılacak output_d(0x00); // D portunun tüm pinlerini 0 yapıyoruz while(true){ // Sonsuz döngümüzün başlangıcı output_toggle(pin_d0); // D portu 0 nolu çıkışını tersle delay_ms(500); // 500 milisaniye bekleme veriyoruz output_toggle(pin_d1); // D portu 1 nolu çıkışını tersle delay_ms(500); // 500 milisaniye bekleme veriyoruz output_toggle(pin_d2); // D portu 2 nolu çıkışını tersle delay_ms(500); // 500 milisaniye bekleme veriyoruz output_toggle(pin_d3); // D portu 3 nolu çıkışını tersle delay_ms(500); // 500 milisaniye bekleme veriyoruz output_toggle(pin_d4); // D portu 4 nolu çıkışını tersle delay_ms(500); // 500 milisaniye bekleme veriyoruz output_toggle(pin_d5); // D portu 5 nolu çıkışını tersle delay_ms(500); // 500 milisaniye bekleme veriyoruz output_toggle(pin_d6); // D portu 6 nolu çıkışını tersle delay_ms(500); // 500 milisaniye bekleme veriyoruz output_toggle(pin_d7); // D portu 7 nolu çıkışını tersle delay_ms(500); // 500 milisaniye bekleme veriyoruz } // sonsuz döngü olduğu için program 7 numaralı satıra geri dönüyor } // main fonksiyonumuzun sonu |
Programı denetleyiciye yükleyip aşağıdaki devreyi kuruyoruz ve çalıştırıyoruz.
Dersler cokfaydalı emeğine sağlık