TMR0'ı kullanarak 30 saniye gecikme yapmak?

Başlatan Seferi, 02 Aralık 2011, 13:40:09

Seferi

PIC16F628A kullanıyorum ve 30sn ye aralıklarla PORTB,7 bitinde bulunan ledi yakıp söndürmek istiyorum. Aslında amacım ledi yak söndürmek değil, sadece TMR0'ı kullanarak yaklaşık 30saniye gecikme elde etmek. Ben kodları aşağıdaki gibi yaptım ama 1sn ye bile olmadan led yanıyor. Yazdığım programın neresinde bir sorun var? Çok baktım ama bir türlü anlayamadım. Yardımlarınızı bekliyorum.
KESME KULLANMADAN BU İŞİ HALLETMEK İSTİYORUM.
LIST	P=16F628A
	INCLUDE	"P16F628A.INC"
	__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _BODEN_OFF & _LVP_OFF & _CP_OFF

BIRSN	EQU	H'20'
IKISN	EQU	H'21'
BESSN	EQU	H'22'
OTUZSN	EQU	H'23'
	ORG		H'000'
	GOTO	AYAR
AYAR
	BANKSEL	TRISB					
	MOVLW	B'01000111'			;HARICI SINYAL KESMESI RB0 YUKSELEN KENARDA, T0CS=1 DAHİLİ KOMUT CEVRİMİ, TMR0 1/256
	MOVWF	OPTION_REG
	MOVLW	B'00000111'			;PORTB	RB0 PWM ÇIKIŞI, İLK 3 BİT BİTİ GİRİŞ, DİĞERLERİ ÇIKIŞ
	MOVWF	TRISB
	MOVLW	H'00'
	MOVWF	TRISA				;PORTA GIRIŞ
	BANKSEL	PORTB
	CLRF	PORTB
	CLRF	PORTA

DENEME
	BSF	PORTB,7
	CALL	OTUZ_SN
	BCF	PORTB,7
	CALL	OTUZ_SN
	GOTO	DENEME
	
ZAMANLAR
;--------------------------------------------30saniye gecikme-------------------------------------------------------------------------
OTUZ_SN
	MOVLW	D'89'
	MOVWF	TMR0			;TMR0 89 SAYISINI YUKLE	128-89=39	39*256=9984 YAKLAŞIK 1
	BTFSS	TMR0,7			;TMR0,7 BİT 1 Mİ?
	GOTO	$ -1			;HAYIR TEKRAR TEST ET
	INCF	BIRSN,F			;BIRSN SAKLAYICISINI BIR ARTTIR
	MOVLW	D'100'
	SUBWF	BIRSN,W			;W=BIRSEN-W
	BTFSS	STATUS,Z		;BIRSN 100 OLDUMU?
	GOTO	OTUZ_SN			;HAYIR TEKRAR SAY
			;EVET,YANI KOMUT BURAYA ILK GELGINDE 1SN OLMUŞ OLDU. ŞİMDİ OTUZ SANIYEYI TAMAMLAMAYA GIDECEK
	INCF	OTUZSN,F		;OTUZSN YI 1 ARTTIR
	MOVLW	H'30'			
	SUBWF	OTUZSN,W		;W=OTUZSN-W  (W=30)
	BTFSS	STATUS,Z
	GOTO	OTUZ_SN			;HAYIR BASADON
	RETURN				;EVET, KOMUT BURAYA GELDİYSE 1SN YI 30 DEFA TEKRARLADIK DEMEKTIR

systran

#1
CCS C de bunu RTOS kullanarak çok kolay halledersin ama ASM de nasıl bilemiyorum.

#use rtos(timer=0, minor_cycle=10ms)
// TASK 1 - her 30s de çağırılıyor ve 10_ms sürüyor
#task(rate=30s, max=10ms)
void task_B7()
{
output_toggle(PIN_B7); // B7 bacağını yak/söndür
}

void main()
{
set_tris_b(0); // PORTB output yapıldı
output_b(0);
rtos_run(); // RTOS başlatıldı 
}

Seferi

Hocam teşekkürler yardımın için. Şuan assemly ile ilgileniyorum, Assembly ile donanımı öğrenmek için biraz daha kendimi geliştirmek istiyorum. Nasip olursa ya ccs c yada hi-tech c ye geçeceğim. Ama öncelikle assembly ile nasıl halledebilirim öğrenmek istiyorum.
Bu arada PIC dahili 4MHZ lik ossilatorle çalışacak.
Yardımlarınızı bekliyorum.

LukeSkywalker

#3
128-89 değil 256-89 olmalı o. TMR0 255'den  taşar ise kesme üretir.

ehliseyf

dahili osc ile biraz sapma olur gibime geliyor ama hayırlısı ..çok hassas değilse devam edin.
Code'm mu oturturum !

gevv

merak ediyorumda uzun zamanlı gecikmeler nasıl yapılıyor  mesela  10...20 dakika gibi
 

tuggy


OTUZSN isimli register içeriği her 1 arttığında OTUZ_SN ye dallanıp yeniden 1 sn beklemeye gidiyor ama BIRSN isimli register kaldığı yerden değer arttırmaya devam ediyor. BIRSN nin içeriğini her yukarı geldiginde yeniden "0" yapmalısın. Ayrıca hesaplamanda da  sorun var. Bir TIM0 örnek hesaplaması incelemelisin yeniden.

Kolay gelsin.

fahri-

Ben timer interruptını 1 sn olarak kuruyorum. Bir değişkeni her timer int de artırıyorum. 16 bit değişken için 65535 sn ye kadar sayıyorum. bu da uzun gecikmeler için yeterli oluyor. (yaklaşık 16 saati kurtarıyor.)
Ama dahili osc kullanmak sakıncalı. sıcaklıkla değişir çünkü.

justice_for_all

Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

Seferi

Alıntı yapılan: maytere - 02 Aralık 2011, 15:34:04
128-89 değil 256-89 olmalı o. TMR0 255'den  taşar ise kesme üretir.
İlgilendiğiniz için teşekkürler , TMR0 ın 7. biti test ederek bir gecikme yapmak istedim. Yani Tmr0 ın 7. biti ilk defa sayılan sayı 128 olduğu zaman 1 değerini alır. Zaten söylediğim gibi kesme kullanmadan bu işi yaptırmak istiyordum ama olmadı.

Seferi

Yardımlarınız için çok teşekkür ederim sonunda halloldu. Anlaşılan daha bol bol çalışma yapmam gerekecek assembly ile. Benim gibi zorlanan arkadaşlar olabilir yardımcı olabilir diye kodları yazıyorum

DENEME
	BSF		PORTB,7
	CLRF 	OTUZSN
	CALL	        OTUZ_SN
	BCF		PORTB,7
	CLRF 	OTUZSN
	CALL 	OTUZ_SN
	GOTO	DENEME
	

OTUZ_SN

	CLRF	        BIRSN

BIR
	MOVLW	D'25'
	MOVWF	TMR0			
	BTFSS	TMR0,6			
	GOTO	$ -1			
	INCF 	BIRSN,F			
	MOVLW	D'100'
	SUBWF	BIRSN,W			
	BTFSS	STATUS,Z
						
	GOTO	BIR	
						
						
	INCF 	OTUZSN,F		
	MOVLW	D'5'			
	SUBWF	OTUZSN,W	
	BTFSS	STATUS,Z
	GOTO	OTUZ_SN			
	RETURN