ete hocanın frekansmetresindeki hesaplamayı anlayamadım

Başlatan fryrmnd, 26 Haziran 2011, 17:43:30

fryrmnd

iyi günler arkadaşlar.... frekansmetre başlıklı projede gelen sinyalin  2 ms lik kısmında hangi aralık için ölçün yapılcağını belirlemek amacıyla    tmr1 in değeri okunuyo anladığım kadarı ile de yükselen kenarlar sayılıyor. daha sonra değer hangi aralıkta ise o aralık için ölçüm yapılyor... anlamadığım  mesala 9 dan küçük ise 65khz e kadar olan aralık için ölçüm yapılsın demiş ete hocam. 65khz,  0.015 ms gibi bişey ediyo... 2ms de 0.015  değeri için 133 tane yükselen kenar gelmesi gerekmiyormu.Neden sayac <130 denmemiş. matematik ve elektroniği bu kadar mı unttum ben...  kod aşağıda. lütfen yardım edin. teşekkürler
START  :           Gosub ROLE
                   Sure=2:gosub olc:low portb.7
                   sayac=Frekans
                   IF sayac<9 THEN HAS=0
                   if sayac>8 and sayac<88 then HAS=1
                   if sayac>87 and sayac<2042 then has=2
                   if sayac>2002 then has=3
                   LCDOUT $FE,1':has=1

ATLA:              SELECT CASE has
                   CASE 0
                        Lcdout $FE,$80,"0-65 KHz : MOD=",DEC has
                        low portb.7:sure=1000:GOSUB OLC
                        Lcdout $FE,$C0,#Frekans," Hz      ":PAUSE 200
                        GOSUB TUS
                        goto ATLA   
                   
                    CASE 1
                        Lcdout $FE,$80,"65-650KHz: MOD=",DEC has
                        GOSUB ROLE:sure=100:GOSUB OLC
                        frekans=(frekans)*10
                        Lcdout $FE,$C0,#Frekans,"0 Hz      ":pause 200
                        GOSUB TUS
                        GOTO ATLA
                   
                    CASE 2
                        Lcdout $FE,$80,"065-65 MHz:MOD=", DEC has
                        sure=10:GOSUB ROLE:GOSUB OLC
                         IF FREKANS>1000 THEN
                         I=frekans/1000
                         Lcdout $FE,$C0,#(I),".",dec3 (frekans-I*1000)," KHz"
                         GOTO ARA
                        ENDIF
                        Lcdout $FE,$C0,Dec3 FREKANS,",",#(Frekans//10)," KHz"
ARA:                    pause 200:GOSUB TUS
                        GOTO ATLA
     
                    CASE 3
                        Lcdout $FE,$80,"65-100MHz: MOD=" ,DEC has
                        GOSUB ROLE:sure=10:GOSUB OLC
                        I=frekans/1000
                        Lcdout $FE,$C0,#I,".",dec3 (Frekans//1000)," MHz      "
                        pause 200:GOSUB TUS
                        GOTO ATLA
                     
                     CASE 4
                     HAS=0:GOTO START   
                    END SELECT
                    Z=0
                    GOTO START
                   
TUS:                if PortB.2=1 then
                      IF Z=1 THEN CIK
                      has=has+1:pause 5
                      'IF has=4 THEN has=0
                      Z=1
                      RETURN
                    ENDIF
                    Z=0             
CIK:               RETURN

ROLE:              HIGH PORTB.7:return

ete

Aradan epeyce zaman geçti. Hatırladığım kadarı ile senin düşündüğün şekilde düşünmemiştim.
Öncelikle her bir mod'un örnekleme zamanı farklı idi. Bu nedenle düşük frekanslar için örnekleme zamanı en uzun olan Mode-0'ı seçmiştim.
Mode-0 için 1000 ms lik bir örnekleme süresi , mode-1 için ise 100 ms lik örnekleme süresi almıştım.
2 ms lik ön ölçüm süresinde okunan puls adedi 8 ve altında ise Mode-0 da ölçüm yapılmasına karar vermiştim.
Tabiiki ön ölçüm değerleri tam tamına 0-65 , 65-650Khz .... arasını net olarak ayırmıyor. Bu yalnızca benim tercihim.

Seni yanıltmış isem kusura bakma. Acemilik dönemi programlarından birisi işte.

