JAL Dili ile PIC Programla ve Örnek Uygulamalar

| Mayıs 16, 2023 Tarihinde güncellendi
JAL Dili ile PIC Programla ve Örnek Uygulamalar

Hazırlayan :Emre CEYHAN

PCBway Türkiye PCB Manufacturer PCB Assembly

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 (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ı

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

jal-dili-ile-pic-programla-ve-ornek-uygulamalar

Şifre-Pass: 320volt.com

Yayım tarihi: 2008/04/22 Etiketler: , , , ,



10 Yorum “JAL Dili ile PIC Programla ve Örnek Uygulamalar

  1. alperen GÖKalperen GÖK

    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

    CEVAPLA
    1. sabansaban

      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

      CEVAPLA
  2. ismail suismail su

    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

    CEVAPLA
  3. feridunferidun

    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.

    CEVAPLA
  4. mehmetmehmet

    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

    CEVAPLA
  5. salihsalih

    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: 🙁

    CEVAPLA
  6. ahmetahmet

    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…

    CEVAPLA
  7. burakburak

    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.

    CEVAPLA

Flatron için bir yanıt yazın Yanıtı iptal et

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir