18.08.2013 Views

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 ...

SHOW MORE
SHOW LESS

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/

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!