JAL Dili ile PIC Programla ve Örnek Uygulamalar

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

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ı

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
24/04/2008 12:11 pm
kardeşim varya senin o ellerin dert nedir bilmesin ve görmesin.
Paylaşımcılığın için yürekten sana ,emeği geçen herkese .sonsuz teşekkürler ederim. haydi sağlıcakla kalın
ALPEREN GÖK
27/04/2008 5:46 pm
sayın Emre Ceyhan kardeşim jal ile ilgili çalışman için teşekkürler
jal proramında lib kütüphanesi nasıl yazılır nasıl aktif edilir ve programda nasıl kullanırız ( jal kitapcıgını satın aldım fakat bu kütüpane ile ilgili hiçbir acıklama yok ) önerilerinizi ve degerli cevabınızı beklerim
ismail su
27/04/2008 7:03 pm
İsmail Su
Kitaplık kullanmak :
Bazı program parçaları farklı farklı yazılımlarda kullanılır. Bu tür program parçaları bir dosya olarak kaydedilir ve
hazırlanan programa include komutu ile dahil edebilir.
include jlib — ÅŸeklinde kullanılır
Kaynak:http://www.picproje.com/main/modules.php?name=News&file=article&sid=30
Kaynak:
10/07/2008 9:02 am
kardeşim, ustam, üstadın, eline yüreğine sağlık.
şu jal denen mereti böyle güzel anlatmışsın ya, inan 1 saatte ufak tefek bişeyler yazacak kadar jal öğrendim. picbasic sıkmıştı yaw. ne varsa açık kaynakta var. ALLAH SENDEN RAZI OLSUN.
27/07/2008 10:21 pm
bundan 2 yıl önce altaş yayınarının jal ile pic programlama adlı kitabını satın almıştım ve hala bitiremedim:) ne zaman kitabı okumak için elime alsam bi kaç sayfa sonra sıkılıp bırakıyorum bi ara tatilde kitabı bitirmeye karar vemiştim fakat bir sayfa bile okuyamadım inşallah önümüzdeki yıllarda kitabı bitircem yazdığım programları sizlerle paylaşırım jal ı denemek isteyenler sourceforge . net den jal editörünü ücretsiz indrebilirler
14/09/2008 2:02 pm
merhaba
ben salih bi program yazmak istiyorum fakat bazı eksiklerim var inşallah yardım edersiniz
program şöyle
if pin_ A0 == high then
pin_b0 = high
delay_50ms
pin_b0 = low
pin_b1 = high ——- benim problemim burada baÅŸlıyor
a0 high oldugu müddetce b1 devamlı cıkış versin a0 low oluncada
b1 low olsun fakat ,
a0 high oldugunda b0 bir anlık high olsun birdaha olmasın taki a0 low
olana kadar.
bu program bu şekilde yazıla bilirmi lütfen yardım
tolu_ailesi@hotmail.com
:rolleyes:
5/11/2008 3:04 pm
jal ile 6 adet 7segment display i tarama yöntemi ile sayıcı olarak nasıl kullanabilirim.Yardımcı olursanız sevinirim.iyi çalışmalar…