Main fonkisoynundaki delay ve interrupt timer

Başlatan mustafay, 25 Mayıs 2010, 16:02:28

mustafay

Merhaba arkadaşlar,

Sorum şudur:

Main fonksiyonunun içinde kullanılan delay_ms(***) gibi gecikmeler timer interruptlarının zamanlamasını etkiler mi?

Teşekkürler...



mustafay


Erol YILMAZ

CCS de delay_ms() yazınca TIMER INT kapatılır...
Böyle bir INT varsa oluşmaz.


Başka INT ler için test etmek lazım.

modernherakles

Dediğiniz çok ciddi bir iddia ama ben kullandığım timer kesmesinde, gecikme ile böyle bir sıkıntı yaşamadım. Delay_ms(10) gibi kısa bir süre olduğundan olabilir ama uzun sürelerde sıkıntı olacağını sanmıyorum, denersem yazarım. Siz bu bilgiye hangi kaynaktan ulaşmıştınız?
If we hear, we forget; if we see, we remember; if we do, we understand – Confucius

Veli B.

5-6 sene kadar önce, yine bu forumda kesmeler konusunda bir tartışma yapmıştık ve o zaman CCS assembly çıktılarında, bu rutine gelindiğinde GIE veya T0IE kapatılıyordu( hangisi olduğunu hatırlamıyorum). Çıktıyı verende yanlış hatırlamıyorsam Erol' du. Erol, sen daha net hatırlıyor olmalısın...

50Cal

Alıntı yapılan: Allegro - 25 Mayıs 2010, 16:13:16
CCS de delay_ms() yazınca TIMER INT kapatılır...
Böyle bir INT varsa oluşmaz.


Başka INT ler için test etmek lazım.

Proteusum sakatlandığı için deneyemiyorum ama okuyunca çok şaşırdım..
Bu söylediğiniz ccs'in eski versiyonlarında yer alan bir hata olabilir mi?(öyle olmasını umuyorum) Aksi halde adamlar, kesmenin en temel özelliği olan "kesme"nin içine etmiş oluyorlar...

JKramer

Ben delay_ms() kullanmadan yapamıyorum, interrupt rutini içinde bile delay_ms() kullanırım, her şeyi kendim ayarlarım, interrupt rutinine tekrar tekrar girmez (girse de önemli değil) diyorsanız ikinci bir #use delay(clock=xxxxxxxx) kullanabilirsiniz:

http://www.ccsinfo.com/faq.php?55
http://www.ccsinfo.com/faq.php?page=delay_in_interrupt
http://www.ccsinfo.com/forum/viewtopic.php?t=39120
http://www.ccsinfo.com/forum/viewtopic.php?t=27345

radres

Bu ikinci #use delay(clock=xxxxxxxx) komutu kullanımının avantajını biraz açarmısınız? Ana programda kullanılan delay_ms() fonksiyonu için belirtilen süre içinde kesme geldiğinde program gecikme zamanı süresince kesmeye gitmiyor ama bu ikinci #use delay(clock=xxxxxxxx) komutunu kullanırsak gidiyormu?

radres

CCS C'nin yardım dosyasında delay_ms() ile ilgili kısımda şu bilgiler yer alıyor.

"If interrupts are enabled the time spent in an interrupt routine is not counted toward the time.

The delay time may be longer than requested if an interrupt is serviced during the delay. The time spent in the ISR does not count toward the delay time"

Buraya bakarsak delay_ms ile belirtilen süre içinde bir kesme gelirse diyor gecikme süresi istenenden daha fazla olur diyor. Yani gecikme süresi içinde kesme gelirse kesmeye gidiyor ve geri gecikme fonksiyonuna dönüyor diyebilirmiyiz?

radres

Alıntı yapılan: Allegro - 25 Mayıs 2010, 16:13:16
CCS de delay_ms() yazınca TIMER INT kapatılır...
Böyle bir INT varsa oluşmaz.


Başka INT ler için test etmek lazım.

Bu bilgiyi CCS C'nin help dosyasında timer ve interrupt kısımlarında bulamadım. Acaba bu bilgi nerede geçiyor?

JKramer

Kesmeler kapatılırsa derleyici "Interrupts disabled during call to prevent re-entrancy:" uyarısı verir. Az önce üç tane deneme yaptım:

1- Kesme içinde delay_ms() kullandım ve yukarıdaki uyarıyı verdi. .lst uzantılı dosyaya baktığımda kesmeleri delay_ms() içinde kapattığını gördüm.

2- Yukarıdaki denemeye ikinci #use delay ekledim. Uyarı vermedi, .lst uzanılı dosyaya baktığımda delay_ms() içinde kesmelerle ilgili bir şey yapılmadığını gördüm.

