80 değişkeni, 1 değişken ile en hızlı karşılaştırma?

Başlatan Veli B., 17 Mart 2013, 21:35:57

Veli B.

Keil ve M3 ile SPI üzerinden okuyacağımız 80 input var ve her input' un puls sürelerini(L:L>H:H>L:L) 80 değişken ile SysTick' e göre tutmayı düşünüyoruz.
Pulsler optik bir düzenekten gelmekte ve max 15 Hz civarında fakat Duty Time ve frekans sabit değil.

Önerilere ihtiyacım olan konu ise:
80 değişken için; her hangi bir input(örn 5.),  L>H olduğu anda Var[4]=SysTick yaptık, müteakiben 22. Input L>H oldu ve Var[21]=SysTick yaptık.

Bir pencere kontrol yapmak ve bu amaçla min ve max değerler set etmeyi düşünüyoruz
(Örn.
Min:100ms   
if((Var[4]+100)>SysTick){}

Max 800ms   
if((Var[4]+800)>SysTick){}


SysTick i kontrollü resete götüremiyorum(handle değerler için ref kayacak), Götürmez isem taşma olduğu için resete gidecek(ilave mekanizmalarla çözülür, zaman kaybettirir sadece)

80 değişkenden herhangi birininin veya bir kaçının pencere içine girip girmediğini en hızlı nasıl kontrol edebiliriz?

ErsinErce

duty ve frekans işini bulmak için araya fpga ve ya cpld koyarsanız daha hızlı olur gibi

düşündüğüm yönteme göre 80 değişken yerine 4x80 değişken gerekiyor bu iş için

1. değişken H>L geçişindeki zamanı tutacak
2. değişken L>H geçişindeki zamanı tutacak
3. değişken H da kalma süresini tutacak
4. değişken L da kalma süresini tutacak

elimizde her 1 sn de kendini sıfırlayan bir sayaç olması lazım (Systick'e bağlı bir sayaç 0->999,999 arası sayacak)
pin düşen kenarda ise H->L geçişindeki zamana bu sayaç değeri yazılacak
pin yükselen kenara geldiğinde L->H geçişine o zamandaki sayaç değeri yazılacak
pin durumu na göre 1 de ise  L da kalma süresi 0 da ise H da kalma süresi 1. ve 2. değişkenlere göre hesaplanıp 3. ve ya 4. değişkene yazılacak

topluca pin karşılaştırma ve çıkartma işlemleri fpga/cpld ile kullanılması 3-4 cycle da tamamlabilir
daha sonra cpld den 3. ve 4. değişkenleri çekerek duty ve frekansları rahatça hesaplatabilirsiniz

belki çözünürlük gereksinimi düşük olursa bu işlemleri m3de yaparak da istenilen sonuç alınabilir

Veli B.

Tam ifade edememişim. Puls süresi derken H olma sürelerini kast ediyorum. Geri kalan kısım lazım değil.
Aşağıda ki her bir puls için, H olma süreleri belirlediğimiz pencere içinde mi? değil mi?
Bunu en hızlı nasıl sorgular ve sonuca ulaşırız?




ErsinErce

80 kanal olunca malesef aklıma başka birşey gelmiyor. 4. değişkeni kullanmadan sadece H zamanını dediğim yolla bulursanız
büyük ihtimal size 1ms çözünürlüğe kadar cevap verebilecektir. (spi dan registerlara aktarma işi dma ile yapılıyor diye düşünürsek)

speak48

meraktan soruyorum  bu spi Serial Peripheral Interface Busmı
ölçmeye çalıştığınız puls genişliğimi
puls genişliği ile spi nin ne alakası var
80 den kastedilen input pinimi,çihazmı,cihazdan alınan verimi

ErsinErce

Alıntı yapılan: speak48 - 19 Mart 2013, 00:37:09
meraktan soruyorum  bu spi Serial Peripheral Interface Busmı
ölçmeye çalıştığınız puls genişliğimi
puls genişliği ile spi nin ne alakası var
80 den kastedilen input pinimi,çihazmı,cihazdan alınan verimi
evet spi o spi
74hc595 ten 10 tane seri bağlandığını ve giriş pinlerindeki sinyalleri ölçmeyi düşünebilirsiniz

Veli B.

Problemlerin büyük kısmı kafamızda çözülmüş durumda.

Performans artışını sağlamak için;
[2][80] adet değişkenimizin random(uint16_t) içeriklerinin,  herhangi bir sayı( uint16 SysTick ) ile karşılaştırmasını en hızlı nasıl yaparız?

@speak48;
sorum ve son verdiğim diagramın açıklayamadığı yeri belirtirseniz, açıklamaya çalışırım.

z

Neden sıradan bir timer int rutininde kod koşturmuyorsun?
En yüksek önceliği bu timera ver.

Timeri 250 uS gibi zamanda taşacak şekilde kur.

N 1..80 arası girişimiz
An N.girişin o anki değeri
Bn N.girişin bir önceki değeri.
Tn N. girişin H olma zamanı

Bn OR An=0 ise Tn=0
(NOT Bn) AND An=1 ise Tn=Tn+1
Bn AND An=1 ise Tn=Tn+1
Bn  AND (NOT An)=1 ise Tn=Tn+1 ve bu Tn aradığın değer.

Bunu her int oluştuğunda bir döngü için 80 kez tekrarla.

Tablo kullanarak çok efektif ve kısacık bir kod yazılabilir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Veli B.

H surelerini bulma kismini hallettim. SysTick ile senkronize ederek kolayca diziye aliyorum ve indexliyorum.
Hizlandirmak istedigim kisim;
bu 2*80 lik dizi icerigini baska bir ref deger ile en hizli nasil karsilastirabilrim?

speak48

74_165 li entegre kullandığını belirtmeyince baya anlaşılmaz havada kalıyor.
puls geliği ölçmek işlemcinin donanımlarıyla olmazsa 1 girişken bile zor, doğruluğu tartışılır bi işlemken
80 girişi birde seri alınca sonuç ne olur bilmiyorum.
baya bacaklı bi mcu ile parelel denenirse daha başarılı olabilir
veya genişliği ölcebilecek uzuz mculardan 5 6 10 neyse onlarla ölçüp değeri ana mcuya iletmek
veya cpld/fpga kesin çözüm


z

Alıntı yapılan: katana - 19 Mart 2013, 01:22:24
H surelerini bulma kismini hallettim. SysTick ile senkronize ederek kolayca diziye aliyorum ve indexliyorum.
Hizlandirmak istedigim kisim;
bu 2*80 lik dizi icerigini baska bir ref deger ile en hizli nasil karsilastirabilrim?

Yazılımdan bahsediyorsan cok optimize edilmiş ASM kodlarla yapacaksın.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

haydarpasamikro

74165 * 10 kaskad bağlayıp 80 girişin herbirini, gelen seri bitlerin H-L durumuna bakarak karşılaştırım. Yani daha bitler porttan girerken hemen kıyaslayarak:
1) H ise Timeout bunun içinde aktif olsun.
2) L ise Timeout dursun reset.
3) H ise ve Timeout ulaşmışsa ilgili işlem.
Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

