JALv2 bana kafayı yedirtecek.

Başlatan demket, 05 Aralık 2013, 15:06:22

demket

S.A., Yaklaşık 2000 satırlık bir projem var. Projede 24lc256, uart,  lcd ve 4 adet button kullanıyordum. 4 buttonu taramak için timer0 kesmesi kullandım. Fakat timer yüzünden yavaşladı ve işimi görmedi. Bende MM74c922 ile keypad kullanayım dedim. 74c922 nin DATA pinini B0 a girdim ve B0 kesmesi ile kontrol etmeye başladım. Keypad çalışıyor ama LCD nin ekranına karakter değil de string basarken saçma karakterler basmaya başladı. Araştırdım. ne print ne 18f4620 nede lcd kütüphanelerinde kaynaklanmıyordu ve hatayı buldum. "Forever loop" tan hemen önce kullandığım aşağıda ki kodları silince herşey düzeldi.

lcd_clear_screen
lcd_cursor_position(0,0)
print_string(lcd,merhaba)
lcd_cursor_position(1,0)
print_string(lcd,web)
delay_1s(1)
lcd_clear_screen
lcd_cursor_position(0,0)
lcd_write_char("A")
lcd_cursor_position(0,5)
lcd_write_char("B")
lcd_cursor_position(0,10)
lcd_write_char("C")
lcd_cursor_position(0,15)
lcd_write_char("D")
lcd_cursor_position(1,0)
lcd_write_char("E")
lcd_cursor_position(1,5)
lcd_write_char("F")
lcd_cursor_position(1,10)
lcd_write_char("G")
lcd_cursor_position(1,15)
lcd_write_char("H")

lcd_cursor_position(2,0)
print_string(lcd,toplamyaz)



Hadi dedim, bu kodlar olmaksızın başlasın program. Ama dert bununla bitmedi. 24lc256 düzgün çalışmamaya başladı. Yine araştırdım.  Bu seferde B0 kesmesine gidince işlettiğim, oluşturduğum menüde gezdiğim kısımdaki bu kodları silince 24lc256 kendine geldi.  Ama o kodlar olmazsa olmaz. Her iki kod grubunun içinde de anormal bir şey görünmüyor. Hafif projelerde sorun yokta kodlar dallanıp budaklanınca JALv2 sapıtıyor.

Sorun bende mi yoksa derleyicide mi?

Kodlar:



procedure int_on_change_isr() is
   pragma interrupt

if  INTCON_INT0IF then
    keyoku(deger)

;         if deger == 21 & menusay == 2 then macgonderpro gecikme1 end if
;         if deger == 21 & menusay == 4 then silpro gecikme1 end if
;         if deger == 21 & menusay == 3 then
;                  macksay = macksay + 1
;                  if macksay > 4 then macksay = 1 end if
;                  gecikme1
;         end if
;         if deger == 21 & menusay == 5 then aktarpro gecikme1 end if
;         if deger == 21 & menusay == 6 then okupro gecikme1 end if
;         if deger == 21 & menusay == 7 then biletokupro gecikme1 end if
;         if deger == 21 & menusay == 8 then kombineokupro gecikme1 end if
;         if deger == 21 & menusay == 9 then masterokupro gecikme1 end if
;         if deger == 21 & menusay == 10 then
;                  menusay = 0
;                  lcd_cursor_position(3,0)
;                  print_string(lcd,satirsil)
;                  gecikme1
;         end if







         if deger == 21 then
         case menusay of
              2: Block
                      macksay = macksay + 1
                      if macksay > 4 then macksay = 1 end if
                      gecikme1
                 End Block
              3: Block
                      silpro gecikme1
                 End Block

              4: Block
                      aktarpro gecikme1
                 End Block
              5: Block
                      okupro gecikme1
                 End Block
              6: Block
                      biletokupro  gecikme1
                 End Block
              7: Block
                      kombineokupro gecikme1
                 End Block
              8: Block
                      masterokupro gecikme1
                 End Block
              9: Block
                       menusay = 0
                       lcd_cursor_position(3,0)
                       print_string(lcd,satirsil)
                       gecikme1
                  End Block


         end case
         end if



