jal_ile_pic_programlama

Hazırlayan :Emre CEYHAN

Bu yazımızda bir mikro denetleyicisini çok basit bir ÅŸekilde programlamamızı saÄŸlayacak bir derleyici program olan JAL’i ve komutlarını anlatmaya çalışacağım. Mikrocontroller programlamada çeÅŸitli derleyiciler kullanılmakta. Basit uygulamalar için bence ideal olan ve internette bedava dağıtılan bu derleyicinin ilk baÅŸlayanlar için yeterli olacağına inanıyorum. Bu jal derleyici için arkadaÅŸlarımla yazdığımız basit bir editör programınıda Buradan İndirebilirsiniz

Bu editör programı sayesinde derleme yapabilir ve isterseniz içerisinde devre şekli verilmiş 16f84-16f877 çiplerini programlamamızı sağlayan devreyi yaparaktan, aynı programla derlediğiniz porgramı çipe yazabilirsiniz. Porgram her derlemede oluşturduğu jaltemp.hex dosyasını c: ye kopyalar. Bu hex dosyasını çipe yüklemeniz yeterli olacaktır.

JAL (Just Another Language)

Jal , Wouter Van Ooijen tarafından 16F84 ,16C84,16F877 , Scenix SX18 ve SX28 gibi mikrokontrollerları programlamak için geliştirmiş yüksek seviyeli bir programlama dilidir.

Bilinen bilgisayar komutları ile kolayca mikrokontroller programlamazı sağlayan bu programlama dili derleyicisini ve kütüphane dosyalarını internetten bedava temin edebiliriz. Ayrıca programlama yaparken asembler komutlarınıda kullanabiliriz.

Jal İle Programlama :

Register Tanımlama:

Jal ile microcontroller içerisinde mevcut olan registerları bit veya byte şeklinde istediğimiz isimle tanımlayabiliriz.

Örnek :

var byte alınan_data

Yukarıdaki komutta program kullanılmayan registerlardan birini alınan_data şeklinde isimlendirir.

var bit a = high

Bu ÅŸekilde yapılan tanımlamada bir a biti tanımlanmış ve baÅŸlangıç deÄŸeri olarak lojik 1 atanmıştır. Byte içinde aynı ÅŸekilde kullanılabilir ve 0 dan 255′e kadar bir baÅŸlangıç deÄŸeri atanabilir.

var byte n = 1, m = 257

Aynı anda birden fazla bit veya byte tamılanabilir.

const byte sabit_sayi = 125

Bu ÅŸekilde de program içinde kullanılacak sabit bit veya byte’lar tanımlana bilir.

Port Tanımlama :

Kullanılan çipeteki porttaki pin sayısı kadar I/O (girş-çıkış) tanımlanabilir. Mesela 16f84 için 13 tane I/O kullana biliriz. Aksi taktirde derleyici hata verir ve derleme işlemini durdurur.

Örnek :

pin_a0_direction = input….A portunun sıfırıncı pinini input (giriÅŸ) yapar

port_b_direction = all_output ……B portunun tamamını output(çıkış) yapar

Buraya kadar öğrendiklerimizle bir örnek yapalım.

Örnek:

Port b’yi kullanaraktan bir yürüyen ışık programı yazalım

*** yürüyen ışık programı ****

include 16f84_4 – programı hangi mikrodenetleyici için yazıyorsak onun için gerekli derleme ayarlarını içerir

include jlib – kullandığımız komutları içeren lib dosyalarını içeriri

var byte bekleme_suresi – bekleme_suresi isminde bir byte’lık register tanımladık

port_b_direction = all_output – b portunun tamamını çıkış yapıyoruz

bekleme_suresi = 25 – 1 ile 255 arası deÄŸer vererekten ışığın kayma zamanını ayarlayabiliriz

– ben 25 aldım siz deÄŸiÅŸtirebilirsiniz

port_b = 0b_0000_0001 – birinci ışık yanıyor

delay_10ms(bekleme_suresi) – 250 msn bekliyor (10msn*25=250 msn)

port_b = 0b_0000_0010 – birinci sönüyor ikinci yanıyor

delay_10ms(bekleme_suresi) – bekliyor

port_b = 0b_0000_0100 – ikinci sönüyor üçüncü yanıyor …..

delay_10ms(bekleme_suresi)

port_b = 0b_0000_1000

delay_10ms(bekleme_suresi)

port_b = 0b_0001_0000

delay_10ms(bekleme_suresi)

port_b = 0b_0010_0000

delay_10ms( bekleme_suresi)

port_b = 0b_0100_0000

delay_10ms(bekleme_suresi)

port_b = 0b_1000_0000

delay_1ms(bekleme_suresi)

DeÄŸer Tipleri :

Programlama esnasında kullanılan sayılar binary, hexedecimal , decimal veya ascıı şeklinde değerler alabilirler.

Örnek :

Gidecek_data = 0b_0101_0101 — binary

Gidecek_data = 0x_55 — hexedecimal

Gidecek_data = 85 — now decimal

Gidecek_data = “a” - ascıı

Kullanılan Operatörler :

operator

Priority

interpretation

left argument

right argument

result

! 5 monadic not Bit bit
! 5 monadic not Byte byte
+ 5 monadic plus Byte byte
- 5 monadic minus Byte byte
* 4 Multiplication byte Byte byte
/ 4 Division byte Byte byte
% 4 Modulo byte Byte byte
+ 3 Plus byte Byte byte
- 3 Minus byte Byte byte
<< 2 shift left byte Byte byte
>> 2 shift right byte Byte byte
> 2 larger than byte Byte bit
< 2 less than byte Byte bit
>= 2 larger than or equal byte Byte bit
< = 2 less than or equal byte Byte bit
== 2 Equal byte Byte bit
!= 2 not equal byte Byte bit
& 1 And bit Bit bit
& 1 And byte Byte byte
| 1 Or bit Bit bit
| 1 Or byte Byte byte
^ 1 Xor bit Bit bit
^ 1 Xor byte Byte byte

Tablo-2.1.1

Programla yaparken yukarıdaki operatöler kullanılabilir.

Örnek :

If gelen_data == 5 then pin_a0 = low end if

***

sayici = sayici + 1

Döngü Komutlar :

Koşulsuz döngü :

Forever loop (daimi döngü) :

Programlamada daimi dögü gerekli oduğu zaman kullanılır.

Örnek :

Sürekli pin_a0′ı kontrol eden pin_a0′ın durumuna göre pin_a1′i lojik 1 veya 0 yapan mikrokontrollır programı :

include 16f84_4

include jlib

pin_a0_direction = input

pin_a1_direction = output

pin_a1 = low — pin a1′in baÅŸlangıç deÄŸeri

forever loop

if pin_a0 == high then

pin_a1 = high

else

pin_a1 = low

end if

end loop

Koşullu Döngü :

While :

Bir koşul sağlanana kadar olmasını istediğimiz döngülerde kullanılır.

Örnek :

while r > y loop

d = d + 1

r = r - y

end loop

For :

Bir değere kadar döngü yapmak istediğimizde kullanılır.

Örnek :

for 100 loop

a = a + 1

end for

Åžart Komutu (If ) :

Programlamada bazı şarlar sağlandığında olması gereken olayları gerçekleştirmek için kullanılır.

Örnek :

if a > b then

x = a

else

x = b

end if

Procedure ve Function Tanımlama :

Programlamada yapılacak işlemleri yerine getiren alt programlardır.

Örnekte verilen kalıplarda yazılır. Her procedure veya function bir isimle adlandırılmalıdır. Procedure veya function çağrılırken bu verilen isimler kullanılır.

Örnek :

Proceudre tanım örneği:

procedure zero( byte out x ) is begin

x = 0

end procedure

Function tanım örneği :

function reverse( byte in x ) return byte is

byte y

for 8 loop

asm rrf x, f

asm rlf y, f

end loop

return y

end function

Return Komutu :

Alt programlardan geri ana programa dönmek için kullanılır.

Örnek :

function root( byte in x ) return byte is var byte

n = 15

forever loop

if n * n <= x then return n end if

n = n - 1

end loop

end function

Asembler Komutları Kullanma :

