CCS-C ile PIC Programlama, Portlar Led Buton ve Röle Kullanımı
Her ne kadar daha önceki yazılarımızda kısmen anlatmış olsakda PORT’lar ve kullanımı konusunu daha ayrıntılı olarak bu yazımıda ele alacağız.
PORTLAR
Portlar PIC denetleyicilerinde giriş/çıkış işlemleri için kullanılan yapılardır. Örneğin bir anahtarın açık/kapalı durumunu belirlemek, LED yakmak, Röle açıp kapamak, veya bir LCD ekranı sürmek için PORT’ları kullanırız. Her PIC modelinde farklı sayıda port bulunur ve bu portlar farklı büyüklüklerde olabilir. Büyüklükten kastımız PORT’un kaç bit olduğudur.
Kullandığınız denetleyicinin teknik dökümanına bakarak kaç porta sahip olduğunu öğrenebilirisiniz. Portlar A,B,C….F gibi harflerle isimlendirilir, PORTA, PORTB, PORTC gibi. Aşağıdaki resim 16f628A Denetleyicisinin pin bağlantılarını göstermektedir.

Resimde de görüldüğü gibi PIC 16F628A Denetleyicisi PORTA, ve PORTB olmak üzere iki adet porta sahiptir. PORTB RB0…..RB7 olmak üzere 8 Bit, PORTA ise RA0….RA5 olmak üzere 6 Bit’tir.
RB0….RB7, RA0….RA5 PORT’ları oluşturan PIN’lerdir. Bir PIN önündeki <—-> simgesi, o PIN’in hem giriş hem de çıkış olarak kullanılabileceğini —-> simgesi ise sadece giriş olarak kullanılabileceğini gösterir.
CCS-C derleyicisinin kullanımını öğrenmek kadar PIC Donanımlarını da çok iyi öğrenmek gerekir. Donanım tecrübesi olmadan bilgisayarda simulasyonla PIC programlama öğrenmek iyi birşey değildir. Bu yüzden en temel seviyede donanımların ne iş yaptıklarını ve nasıl bağlanacaklarını elimden geldiğince anlatmaya çalışacağım.
Yukarıdaki resimde gördüğünüz gibi PORT PIN’lerinin yanında başka şeylerde yazmakta. RB3/CCP1 ve RB0/INT gibi. Bu ifadeler bu pinlerin alternatif kullanımlarını göstermektedir RB3/CCP1 ifadesi 9 nolu bacaktan PWM sinyali üretebileceğimizi, RB0/INT ifadesi ise 6 nolu bacağın Harici Kesme girişi olduğu belirtir.
Demekki PIC denetleyicilerinde bazı PIN’leri farklı farklı amaçlar için kullanabiliriz. Bu tamamen bizim ihtiyacımıza ve tercihimize kalmış.
GİRİŞ ÇIKIŞ AYARLAMALARI
Bir portun istediğiniz PIN’ini giriş istediğinizi de çıkış yapabilirsiniz. Bu işlemi gerçekleştirmek için ilgili portun TRIS Register’ini ayarlamanız gerekir.
![]()
16f628A TRIS Register adresleri TRISA = 0×85 TRISB = 0×86
Bir pini giriş yapmak için ilgili TRIS biti 1 yapılır
Bir pini çıkış yapmak için ilgili TRIS biti 0 yapılır
Şimdi B portunun tüm PIN’lerini giriş yapmak istersek TRISB = 0xff yapmamız gerekir. Bunu gerçekleştirmek için set_tris_x() fonksiyonunu kullanabiliriz
#include <16f628a.h>
main()
{
set_tris_b(0xff); // B portu komple giriş
}
Bu ayarlamayı hazır fonksiyon kullanmadan da yapabiliriz. Bunun için öncelikle TRISB Register’ını programımızda tanımlayıp daha sonra değer atamamız gerekir
#include <16f628a.h>
#byte TRISB = 0x86 // TRISB 0x86 adresindedir
main()
{
TRISB = 0xff; // B portu komple giriş
}
Başka örnekler
set_tris_a(0b00001010); // A1,A3 giriş diğerleri çıkış set_tris_b(0xf0); //B0...B3 Çıkış, B4...B7 giriş set_tris_c(0x55); //C0,C2,C4,C6 giriş C1,C3,C5,C7 Çıkış
Portlarla ilgili bazı önemli bilgiler.
- Her bir Giriş/Çıkış PIN’inden çekilebilecek veya bu PIN’e akabilecek maksimum akım 25mA’dir
- RA4 TOCKI PIN’i Open Collector Output olduğundan, bu pini çıkış olarak kullanmak istediğinizde bir direnç ile beslemeye pull-up yapmanız gerekir.
- PORTB Dahili pull-up dirençlerine sahiptir ve bu dirençler yazılım ile devreye sokulabilir.
- Kullanılmayan pin’lerin çıkış olarak ayarlanması gerekir
DONANIM BAĞLANTILARI
Ledler
Bir ledi PIC’e iki şekilde bağlayabilirsiniz. Led’lere besleme verirken bu işlemin bir ön direç ile yapılması gerektiğini unutmayınız. Dirençsiz bağlarsanız led aşırı akımdan dolayı kullanılamaz hale gelecektir. Ledlerin büyük çoğunluğu maksimum 20mA akım ile çalışacak şekilde üretilirler. Led öndirencinin nasıl hesaplanacağını bilmiyorsanız buraya bir göz atın

