RESET PROBLEMİ

Başlatan Tom, 26 Mayıs 2005, 00:52:39

Tom

arkadaşlar  yaklaşık 1.8k lık proğram yazdım ama proğram geliyor ve bir satırdan sonra en başa dönüyor.O satıra denk gelen komutta bu dönme işlemini yapacak bir komut yok call komutu kullanıyorum ama oda alt döngüleri 4 veya 5 i aşmıyacak şekilde.Bunu neden yapıyor anlamadım.
  Ama proğramda 47 adet genel amaçlı regıster tanımladım ondan olabilirmi?Veya başka ne gibi hallerden başa dönebilir.Yardım eden arkadaşlara şimdiden teşekkürler

SpeedyX

Programın hangi noktadan sonra başa döndüğünü nasıl anladınız ?
MPLAB gibi bir simulasyonla mı kodu çalıştırıp görüyorsunuz?
WDT kullanıyor musunuz?

HEXF2

Arkadaşım bende de böyle bir problem olmuştu eset sonrası PCLATH içeriği 0 dır senin programda bayağı uzun benim yazdığım programda da
1024 byte ı geçtimi sapıtmaya başlıyordu hatta 512 byte ta bile sapıtıyordu bu yüzden PCLATH ile ilgili ayarlamaları yaptın mı merak ediyorum ben kendi programımda gerekli PCLATH kurmalarını yaptım sorun çözüldü

oziant

kullanmış oldugun işlemci ne?
tanımladıgın register adreslerini kontrol et
bank degiştirmen gerekiyordur belki de
MPLAB 5.62 ASM PROPİC 2

HEXF2

Ya ne bankı sayfa alakalı bir probleme benziyor bank değiştirme gerekli registerlar arası geçiş içindir hengi işlemciyi kullanıyorsun

Petek

Programda interrupt kullanıyorsan ve interruptta alt program çağırıyorsan bunları ana programdaki stack kullanımına ekleyeceksin. 4-5 stack derinliğinden bahsediyorsun. LCD veya software i2c kullanıyorsan zaten 4-3 stack alanın kafadan gider. Derleyicinin rapor ettiği stack kullanımına bak (worst case durumuna).

Jal kullanıyorsan port yazdırma işleminde kullandığı stack alanını rapor edemiyor. Bu özellikle interrupt rutininde sorun oluyor. Senin sorunun 8 stack alanını tüketmiş olmandan kaynaklanıyor olabilir. Derleyici olarak ne kullanıyorsun?

Bir başka konu da derleyicinin interrupta atlarken w registerini, PCLATHi, STATUS registerini sakladığı alana değişken tanımlamış olabilirsin. Bu durumda kendi elinle PCLATH'i bozmuş olursun.

ISIS'te simule et ve adım adım çalıştır. Hatanı görürsün.

Kolay gelsin.
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

Tom

Aslında söylediklerinizin zaten hepsini bende koıntrol etmiştim yani bank değiştirme noktalarını ve daha önce 16F877 için 8kByte dolduran proğramlar yazdım ve hiç sorun çıkmadı .Burada tek süphelendiğin nokta kullandığım genel amaçlı regıster sayısı ve bunları EQU komutu ile atadığım yerler .Ben kullandığım regısterler ve adresleri aşağıda yazıyorum bu konuda yardımcı olursanız sevinirim

;===SAIT.ASM===03/04/05===
;===SAIT.ASM===03/04/05===
; ----lcd displayli KGS proğramı---
	LIST	P=16F877A
	INCLUDE	"P16F877A.INC"
ANA_PROG_BASI1
ADCON1	EQU	h'9F'
TMRO	EQU	h'01'
SAYAA	EQU	h'20'
SAYAB	EQU	h'21'
SAYAC	EQU	h'22'
MAYAC	EQU	h'25'
SAYAD	EQU	h'26'
TORBA	EQU	h'27'
DEPO1	EQU	h'28'
KAPI_REG EQU	h'29' ; kapı kapama sayısı regısteri
TORK_REG EQU	h'30' ; mak motor tork sayısı regısteri
SAYI1	EQU	h'31'
SAYI2	EQU	h'32'
DEPO2	EQU	h'33'
MODUR	EQU	h'34'; motorun durduğunu işaret eden reg
KAPI_ZAM EQU	h'35' ; kapı aç/kapa zamanı
TORK	EQU	h'36' ; motorun tork degeri
MOSACA	EQU	h'37' ; kalkışta motorun algılamasız çalışma süresi
MOTOR_YON EQU	h'38' ; makina motor yön regısteri
BUT_SURE EQU	h'39' ; kts devreye sokan but süresi
DUR_SEC	EQU	h'40'
ZAM_ASIMI EQU	h'41' ; kat zaman aşımı regısteri
ZAM_ASIMIY EQU	h'42' ; kat zaman aşımı  yardımcı regısteri
ELEKT1	EQU	h'43' 
ELEKT2	EQU	h'44' 
CUVAL	EQU	h'45'
ZAMIP_ET EQU	h'46' ; zaman regıs iptal etme regısteri 
EKO1	EQU	h'47'
EKO2	EQU	h'48'
EKO3	EQU	h'49'
ROLE1	EQU	h'50'
ROLE2	EQU	h'51'
ROLE3	EQU	h'52'
MOT_FR	EQU	h'53' ; fren motor arası gecıkme reg
BUTON	EQU	h'54' ; buton tipi yuklenen reg
CALISTI	EQU	h'55' ; kts devreye girdi çıktı reg
ELEKT3	EQU	h'56' 
ELEKT4	EQU	h'57' 
KUTU	EQU	h'58'
SAYA	EQU	h'59'
SAYB	EQU	h'60'
SAYC	EQU	h'61'
BUTON_BAS EQU	h'62' ; butona basılmıs reg

