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 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. 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ı
http://www.teknomerkez.net/makale.asp?konu=329&b=b 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.
http://www.teknomerkez.net/makale.asp?konu=328&b=b 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
Şifre-Pass: 320volt.com
Yayım tarihi: 2008/04/22 Etiketler: jal, jal örnek, jal programlama, kılavuz ders, PIC programlama
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
Merhaba ardaşlar çok proje yaptım çok kolay ards istediği çalışma a0 butonuna basınca yansın basmayınca yanmasın yazıyorum
include 16f84_4
include jlib
pin_a0_direction = input
pin_b0_direction = output
forever loop
if pin_a0 == high then pin_b0 = high else pin_b0 = low end if
end loop
—- burayı yazın çalışır
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
İ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:
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.
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
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
[email protected]
:rolleyes: 🙁
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…
emeğine sağlık çok yararlı oldu
jal programı derleme esnasında hata vermiyor fakar hex koduda üretmiyor programı kaydettiğim yerde 2 tane dosya oluşuyor birinde kodun kendisi var diğeri ise boş yardım ederseniz sevinirim iyi çalışmalar.