Picproje Elektronik Sitesi

SERBEST BÖLGE => Programlama ve Algoritma => Konuyu başlatan: Veli B. - 17 Mart 2013, 21:35:57

Başlık: 80 değişkeni, 1 değişken ile en hızlı karşılaştırma?
Gönderen: Veli B. - 17 Mart 2013, 21:35:57
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?
Başlık: Ynt: 80 değişkeni, 1 değişken ile en hızlı karşılaştırma?
Gönderen: ErsinErce - 18 Mart 2013, 16:46:55
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
Başlık: Ynt: 80 değişkeni, 1 değişken ile en hızlı karşılaştırma?
Gönderen: Veli B. - 18 Mart 2013, 18:21:29
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?

(http://g1303.hizliresim.com/17/l/l6fxm.jpg) (http://bit.ly/c25MCx)

Başlık: Ynt: 80 değişkeni, 1 değişken ile en hızlı karşılaştırma?
Gönderen: ErsinErce - 19 Mart 2013, 00:22:18
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)
Başlık: Ynt: 80 değişkeni, 1 değişken ile en hızlı karşılaştırma?
Gönderen: 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
Başlık: Ynt: 80 değişkeni, 1 değişken ile en hızlı karşılaştırma?
Gönderen: ErsinErce - 19 Mart 2013, 00:45:42
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
Başlık: Ynt: 80 değişkeni, 1 değişken ile en hızlı karşılaştırma?
Gönderen: Veli B. - 19 Mart 2013, 00:59:02
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.
Başlık: Ynt: 80 değişkeni, 1 değişken ile en hızlı karşılaştırma?
Gönderen: z - 19 Mart 2013, 01:14:42
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.
Başlık: Ynt: 80 değişkeni, 1 değişken ile en hızlı karşılaştırma?
Gönderen: Veli B. - 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?
Başlık: Ynt: 80 değişkeni, 1 değişken ile en hızlı karşılaştırma?
Gönderen: speak48 - 19 Mart 2013, 01:27:48
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

Başlık: Ynt: 80 değişkeni, 1 değişken ile en hızlı karşılaştırma?
Gönderen: z - 19 Mart 2013, 01:53:41
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.
Başlık: Ynt: 80 değişkeni, 1 değişken ile en hızlı karşılaştırma?
Gönderen: haydarpasamikro - 19 Mart 2013, 09:47:50
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.
Başlık: Ynt: 80 değişkeni, 1 değişken ile en hızlı karşılaştırma?
Gönderen: Veli B. - 19 Mart 2013, 12:42:56
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ç:)
Başlık: Ynt: 80 değişkeni, 1 değişken ile en hızlı karşılaştırma?
Gönderen: muhittin_kaplan - 19 Mart 2013, 12:53:53
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 ?)
Başlık: Ynt: 80 değişkeni, 1 değişken ile en hızlı karşılaştırma?
Gönderen: SpeedyX - 19 Mart 2013, 13:23:52
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 :)
Başlık: Ynt: 80 değişkeni, 1 değişken ile en hızlı karşılaştırma?
Gönderen: Klein - 19 Mart 2013, 17:17:11
Ne için Hız?

Karşılaştırma sonucunu en kısa sürede mi almak istiyoruz?
Bu işlemleri yaparken harcadığımız zamanı kısaltmak mı istiyoruz?
İkisi birden mi?
Başlık: Ynt: 80 değişkeni, 1 değişken ile en hızlı karşılaştırma?
Gönderen: Veli B. - 19 Mart 2013, 19:28:09
Karsilastirma sonucunu bulma kismini hizlandirmanin bir yolu olabilir mi?
Su an kullandigim yontemi yukarida acikladim. Index kontrollu bir dongu ile 80 deger icerisinden 0 dan buyuk olanlari SysTick ile karsilastiriyorum.
Başlık: Ynt: 80 değişkeni, 1 değişken ile en hızlı karşılaştırma?
Gönderen: Klein - 19 Mart 2013, 19:58:50
Karşılaştırma sonucunu karşılaştırma anında incelemeyeceksin sanırım. Sonuçlar bir yere kaydedilecek , karşılaştırma işlemleri bittikten sonra oradan alıp işleyeceksin. Yanlış anlaşılma yok değil mi?

Neden karşılaştırma işlemini SysTick verisini aldığımız anda yapamıyoruz?
Başlık: Ynt: 80 değişkeni, 1 değişken ile en hızlı karşılaştırma?
Gönderen: Veli B. - 20 Mart 2013, 00:17:24
İstenilen özellik saçma olunca, anlatması da problem oluyor.
Bir müşterimizin özel imalat 40 tane penceresinin 80 kanadı var ve bu kanatların motor kontrolleri var. Müşterimiz uçuk ve elektronikten anlıyor.
Kanatların kapanma şekline ve hızına göre ilave bildirimler/kontroller istiyor.

Olayı daha bizim dünyamıza uyarlamaya çalışayım.
80 tane buton düşünelim. Butonların her birisi farklı zamanlarda ve farklı sürelerde basılabiliyor.

Amacım;
Butonların basılı kalma sürelerini monitorize etmek ve belirleyeceğim set değerlerine göre bir işlem yapmak(motor hız ve/veya on/off kontrolü)
Mesela 1. buton herhangi bir anda basılmış ve o basılı iken bir süre sonra(atıyorum 200ms) 3. buton da basılmış, 100ms sonra 56. buton basılmış bir süre sonra ise 1. buton bırakılmış.... böyle bir senaryo...

Yapmak istediğim ise ;
1. buton basıldığı anda Bir timerdan değeri 1. dizi değişkene kopyalıyorum ve 1. flagı kuruyorum ki karşılaştırma aşamasında bu bite bakarak karşılaştırma yapıp yapmayacağıma karar veriyorum.

Olay aslında RTOS gibi ama bende yapısal çalışıyor.
MCU
hem SPI okuyacak,
Hem diziye, butonu  1 olan varsa Tımer mirror(butona ilişkili dizi hücresine örn: 5. buton için [4] e) yapacak,
Hemde aynı süreçte 80 değişkenden flagı 1 olanların içeriklerini set ettiğim değerle(örn if (Timer > ([5]+100))) karşılaştıracak.

Üzerinde durduğum kısım kalın fontlu olan son kısım.





mesaj birleştirme:: 20 Mart 2013, 00:20:01

Alıntı yapılan: Klein - 19 Mart 2013, 19:58:50
Neden karşılaştırma işlemini SysTick verisini aldığımız anda yapamıyoruz?

Şu an zaten böyle yapıyorum. Her SysTick Int oluştuğunda döngüye girip, Flagı 1 olanları if (Timer > ([5]+100)) gibi bir değerle karşılaştırıyorum.
Başlık: Ynt: 80 değişkeni, 1 değişken ile en hızlı karşılaştırma?
Gönderen: ErsinErce - 20 Mart 2013, 01:03:52
flag neden kuruyorsunuz birde ekstra ona vakit harcıyorsunuz. register la işiniz bitince sıfırlayın, register sıfırdan farklıysa işleme tabi tutun
systick değeri flag kurma işiyle uğraşırken değişmesin

birde 80 input + motor çıkışları vs birden çok mcu kullanırsanız daha iyi olur.
birbirleriyle haberleştirip aynı anda aynı değeri saydırtabilirsiniz. gerekirse merkezi bir noktadan hareketleri bildirirsiniz