Asm'de TIMER Kullanımı Zaman Gecikmesi

Başlatan protech06, 24 Ağustos 2008, 00:19:33

protech06

Arkadaslar ASM Kullanıyorum ve  timer kullanımını bir turlu çözemedim netteki örnekler ve forumda araştirdim fakat zaman ayarlamasının neye göre yapıldığını anlayamadım 16F628A ve 20mhz Osc  kullandıgım bir devrede mesela port B0 daki bir ledi 60sn yanık 60sn sönük yapmak icin nasıl bir yol izlemeliyim ve burdaki zaman ayarı neye göre değişiyo yani simdi 60sn gore diyelim peki sonra bunu 20sn 30sn yada 45sn veya 2dk yapmak istenirse nasıl bir yol izleniyor ? timer kullanılmadan dongu ilede zaman ayarlaması gecikme yapıldıgını gordum devrede kullanılan kristal degerine gore ayarlama yapılıyor bu konuda bilgili olan arkadaşlardan kısada olsa açıklayıcı bir örnek ve anlatım olursa cok makbule gecer, iyi çalışmalar

Tagli

PIC'ler genelde kristal frekansının 4'te 1'i frekansta çalışırlar (istisnaları var, 18F serisinde PLL kullanıldığı zaman mesela). 20 MHz kristal bağlı iken PIC 5 MHz ile çalışır ki bu da bir cycle'ın (bunun Türkçe'si nedir bilmiyorum ama belki "çevirim" diyebiliriz) 200 ns sürmesi demektir. 16F serisinin komutlarının çoğu 1 cycle'da biter ama PC (program counter)'ı değiştiren komutlar genelde 2 cycle sürer. Bekleme kodlarını yazarken bunlar göz önünde bulundurulur. Örnek vermek gerekirse kodda yazdığın CALL, GOTO, RETURN gibi komutlar 20 MHz XTAL ile 0,4 us (400 ns) zaman alır. Burda dikkat edilmesi gereken nokta DECFSZ gibi bazı komutların normalde 1 cycle sürüp, atlama yapmalarına neden olacak şart sağlandığında 2 cycle sürmeleridir. Bir diğer mesele de döngüler için değişkenleri saklama sorunudur. Normalde bir register'da 255'e kadar olan bir sayı saklanabilir ama bazı durumlarda döngü için büyük sayılar gerekebilir bu durumda birden fazla byte'ı beraber kullanacak bir sayaç kodu yazılmalıdır ki bu da zaman hesabını zorlaştırır. İşler karışınca bazı ufak hatalara göz yumulabilir bence.

Aşağıdaki kod (daha önce yazdığım bir yerden kopyala yapıştır yaptığım için pek düzgün görünmeyecektir, şimdiden özür dilerim) 1us ve 1ms beklemeleri tam olarak sağlıyor (20 MHz XTAL ile), ama 1 saniye bekletmek istediğimde %0,4'lük bir hataya razı olmam gerekti. (O bölümü burda vermedim, ms bekleme döngüsünü 16 bitlik sayaç ile tekrar tekrar çağıran karmaşık bir şeydi çünkü)
;Bu bolumde tam 1000 us bekleme saglaniyor
BEKLE_MS	CALL		BEKLE_US	;1 us bekleniyor
		CALL		BEKLE_US	;1 us bekleniyor
		CALL		BEKLE_US	;1 us bekleniyor
		CALL		BEKLE_US	;1 us bekleniyor
		DECFSZ		SAYAC_MS,1	;Dongu sayaci kontrol ediliyor
		GOTO		BEKLE_MS	;0 değilse donguye devam et
		NOP				;Dongu bitmisse -> Ince ayar icin 0.2 us bekle
		MOVLW		D'217'		;W'ye 217 yaziliyor
		MOVWF		SAYAC_MS	;SAYAC_MS sonraki dongu icin hazirlandi
		RETURN				;Cagrilan yere donuluyor


;Bu bolumde 1 us (5 islem) bekleme saglaniyor: 2+1+2 (Cagirma+NOP+Donme)
BEKLE_US	NOP				;Gerekli bir bekleme (ust satirda aciklandi)
		RETURN				;Cagrilan yere donuluyor
Gökçe Tağlıoğlu

XX_CİHAN_XX

http://picproje.org/index.php/topic,2795&start=0

http://picproje.org/index.php/topic,10564

..............................

Forumda okadar çok bilgi varki aradığını nasıl bulamadın hayret.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.