Pic in timer özelliğini kullanabilmek?

Başlatan futureng, 16 Ekim 2008, 19:15:48

futureng

Merhaba.
PIC in bir bacağına karışık zaman periyodları ile High olma durumu gelmektedir. (yani 1 olmaktadır) 2 high olma arasındaki geçen süreyi ölçüp çeşitli matematiksel işlemlere tabi tutarak bir takım değerler elde etmek istiyorum. Sanırım Timer komutları ile yapılabilecek. Bu konuda yardımcı olacak arkadaşlara teşekkür ederim.
GimpTR.COM: Hayal Gücünüzün Gerçek Dünyadaki Görünüşü  http://www.gimptr.com

XX_CİHAN_XX

Hangi dili kullandığını ve iki high arasında olabilecek maksimum süreyi verirsen daha çok yardımcı olabilirim.
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.

futureng

Normalde JAL kullanıyorum. Ama picbasic kullanan daha fazla olduğu için bu konuda da işimi görebilririm.

Ölçülmeis gereken süre belli değil kararsız bir high olabilir. max. 2sn ye ye kadar ölçüm yapılabilirse sanırım olabilir.
GimpTR.COM: Hayal Gücünüzün Gerçek Dünyadaki Görünüşü  http://www.gimptr.com

ferdem

Bu dökümanda CCP modül uygulamaları var, pulse genişliği ölçme de var:CCP Module
Bu işlem için RB0 kesmesini kullanabilirsiniz. 2 kenar arasını ölçmek için B0 önce düşen kenarı beklesin(veya tersi), düşen kenar gelince kesme içinde timer1 i başlatın ve sıradaki kenar yükselen kenar olacağından option registerinden ilgili biti değiştirerek B0 ın yükselen kenarı beklemesini sağlayın. Sıradaki kesmede timer1 in değeri geçen süreyi verecektir. Eğer kodunuzda başka kesmeler varsa PIC timer kesmelerine hemen giremese de diğer timer kesmesinde de aynı gecikme olacağından doğru zamanı ölçebilirsiniz.
Timer1(16bit) 4MHz osilatör ile eğer prescale 1:1 olursa 65 milisaniyeye kadar sayabilir. Siz iki saniyeye kadar saymasını istiyorsanız timer1 prescale 1:4 yapabilirsiniz. Bu işlemleri bir defa assemby ile yazarsanız ki uzun sürmez yüksek seviyeli bir dille yazarken gözden kaçan bir şey olmaz. İyi çalışmalar.

futureng

Teknik açıklama için teşekkür ederim. Fakat bu açıklamalar doğrultusunda kodu yazamıyacağım. Örnek bir algoritma veren olursa sevinirim. Teşekkürler.
GimpTR.COM: Hayal Gücünüzün Gerçek Dünyadaki Görünüşü  http://www.gimptr.com

ferdem

PIC Simulator IDE programını yükleyip timer1 ile alakalı çalışma yapınız. timer1 i çalıştırıp durdurun, prescale i değiştirin, rb0 kesmesini kullanın, bu program kolayca denemeler yapmanızı sağlayacak. PIC içerisinde Timer1 ile ilgili hangi registerlar var, rb0 kesmesi ile ilgili hangi registerlar var, bu registerların hangi biti neyi kontrol ediyor? Bu soruların cevabı kataloglarda derli toplu bir şekilde, tablo halinde veriliyor.
PIC Simulator IDE den çok şey öğreneceksiniz. Bunları asm olarak yazarsanız timer1 ve b0 kesmesini beraber kullanarak pulse ölçecek uygulamayı kolayca yazabilirsiniz. Aşağıda benim eskiden yazdığım pulse ölçme ile ilgili asm kodları var(şimdi baktım ölçüyor, inşallah bir eksiği yoktur, optimize edilmedi), asm diyorum çünkü bu işlemleri en iyi anlamanın yolu asm den geçiyor, şöyle bir asm ye küçük bir giriş yapıp timer ları öğrenip pic basic proya dönebilirsiniz. Yani kolları sıvayıp biraz asm ye giriş yapmak ilk günler zor olabilir ama emin olun bu çalışmanız için aradığınız bilgileri güzelce öğrenmenizi sağlayacaktır.


