Z

GPS serri iletişim kesmesini alamıyorum

Başlatan zengar, 20 Mart 2014, 15:28:43

zengar

Selam Arkadaşlar,
bir servo kesmesi kullanıyorum 30 microsaniye, bir de 5 hz lik serri iletişim kesmesi(gps).
Gelen serri iletişim kesmesini yakalayamıyorum.Ama servo kesmesinin süresini artırdığımda 50 microsaniye gibi yakalamaya başlıyor ama ama tam 5 hz olmuyor. servo kesme süresini artırdığım zaman anca 5hz yi yakalayabiliyorum. Bu durum normalmi acaba yardımlarınız için şimdiden teşekkürler.   
Takip ettiğim yol ise şöyle;
INT RDA yani serri iletişim  kesmesine öncelik verdim ve INT RDA kesmesi girşinde servo kesmesini enable, çıkıştada disable yaptım.Aynı şekilde Servo kesmesi girişinde INT RDA kesmesini enable yaptım.

zengar

servo ları sürmek için ayrı bir işlemci kullanacam başka çare yok gibi,

zengar

Google da biraz araştırınca cevabı buldum!
8 bitlik bir microdenetleyici ile hem 5 hz lik gps kesmesi hemde servo kesmelerinin beraber kullanımı üzerine bir çalışma yapmış.
link burda;
http://www.arl.army.mil/arlreports/2009/ARL-TR-4747.pdf
kısaca anlatayım;
çoğu 8 bitlik işlemci 2 baytlık hardware buffer kullanıyor. 9600 bps iletişim kuran bir işlemci start biti+veri baytı+stop bitini=10 bit ----->104.16 us*10=1.04ms'de 2 baytı ise 2.08 ms herhangi bir veri kaybı olmadan bufferda tutacaktır. bu süre içinde kesme oluşup veri okunmazsa bufferdan silinecektir. benim gibi 500 defa servo kesmesine gidiyorsa yakalayamayacaktır diyor.Ve servo kesme algoritmasında değişikliğe gidiyor.Algoritma şöyle;
servo kesmesini 3 bölüme ayırmış,eğer duty süresi 0.5ms-2500ms dersek
40MHz kristal, ps değeri 4 alınacak
1-500us high süresi(her 20 ms bu sabit kısım)
basamak değişkeni=0 ise
servo pinleri high yapılır
timer1---->64295 e set edilir.

2- burası asıl servo başlığını yönünü belirleyen kısım 2500-500=2000 us eder. 20 us lik kesmelerle  2000/20=100 ederki 180derece/100=1.8 derece gibi hassas bir değer elde ediyoruz.
timer1----->65500 e set edilir.
basamak değişkeni bir artırılır.
bu bölmede yani 2ms lik süre içinde gps kesmesi gelirse yakalayamayacaktır.

3-eğer basamak 101 den büyükse sıra 20 ms lik süreyi ayarlamada
timer1--->15535
basamak=0 olur ve başa döner.

ver hasıl ortada 20ms lik lezzetli bir süre kalıyor elimizde denedim çalışıyor çok şükür. gps kesmelerini kaçırmadan alabiliyorum. Ama hala kafa takılan bir şey var. Eski çalışmamda 500 defa servo kesmesine gidiyor olsamda servo kesmesi girişinde gps kesmesini enable yapıyordum. GPS kesmesi girinde servo kesmesini disable, çıkışta enable. gps kemesine öncelik vermiştim yinede yakalayamıyordum. Herneyse bu hamur çok su götürür. Duanıza çok muhtaç kardeşiniz zengdai.
   selametle

kullandığı kodlar,

#int_timer1 
void kesme ()
{
if (basamak == 0)
{
output_high (pin_d7);//servo pini
output_high (pin_b3);//servo pini

set_timer1 (64295);//500us ayarlayan kısım
basamak++;
}
else if (basamak > 101)
{
//timer1 her 20 ms de bir kesme yapar bu durumda
set_timer1 (15535);
basamak = 0;
}
else
{
set_timer1 (65500);
if (basamak >= duty1) output_low (pin_b3);
if (basamak >= duty2) output_low (pin_d7);
basamak++;
}
}

Powered by EzPortal