PIC BASIC PRO İLE PROGRAMLAMA

1.1. Pic Basic Pro Hakkında
Pic Basic programlama dili mikrochip firmasının ürettiği mikrodenetleyicileri programlamada kullanılan daha çabuk ve kolay bir dildir(www.rentron.com). Pic Basic Pro programlama dili ile 8 ile 84 pin arasındaki değişik özelliklerdeki mikrodenetleyiciler için program yazılabilir. Üst seviyeli programlama dilleri sayesinde çok daha rahat ve hızlı bir şekilde programlama yapılabilmektedir. Ancak bu programlar çok karmaşık sistemlerin çözümünde yetersiz kalabilmektedir.Yüksek seviyeli bu programlama dilleri assembly dili komutları ile birlikte kullanılabilmektedir. Bu durumda yüksek seviyeli bir pic programlama dili ve PIC assembly dili birlikte kullanıldığında bu sorun ortadan kalkmaktadır.
1.2. Pic Basic Pro Komut Seti
Pic Basic Pro’nun komut seti basic programlama diline çok benzemektedir. Basic programlama dilinde olmayan komutlar da mevcuttur.
PIC BASIC PRO programlama dilinin tüm yönleriyle açıklanması bir kitap konusu olacağından burada sadece bu çalışma için gerekli olan komutlar ve bunların özelliklerinden bahsedilmiştir.
1.2.1. Değişkenler ( Variables )
PICBASIC programlama dilinde üç tip değişken tipi kullanılmaktadır. Değişkenler BIT, BYTE veya WORD büyüklüğünde olabilirler. Örneğin: k VAR byte (byte büyüklüğünde K değişkeni)
Pic Basic Pro Komut Seti
END | NAP | SELECT CASE | |
ADCIN | FOR…NEXT | ON DEBUG | SERIN |
ASM…ENDASM | FREQOUT | ON INTERRUPT | SERIN2 |
BRANCH | GOSUB | OUTPUT | SEROUT |
BRANCHL | GOTO | OWIN | SEROUT2 |
BUTTON | HIGH | OWOUT | SHIFTIN |
CALL | HPWM | PAUSE | SHIFTOUT |
CLEAR | HSERIN | PAUSEUS | SLEEP |
CLEARWDT | HSEROUT | PEEK | SOUND |
COUNT | I2CREAD | POKE | STOP |
DATA | I2CWRITE | POT | SWAP |
DEBUG | IF…THEN | PULSIN | TOGGLE |
DEBUGIN | INPUT | PULSOUT | USBIN |
DISABLE | LCDIN | PWM | USBINIT |
DESABLE DEBUG | LCDOUT | RANDOM | USBOUT |
DISABLE INTERRUPT | LET | RCTIME | WHILE…WEND |
DTMFOUT | LOOKDOWN | READ | WRITE |
EEPROM | LOOKDOWN2 | READCODE | WRITECODE |
ENABLE | LOOKUP | RESUME | XIN |
ENABLE DEBUG | LOOKUP2 | RETURN | XOUT |
ENABLE INTERRUPT | LOW | REVERSE |
1.2.2. Etiketler ( Labels )
Etiketler GOTO veya GOSUB gibi komutlara referans teşkil ederler. Bu komutların icrasından sonra program etiketle belirtilen satıra dallandırılır. Etiketler herhangi bir kelime olabilir ve sonuna iki nokta üst üste (:) konur.
Örneğin: Etiket: HIGH PORTB.5
1.2.3. Nümerik sabitler ( Numeric constants )
Nümerik sabitler üçşekilde tanımlanırlar. Bunlar decimal, binary ve hexadecimal‘dir. Binary değer tanımlanırken değerin başına ‘%’ ve hexadecimal değerinbaşına ‘$’işareti konulur. Decimal değer tanımlanırken herhangi bir işaret kullanılmaz. Örneğin:
100‘decimal değer .
%100 ‘decimal 4 için binary değer.
$100 ‘decimal 256 için hexadecimal değer.
1.2.4. Portlar
PIC’in herhangi bir portunun istenilen pini giriş yada çıkış olarak tanımlanabilir. Daha sonra istenilen değer ilgili porta yüklenir. Değerin porta yüklenmesi için farklı yollar vardır.
Örneğin:
TRISB = 0 ‘Portb’nin tüm pinlerini çıkış olarak tanımlamada kullanılır’
TRISA=1 ‘Portb’nin tüm pinlerini giriş olarak tanımlamada kullanılır’
TRISC = %11110000 ‘Portb’nin ilk dört biti çıkış,son dört biti giriş olarak tanımlamada kullanılır’
Yönlendirilen port pinlerine bilgilerin gönderilmesi için birkaç yol vardır. Örneğin:
PORTB = %11110000 : ‘Portb’nin ilk dört pinine lojik-0 , son dört pinine ise lojik-1değeri gönderilmede kullanılır .’
PORTB = 1 ‘Portb’nin bütün pinlerine lojik-1 değeri gönderilmede kullanılır.’
HIGH PORTB.4 ‘PORTB’nin dördücü pinine lojik-1 değeri gönderilmede kullanılır .’
LOW PORTB.6 ‘PORTB’nin altıncı pininelojik-0 değeri gönderilmede kullanılır.’
1.2.5. Zaman gecikmesi ( Pause )
Pause programı istenilen bir süre beklemeye alır. En fazla 61.535 milisaniyelik bir gecikme sağlanabilir. Bu da bir dakikanın biraz üstünde bir değerdir. Pause komutundaki değer milisaniye büyüklüğündedir. Örneğin, PAUSE 49000 (49 saniyelik gecikme). Pause komutu bu çalışmada komut yazımı anlamında programı basitleştirmiştir. Eğer 49 saniyelik gecikmeyi assembly kodunda yazmak gerekseydi, şu şekilde yazılmalıdır.
LIST = P16F877
INCLUDE “P16F877.INC”
SAYI :2′> EQU H’20’
SAYI1 EQU H’21’
SAYI2 EQU H’22’
GECIKME
MOVLW H’FF’
MOVWF SAYI
DONGU
MOVLW H’FF’
MOVWF SAYI1
DONGU1
MOVLW H’FF’
MOVWF SAYI2
DONGU2
DECFSZSAYI2,F
GOTO DONGU2
DECFSZ SAYI1,F
GOTO DONGU1
DECFSZ SAYI
GOTO DONGU
RETURN
Oysa bu programı PIC BASIC PRO programlama dilinde PAUSE 49000 şeklinde tek satırda gerçekleştirmek mümkün olmaktadır. Görüldüğü üzere PIC BASIC PRO ile program yazmak hem çok rahat hem de çok basit olmaktadır.
1.2.6. Döngü düzenlemek ( For…Next )
Bazı işlemlerin önceden belirlenen sayıda tekrarlanması gerekmektedir. PICBASIC programlama dilinde bu işi FOR…NEXT döngüsü bir sayaç gibi çalışarak gerçekleştirmektedir. FOR komutundan sonra bir değişkene ilk değer atanıp, bu değişkenin sayacağı son değer de belirtilir. Ayrıca değişkenin kaçar kaçar artacağı STEP komutuyla kontrol edilebilmektedir. Son olarak NEXT döngüsüne gelen program eğer son değere ulaşılmamış ise bir sonraki değer için aynı işi yapacaktır. Örneğin:
For k=2 TO 10 step 2
Pause1000
Next
Burada k değişkeni 2’den 10’a kadar ikişer ikişer saymaktadır. Her bir döngüde bir saniyelik bir gecikme sağlamaktadır. Döngü toplam beş tur atacağından 5 saniyelik bir gecikme sağlanmış olacaktır.
1.2.7. Kontrol yapmak (IF…Then)
Bazı işlemlerde bir durumun kontrol edilmesi gerekebilir. Picbasic programlama dilinde bu işi IF…THEN komutu sağlamaktadır. Bu kontrol deyimi bir veya birden çok karşılaştırmayı icra edebilir. IF…THEN kontrolörü bir durumun doğru (true) veya yanlış (false) olmasını karşılaştırarak değerlendirir. Eğer değerlendirme doğru iseTHEN komutundan sonraki komut icra edilmektedir. Eğer değerlendirme yanlış ise program bir sonraki satıra geçmektedir. Örneğin:
IF portb.2 = 0 then high porta.1
Else high portb.3
Bu program parçasında eğer portb’nin ikinci pinine lojik-0 gelmişse porta’nın birinci pinine lojik-1gönderilir aksi taktirde portb’nin üçüncü pinine lojik-1 gönderilecektir.
1.3. Kesmeler
Bir Pic mikrodenetleyicisinde kesmelerin nasıl olduğundan 3. bölümde bahsedilmiştir. Burada sadece Pic Basic Pro dilinde kesmelerin nasıl yapıldığından biraz bahsedilecektir.
Bir kesme programı yazmak için en kolay yol ON INTERRUPTyazmakla başlar. Bu komut Pic Basic Pro programının dahili kesmeleri aktif etmesini ve kesme geldiği anda mümkün olan en kısa zamanda kesme alt programına dallanması gerektiğini bildirir. ON INTERRUPT kullanılırsa, bir kesme oluştuğu anda program bulunduğu yerden alt programa dallanmakta ve kesme alt programını icra ettikten sonra kaldığı yere geri dönmektedir. Fakat bu işlem assembly dilindeki kadar hızlı olmamaktadır. İlk olarak kesme geldiği andaki komutun icrası tamamlanmakta ve ardından kesme işlemi gerçekleştirilmektedir. EğerPAUSE 10000 gibi bir komut icra edilirken kesme gelmişse bu komutun icrası bitene kadar (10 saniye) kesme işlemi gerçekleşmeyecektir ve program istenilen amacın dışında çalışacaktır. Bu da Pic Basic Pro’nun dezavantajlarından biridir.
Kesme işleminin yapılabilmesi için öncelikle ilgili registerlerin ayarlanması gerekmektedir ve dikkat edilmesi gereken bir hususta kesme altprogramının programda doğru yerlere yazılmasıdır. Örnek bir kesme alt programı aşağıdaki gibidir.
‘ Port ayarlamaları yapılır
….
ON INTERRUPT GOTO OKUMA
INTCON = %10100000 ‘ Tmr0 kesmesini ayarlamak için
STATUS = %00000111 ‘ Prescaler değeri için
ENABLE INTERRUPT
‘ Ana program bu kısıma yazılır
……..
……
…..
….
…
DISABLE INTERRUPT
ASM
MOVF TMR0,W ‘ Assembly komutları kollanılmıştır.
MOVWF PORTD
NOP
BCF TMR0,2
ENDASM
RESUME
ENABLE INTERRUPT
END
1.4. Pic Basic Pro Komutları
@ : Assembly kodu (tek satırlık) eklemek için kullanılır.
ASM . . ENDASM : Assembly dili kodlarını eklemek için kullanılmaktadır.
BRANCH : Programın başka bir yere dallanmasını sağlamaktadır ( = ON..GOTO )
BRANCHL : Programın değişken içerikli bir konuma dallanmasını sağlamaktadır.
BUTTON : Pine bağlı bir anahtardaki sıçramaları düzenlemektedir.
CALL : Assembly dilinde yazılmış alt programı çağırmaktadır.
CLEAR : Tüm değişkenleri sıfırlamaktadır.
CLEARWDT : Watchdog timerı silmektedir.
COUNT : Bir pindeki darbeleri saymaktadır.
DATA : Eepromun ilk içeriğini belirlemede kullanılmaktadır.
DEBUG : Uygun pinden ve hızda (baud) asenkron seri çıkış
DEBUGIN : Uygun pinden ve hızda (baud) asenkron seri giriş
DISABLE : Debug yada Interrupt komutlarının icrasını durdurmaktadır. (pasif etme)
DTMFOUT : İstenilen pinden touch tonlar üretir.
EEPROM : Eepromun ilk içeriğini belirlemede kullanılmaktadır.
ENABLE : Debug yada Interrupt komutlarının icrasını aktif etmektedir.
END :2′> : İşlemleri durdurur ve düşük güç moduna geçmektedir.
FOR… NEXT : İşlemlerin tekrarında kullanılmaktadır.
FREQOUT : Bir pinde ikiden fazla frekans sağlamaktadır.
GOSUB : Belirlenen adresteki BASIC altprogramını çağırmaktadır.
GOTO style=’mso-bidi-font-weight: bold’>: Programının icrasını belirlenen adrese götürmektedir.
HIGH :2′> : Pini aktif yapmaktadır. (lojik-1)
HPWM : Programdan bağımsız PWM sinyal üretmektedir.(sadece belirli Pic’erde)
HSERIN : Programdan bağısız asenkron seri giriş.
HSEROUT : Programdan bağısız asenkron seri çıkış.
I2CREAD : I²C aygıtlardan okumada kullanılır.
I2CWRITE : I²c aygıtlara yazmada kullanılır.
INPUT : Pini giriş yapmaktadır.
LCDIN : Lcd hafızasından (RAM) okumada kullanılır.
LCDOUT : Karakterleri lcdde göstermektedir.
LOOKDOWN : Değişken için sabit tablosunu araştırmaktadır.
LOOKDOWN2 : Değişken için sabit-değişken tablosunu araştırmaktadır.
LOOKUP : Tablodan sabit değeri almaktadır.
LOW :2′> : Pini sıfıra çekmektedir.(lojik sıfır)
NAP : Geçici bir süre işlemcinin enerjisini kesmektedir.
OWIN : Tek kablo giriş.
OWOUT :: Tek kablo çıkış.
OUTPUT : Pini çıkış yapmaktadır.
PAUSE : Gecikme sağlamaktadır. (ms)
PAUSEUS : Gecikme sağlamaktadır. (µs)
PEEK : Registerden Byte’ı okumada kullanılır.
POKE : Registere Byte’ı yazmada kullanılır.
POT : Belirlenen pindeki potansiyometrenin değerini okumaktadır.
PULSIN :: Bir pindeki darbe genişliğini okumaktadır.
PULSOUT : Pinde darbe üretmektedir.
PWM : Pinde PWM sinyal üretmektedir.
RCTIME : Pindeki darbe genişliğini ölçmektedir.
READ : Eepromdan Byte’ı okumaktadır.
READCODE : Kod hafızasından kelime okumaktadır.
RESUME : Kesmeden sonra programı kaldığı yere göndermektedir.
RETURN : GOSUB komutuyla dallanılan alt programdan kaldığı yere geri döndermektedir.
REVERSE : Pinin konumunu değiştirmektedir.(girişse çıkış çıkışsa giriş yapar)
SELECT CASE : Bir değişkeni farklı değerlerle karşılaştırmaktadır.
SERIN : Asenkron seri giriş.
SEROUT : Asenkron seri çıkış.
SHIFTIN : Senkron seri giriş.
SHIFTOUT : Senkron seri çıkış.
SLEEP : Belli bir süre için işlemcinin enerjisini kesmektedir.
SOUND : Belirlenen pinde ton yada beyaz gürültü oluşturmaktadır.
STOP : Programın icrasını durdurmaktadır.
SWAP : İki değişkenin değerini değiştirmektedir.
TOGGLE : Pini toggle durumuna almada kullanılır..
USBIN : USB giriş.
USBINIT : USB ayarlama.
USBOUT : USB çıkış.
WHILE… WEND : Şart doğru olana kadar programın (durumun) icrasını sürdürmede kullanılır.
WRITE : Eeproma byte’ı yazmada kullanılır.
WRITECODE : Kod hafızasına kelime yazmada kullanılır.
XIN : X-10 giriş.
XOUT : X-10 çıkış.
1.5. Microcode Studio Programı
Pic basic programlama dilinde yazılan bir program yazmak ve derlemek (compile) için microcode studio programı kullanılmaktadır. Herhangi bir editörde yazılan Pic Basic Pro kodları microcode studio programına aktarılabildiği gibi, bu programın kendine has editörü bulunmaktadır. Aşağıdaki şekilde microcode studio programının ana sayfası görülmektedir.
1.6. Propic Programı
PIC’in belleğine yüklenmek üzere yazılan program, microcode studio programında derlenmektedir. Program doğru yazılmışsa .HEX, .ASM, .BAS ve MAC uzantılı dört dosya oluşturulmaktadır. Hexadecimal kodlar ( derlenmiş program ) bilgisayarın paralel portuna bağlanan programlayıcı ( PROTOPIC ) aracılığı ile PIC’in program belleğine yazılmaktadır. Aynı işlemi yapmak için bilgisayarın seri portuda kullanılabilir.(ICPROG) PROTOPIC programlayıcısının PROPIC adında bir programı bulunmaktadır. Programın ana menüsü de aşağıdaki şekilde görüldüğü gibidir.