Ete

Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

fryrmnd

Estağfurullah ete hocam. mod 0 için farlı örnekleme süresi tuttuğunuzu anladım da. İlk kısımda hangi moda girilceğini belirlemek için 2ms lik tmr1 ölçümü var. O kısımda benim yazmaya çalıştığım hesaplamam yanlış değildi dimi yani hocam ona göre hareket etmeye çalışıcam da. Yani siz 8 pulse adedini ozaman için tahmini değer olarak mı varmiştiniz. Birde sizin derslerinizdeki frekansmetre projesinde şöle bir kısım var(tam bakamadım ama,bu örnek proje kodu biraz daha teferruatlı o yüzden önce eski kodlarınıza baktım)
START:
'     gosub olc
'     gosub modsec
'     lcdout $FE,1,"fre:",#frekans," mod=",#has,"S=",#SEC
'     pause 500:goto start
Burda  yorum kısmı(code tag mı deniyo) varmı hocam. Eğer yoksa kod program start kısmından ileri gidemicek gibi anladım. Eğer varsa ilk 2 ms lik kısım bu projede olmuyo mu yada ben mi farkedemedim.
İlginiz için teşekkürler

fryrmnd

Ete hocam gene ben. Vaktiniz olurda cevap yazarsanız çok sevinicem.Şimdi önceki mesajımda frekansmetre projenizin sanırım ilk hali üzerinden 1 soru sormuştum. Birkaç denememde yazdığınız  kodların son halinin(derslerin içinde olan) daha doğru ölçtüğünü anladım ve onları bir kontrol edip 4 Mhz e çevirmeye çalışıtım(bilmiyorum 4Mhzde iyi sonuç alınabilirmi). Hocam kodun sadece mod seçimi için 1 ms lik ölçüm yapılan kısmı üzerinden bir soru sromak istiyorum.
hocam ilk başta süreL ye $fe(242),süreH ye de $04(4) değeri veriyosunuz.sonra portb,6(tmr1) yı kontrol ediyosunuz.Hocam şimdi bu kısımda portb,6(tmr) nın sürekli "0" olduğunun farzetsek süreH bir azalıcak ve tamambir kısmına gidip pic TMR1 aktif olacak ve sanırım ekranda her halükarda "0" değerini gösterecek.Bu kısmı giriş olmadığı halde de ekrana "0" yazdırmak yani girişi kontrol edin gibi bi durum oluşturmak için mi yazdınız.
Hocam 2. sorum. 10Mhz de yazdığınız kod için zaman etiketinden dönünce süreye tekrar bir atama yapıyosunuz.daha sonra süreL ve süreH "0" lanana kadar TMR1 i okuyosunuz.
Delay_9
          decfsz    _SureL, f
          goto      $+2
          decfsz    _SureH, f
          goto      Delay_9
          goto      $+1
kısmında "decfsz    _SureL, f"(0.4),   "goto      $+2 "(0.8),  " goto      Delay_9 "(0,8) toplam  2 mikrosaniye gecikme. burdan (242x2=484)+(2x256=512)=996 mikrosaniye gecikme 1 kaç komutda üst kısımda var (trm1 açıldıktan sonra) 1ms gibi bir ölçüm var anladığım.Şimdi ben bu kısmı 4Mhz de şöyle yazdım.(tabii buna göre asıl modlu ölçümleri de değiştirdim)

1 komut 10mikrosaniye.  "decfsz    _SureL, f"(1),   "goto      $+2 "(2),  " goto      Delay_9 "(2) toplma 5 mikrosaniye. 1000 mikrosaniye ölçüm yapmak için  200 kez dönmesi lazım. Direk süreL ye 200 değerini atasam SüreH ye de "0" atasam(gün içinde böyle yanımdakiler de uyarmadı yaptım ) olmazmı dicem 1 mi atamk gerekiyo ki 0 olup son kısmına dallansın.

Hocam bi aydınlatsan çok sevincem.Teşekkürler






  tamambir
call    zaman
         movlw      0xf2
         movwf      _SureL
          movlw     0x02
          movwf     _SureH

Delay_9
          decfsz    _SureL, f
          goto      $+2
          decfsz    _SureH, f
          goto      Delay_9
          goto      $+1