Peryod ölçme

Başlatan mesmert, 10 Şubat 2015, 15:37:58

CLR

#15
Alıntı yapılan: mesmert - 11 Şubat 2015, 02:55:28
@CLR hocam asm ile ilgili bir örnek verebilirmisiniz acaba?

Bu iş öyle kafa dağıtmak için günde 5-10dk foruma baktığım esnada olacak iş değil. Assembly, C'ye benzemez. Ayrıca proje senin, ben mantığını söylüyeyim sen dene, senin yerine benim uğraşmam doğru olmaz.

Bu iş kesin olur demek yanlış , denemek lazım çünkü arm işlemcilerde çoğu işlem tek cycle'da yapılmaz mesela bir hw registere bir değer yüklemek için minimum 3 veya 2 asm komutu gerekir yani zaman olarak
(16mhz için) 62,5*2 veya 62,5*3 bu süre zaten senin  periyodu nerdeyse kaplıyor aşağıda örnek olsun diye gpioa registerlerinden birine ODR,BSRR, vb gibi registerlere değer yükleyen asm macro örneği ekledim.
GpioA registerlerine ilk defa değer yükleyeceksen 3 asm komutu, hemen ardından yine GpioA registerlerinden birine değer yükeleyeceksen 2 asm komutu gerekir çünkü bu defa adres kullanmaya gerek yok sadece register index'i
kullanılır vs vs.

Capture fonksiyonu içinde adımları yazdım sen en optimize şekilde yazıp deneyebilirsin. Capture fonksiyonu bir asm fonksiyonudur yani içinde doğrudan asm kullanbilirsin , gerisi sana kalmış.

    MACRO
    LD_GPIOAREGS    $indx,$da_ta
    ldr     r11,=$GPIOA_ADR;
    mov     r0,#$da_ta
    str    r0,[r11,#$indx]                 
    MEND


// bu kısmları C'de hazırla
// Portları ve timer veya registerleri c'de hazırlarsın 
// kullanacağın tüm registerler clear veya set (kenar saymak için bir register lazım mesela onu 8 periyod okuyacaksan 8'e set etmelisin sonra sonucu 8'e bölebilirsin)
// kullanacağın timer'ın ilgili registerleri clear ve disable

__asm void Capture  (void)	
{
 tüm interruptlar disable (cpsid i)
 yükselen kenarı bekle 
 timer on 
 yükselen kenarı bekle 
 kenar counter'u bir azalt
 0 ise  timer off ve 
 tüm interruptlar enable (cpsie i)
}
// C'de ilgili timer'ın counter registerinden değeri oku
// sonucu 8'e böl




@LukeSkywalker'ın yöntemi için

interrupt kurman gerekir veya main içinde de yapabilirsin ama interrupt kurarsan bu durumda sen daha interrupt'a gidemeden kenar kaçırırsın. Main içinde C ile yaparsan yine kenar kaçırırsın(asm kadar optimize olmadığını düşünerek). Asm ile yaparsan yani bir süre kenar sayarsan sonuç 1 kenar eksik veya fazla olabilir bu sonucu ne kadar etkiler bu sayacağın süreye göre değişir. Ayrıca o saydığın süre boyunca yoğun interrupt varsa kapatman gerekir yoksa kenar sayısı eksik olabilir.   


Yani anlayacağın denemek lazım, kullandığın işlemci 32mhz'de çalışabiliyor sanırım, 32mhz'e çıkarsan daha doğru sonuçlar elde edebilirsin veya okuma esnasında işlemciyi overclock yapabilirsin tabii overclock'ta sayabilirmi denemek lazım.

Knowledge and Experience are Power