Jal komutlarının yanında jal asembler komutları kullanmamıza izin verir.

Örnek :

procedure first_set( byte in x, byte out n ) is

assembler — assembler block

local loop, done

clrf n

loop : btfsc x, 0

goto done

incfsz n, f

rrf x goto loop

done :

end assembler

end procedure

Aritmetik ve Lojik İşlem Komutları :

Lojik iÅŸlemler :

AÅŸağıdaki tablo-2.1.2′de gösterilen lojik iÅŸlemleri jal içerisinde kullanabiliriz. EÄŸer datamız bit tanımlı ise yanızca and, or ve xor islemlerine tabi tutulabilir.

operator

Priority

Interpretation

left argument

right argument

result

<< 2 shift left Byte Byte byte
>> 2 shift right Byte Byte byte
& 1 And Bit Bit bit
& 1 And Byte Byte byte
| 1 Or Bit Bit bit
| 1 Or Byte Byte byte
^ 1 Xor Bit Bit bit
^ 1 Xor byte Byte byte

Tablo-2.1.2

Örnek :

d = d | 1 — d datasını 1 ile or lojik iÅŸlemine tabi tutar

eÄŸer d = 0b_0000_1100 sa iÅŸlem sonunda d = 0b_0000_1101 olur.

d << d — d datasını sola kaydırır. Mesela d = 0b_0001_0001 ise islem sonunda d = 0b_0010_0010 olacaktır.

Aritmetik iÅŸlemler :

Jal ile tablo-2.1.3′de gösterilen aritmetik iÅŸlemleri kullanılabilir. Ayrıca tabloda belirtilmeyen ve jal’e sonradan ilave edilmiÅŸ math kutüphanesi sayesinde jal ile 24 byte çarpma, toplama, çıkarma ve bölme iÅŸlemleri yapılabilmektedir. Bu iÅŸlemlerden yalnızca bölme iÅŸlemi tam olarak düzgün çalışmamaktadır. İstenildiÄŸi taktirde kullanıcı kendi kütüphanesinide yazarak yapmak istediÄŸi iÅŸlemleri yerine getirebilir. 16FXXX serilerinde kayan nokta iÅŸlemleri yapılamamaktadır. Bu yüzden sonuçlar tam sayıdır.

Byte ile toplama ve çıkarma işlemleri yaparken dikkat etmemiz gereken bazı hususlar şunlardır.

1- Toplama sonuçları işlemcinin 8 bit olmasından dolayı mod 256 şeklindedir. Mesela

d = 255 ise

d = d + 1 iÅŸleminin sonucunda d = 0 olur.

Eğer toplama sonuçlarımızın 255 değerini aşma durumları olursa yeni algoritmalar oluturmamız veya math kütüphanesini kullanmamız gerekmektedir.

2- Çıkarma işlemi işaretsiz sayılar için kullanılmalıdır.

3- Çıkarma iÅŸlemi yapılacak sayı çıkan sayıdan küçükse sonuç 0′dan çıkarılarak bulunur ve pozitiftir. Bunu bilmemiz iÅŸlemlerin doÄŸruluÄŸu açısından önemlidir. Mesela d=0b_0000_0000 ise d = d - 1 iÅŸleminin sonucu d=0b_1111_1111 olur. Sonuçu 0′dan çıkarırsak d=1 olur. Böylece sonuçun mutlak deÄŸerini elde etmiÅŸ oluruz.

operator

Priority

interpretation

left argument

right argument

result

* 4 Multiplication byte Byte byte
/ 4 Division byte Byte byte
+ 3 Plus byte Byte byte
- 3 Minus byte Byte byte

Tablo-2.1.3

Kütüphane Dosyaları :

Jal derleyicisi ile birlikte aÅŸağıda belirtilen kütüphane dosyalarıda gelmektedir. Bu dosyalar lib dosyası içerisinde saklanmaktadır. Bir sonraki yazımızda lib dosyası oluÅŸturmayı alnatmayı düşünüyorum. Bu sayede jal’e yeni komutlar ekleyebiliriz.

1- Jlib(jpic, jascii, jdelay, jseven)

2- Interval

3- Hd447804, Hd447808

