PIC ile LED Yakıp Söndüren Devre - Hacettepe Üniversitesi Robot ...
PIC ile LED Yakıp Söndüren Devre - Hacettepe Üniversitesi Robot ...
PIC ile LED Yakıp Söndüren Devre - Hacettepe Üniversitesi Robot ...
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>Hacettepe</strong> <strong>Robot</strong> Topluluğu
HUN<strong>Robot</strong>X - Makaleler - <strong>PIC</strong> <strong>ile</strong> <strong>LED</strong> <strong>Yakıp</strong> <strong>Söndüren</strong> <strong>Devre</strong><br />
Makaleler<br />
<strong>PIC</strong> <strong>ile</strong> <strong>LED</strong> <strong>Yakıp</strong> <strong>Söndüren</strong><br />
<strong>Devre</strong>
HUN<strong>Robot</strong>X - Makaleler - <strong>PIC</strong> <strong>ile</strong> <strong>LED</strong> <strong>Yakıp</strong> <strong>Söndüren</strong> <strong>Devre</strong><br />
<strong>PIC</strong> <strong>ile</strong> <strong>LED</strong> <strong>Yakıp</strong> <strong>Söndüren</strong> <strong>Devre</strong><br />
Canol Gökel - 13 Ekim 2006<br />
Giriş<br />
Merhaba arkadaşlar, bu makalemizde <strong>PIC</strong>'e yeni başlayanlar için basit bir devre yapacağız.<br />
Mikrokontrolörümüzü kullanarak bir <strong>LED</strong>'i yakıp söndüreceğiz. Günlük hayatta lambaları yakıp<br />
söndürme işlemi iki şekilde yapılır; birincisinde, bir düğmeye basarsınız (yani bir anahtarı<br />
kapatırsınız) ve düğme basılı olduğu sürece (anahtar kapalı kaldığı sürece) lamba yanık kalır.<br />
İkinci şekilde ise; bir düğmeye basarsınız (anahtar kapanır ve hemen tekrar açılır, yani bir sinyal<br />
gönderir) ve lamba yanar, tekrar basarsınız (yine aynı şekilde anahtar kapanır ve hemen<br />
kendiliğinden açılır) lamba söner.<br />
Birinci şekilde yapılacak bir devre mikrokontrolör gerektirmeyeceğinden biz ikinci şekilde çalışan<br />
bir devre hazırlayacağız.<br />
Assembly Programı<br />
İlk olarak mikrokontrolörümüz için bir program yazacağız. Programı assembly dili <strong>ile</strong><br />
kodlayacağız. Elbette mikrokontrolöre HEX uzantısına dönüştürülmüş (yani derlenip makine<br />
koduna çevrilmiş) halini yükleyeceğiz. Bu işlemi MPLAB ya da MPASM programını kullanarak<br />
yapabilirsiniz.<br />
Biraz görsellik katıp anlamanızı kolaylaştırmak açısından bir akış diagramı hazırlayarak işe<br />
başlayabiliriz:<br />
Değişkenleri ayarla,<br />
giriş/çıkış pin'lerini ayarla<br />
D ü ğ m e d e n s i n y a l<br />
geliyor m u ?<br />
Hayır<br />
Evet<br />
Lamba yanıyor mu?<br />
Hayır<br />
Lambayı yak<br />
Evet<br />
Lambayı söndür
HUN<strong>Robot</strong>X - Makaleler - <strong>PIC</strong> <strong>ile</strong> <strong>LED</strong> <strong>Yakıp</strong> <strong>Söndüren</strong> <strong>Devre</strong><br />
Diagramı açıklayacak olursak: İlk olarak yapılması gereken ufak ayarlar yapılıyor. Örneğin<br />
değişken adlarını ayarlıyoruz, hangi geçidin hangi pin'inin giriş hangi pin'inin çıkış olacağını<br />
belirliyoruz vs... Daha sonra programımız sürekli olarak düğmenin bağlı olduğu pin'i kontrol<br />
ediyor. Eğer o pin'den bir sinyal gelirse lambanın bağlı olduğu pin'i “high mode”a çekiyor, yani<br />
+5V yapıyor. Böylece lambamız yanıyor. Ondan sonra yaptığı şey yine giriş pin'ini kontrol etmek<br />
ve yeni sinyaller beklemek. Tekrar bir sinyal aldığı taktirde pin'i “low mode”a çekecek yani 0V<br />
yapacak ve lamba sönecek. Bu kontrol işlemi <strong>PIC</strong>'e güç verdiğiniz sürece devam edecek.<br />
Şimdi programımızın kodlarını yazalım. Programın gerekli yerlerine açıklamalar koydum ama<br />
<strong>PIC</strong> assembly dilini zaten bildiğinizi varsayarak yalnızca programın mantığı <strong>ile</strong> ilgili açıklamalar<br />
yazdım. “;” noktalama işaretinden sonra yazılan yazılar “yorum”lardır ve derleyici tarafından<br />
dikkate alınmaz. Ben de açıklamaları yorum şeklinde programa dahil ettim.<br />
list p=16F84 ; Mikrokontrolörün modelini belirttik.<br />
#include ; <strong>PIC</strong>16F84'e has bazı değişkenleri programa dahil<br />
; ettik.<br />
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC<br />
; <strong>PIC</strong>'in ayarlarını yaptık. Örneğin WDT timer'ını kapattık,<br />
; kristal osilatör kullanacağımızı belirttik.<br />
; Şimdi değişkenleri ayarlayacağız:<br />
#DEFINE DUGME PORTB, 1 ; Düğmemizin bağlı olduğu pin'i tanımladık.<br />
#DEFINE <strong>LED</strong> PORTB, 2 ; <strong>LED</strong>'imizin bağlı olduğu pin'i tanımladık.<br />
#DEFINE YANIK 0X20, 0 ; <strong>LED</strong>'in anlık durumunu (yanık ya da<br />
; sönük) aklında tutan değişkenimizi<br />
; (daha doğrusu bit'imizi) tanımladık.<br />
SAYAC_1 EQU 0X21 ; Program içinde kullanacağımız sayaç için gerekli<br />
SAYAC_2 EQU 0X22 ; olan değişkenler.<br />
ORG 0x000<br />
GOTO main ; <strong>PIC</strong>'e ilk çalıştırılacak olan alt programa gitmesini<br />
GECIKME<br />
; söyledik.<br />
; Düğmeye basıldığında oluşan arkı algılamamak için bir bekleme yapacağız.<br />
; Bu gecikme prosedüründe iki değişkene 255 değeri atıyoruz daha sonra da<br />
; bunları azaltmakla zaman harcayarak bir bekleme rutini gerçekleştiriyoruz.<br />
MOVLW D'255'<br />
MOVWF SAYAC_1<br />
MOVWF SAYAC_2<br />
SAYAC_AZALT<br />
MOVWF SAYAC_1<br />
SAYAC_1_AZALT<br />
DECFSZ SAYAC_1<br />
GOTO SAYAC_1_AZALT
DECFSZ SAYAC_2<br />
GOTO SAYAC_AZALT<br />
RETURN<br />
HUN<strong>Robot</strong>X - Makaleler - <strong>PIC</strong> <strong>ile</strong> <strong>LED</strong> <strong>Yakıp</strong> <strong>Söndüren</strong> <strong>Devre</strong><br />
TERSLE ; <strong>LED</strong> yanıksa söndüren, sönükse yakan alt programımız.<br />
BTFSC YANIK ; YANIK bit'ini kontrol et.<br />
GOTO $+2 ; YANIK bit'i 1 ise 2 satır sonraya git.<br />
GOTO $+3 ; YANIK bit'i 0 ise 3 satır sonraya git.<br />
CALL <strong>LED</strong>_SONDUR ; <strong>LED</strong>'i söndürme alt programını çağır.<br />
GOTO $+2<br />
CALL <strong>LED</strong>_YAK ; <strong>LED</strong>'i yakma alt programını çalıştır.<br />
CALL GECIKME ; Düğmeye bastıktan sonra oluşacak olan arklar<br />
CALL GECIKME ; geçinceye kadar bekle.<br />
CALL GECIKME<br />
RETURN ; Ana programa geri dön.<br />
<strong>LED</strong>_YAK ; <strong>LED</strong>'i yakan alt program.<br />
BSF <strong>LED</strong> ; <strong>LED</strong>'i yak.<br />
BSF YANIK ; YANIK bit'ini 1 yap.<br />
RETURN<br />
<strong>LED</strong>_SONDUR ; <strong>LED</strong>'i söndüren alt program.<br />
BCF <strong>LED</strong> ; <strong>LED</strong>'i söndür.<br />
BCF YANIK ; YANIK bit'ini 0 yap.<br />
RETURN<br />
main ; İlk olarak çalıştırılacak olan kısım.<br />
BSF STATUS, RP0 ; Kodlama yaptığımız bank'ı değiştiriyoruz.<br />
CLRF TRISA ; A portunun tüm pin'lerini çıkış yapıyoruz.<br />
MOVLW B'00000010'<br />
; Aslında A portunu kullanmadığımızdan çok da önemli<br />
; değil.<br />
MOVWF TRISB ; B portunun 1. bitini giriş diğer bit'lerini çıkış<br />
; yaptık.<br />
BCF STATUS, RP0 ; Tekrar bank değiştirdik.<br />
CLRF PORTB ; <strong>PIC</strong>'e ilk güç verdiğimizde düğmeye basılıymış<br />
; gibi gözükmesin diye B portunun değerlerini low<br />
; yaptık. Elbette yalnızca 1. bit'i low yapmak da<br />
; yeterdi.<br />
<strong>LED</strong>_YAK_SONDUR ; Düğmenin basılıp basılmadığını kontrol ettiğimiz kısım.<br />
BTFSC DUGME ; Düğme basılı mı?<br />
CALL TERSLE ; Basılıysa <strong>LED</strong>'in durumunu tersle.<br />
GOTO <strong>LED</strong>_YAK_SONDUR ; Düğmenin basılı olup olmadığını tekrar<br />
END<br />
; kontrol et.
<strong>Devre</strong><br />
HUN<strong>Robot</strong>X - Makaleler - <strong>PIC</strong> <strong>ile</strong> <strong>LED</strong> <strong>Yakıp</strong> <strong>Söndüren</strong> <strong>Devre</strong><br />
Programımızı yazdıktan sonra derleyicimizle derliyoruz ve <strong>PIC</strong>'imize derlenmiş kodu yüklüyoruz.<br />
Bu adımları bu makalede adım adım anlatamayacağım çünkü o konulardan ayrı bir yazı konusu<br />
çıkar.<br />
Şimdi devre şemasına kısaca bir göz artalım:<br />
Düğmenin <strong>PIC</strong> <strong>ile</strong> birleşen kısmına direnç koymamızın nedeni düğme basılı değil iken <strong>PIC</strong>'in giriş<br />
pin'inine 0V vermek istememiz. Düğmeye basıldığında 5V'luk değer kısa devre aracılığı <strong>ile</strong> <strong>PIC</strong>'le<br />
buluşacak direnç üzerinde de 5V'luk bir gerilim farkı oluşarak 5V'un ve toprağın kısa devre<br />
olmasını engelleyecek. Bunun dışında kristalli olan kısım ve <strong>PIC</strong>'in bacaklarına bağlanan kablolar<br />
dışında devrenin mantığını anlamış olmanız gerekiyor (zaten geriye bir tek <strong>LED</strong>'li ve düğmeli<br />
kısım kaldı). Eğer anlamadıysanız elektronik konusunda biraz daha çalışmalısınız. Daha sonra<br />
yeniden bu yazıya dönebilirsiniz.<br />
0V +5V 0V +5V<br />
10KΩ<br />
<strong>PIC</strong> 16F84
Benim hazırladığım devrenin birkaç açıdan fotoğrafı:<br />
HUN<strong>Robot</strong>X - Makaleler - <strong>PIC</strong> <strong>ile</strong> <strong>LED</strong> <strong>Yakıp</strong> <strong>Söndüren</strong> <strong>Devre</strong><br />
Şimdi devreye +5V vererek sisteminizi çalıştırabilirsiniz. Yani breadboard'un kırmızı çizgili<br />
sütununa güç kaynağınızın +5V'luk ucunu mavi çizgili sütununa ise toprak ucunu<br />
bağlayacaksınız. Eğer çalışmazsa kabloların breadboard'a tam olarak yerleştiğinden ve <strong>PIC</strong>'in<br />
doğru bacaklarına doğru voltajı uyguladığınızdan emin olun. Yine çalışmazsa düğmeye<br />
bastığınızda doğru bacağa +5V'un ulaştığını avometrenizle kontrol edin. Eğer yine çalışmazsa<br />
yazdığınız programın yukarıdaki <strong>ile</strong> aynı olduğundan ve programın HEX kodunu <strong>PIC</strong>'e doğru bir<br />
biçimde yüklediğinizden emin olun. Bir de devreniz çalışmadığı taktirde <strong>PIC</strong>'in ısınıp<br />
ısınmadığını ara ara kontrol edin, eğer <strong>PIC</strong> çok ısınırsa mutlaka güç kaynağını devreden sökün ve<br />
bağlantıları gözden geçirin.<br />
Sorularınız için sitemizin forum bölümünü ziyaret edebilirsiniz. İyi çalışmalar.<br />
Bağlantılar<br />
http://robot.ee.hacettepe.edu.tr/<br />
http://www.microchip.com/