PC	EQU	h'02'		; program sayıcı
VERI	EQU	h'63'		; veri reg
VERI_AD	EQU	h'64'		; veri adresinin tutuldugu reg
SAY0	EQU	h'65'		; sayac
SAY1	EQU	h'66'		; sayac
CX	EQU	h'67'	; genel amaçlı sayac

code tag lütfen
tanımladığım regısterler yukarıdadır.

Tom

Arkadaşlar bana yardım ederken bilgi mahiyetinde yazıyorum.Ben proğramda interrupta, veya WDT kullanmıyorum.daha önce yazmış olduğum  displayli bir proğrama LCD display ilavesidir.İşin enteresan tarafı bank değiştirme hatam kesinlikle yok, çünkü daha önce 16F877 içinde bu 4 bölüm toplam 8kByte lik hafıza içinde çalışan bir çok proğram yazdım.
   burada tek farkı LCD display olması    CALL KAPIYI_ACIYOR    komutu ile lcd ye yazdırılacak karakterleri sıra ile alıp ekranda gösterirken , en son A ile C yi yazıp  proğramın en başına dönüyor.Döndüğünü nereden anlıyorum çünkü proğramın en başındada ekrana başka yazı aktarılıyor.Bu proğramı ISIS ile simüle etmem imkansız çünkü sadece çizimi 1 haftamı alır.Fakat kapıyı açıyor komutundan bir önceki komut olan CALL KAPIYI_KAPATIYOR hiç bir problem olmadan gösteriyor.
   Burada aşağıda yazdığım proğram parçası 16F877 nin 2. 2kbyte lik bölümünde yer alıyor ama daha öncede dediğim gibi bank değiştirme hatası yok.
.
.
.
.
.
.
.
.
;******************************
KAPIYI_KAPATIYOR
	CALL	CLEAR
	CLRF	VERI_AD		;veri ad sıfırla
MES6
	CALL	GECIK_20MS
	CALL	RS_1		; data regısterıne
	MOVF	VERI_AD,W	; W <--VERI_AD=0
	CALL	MESAJ6
	MOVWF	VERI
	IORLW	d'0'
	BZ	CIK6
	CALL	VERI_AKTAR	;  8 bit gönderildi
	INCF	VERI_AD,F	;  veri adresi 1 arttır.
	GOTO	MES6		;  verı gon devam et
CIK6
	RETURN
MESAJ6
	ADDWF	PC,F
	DT	"KAPIYI KAPATIYOR",0
	MOVF	PC,W
	RETURN	
;******************************
KAPIYI_ACIYOR
	CALL	CLEAR
	CLRF	VERI_AD		;veri ad sıfırla
MES5
	CALL	GECIK_20MS
	CALL	RS_1		; data regısterıne
	MOVF	VERI_AD,W	; W <--VERI_AD=0
	CALL	MESAJ5
	MOVWF	VERI
	IORLW	d'0'
	BZ	CIK5
	CALL	VERI_AKTAR	;  8 bit gönderildi
	INCF	VERI_AD,F	;  veri adresi 1 arttır.
	GOTO	MES5		;  verı gon devam et
CIK5
	RETURN
MESAJ5
	ADDWF	PC,F
	DT	"KAPIYI ACIYOR  ",0
	MOVF	PC,W
	RETURN

code tag lütfen

not: Tom, kod verirken ne yapmamız gerekiyor  :?:  :?:  :?:

Petek

Bu şekilde anlamak güç. Bende de benzer sorun olmuştu, Jal kullanıyordum o zamanlar. Stack overflow olmuş. 0 stack seviyesine dönemiyordum.

Değişken adreslerin 20h den başlamış. Sorun görünmüyor gibi.

Sana tavsiyem MPLAB üzerinde simule et. Stack overflow da uyarı versin. En azından hatanın ondan olup olmadığını anlarsın. Port girişlerini ilgili portun adresindeki değerleri değiştirerek simule et.

