Kafa yedirten problem - MCU'yu Timera senkronlamak

Başlatan z, 23 Kasım 2015, 09:26:52

z

CPU ve Timer 72Mhz de koşmaktadır. (Timer prescaler=0)

Reload değeri atıyorum 100 olsun.

Timer int yediğim için int rutinine girdiğimde Timer 0 dan bir miktar yüksek değere kadar saymış oluyor. Bu değişken bir değer ve tamamen int üretildiği anda işletilen komutun tamamlanmasına bağlı. Int latencyden dolayı da bir miktar kayıp olacak zaten.

Neyse uygulamaya yönelik kodlarım çalışıyor ve CPU ile Timerı tamı tamına (mükemmel) senkronlama aşamasına geliyorum.

while (timer<50); gibi bir rutinle timerın 50 olmasını bekliyorum.

Hemen altta tekrar timerı okuyorum.

Her defasında (her int döngüsünde) aynı değeri okumam lazım ama okuyamıyorum. En son okumamda timerın 51, 62, 72 olması önemli değil. Her defasında aynı olsun da 52 olsun 60 olsun dert değil.

Yazılımı timera senkronlama işini bir türlü beceremedim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Elektroemre

Hocam sorunun bir kısmını tam anlamadım ama,

Interrupt'ın içindeki komutların flash wait state'ten etkilenmemesi için RAM'den koşturabilirsiniz.
Keilde Interrupt rutinini bulunduğu C dosyasına  sağ click options deyip, çıkan pencerededeki "Memory Assignment" kısmından "CODE/Const" seçeneğini IRAM1 veya IRAM2 gibi seçmeniz yeterli.

z

Flash wait state 0 zaten.

Şöyle sorayım.

Timer ve CPU 72 Mhz de koşuyor.

Timerı okudun ve A değişkenine yazdın.

Şimdi öyle bir Delay rutini yaz ki. Rutin işledikten sonra tekrar Timerı okuyup B ye atalım.

C=B-A işlemi sonucunda C hep aynı olsun.



Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Karamel

Hocam ben birsey sormak istiyorum. timer her overcounting oldugunda. gelen timer interrupti her seferinde ayni interval da olusuyormu? Tim interrupt icersine sadece bir pin i toggle yapip. Olusan signal in lenght i esit cikiyorsa bir theory im var.

z

Olmaz. Bazı cpu komutları 1, bazıları 2 bazıları x şeklinde değişiklik gösteriyor. Çok fazla çeşitlilik var. Bu komutlar işletilirken interruptun işleme alınması için o an yürütülen komutun tamamlanmasını beklenir.

Senin teorin nasıl bir şey?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

yamak

Hocam bu tip işler için Core'a ait DWT peripheralı belki işinize yarayabiir.Direkt o anki CPU cyle'ını  'DWT_CYCCNT' registerından okuyabilirsiniz.

z

Baktım da işime yarar bir şey çıkartamadım.

Sorumu bir daha farklı bir şekilde yazayım.

1) Timer2 ve CPU 72 Mhz de koşmakta.

Öyle bir program parçası yazın ki timerı oku dediğimde okuduğu değer muhakkak çift sayı olsun.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Karamel

Alıntı yapılan: z - 23 Kasım 2015, 12:24:07
Olmaz. Bazı cpu komutları 1, bazıları 2 bazıları x şeklinde değişiklik gösteriyor. Çok fazla çeşitlilik var. Bu komutlar işletilirken interruptun işleme alınması için o an yürütülen komutun tamamlanmasını beklenir.

Senin teorin nasıl bir şey?

hocam benim theory benim capimda olabilir. en basta bunu dillendirdikten sonra. hemen theory im e gecebiliriz.

hocam code larin 1 yada 2 cycle clock hatcadigini biliyoruz. siz bildigim kadariyla suan dma ide kullaniyorsunuz. bu cpu nun calismasini yavaslatiyor olmasi lazim?(dma ile cpu clock frequance i paylasiliyor olmali.)

surekli ayni miktar kullanim olmuyor olabilir. bazi sayimlarda yogun kullanim. bazilarinda az kullanim oluyor olabilir. buda cpu clock unu etkiliyor olabilir diye dusundum. o yuzden interrupt deneyini yapmanizi istemistim. suan benim deney yapma sansim yok. ama int deneyinde tim int icersinde sadece bir pin i toggle edip. cikarak. asagi yukari ayni pulse distance lari gozlemleyebiliyorsak. demekki sorun timer da degil.

ikinci testide soyle yabilecegimizi dusunuyorum.

timer i durdurup.

while(1) toggle eden code;

