saçma hatalar alıyorum , nedeni ne olabilir

Başlatan loves_oi, 28 Mart 2014, 20:31:21

loves_oi

Merhaba , çok saçma hatalarla karşılaşıyorum ve hiç bir anlam veremiyorum , eminim bu hatalarla daha önce karşılaşanlar vardır da bir çözüm önerisi veren olur.
Yazdığım kodda şimdilik hiç bir sorun yok ledler yanıyor 7 segment çalışıyor buton tam takır çalışıyor. Ancak şu 3 şeyden herhangi birisini deneyince kodum bozuluyor. Bu yüzden kodu geliştiremiyorum.

1-  kod içerisinden hiçbir interrupt kullanmıyorum.yani
org 0x04
goto $
sonra Gene tamamıyla çalışır vaziyetteki koda Sadece şunu yapıyorum
INCLUDE dosya
Ve başarılı bir şekidle build oluyor ancak pic'de gene bozulma oluyor.
Birbirleriyle çakışması muhtemel hiçbir register yok , Interrupt mı bozuyor diye de düşünmeyin interruptlar kapatıyorum .


2.
main:
call process1
call process2
call process3
goto $-3
çalışıyor
ama

main:
call process1
call process2
call process3
goto $-3
return
build oluyor ama pic'de hiçbir şey olmuyor
bunu yapmamın hiçbir mantığı yok biliyorum ama çalışmaması için de hiçbir sebep göremiyorum.

3-
main:
call process1
call process2
call process3
goto $-3

ledlerikapat:
..
ledlerikapat 'ı code'un hiçbir yerinde call etmememe rağmen led'ler en başta kapalı olarak geliyor

z

#1
Tamam bazi ip uclari vermeye calismissin ama karsi karsiya kaldigin olayi bize tarif edemiyorsun.

Bizler nasil bir devre yaptin, process1,2,3 rutinlerin nasil kodlardan olusuyor bilmiyoruz.

Uzun suredir pic asm ile ilgilenmiyorum. Fakat;

goto $-3 komutu hata yapmaya musait bir yazim sekli.

$-3 olarak gitmeyi dusundugun  yere bir label ismi (mesela label1) yaz.  goto $-3 yerine de  goto label1 yaz. Satir aralarina yeni komut ekleyip cikarttikca en azindan $ dan kaynakli hatalar yapmamis olursun.

Ote yandan process ismiyle baslayan alt rutinlerde neler olup bittigini bilmek lazim.

ASM kodlama yapiyorsan simulatorle calismayi ogrenmelisin.  Adim adim kodlari ilerletirken sorunu yakalarsin.

Acaba cok uzun bir program mi yazdin. Call ettigin rutinler page disinda kaliyor olabilir mi?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#2
Evet sorun muhtemelen page disina tasma olayi.

main:
call process1
call process2
call process3
goto $-3

Process1,2,3 rutinleri ilk page icinde yer aliyor ve programin calisiyor.

Fakat;

main:
call process1
call process2
call process3
goto $-3
return

buradaki return komutunu eklediginde process1,2,3 rutinleri 1 er adres ileriye oteleniyor ve bu rutinlerden birisi page disina tasiyor.

-------------

ledleri kapat fonksiyonu process1,2,3 rutinlerinden daha ondeki adreslerde yer aliyor.

Sen process1,2,3 rutinlerinden birini (hangisi ise artik) cagirdiginda page ayarlamasi yapmadigi icin ayni pagedeki ve sansina ayni adres bolgesinde kalan  ledleri kapat fonksiyonunu cagirmis oluyorsun.

Uzak rutinleri Call ederken  PCLATH register icerigini degistirmiyor olabilirsin.

http://www.piclist.com/techref/microchip/pages.htm


Bana e^st de diyebilirsiniz.   www.cncdesigner.com

loves_oi

Merhaba , hatayı buldum ve düzelttim. process 'lerin içinde call veya goto yaptığım label'ları kod'un sonuna taşıyınca problem çözüldü(tek yaptığım değişiklik bu). Yani tek yaptığım kod'un ortasında bulunan label'ı kodun sonuna taşımak oldu. Ama hala bu problemin neyden kaynaklandığı ve bu şekilde nasıl çözüldüğünü anlamış değilim.

z

#4
Anlattığım gibi olmuş işte.

Bu olaya page olarak adreslenen işlemcilerde dikkat etmek zorundasın.

Program counter goto yada call olarak çağrılacak labelin adresinin tamamını kod alanından okumadığı için (üst bitler PCLATH registerinden alınıyor) sen de PCLATH'a hiç bir şey yazmadığın için üst bitler 0 olarak kalıyor.  İlgili labelı çağırdığını sanıyorsun ama aslında daha öndeki adreslere gidiyorsun.


Bana e^st de diyebilirsiniz.   www.cncdesigner.com

RaMu

z hocamızda söylemiş bende tekrarlamak istiyorum
debug yap koduna, adım adım çalışır kodun
ve ne zaman nereden nereye nasıl neyle gidiyor dönüyormu neyle dönüyor nereye dönüyor
herşeyi görürsün debug bu işin yüksek hızlı kamerasıdır.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

loves_oi

Hocam PCLATH i dediğiniz gibi hiç değiştirmiyorum. ancak slatlarda şey diyordu, kodunuz çok uzun ise , 1024 tane instruction'dan fazla ise PCLATH i handle etmelisiniz diyordu. Benim kodum 1024 instruction'ı geçmemiştir ki o zaman PCLATH neden işin içine giriyor ?

Alıntı yapılan: z - 01 Nisan 2014, 17:21:09
Anlattığım gibi olmuş işte.

Bu olaya page olarak adreslenen işlemcilerde dikkat etmek zorundasın.

Program counter goto yada call olarak çağrılacak labelin adresinin tamamını kod alanından okumadığı için (üst bitler PCLATH registerinden alınıyor) sen de PCLATH'a hiç bir şey yazmadığın için üst bitler 0 olarak kalıyor.  İlgili labelı çağırdığını sanıyorsun ama aslında daha öndeki adreslere gidiyorsun.

z

Bana e^st de diyebilirsiniz.   www.cncdesigner.com