stm32f4 ün GPIO portunu en hızlı algılama şekli nasıl olmalı?

Başlatan XX_CİHAN_XX, 27 Aralık 2012, 14:46:16

XX_CİHAN_XX

Örneğin C portunun 8. bitini aşağıdaki şekilde sorguluyorum.

do{
while(GPIOC->IDR & 0x00000100);   //sıfırı bekle
while(!(GPIOC->IDR & 0x00000100));   //biri bekle
//Clock alındı!
//işlem satırları....
}while(xxxxx);

Sorun şu ki; bu pine çok yüksek hızda clock geliyor. Ben her clock darbesinde bir baytlık data üzerinde işlem yaptığım için clock detect işlemini vakit kaybetmeden mümkün olan en hızlı şekilde kontrol etmek istiyorum.

Yukarıdaki yöntem benim için en basit çözüm oldu ancak daha hızlı çözümler var mı onu merak ettim.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

Klein

Pini interrupt üretecek şekilde ayarlarsan beklemen gerekmez.

XX_CİHAN_XX

hocam o daha büyük bekleme yaratmaz mı her clokck gelişinde interrupt vektörüne gidecek interrupta girmek ve çıkmak
basitçe pini sormaktan daha büyük gecikme yaratır diye düşünüyorum.

Ek olarak yanlış anlaşılmamak için açıkma yapayım programın beklemesi sorun değil işlem gecikmesi sorun. Yani iki clock arasında diğer işlemler için maksimum süreyi elde etmek için uğraşıyorum. Bunun için sordum daha hızlı bir pin sorgulama yöntemi var mı diye.

Örneğin 8 bitlik dandik piclerde hatırlarsınız BTFSS ve BTFSC komutları vardı. Bu tarz birşey var mı diye soruyorum aslında.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

CLR

Alıntı yapılan: XX_CİHAN_XX - 27 Aralık 2012, 15:11:19
hocam o daha büyük bekleme yaratmaz mı her clokck gelişinde interrupt vektörüne gidecek interrupta girmek ve çıkmak
basitçe pini sormaktan daha büyük gecikme yaratır diye düşünüyorum.

Ek olarak yanlış anlaşılmamak için açıkma yapayım programın beklemesi sorun değil işlem gecikmesi sorun. Yani iki clock arasında diğer işlemler için maksimum süreyi elde etmek için uğraşıyorum. Bunun için sordum daha hızlı bir pin sorgulama yöntemi var mı diye.

Örneğin 8 bitlik dandik piclerde hatırlarsınız BTFSS ve BTFSC komutları vardı. Bu tarz birşey var mı diye soruyorum aslında.

Bitbanding ile read işlemi yaparsan daha hızlı olur.

Bu yazdığın program kitlenmeye açık bir program, clock hiç gelmezse ne olacak?   
Knowledge and Experience are Power

XX_CİHAN_XX

Hocam donanımsal sistem gereği clock gelmemesi normal şartlarda mümkün değil.
Ancak her ihtimale karşı  wdt kullanmam ama systick timer ile kitlenme durum kontrolü yaptırabilirim.

Bitbanding olayını bir araştırayım hocam teşekkür ederim. Bu konuda da ufak bir bilgi verebilirseniz ayrıca sevirinirim.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.


CLR

// BitBanding Tanımlamaları
#define BITBANDING(adr, bitno) 		((adr & 0xF0000000)+0x2000000+((adr &0xFFFFF)<<5)+(bitno<<2)) 
#define MEM_ADRS(adr)  			*((volatile unsigned long  *)(adr)) 
#define BITADR(adr, bitno)   		MEM_ADRS(BITBANDING(adr, bitno))


#define GPIOA_BBOUT(n)   BITADR(GPIOA_ODR_ADR,n)   		// Bitbanding output
#define GPIOA_BBIN(n)    BITADR(GPIOA_IDR_ADR,n)  		// Bitbanding input

GPIOA_ODR_ADR ve GPIOA_IDR_ADR bu registerlerin adresleridir diğer portlarınkinide aynı şekilde oluşturabilirsin veya farklı bişeyler yapabilirsin



Knowledge and Experience are Power

XX_CİHAN_XX

Bu bilgiler oldukça açıklayıcı oldu çok teşekkürler üstadlarım.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

XX_CİHAN_XX

Örneğin GPIOC nin ilk baytına bit banding te olduğu gibi çok hızlı okuma yapmak istiyorum.

Yukarıdaki bit banding makrosunu şöyle bir tanımlamada kullanmak istedim
#define GPIOC_GETBYTE()	GPIOC_BBIN(7)<<7 | GPIOC_BBIN(6)<<6 | GPIOC_BBIN(5)<<5 | GPIOC_BBIN(4)<<4 | GPIOC_BBIN(3)<<3 | GPIOC_BBIN(2)<<2 | GPIOC_BBIN(1)<<1 | GPIOC_BBIN(0)


Ancak hızlı olmadı dogrudan IDR yi okuyarak daha hızlı alabiliyorum ilk bayt.
Bitbanding te olduğu gibi dogrudan o baytın adresini gösterip nasıl erişeceğimi çözemedim.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

Klein

IDR zaten portun giriş doğrudan tamponunun adresi.  Ondan daha kestirme bir şey yok.

X-Fi

Bir timer'ı counter moda alıp clock kaynağını sayacağınız pinden alın en hızlı bu şekilde sayabilirsiniz bunu kodla yapmaya çalışırsanız flash erişim ve SYSSCLK frekansı yüzünden daha yavaş sayarsınız.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

XX_CİHAN_XX

Hocam clock ile birlikte 8 bit datastream alıyorum.
her bir baytı okumak için clock bekliyorum. Clock pinini okumayı bit banding kullanarak yapıyorum ancak 1 baytlık datayı IDR den alıyorum bunuda dogrudan adresleme metodu ile alabilsem daha hızlı olabilir düşüncesi vardı. Timer metodu clock a bağımlı olduğum için uygun değil.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

haydarpasamikro

CCP birimini Capture modunda kullanarak gelen her palste hem kesme(düşen yükselen veya her ikisi) hem de ilgili bir timer ın sayma değerini capture yaparak donanımsal olarak hız frekans süre vs.. çıkartılabilir.
Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi