Merhaba Hüseyin,
Doğrudan (direct) program yazmaya geçersen "bu niye çalışmıyor!" gibi sonuçlar ile çok karşılaşabilirsin. Halbuki internette bulduğun kodun aynısını hatta HEX dosyasını olduğu gibi PIC'e yüklemişsindir!
Elbette malzemelerin hazır ise çok arzuladığın çalıştırma hadisesine çok kısa zamanda geçeceğiz. Öyle veya böyle bir LED yakıp, hatta bir düğme (button) ile bunu etkileşimli yapman mümkün olacak. Belki yazacaklarımı iyi anlarsan ve doğru uygulayabilirsen yazı sonunda bunu yapacaksın bile...:)
(Ancak uyarmalıyı#include <stdlib.h>#include <stdlib.h>#include <stdlib.h>m yazı uzun olabilir ve bir solukla okuma istersen....)
Belki elektroniğin en temel mevzularından biri osilatörlerdir. Kalbimiz bile bir frekansa göre hareket etmiyor mu? Öyleyse hayatın bile temeli diyebileceğimiz bir olayı çok iyi anlamalıyız. Bu PIC'in donanım bilgisine atılacak ilk adım olabilir ve lütfen sık sık program yazmanın yanında üzerinde çalıştığın donanımı da hakim olmaya çalış. Yoksa aralarındaki uçurum büyürse sorunlar sıklaşır. Yani frekans formulünden (f = 1/T) gidersek T değer küçüldükçe (T < 1) küçülür ve içinden çıkılmaz bir hal alır.
Şimdi, basit denemeler için Mega Hertz'ler seviyesinde PIC'in çalışmasına gerek yok. O yüzden PIC 2 OSC bacağı yerine bir tanesini (OSC1'i) ve de birer direnç/kondansatör ikilisini kullanarak basit bir başlangıç yapabiliriz. Ancak yazılım kısmında da programlarken ayarının doğru (RC in configuration bits) olduğuna emin olmasın. Bağlantısı ise şu şekilde:
'http://www.8051projects.net/pic_tutorial/Untitled-14.gif'
Çok basit değil mi? Biz buna RC Oscillator diyoruz ve elektronikte, bobinden tut da kristal elemanına, hatta şekillerine göre çok kapsamlı bir konudur. Ama bizim için 2,2K'nın altında olmadığı müddetçe bir direnç (örn. kolay bulabileceğin 10K) ile kristalli devrede de kullanabileceğin 20 pF (pikofarat) kondansatör yeterli oluyor. Tekrar hatırlatmalıyım RC ayarı önemli. Aslında bu konfigurasyon biti kristal kullanırken de önemli. Örneğin 20 MHz. kullanacağın zaman HS (HighSpeed) ayarı yapman gerekiyor.
http://320volt.com/wp-content/uploads/2009/04/breadboard.jpg
Genelde breadboard üzerinde 2 kenarda ikili yatay kısa devre olmuş bölümler vardır. Bunlardan biri artı (+ kırmızı), diğeri eksi (- mavi) deliklere direnç ile kondansatörü takarak kullanabilirsin. Kalan uçları da PIC'in olduğu bacağa takıyorsun, hepsi bu kadar...
Ne kadar kolay öyle değil mi?
Ancak bu kadar basit olmayabilir, şunlara da dikkat et:
- Yine bir direnç (1K) kullanarak MCLR ucunu artıya (+) ver ve eğer PIC'i baştan başlatmak (reset) isteren,
- Herhangi bir düğme (button) ile tıpkı RC bağlantısı gibi onun bir ucunu eksiye (-) diğerini MCLR'a bağla,
- Doğal olarak PIC'in güç bacaklarını (+/-) bağlayacaksın ama Vdd uca 100 nF kondansatör takmalısın ve
- Kondansatörün diğer ucunu şaseye (-) ver ama pilli devrelerde bu kondansatör çok şart değildir...
Hadi çok sıkıldık, şimdi biraz program yazalım...:)
Tabi PIC'i bahsettiğim bağlantılar da breadboard üzerinde kurabildiğini var sayıyorum. Herhangi bir bacağa (örn. PortB'nin 0. bitine), 1K'dan düşük bir direnç ile seri bir LED bağlayalım (sürelim) ki hiç bir şey bozulmasın. Bu 470 ohm olursa daha iyi olur. Her ne kadar PIC'in sink (LED artıya) / source (LED eksiye) akımları birbirine yakın ve LED'i bozmayacak seviyede olsa da en doğrusu direnç kullanmaktır.
Alıntı (EK BİLGİ):
> LED'ler basit bir lambadan farklı olarak tıpkı elektrolitik bir kondansatör gibi artı/eksi uçlara sahiptir. Üstelik diyot özelliği vardır. Zaten bunu kısaltmanın açılımından anlayabilirsin. Ayrıca renklerine ve büyüklüklerine göre bir direnç hesabı vardır. Eğer yeşil bir LED pembe/kırmızı bir kıvamda yanıyorsa o bozulmaya başlıyor demektir. Ömrünü hızlıca tüketir o yüzden çok parlak yeşil bir renk yansa bile hesabı önemli olabilir ömrünü kısaltabilir. Şurada bir hesaplama script'i var, belki işine yarar:
http://320volt.com/led-calistirmak-icin-seri-direnc-hesaplari/
Gördüğün gibi hala donanımdan kurtulamadık. Peki bir LED'i, PIC çalıştığı müddetçe, sürekli yanıp sönmesini isteseydik ne gibi basit bir program yazardık. Elbette yüksek seviyeli bir dilde, toggle gibi komutlar ile bir kaç satırda bu mümkün. Ama başlanıçta PIC iyi tanıyabilmek için assembly ile kodlama yapmanı salık veriyorum:
'
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC
LIST P=16F84
INCLUDE "P16F84.INC"
KURULUM:
SAY1 EQU H'0C'
SAY2 EQU H'0D'
CLRF PORTB
BSF STATUS, 5
CLRF TRISB
BCF STATUS, 5
TEKRARLA:
BSF PORTB, 0
CALL AZBEKLE
BCF PORTB, 1
GOTO TEKRARLA
;*************** ALT YORDAM ***************
AZBEKLE:
MOVLW H'FF'
MOVWF SAY1
L1: MOVLW H'FF'
MOVWF SAY1
L2: DECFSZ SAY2, F
GOTO L2
DECFSZ SAY1, F
GOTO L1
RETURN
;*************** ALT YORDAM ***************
END
'
C'de ise şöyle yapacaktık:
Alıntı:
>
> #include <p16f84a.h>
> #include "HardwareProfile.h"
> #include <stdlib.h>
>
> void main (void) {
> TRISB = 0x00;
> PORTB = 0x01;
>
> while(1);
> mInitAllLEDs();
> mLED_1_Toggle();
> PORTB = 0xFF;
> }
> }
> ```
>
Aslında yukarıdaki kod da örneğini verdiğim assembly kodunu oluşturuyor. Belki çok fazla gereksiz şeyle dolduruyor olabilir. Ama mesele PIC'e hakim olmak yoksa ileride istediğin platformda kod yazabilirsin. Genelde assembly ile başlamayanlar, donanımı çok kavrayamadığında kodu ne kadar mükemmel yazarsa yazsın sıkıntı yaşarlar. En basitten "button bounce" diye bir kavram vardır. Grafikle anlatalım:
'<http://lh6.ggpht.com/-3oNbjYuMCsA/Th5FklEtJcI/AAAAAAAAFEM/uBZjs1gOxoo/image_thumb22.png?imgmax=800>'
Bir sonraki uygulamamızın, bir düğmeye basınca LED'i yakan bir şey olsun. Hatta ileri gidelim ve ilk bastığımızda yansın, ikinci bastığımızda sönsün. Bu o kadar kolay ki çift düğme kontrolü ile (BTFSS/BTFSC) düğmenin bırakılıp bırakılmadığını sorguluyoruz. Ancak "bounce" denilen olay ile LED, daha basarken bile defalarca yanıp sönebilir. Çünkü iki iletkenin yaklaşma anında mikro yıldırımlar (ark'lar) çakar ve gözle göremesek de mantık birimine (logic unit: PIC) gereksiz yere true/false döndürebilir. İşte bunu engellemek için küçük gecikmeler yapıyoruz. Tıpkı yukarıdaki ALT YORDAM gibi. Yani o tür şeyler hem istediğimiz aralıklarda bir şeyi yakıp söndürmek için kullanacağız, hem de düğmenin basılıp basılmadığını kontrol ederken olabilecek arkları görmemek için.
Şimdilik ara vermeliyim, yapacak işlerim var. Buraya kadar yazdıklarımı denediysen ve eğer istersen düğme olaylarına da geçeriz?
Başarılar...
--
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]