Not: İki türlü de  denedim. Hem case hem if. İlginç olan sadece bir koşulu bırakınca (mesela 2: Block...........End Block arasını) çalışıyor. İkinci bir block u ilave edince 24lc256 yine çalışmıyor. :)))

Erol YILMAZ

Hocam 2000 satır vs lik ciddi bir iş yüküne JAL ile girmeniz beni şaşırttı açıkçası.

C derleyicileri var ne güzel,
Denenmiş, test edilmiş...

Şimdi JAL deneyimli  kaç kişi bulunabilir ki ?
Bence pek düşünmeden C tarafına geçiş yapın.

demket

C yi de kullanmaktayım. fakat JAL gerçekten kullanımı, anlaşılması kolay üst seviye bir dil. Keşke kullanımı artsa. İlkokul mezunu, lise mezunu, hiç yazılımla uğraşmamış çalışanlarımız var. 1 hafta da proje çıkarmaya başladılar.

ByTEK

ben uzun zamandan beri jalv2 kullanıyorum. hiç dediğiniz gibi sorun yaşamadım. acaba kullandığınız derleyici beta olupta hatalı olabilir mi. stabil çalışan derleyici indirip farklı sürümlerde deneyebilirsiniz.

http://www.casadeyork.com/jalv2/archive/

boreas

JalV2'i bilmiyorum ama jal'da aynı sorunu bende yaşadım büyük bir projede ki 18f452'nin tamamını kullanmıştım dehşet sapıttı. Proton'a geçtim ve bir daha jal'a bakmadım.

demket

Her türlü derleyici ile denedim. Hatta konuyu jallist e de yazdım. Gelen cevap "Kesme rutinlerinde çok fazla procedure e dallanma olunca böyle durumlar yaşanabiliyor." şeklinde oldu. Asıl şaşırtıcı olan bu durumu düzeltmek için bir girişimin olmaması. Daha doğrusu herkes bu durumu JalV2 nin sınırı gibi algıladı herhalde.

ByTEK

Derleyiciyi geliştiren arkadaşa mail atabilirsiniz. Ben bir ara yardım almıştım.

kyle@casadeyork.com

RaMu

Jal kullanmadım ama,
interrupt rutini içinde iş yapılmaz
interrupt içi çok çok kısa tutulmalı
interrupt rutininde rutin dışındaki biryere gidip işlem yapılmamalı
mesela interrupt içinde lcdye veri yazdırmak, uarta iş yaptırmak gibi,
bunları yaparsanız kesin sorun çıkar demiyorum fakat sağlıklı olmaz.
Jal da nasıl bilmiyorum ama interrupt rutini kullanılırken intcon registerını tekrar okumaya gerekte yok.
Yine jal da nasıl olduğunu bilmiyorum ama koda debug yapın, dallanmalardaki intteruptdaki hataları daha rahat görürsünüz.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

myders

Ramu arkadaşımıza katılıyorum...bende 18f4620 ile bir proje yapıyorum mümkün olduğunca kesme kullanma, birde butonlar için kesmelerde okadar beklenmez. max 2-3 us yeter gir aktif et bayrakları sil bukadar.

FEHMİ_ASM

    Programdaki sapmalar stack overflow'dan da olabilir. Çünkü kodlarınız biraz uzun ve farkında olmadan limiti aşıyor olabilirsiniz. Program saçmalamaya başladığı anda simülasyonu durdurun ve yığını kontrol edin, eğer 31 seviyeye kadar dallanma adresleri görülüyorsa overflow olmalı.
Stack'ı kontrol eden birkaç register var, onları da inceleyin.

rree

Arkadaşların dediği gibi kesme içinde  hem gecikme hemde print  komutu kullanmışınız. Bunları işleyinceye kadar 2 kesme çağrısı gelecektir.Jal bilmem ama kesme içinde gecikme kullanmak için gecikme prosodurunu kendim yazmıştım.Hazır kütüphaneyi kullanmadım.

myders

Forever loop a kadar olan kodları olduğu gibi yaz düzeltmeleri yapalım...