RB0′a bağlanan LED-1′i yakmak için RB0 = “0″ yapılır, söndürmek için “1″ yapılır
RB3′e bağlanan LED-2′yi yakmak için RB3 = “1″ yapılır, söndürmek için “0″ yapılır
Röleler
Aşağıdaki şemada yaygın olarak kullanılan PIC ile röle sürme devresi görülmektedir.

RB7 = “1″ yapıldığında röle çeker, “0″ yapıldığında bırakır.
VCC voltajı rölelin çalışma votajıdır ve röle modeline göre değişir.
Butonlar
Aşağıdaki şemada da görülebileceği gibi butonlar da iki farklı şekilde PIC’re bağlanabilir.

Buton bağlanan bacaklar giriş olarak ayarlanmalıdır. Yukarıdaki şemaya göre, Buton-1 basıldığında RA2 = 0 olur. Buton-2 basıldığında RB2 = 1 olur. Bu değerler yazılım ile okunarak butonun basılıp basılmadığı tespit edilebilir.
TOPLU ÖRNEK – ISIS ÇİZİMİ VE KODLAR
ISIS Proje dosyasını indirmek için tıklayın test_project
LED-1 RB7′de
LED-2 RB6′da
BUTON-1 RA0′a
BUTON-2 RA1′de
RÖLE RB5′te Bağlı
Örnek
Şimdi 1 nolu butona basılı tutulduğu sürece 1 nolu ledi yakan, buton bırakıldığında söndüren. 2 Nolu butona basıldığında ise bırakıldığında 2 Nolu ledin durumunu değiştiren programı yazalım. Devre ilk açıldığında da rölemiz 2 saniye çekip bıraksın.
#include <16f628a.h>
#use delay(clock=4000000)
#fuses INTRC,NOMCLR,PROTECT,NOWDT
#fuses PUT,NOLVP,NOCPD,NOBROWNOUT
void main(void)
{
set_tris_a(0x03); //A0,A1 giriş diğerleri çıkış
set_tris_b(0x00); //B portu komple çıkış
output_low(PIN_B7);
output_high(PIN_B6);
output_high(PIN_B5) //Röle çeksin
delay_ms(2000); // 2 sn bekle
output_low(PIN_B5) //Röle bıraksın
while(TRUE) // Sonsuz döngü
{
if(input(PIN_A0)==0 ) //Buton-1 basılımı?
{
output_high(PIN_B7); // Ledi yak
while(input(PIN_A0)==0); // Butonun bırakılmasını bekle
output_low(PIN_B7); // Ledi söndür
delay_ms(25); //debounce süresi
}
if(input(PIN_A1)==1 ) //Buton-2 basılımı?
{
while(input(PIN_A1)==1); //Butonun bırakılmasını bekle
output_toggle(PIN_B6); //Led'in durumuu değiştir
}
}
}
Şimdi aynı işi yapan kodu daha profosyonelce yazalım
#include <16f628a.h>
#use delay(clock=4000000)
#fuses INTRC,NOMCLR,PROTECT,NOWDT
#fuses PUT,NOLVP,NOCPD,NOBROWNOUT
#byte PORTA = 0x05
#byte PORTB = 0x06
#byte TRISA = 0x85
#byte TRISB = 0x86
#bit LED1 = PORTB.7
#bit LED2 = PORTB.6
#bit BUTON1 = PORTA.0
#bit BUTON2 = PORTA.1
void main(void)
{
PORTA = 0;
PORTB = 0;
TRISA = 0x03; // A0, A1 girişi
TRISB = 0x00; // Komple Çıkış
LED1 = 0; // LED1 söndür
LED2 = 1; // LED2 Söndür
while(TRUE) // Sonsuz döngü
{
if(!BUTON1) //Buton-1 basılımı?
{
LED1 = 1; // Ledi yak
while(!BUTON1); // Butonun bırakılmasını bekle
LED1 = 0; // Ledi söndür
delay_ms(25); //debounce süresi
}
if(BUTON2) //Buton-2 basılımı?
{
while(BUTON2); //Butonun bırakılmasını bekle
LED2 = !LED2; //Led'in durumunu değiştir
delay_ms(25); //debounce süresi
}
}
}
Buton kullanımıyla ilgili ipuçları
- Gerçek devrelerinizde asla butonları bir kez okuyarak durumları değişmiş kabul etmeyin. En az 100 defa basılmışmı veya bırakılmış mı diye kontrol ettirin. Bu şekilde yapmazsanız dışarıdan gelebilecek parazitler olumsuz etki yapar.
- Elinizi butondan çekerken bounce (zıplama) denilen hadise nedeniyle ikinci bir basış gerçekleşebilir. Buda bozuk çalışmaya neden olabilir. Bu durumun önüne geçmek için buton bırakılması tespit edildiğinde belirli bir gecikme süresi konur. Yukarıdaki kodlarda 25ms gecikmeler bu amaçla konmuştur.
Yazımızı burada noktalıyoruz. Anlamadığınız yerler olursa sormaktan çekinmeyin



Bu yazı için 52 yorum yapıldı
June 17th, 2010
Merhaba, hocam benim bir sorum olacaktı bu konuda biraz yeniyim şu ccs de proje oluşturduğumda #use ve #fuse leri tanımlamıyor.Acaba onları kendimiz mi tanımlamamız lazım?
June 17th, 2010
@kadir
PIC Wizard kullanarak projeyi oluşturmuş isen projenin h dosyasında fuse satırlarını bulabilirsin. C dosyasının en üstünde #include ile başlayan satırda h dosyası include ediliyor. o satıra sağ tıklayıp “open fila at cursor” seçeneğini seçersen h dosyasıda açılır.
Geri izlemeler