Her iki altprogram da aynı stack seviyesinden çağırılıyor ise sorun olmaması lazım.

devrende gerekli elektriksel besleme ve filtrelemeleri yapmışsın kabul ederek onlardan kaynaklanabilecek sorun olmayacağını varsayıyoruz. O zaman geriye iki seçenek kalıyor ya goto komutları ile programın başına atlıyorsun, yada pclath içeriğini değiştiriyorsun. Bu durumda fsr ve indf registerlerini kullanmış ve farkında olmadan PCLATH içeriğini değiştirmiş olabilirsin.

Sana tavsiyem ISIS üzerinde 1 hafta harca ve devreyi çiz. En azından her defasında programı yükleyip çalıştırmaktan kurtulursun ve her türlü durumu kolayca denersin.

Olmuyorsa ICD al/yap ve devre üzerinde debug yap.

Ben uzun zamandır assembleri kullanmıyorum. Yazması da hata takip etmesi de çok zahmetli. CCS ile program yazıyorum. İstediğim zaman istediğim yere printf koyup terminal ekranından da olayları takip edebiliyorum. İnanılmaz hız kazandırıyor. Program yazması da çok zevkli hale geliyor. Zaten C de yazınca assemblerda yazmış kadar kodu optimize edebiliyorsun.

Kolay gelsin.
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

Tom

Açıklamaların için çok teşekkür ederim petek cim dediğin gibi yapacağımama yapacağım  başka care yok...

bsivgin

MESAJ6
	ADDWF	PC,F
	DT	"KAPIYI KAPATIYOR",0
	MOVF	PC,W
	RETURN

code tag içine alalım kodları dostlarım   - gnd


bu DT'den sonraki Movf PC,W nın bi manası yok bence. Mesela programın başında
INCLUDE "P16F877A.INC"  tanımladığın halde tekrar TMR0, PC ve ADCON gibi registerleri neden tanımlama ihtiyacı duydun??

MESAJ6'yı çağırmadan önce PCLATH'ı ayarlaman gerekiyor olabilir. Çünkü her sayfanın ilk 256 byte'ında RETLW yapabilirsin?. Yani program hafızasının ikinci 2Kbyte'ın 2. sayfasında isen (her 2Kbytelık kısım sekiz adet 256 byte'dan oluşan sayfalar vardır) PCLATH değerini 1010'a ayarlamalısın. Programıyın 900H ve A00H arasında olduğunu farezettim.


Saygılarımla
Bülent ŞIVGIN
www.diyot.com

supermakarna

Alıntı yapılan: "bsivgin"
MESAJ6
	ADDWF	PC,F
	DT	"KAPIYI KAPATIYOR",0
	MOVF	PC,W
	RETURN

code tag içine alalım kodları dostlarım   - gnd


bu DT'den sonraki Movf PC,W nın bi manası yok bence. Mesela programın başında
INCLUDE "P16F877A.INC"  tanımladığın halde tekrar TMR0, PC ve ADCON gibi registerleri neden tanımlama ihtiyacı duydun??

MESAJ6'yı çağırmadan önce PCLATH'ı ayarlaman gerekiyor olabilir. Çünkü her sayfanın ilk 256 byte'ında RETLW yapabilirsin?. Yani program hafızasının ikinci 2Kbyte'ın 2. sayfasında isen (her 2Kbytelık kısım sekiz adet 256 byte'dan oluşan sayfalar vardır) PCLATH değerini 1010'a ayarlamalısın. Programıyın 900H ve A00H arasında olduğunu farezettim.


Saygılarımla
Bülent ŞIVGIN
www.diyot.com

Benim hatırladıgın kadarıyla 256'lık bloklar halinde her yerde kullanabiliyoruz.

000 ile 0FF arası olabilir
100 ile 1FF arasında olabilir
200 ile 2FF arasında olabilir         vs.

Yanlışım varsa düzeltin

aYe

Selam,

@Tom

Kodun tamamını görmeden kimse size tam manasıyla yardımcı olamaz, sizin de bileceğiniz üzere bu tür hatalar kod'un herhangi bir yerinde olabilir.

Sanırım asansör kontrol programı yazıyorsunuz, bu durumda kodunuzun tamamını yazamazsınız, zira tüm asansör kartı yazanlar için kendi kodu eşsizdir.  :roll:

Sonuç olarak sorunu kendi başınıza bulup gidermek zorundasınız.

İyi çalışmalar.
Dünyada iki şey sonsuzdur. İnsanın aptallığı ve evren. Ancak ikincisinden o kadar emin değilim... (Einstein)

supermakarna

Eğer asansör programı yazıyorsan işin zor derim. Çünkü tahmin edemeyeceğin kadar gürültü var o ortamda. Benim yakın bir arkadaşım sırf gürültü yüzünden projesini çöpe attı. Yani asansör kumanda kartı her baba yiğidin harcı değildir. Umarım başarılı olursun.