Puls ortalamasi

Başlatan UGR, 26 Eylül 2014, 17:44:21

UGR

Merhabalar Pin girişindeki pulsi ortalama almak istiyorum. Pulsi 10 kere okutu toplayıp 10'a bölerek bu işlemi gerçekleştirebiliyorum fakat sure kaybı oluşuyor bunun başka bir yolu varmıdır ? Yazılımsal veya Donanımsal da olabilir.

ete

Bu tür işlerde genelde kullanılan yöntem okunan pulslerdeki kusurat bitlerini atmaktır. İşine ne kadar yarar bilemem.
Ancak, okuna sayıların NCD sini alırsan sayının en yüksek değerlikli bitini alarak diğer bitleri iptal etmiş olursun.
Böylece ortalama almaya bile gerek olmaz. Örnekle açıklarsam,
Elimizde %10011001  , %11001000 , %01010110 ibi sayılar olsun. Bunları Temp=NCD SAYI şeklinde Temp değişkenine çevirirsek elimizdeki sayılar %10000000 , %10000000 , %01000000 şeklindeki sayılara döner. Buda sana ne yapacağın konusunda br fikir verir umarım.

Ete

UGR

#2
Hocam deger bayt olarak kullaniyorum okuma suresi 20 ms suruyor. Mesela 112 degeri  112-113 gibi kararsizlikta kaliyor soylediginiz yontemle anladigim kadari ile ilk haneyi gormezden gelip sorunu cozebilirim  fkat kimi zman ilk haneyide kullanmam gerekiyor bu kararsizligi nasil stabillestirebilirim

ete

Ortalama almak demek zaten ilk haneyi görmezden gelmek gibi bir şey. Hem ilk haneyi kullanayım hemde satbil olsun diyorsan ilk yönteminden başka bir yol aklıma gelmiyor maalesef. Hepsini sürekli topla ve ortalama al. Başka çaresi yok.

Ete

UGR

Peki hocam bu sorun pulsin komutundan kaynaklanıyor neden tek puls gelmesine rağmen kesin sonuç vermiyor ?

UGR

Veya kesme kullanarak net sonuç elde edebilirmiyim ?

Maxim

pulsin komutu için word değeri ve 20mhz osc kullanın
20mhz de ölçüm aralığı 2us denmiş
4mhz de 10us

ete

Ölçüm aralığın 65535'i geçmiyor ise TMR1 kesmesi ile 1/1 bölme oranı ile puls sayabilirsin.
Ete

UGR

Hocam  kesme daha önceden hiç kullanmadım fakat mantığını biliyorum. Nelere dikkat etmem gerekir ?

ete

Dikkat etmen gereken diye bir şey yok. Usulü neyse ona uygun yapman gerekiyor. Ama terimi galiba yanlış kullandık. Burada esas olan TMR1 kesmesi değil iki kesme arasında TMR1 süresinin ölçülmesi şeklinde uygulanmasıdır. Bir puls süresini kesme kullanarak TMR1 sayacı ile ölçmek için;
- Önceden T1CON registerinden TMR1 sayacı bölme oranı 1/1 olarak ayarlanır. Registerin sıfır nolu biti timer'ı çalıştırır. Başlangıçta bu bit sıfır olarak bekler. TMR1 sayacını sıfırlayarak bekletiriz,( TMR1L=0:TMR1H=0)