seklinde bir code ile deney yapabilirsiniz. dma acikken vede kapali iken iki olcum yapip. dma unit in cpu frequance ina ne derece etkisi oluyor gozlemlenebilir.

RaMu

Alıntı yapılan: z - 23 Kasım 2015, 09:26:52
...
while (timer<50); gibi bir rutinle timerın 50 olmasını bekliyorum.

Hemen altta tekrar timerı okuyorum.

Her defasında (her int döngüsünde) aynı değeri okumam lazım ama okuyamıyorum.
...
while (timer<50);
satırının ASM çıktısına baksak,
en az 2-3 satır belki 10-15 satır asm komut olacaktır,
komut setini bilmiyorum ama en azından
50 mi? (mov 50, Wreg   +   xorwf  timer0    +   bit test status ...  gibi bir şey olabilir)
hayır  > goto tekrar kontrol
evet  > sıradaki komut

Bu komutlar işletilirken bazen goto tekrar kontrol de
bazen daha karşılaştırılacak değer Wreg e yüklenirken Timer0 50 olabilir,
bu nedenle her defasında aynı timer0 değeri okunamamış olur. 
Diye düşünüyorum.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

z

Tüm kodlarım asm ile.

Oku, karşılaştır, sıçra şeklinde 3 satır.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Karamel

hocam benim hipotezim tutarlimi? eger degilse hemen bunu  terkedip. yeni birseyler dusunmeye basliyayim.  :-\

t2

PICde bir yöntem var işinize yarayabilir.
while (timer<50); gibi sayı belirtmek yerine
Timer zaman aşımı bayrağı tetiklenecek şekilde  ayarladıktan sonra ,
Timer, preset değerine atanır. beklenir. bayrak kontrol edilir.
hep aynı güzel gecikme  elde edilir. bayrak sıfırlanır yeniden preset atanır.
Sadece bayrak kontrol edilir. interrupta gerek yoktur. program işleri  yapar ve bayrağı bekler. sonra preset atanır.

            while (PIR1bits.TMR1IF == 0);
            PIR1bits.TMR1IF = 0;
            TMR1 = sure;



Bu kısma gelmeden önce, program diğer işleri bitirmesi gerekir. Aksi halde istediğniz sabit süre elde edilmez.  gecikme uzun olur.

z

Alıntı yapılan: Karamel - 23 Kasım 2015, 21:51:38
hocam benim hipotezim tutarlimi? eger değilse hemen bunu  terkedip. yeni birseyler dusunmeye basliyayim.  :-\

Int üretilme anı şaşmıyor. Interrupt rutinine girme anı değişkenlik gösteriyor.  İnterrupt rutinnin ilk satırında counter içeriğini okuduğumda 15..16 gibi oynak değer okuyorum.

DMA'yi tamamen devre dışı bıraktım. Sorun pipeline mekanizmasının altında.

Mesela counter değerini tek sayı okuduysam fazladan NOP vs okutarak işlemciyi tek clk geciktirip bir sonraki counter okumada çift sayı okumayı hedefliyorum.

Fakat NOP kitapta yazıldığı gibi tek cycle değil 2 cycle da tamamlanıyor.

Pipeline da kuyruğa girmiş komutları silip işletiyorum farketmiyor.

Resmen işlemci benim atağıma karşı karşı atak yapıyor.

Timerdan tek sayı okuduysam, normalde çift sayı okuduğumda 4 clk süren komutlar bu kez 6 clk da falan çalışıyor.

@t2

Bahsettiğin yapıyı bazen kullanıyorum. Buradaki sorunum şaşmaz bir doğruluk.

Projem VGA controller.

! No longer available

Bu projeyi bitirdim fakat çok daha fazla geliştirmeye çalışıyorum. Timer ile CPU arasında tek bir clk şaşarsa (1/72Mhz) ekranda bu ana denk gelen satır ile diğer satırlar arasında görsel bozukluk oluşuyor.

Zamanlamanın son derece kritik olduğu bir uygulamada 13.88 ns gibi bir zamana senkron olmaktan bahsediyorum.

Sorun şu: Herhangi bir sebeple işlemci 13.88 nano saniyenin tek katları kadar gecikti ise ilave olarak 13.88ns nin tek katı kadar daha geciktirme yapıp toplamda çift sayılı değerde gecikme yapmak istiyorum.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

drozk


z

Yok havlu attım. Timerlarla hadware'e çözdürdüm sorunu.

ARM gibi bir MCU nun komut işleme süresi havadaki nemden etkileniyor.

Pipelinın boşalmış olup olmadığı, bir sonraki komutun ne olduğu, bir sonraki komutun adresinin ne olduğu, DMA'in busı kullanıyor olması......


Bana e^st de diyebilirsiniz.   www.cncdesigner.com