Veli B.

Arkadaşlar,
Pulsleri yakalama ve sürelerini kaydedip indexleme kısmını hallettim. [80] dizi içerisinde kayıtlı.
İlgili pine ait hücre 0x0000 veya event anında ki SysTick değeri(0xXXXX) ile yüklü. 3 adette 32 bitlik değişken içerisinde ise 80 lik dizimizin her bir hücresi için değer sıfırdan büyükse 1 aksi durumda 0 olacak şekilde Flag olarak kullanıyorum. Bir döngü içerisinde Flag durumuna göre 0 ise  ilgili hücreyi es geçiyorum veya 1 ise karşılaştırma işlemine sokuyorum.
Sorun şu;
Dizi içinde ki değerleri, hızlı bir şekilde (atıyorum) 0x0FC2 ile karşılaştırmam ve buna göre işlem yapmam lazım.

Bunu en hızlı nasıl yaparım? Sorun şu an, algoritma konusu artık.

//Bülent Abi' ye özel not: ASM hariç:)

muhittin_kaplan

hocam 80 li bir döngü kursanız olmaz mı (Sorunuzu pek anlamadığımdan böyle bir yorum yapıyorum. )
(ayrıca == oparatörü yerine XNOR kullanınca nasıl bir durum oluşur ?)

SpeedyX

Bu alet 32 bit sayıları tek cycle da karşılaştırabiliyorsa ve bu sayılar genelde pek değişmiyorsa, diziyi 40 lı 32bit olarak cast edip 40 lı döngü içinde farklı bölgeyi 2 kat hızlı bulup değiştirebilirsin... yada soruyu anlamadım :)