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. :)))
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.
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.
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/ (http://www.casadeyork.com/jalv2/archive/)
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.
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.
Derleyiciyi geliştiren arkadaşa mail atabilirsiniz. Ben bir ara yardım almıştım.
kyle@casadeyork.com
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.
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.
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.
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.
Forever loop a kadar olan kodları olduğu gibi yaz düzeltmeleri yapalım...