- Sinyal PORTB.0 dan girilerek RB.0 kesmesi oluşturacak şekilde kesme ayarlaması yaparız.  Kesme önce yükselen kenar için (OPTION Registeri 6cı biti)ayarlanır.
- Dolayısıyla kesme oluşur oluşmaz hemen T1CON registeri sıfır nolu bitini 1 yaparak sayacı çalıştırırız.
- Option registeri 6. bitinden bu defa RB0 kesmesini düşen kenar için ayarlarız
- RB0 kesme bayrağını sıfırlayıp kesmeden çıkarız.
- Yeniden kesme oluştuğu zaman bu sefer T1CON=0 vererek TMR1 sayacını durdururuz.
Dikkat edersen PORTB.0 dan giren sinyal yükselirken TMR1 çalışmaya başladı ve Sinyal düşerken de durdurulmuş oldu.
Böylece sinyalin HIGH süresini TMR1 in saydığı değer ile bulmuş oluruz. 4Mhz kristal frekansında TMR1 in saydığı her değer 1us lik bir süreyi kapsar. dolayısıyla sayılan değer direk us cinsinden HIGH süresi olacaktır.
TMR1 değeri bir başka değişkene akratırlarak süre alınır.
Sure isimli 16 bitlik bir değişkenin olursa Sure.Byte0=TMR1L ve Sure.Byte1=TMR1H şeklinde aktarma yaparsın.
Sonra SURE senin sinyalin HIGH süresini verir.
İşin zor kısmı Kesme içindeki ayarlamalardır. Bu nedenle o kısmı veriyorum.
Disable
KESME:
If OPTION_REG.6=0 THEN  'kesme düşen kenar için ayarlanmış ise
   T1con=0
   Sure.Byte0=TMR1L
   Sure.Byte1=TMR1H
   OPTION_REG.6=1  'kesme yeniden yükselen kenar için ayarlanıyor
   TMR1L=0:TMR1H=0
   Goto CIK
Endif
   T1CON.0=1 'bu satırdan itibaren yükselen kenarda kesme olmuş demektir Sayacı başlattık
   OPTION_REG.6=0  'bir sonraki kesme düşen kenarda olacak
CIK:
       INTCON.1=0  'kesme bayrağını sıfırladık
       RESUME
       ENABLE
 


Hepsi bu kadar
Ete




UGR

#10
Hocam ilginiz için çok teşekkür ederim. Anladığım kadarı ile yazdım fakat sonuç alamıyorum.Sadece sinyalin high ta kalma süresi yetiyor aslında tüm yaptıracağım işlemler için, birde tmr0 ile de yapılabilirmi 4 Mhz de 20 milisaniye de maksimum 2.5 milisayine high ta kalan bir servo sinyali için ?
Program:
@ DEVICE pic12F675                                                  
@ DEVICE pic12F675, WDT_On             
@ DEVICE pic12F675, PWRT_OFF           
@ DEVICE pic12F675, PROTECT_ON         
@ DEVICE pic12F675, MCLR_off           
@ DEVICE pic12F675, INTRC_OSC_NOCLKOUT

TRISIO=%00000100  'tek komut satırı yerine bir sürü satır yazmak anlamsız

DEFINE OSCCAL_1K 1
DEFINE OSC 4
CMCON=7
ANSEL=0

ioc = %00000000       '******************************1***pullup açılmamalı
T1CON=%00001000       '******************************2 **TMR1 henüz aktive edilmemeli ilk kesmede aktif olması lazım
OPTION_REG=%11000000  '******************************3**Yükselen kenarda kesme açılmalı
       
INTCON=%11010000     '*******************************4**RB0 kesmesi aktif edilmemiş nasıl kesme oluşacak?
ON INTERRUPT GoTo KESME 'esme oluşursa KESME adlı etikete git.
                                                         
SURE VAR WORD
HAM VAR WORD


CLEAR
TMR1L=0
TMR1H=0  '*******************************************5**timer sıfırlanmalı
BASLA:

SURE=HAM

SEROUT2 GPIO.1,396,[Ham]   'Sure isimli değişken yollansa daha iyi olmazmı!!!!!!!!!!!!!!!!!!!
PAUSEUS 15

     GOTO BASLA
                                                                                                                                                                                       
Disable

KESME:
If OPTION_REG.6=0 THEN  'kesme düşen kenar için ayarlanmış ise
   T1con=0
   Sure.Byte0=TMR1L
   Sure.Byte1=TMR1H
   OPTION_REG.6=1  'kesme yeniden yükselen kenar için ayarlanıyor
   TMR1L=0:TMR1H=0
   Goto CIK
