Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

CCS C delay_ms ve Interrupt

Başlatan esensoy, 02 Aralık 2012, 01:20:07

esensoy

selamlar,
CCS C delay_ms() komutunu işletirken interruptları kapatıyor,
void bekle_ms(int16 sure){
int16 i=0;
while(0!=sure--){
   i=415;
   while(0!=i--){
   #asm
      NOP
   #endasm
   }
}
}

bu kod 18F452 ve 20Mhz OSC=HS için yaklaşık doğru bekleme oluşturuyor, interruptlar da kapanmıyor
En tehlikeli an "zafer" anıdır.

bayelektronik

uygulamada çok dikkatimi çekmiş değil ama bildiğim delay_ms  çalışırken interruptlar çalışıyor

halilgalic

"@esensoy" hocama katılıyorum delay komutu işlenirken interruptlar gec kalıyor yada oluşmuyor.Ben söyle yapıyorum delay cok küçük veriyorum ama for ile tekrarlıyorum

for (i=0;i<100;i++){
delay_ms(1);}

xoom

Benim bildiğim kadarıyla kesme rutinin de geçirilen zaman delay_ms()' belirttiğiniz zamana eklenir.. bu yanlış hatırlamıyorsam CCS yardım dosyasın da da yazıyor.. Yani Sakıncası yok..

esensoy

Alıntı yapılan: halilgalic - 02 Aralık 2012, 09:18:14
"@esensoy" hocama katılıyorum delay komutu işlenirken interruptlar gec kalıyor yada oluşmuyor.Ben söyle yapıyorum delay cok küçük veriyorum ama for ile tekrarlıyorum

for (i=0;i<100;i++){
delay_ms(1);}
hocam ben de oyle yapıyordum ama o 1ms lik süreye de denk gelebiliyor,
bir de verdiğim kodu 1 100 ve 500 ms için scopla da ölçtüm, bayağı yakın çıkıyor verilen süreye,
En tehlikeli an "zafer" anıdır.

xoom

#5
CCS C 'de
1-Main Fonksiyonu içinde kullanılan delay_ms(XX) komut icra edilirken program kesmeye girer..ve bir Kayıp yaşanmaz.
2-Kesme fonksiyonu içinde delay_ms(XX) komutu  kullanılırsa anaprogramda  kesme gelse dahil kesmeler çalışmaz..


esensoy

#6

üstte ki resim altta ki kodun isis te dissassembly edilmiş halidir,
main ana programı içindedir, alt programda ya da kesme rutini içinde değildir,
başına sonuna NOP koydum ki kodun diğer kısmı ile karışmasın,
#asm
NOP
#endasm
delay_ms(1);
#asm
NOP
#endasm



gördüğünüz üzere CCS delay_ms() e dallanmadan BCF INTCON1,GIE ile interruptları kapatıyor ve 0x02C8 delay satırına dallanıyor,
çıkarken de BSF INTCON1,GIE ile tekrar açıyor,
bu sırada kesme oluşmuşsa kesmeye dallanmıyor,
En tehlikeli an "zafer" anıdır.

xoom

Ben neyi izah etmeye çalıştığınızı veya ne yapmaya çalıştığınızı anlamadım biraz açıklama yapabilir misiniz rica etsem?

esensoy

diyelim ki iki interrupt ı açtınız,
kesme koşulu oluşunca program problemsiz şekilde interrupt rutinine dallanıyor ve istediğiniz kodu çalıştırıp istediğiniz gibi tepki veriyor,
sonra program içerisinde bir yere delay_ms(1000) yazdınız,
delay_ms(1000) işletilirken ki 1000ms=1sn içerisinde kesme oluşursa CCS kesmeleri kapattığından dolayı programınız istediği gibi çalışmıyor,

En tehlikeli an "zafer" anıdır.

xoom

Ok Şimdi daha iyi anladım.. Peki,Bu kadar hassas devrelerde bazı çözümler yapılabiliniyor.. mesela
#use delay(clock=xxxxxxxx) fonksiyonu nu Main() fonksiyonunun üzerine birkez daha(2.Kez) ekleyip denermisiniz?

esensoy

meraktan yazım, ama ikinci kez yazınca hata veriyor, derlenmiyor,
En tehlikeli an "zafer" anıdır.

xoom

Hata Mesajı nedir? Şimdi denedim sorunsuz derliyor..

JOKERAS

Selam,
Yazılımda işlenen hiçbir rutin siz kapatmadığınız sürece  interrupt'ı kapatmaz,zaten bu olursa kesmenin anlamı kalmaz!
Aksine şöyle bir durum olur,siz herhangi bir fonksiyonu işlediğinizde kesme oluştuğu
anda (Program Count(PC)) o an çalıştığı adres bölgesi stack register'ine kayıt edilir,
sonra kesme vectör'üne zıplar,kesme rutinini işler kesme rutuninden çıkarken stack'deki
adrese bakar stack register'ine daha önce yüklenen adres PC'u kesme geldiğinde işi bıraktığı
adres noktasına yollar akış devam eder.
Mesela programda delay fonksiyonunu işliyorsunuz tam o sırada dışardan bir interrupt geldi
eğer delay fonksiyonu interrupt'ı kapatıyorsa o sırada gelen interrupt'ı kaçırmış oluyorum,
bunun bir anlamı olmazki.CCS hiç kullanmadım ama böyle bir şeyin olacağını sanmıyorum,çok mantıksız bir şey.Sizin delay fonksiyonu dediğiniz şey bir for veya while döngüsünden başka bir şey değil,
delay fonksiyonunu kesme içinden çağırmakla ana programdan çağırmanın bir farkı yok.
Ayrıca kesme fonksiyonunda delay çağırmanında bir mantığı yok!
Kesme rutinine birkere girdiğiniz zaman eğer orada bekliyorsanız ikinci bir kesme gelirse nereye
gidecekki zaten kesmenin içinde.
Bence yazılımınızı kemseleri aktif deaktif ettiğiniz komut satırlarının yerlerini ve öncelikli kesme kullanıyorsanız (High priority,Low priority) bunları yazılımda ayarlamanız gerek bir kontrol edin.

esensoy

siz CCS C kullanmadan bu kadar fikir sahibi nasıl oldunuz?
En tehlikeli an "zafer" anıdır.

JKramer