servo için timer0 kesmesi kullanınca gps versini alamıyorum!

Başlatan zengdai, 24 Mart 2014, 13:24:38

zengdai

servo için timer0 kesmesi kullanınca gps versini alamıyorum!
Ne yapmam gerekir? Daha önce bu durumla karşılaşanlar
tecrübelerini paylaşırsa sevinirim.
Selametle.

zengdai

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++;
}
}