Endif
   T1CON.0=1 'bu satırdan itibaren yükselen kenarda kesme olmuş demektir Sayacı başlattık
  OPTION_REG.6=0  'bir sonraki kesme düşen kenarda olacak
CIK:
       INTCON.1=0  'kesme bayrağını sıfırladık
       RESUME
       ENABLE                   
                                                                             
    END

ete

Söylemiş olmama rağmen yine TMR1 kesme komutlarını programa bulaştırmaya çalışmışsın.
Ayrıca INT0 kesmesi (RB0 kesmesi) ni aktif hale getirmemişsin. Mantık sırasını sana vermiştim.
Çok zor değil bunların üzerinde kafa yorarak ne yapılması gerektiğini bulmak ama anlamadığım sebeplerden dolayı bunları yapamıyorsunuz. Her neyse verdiğin ve olmuyor dediğin programı düzelterek değiştirdim.
Tabiiki hala eksikleri var. Diyelimki HIGH süresini ölçtün ve ölçülen süre SURE isimli değişkene yerleşti. Sen bunu nasıl göreceksin? Programda buna ait hiç bir komut yok. Bu süreyi program tespit etti ama bir işine yaramamış gözüküyor.
Bir şekilde senin SURE isimli değişkene ulaşım ne değer aldığını görmen gerekmezmi?
Bunun için bir LCD kullansan ve işlemciyide değiştirip 18 pin bir işlemci kullanarak ölçülen süreyi görsen daha iyi olmazmı?.
Muhtemelen programa koyduğun SEROUT komutu ile bu süreyi bir yerlere göndermek istedin ama ne yazıkki ona ait bir komut da yok programda. Maden HAM isimli değişken Süreyi gösterecek o zaman neden sure isimli değişkeni tanımlıyorsun ki?
onun yerine HAM kullan. Ancak bir tedbir almaz isen program sürekli ham değerini bir yerlere yollar. Halbuki ham değiştiği zaman bu işi bir kere yapması daha normal olur. Bu durumda kesme içinde;
   Sure.Byte0=TMR1L
   Sure.Byte1=TMR1H
komutları yerine
   HAM.Byte0=TMR1L
   HAM.Byte1=TMR1H
şeklinde komut kullanıp birde ALDI isimli bit değişkeni tanımlaman ve bu son komut satırlarının altına ALDI=1 yazman iyi olurdu.
Böylece Başla etiketi altınada da;
IF ALDI=1 then
    ALDI=0
    SEROUT......
ENDIF
GOTO BASLA
şeklinde bir mantık kullanman bütün işi çözerdi.

Ete

UGR

Evet hocam bulaştırdım. Öğrenmeye çalışıyorum hocam . 2-3 gündür işi gücü bırakıp bu işe kafa yoruyorum. Seri olarak ayrı bir kartta okuyabiliyorum değeri pulsin de sıkıntı yaşamadım okumakta. 12f kullanmamın amacı puls süresinden kazanmak,diğer şekilde her kanal için en az 1ms kayıp oluyor , Bu yüzden her kanal için ayrı bir 12f kullanıp seri haberleşme ile bu süreyi kazanmak istiyorum. Süreyi hama eşitlememdeki amaç bir makalede böyle olması gerektiğini okuduğumdan dolayıdır. Bana da mantıksız geldi hiç bir amacı yok zaten fakat her ihtimali deniyorum. ham degeri diğer bir high gelene kadar 1 kere göndermesi gerekiyor kartın dediğiniz gibi ham'a önlem almadım. Anlamadığım nokta high süresi sabit oldugu halde ham neden hareketili ve belirsiz oluyor? pulsin komutunda da hareketli oluyor fakat en fazla 2 rakam oynuyor.Kesmede ham hareketten anlaşılmıyor bile.

Powered by EzPortal