3- Sadece ana programda delay_ms() kullandım (kesme içerisinde yok). Uyarı vermedi, .lst uzantılı dosyaya baktığımda delay_ms() içinde kesmelerle ilgili bir şey yapılmadığını gördüm. delay_ms(5000) ve 500 ms'lik bir kesme oluşturup kesme içinde bir pini her gelişte açıp kapatan kodu Proteus'da osisloskopla inceledim, 500 ms'de bir pin açılıp kapandı. (v4.104)

Kendiniz de basit bir program yazın, list dosyasını kontrol edin.

Son mesajınızdan sonra ek:

Alıntı yapılan: radres - 25 Haziran 2010, 10:24:14
CCS C'nin yardım dosyasında delay_ms() ile ilgili kısımda şu bilgiler yer alıyor.

"If interrupts are enabled the time spent in an interrupt routine is not counted toward the time.

The delay time may be longer than requested if an interrupt is serviced during the delay. The time spent in the ISR does not count toward the delay time"

Buraya bakarsak delay_ms ile belirtilen süre içinde bir kesme gelirse diyor gecikme süresi istenenden daha fazla olur diyor. Yani gecikme süresi içinde kesme gelirse kesmeye gidiyor ve geri gecikme fonksiyonuna dönüyor diyebilirmiyiz?


Evet, kesme rutininde geçirilen zaman delay_ms() de belirttiğiniz zamana eklenir diyor. Hassas zamanlama istiyorsanız delay_ms us kullanmazsınız zaten.

radres

Bilgiler için teşekkürler. Sonuçta aşağıda verdiğim kanı doğru o zaman değil mi?

"CCS C'de ana programda kullanılan delay() fonksiyonları süresince kesmeler iptal edilmiyor. Delay  fonksiyonu içindeyken kesme gelirse kesme çalışıyor."

Bilgilerinizde kesme fonksiyonu içinde delay() fonksiyonu kullandığımda .lst dosyasında delay fonksiyonu içinde tüm kesmeler kapatılıyor dediniz. Zaten kesme fonksiyonuna girildiğinde derleyici otomatik olarak tüm kesmeleri kapatmıyor mu? Yani kesme fonksiyonu içindeki delay fonksiyonunda bir daha kesmelerin kapatılmasının veya kapatılmamasının ne anlamı var?

JKramer

Evet.

Kesme fonksiyonu içindekiyle birlikte ana programdaki delay fonksiyonlarında da kesmeler kapatılıyor.

radres

Alıntı yapılan: JKramer - 25 Haziran 2010, 10:48:47
Evet.

Kesme fonksiyonu içindekiyle birlikte ana programdaki delay fonksiyonlarında da kesmeler kapatılıyor.

Yukarıda ki cümlenizi tam anlamadım. Kesme fonksiyonu ve ana programdaki delay fonksiyonlarında kesmeler kapatılıyor demişsiniz. O zaman bu dediğiniz yukarıda yazdığım

"CCS C'de ana programda kullanılan delay() fonksiyonları süresince kesmeler iptal edilmiyor. Delay  fonksiyonu içindeyken kesme gelirse kesme çalışıyor."

cümlesine verdiğiniz "Evet" cevabı ile çelişkili olmuyor mu?

JKramer

Alıntı yapılan: radres - 25 Haziran 2010, 10:53:20

"CCS C'de ana programda kullanılan delay() fonksiyonları süresince kesmeler iptal edilmiyor. Delay  fonksiyonu içindeyken kesme gelirse kesme çalışıyor."

cümlesine verdiğiniz "Evet" cevabı ile çelişkili olmuyor mu?
Alıntı yapmaya üşendiğim için karışıklık olmuş. Evet cevabı, eğer kesme içinde delay fonksiyonu "kullanılmamış" sadece ana programda "kullanılmışsa" içindi. Sizin bunu kastettiğinizi düşündüm.

Alıntı YapBilgilerinizde kesme fonksiyonu içinde delay() fonksiyonu kullandığımda .lst dosyasında delay fonksiyonu içinde tüm kesmeler kapatılıyor dediniz. Zaten kesme fonksiyonuna girildiğinde derleyici otomatik olarak tüm kesmeleri kapatmıyor mu? Yani kesme fonksiyonu içindeki delay fonksiyonunda bir daha kesmelerin kapatılmasının veya kapatılmamasının ne anlamı var?

Bu durumda hem kesme içinde hem ana programda delay fonksiyonu kullanılmış. Yani, kesme fonksiyonu içindekiyle birlikte ana programdaki delay fonksiyonlarında da kesmeler kapatılıyor.