;Darbe Genisligi Olcer
;22 Haziran 2008
;fatih erdem
;picproje.org fatiherdem.net 
list      p=16F628A          
#include <p16F628A.inc>       
 __CONFIG   _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC 

ORG	H'00' ;reset vektörü
GOTO START

ORG	H'04';kesme vektörü
BTFSS INTCON,1; 
GOTO TMR_KESME
BTFSS	OPTION_REG,6
GOTO	DUSEN_KENAR		; dusen kenar algilandi
GOTO	YUKSELEN_KENAR 	; yukselen kenar algilandi


TAM		EQU	H'20'
TMPH	EQU H'21'
TMPL	EQU	H'22'

START
;;;;;;degiskeni sifirla;;;;;;;;;;
CLRF	TAM
;;;;;port ayarları;;;;;;
MOVLW	H'FF'
BANKSEL TRISB
MOVWF	TRISB ;port b giris 
BANKSEL PORTB

;;;;;kesme ve timer1 ayarlari;;;;;
MOVLW	B'11010000'
MOVWF	INTCON
BANKSEL PIE1
BSF		PIE1,0 ;timer1 overflow interrupt aktif

ANADONGU
GOTO ANADONGU



TMR_KESME
	BCF	PIR1,0
	BANKSEL TAM
	INCF	TAM
RETFIE

YUKSELEN_KENAR
	BANKSEL	T1CON
	BSF		T1CON,0 ;saymaya basla
	BCF		INTCON,1; clear int flag
	BANKSEL	OPTION_REG
	BCF 	OPTION_REG,6; dusen kenari bekle
RETFIE

DUSEN_KENAR
	BANKSEL	T1CON
	BCF		T1CON,0 ;sayaci durdur
	BCF		INTCON,1; clear int flag
;;;olcum bitti, degeri oku;;;;
	MOVF TMR1H, W ;Read high byte
	MOVWF TMPH ;
	MOVF TMR1L, W ;Read low byte
	MOVWF TMPL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	BANKSEL	OPTION_REG
	BSF 	OPTION_REG,6; yeni olcum icin yukselen kenari bekle
RETFIE




END


Burda da timer2 ile ilgili basit bir örnek var:

;bu programla timer2 nin periodunu 3F e ayarladık, fosc için 1:4 presacler kurduk. Böylece 3F*4 çevrimde bir timer2 overflow kesmesi çalıştırdık.
list      p=16F628A          
#include <p16F628A.inc>       
 __CONFIG   _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC 
 
ORG	H'00' ;reset vektörü
GOTO START

ORG	H'04';kesme vektörü
GOTO KESME

START
MOVLW	B'11000000'
MOVWF	INTCON

BANKSEL	PIE1
BSF		PIE1,1
MOVLW	H'3F';period
MOVWF	PR2

BANKSEL T2CON
BSF		T2CON,0; 1:4 prescale
BSF		T2CON,3; 1:2 postscale

BSF		T2CON,2 ; start timer2

GOTO $


KESME
BANKSEL PIR1
BCF PIR1,1
RETFIE

END


Bu kodları derlemek için MPLAB kullanabilirsiniz. İyi çalışmalar.

futureng

Teşekkür ederim. ASM ile ilgili bu uygulamayı deneyeceğim. ASM yi her dilde kullanabiliriz.

Ama picBasic te çalışması olan arkadaşların örneklerini de bekliyorum.
GimpTR.COM: Hayal Gücünüzün Gerçek Dünyadaki Görünüşü  http://www.gimptr.com