4- I2c

5- Lm75

6- Serial

7- Random3

———————————————

1-Jlip kütüphanesi :

Bu kütüphane dosyası jpic, jascii, jdelay, jseven dosyalarını içermektedir. Bu dosyaların görevleri:

a- jpic:

Kullanılan pic’e ayit bilgilerin bulunduÄŸu dosyadır. Portlarla , hafıza ve registerlarla ilgili komutlar bu dosyada saklanır.

b- jascii :

Programlama yaparken değer olarak ascii karakterleri kullanmamızı sağlayan dosyadır.

c- Jdelay :

Zaman gecikmesi sağlamak için kullanılan komutları içermektedir.

Bunlar:

delay_1us( byte in x = 1 )

delay_2us( byte in x = 1 )

delay_5us( byte in x = 1 )

delay_10us( byte in x = 1 )

delay_20us( byte in x = 1 )

delay_50us( byte in x = 1 )

delay_100us( byte in x = 1 )

delay_200us( byte in x = 1 )

delay_500us( byte in x = 1 )

delay_1ms( byte in x = 1 )

delay_2ms( byte in x = 1 )

delay_5ms( byte in x = 1 )

delay_10ms( byte in x = 1 )

delay_20ms( byte in x = 1 )

delay_50ms( byte in x = 1 )

delay_100ms( byte in x = 1 )

delay_200ms( byte in x = 1 )

delay_500ms( byte in x = 1 )

delay_1s( byte in x = 1 )

delay_2s( byte in x = 1 )

delay_5s( byte in x = 1 ) komutlarıdır.

d- Jseven :

Seven segment display kullanmamızı sağlayan komutları içerir.

2- Interval:

Timer kesmesi kullanarak zaman gecikmesi sağlayan komutları içerir.

3- Hd447804, Hd447808 :

Hd447804 ve Hd447808 tipi lcd ekranlara yazı yazmak için gerekli komutları içerir.

4-I2c :

I2c formatlı data almak ve göndermek için gerekli komutları içerir.

5-Lm75

Lm75 entegresinde sıcaklık değeri almak için gerekli komutları içerir.

6-Serial

Rs232 formatlı data almak ve göndermek için gerekli komutları içerir.

7-Random3

random sayı üretmek için gerekli komutları içerir.

İndireceÄŸiniz zip dosyasını c:\jal dizinine açmalısınız. Açtıktan sonra jal dizini içindeki tüm dosya ve dizinlerin read-only olmamasına dikkat ediniz. oku.txt dosyası içinde bazı yaralı bilgiler bulacaksınız. iltelis_editor dizininin içinde bulunan jal editorunu calistirdiktan sonra ornekler ve 877_uygulamaları dizini içindeki jal dosyalarını açabilirsiniz… Alt+J ile derleyip Alt+P ile pic’inizi programlayabilirsiniz. Yanlız jal derleyicisi dos tabanlı bir program olduÄŸu için windows 2000 ve nt iÅŸletim sistemlerinde sorun çıkarabilir. 95 , 98 ve ME de bir sorun yaÅŸamassınız…

Jal Uygulamaları


PIC16F84 Entegreli LCD Göstergeli Ayarlanabilir Saat Devresi

jal_pic16f84

Bu devre, saat olarak kullanılmak amacıyla tasarlanmıştır. Bu devre ile saati istediğimiz değere ayarlayabiliriz.

PIC16F628′li LCD Göstergeli 0-999999 İleri Sayıcı

jal_pic16f628

Bu devre LCD ekranlı 0-999999 tur sayma iÅŸlemlerinde kullanılmak üzere tasarlanmıştır. İleri doÄŸru sayma iÅŸlemini gerçekleÅŸtirir. Sayım aralığı yeterince geniÅŸtir. 0′dan baÅŸlayarak 999999′a kadar yani 1 milyona kadar sayıma ihtiyaç duyulan yerlerde kullanılabilir

Örnek JAL Kodları PIC16F84 ve PIC16F877

Flasor,pwm,adc,IR,keypad,eeprom,timer,servo,step kontrol,disp

Dosyaları Buradan indirebilirsiniz