kesme sırasında delayms veremiyorum

Başlatan uardal, 07 Ocak 2011, 11:29:19

Ruzgarbey

Alıntı yapılan: senerenemre - 10 Ocak 2011, 15:29:21
2Tagli,
Zaten kesme de bu komutu yurutuyorsa sıkıntı cıkartmaz ıstedıgımızı yapabılırız bır kısıtlama yok.
Acele etmemizin sebebi nedir?
sevgili üstadım.anlatmaya çalıştığımız kesmelerde acele etmemiz gerektiği değildir.şöyle açıklayayım eğerki sadece 1 adet kesme kullanıyorsanız örneğin RB0/INT,başka kesme kullanmayacaksanız USART,TIMER vs. kesmede istediğiniz kadar kalabilirsiniz,isterseniz bütün programı kesme etiketine yazabilirsiniz bu size kalmış bir şeydir.
birde şöyle düşünün ;
bir saat programı yazdınız timer ile.belli zamanlarda belli işler yapacaksınız.dolayısı ile timer kesmesini saymanız gerekiyor ve kesme etiketine gidiyorsunuz.kesme etiketine gittikten sonra bütün kontrolleri orada yaparsanız kesme içinde olduğunuz zaman içinde bir daha timer kesmesi oluşmayacağı için programda sarkmalar başlayacak ve işlemler zamanında yapılamayacaktır.anlatmak istediğimiz budur.yoksa kimsenin kesme kodlarını nasıl kullanacağı yönünde bir direktifimiz olamaz.
istediğiniz şekilde kullanmak programcıya kalmıştır.saygılarımla..
Hayatta En Hakiki Mürşid İlimdir. M.K. ATATÜRK

Tagli

Acele edilmesinin sebebi gelebilecek başka kesmeler. Örneğin kabaca 100 us'de bir oluşan bir durumu saymamız ve ona göre işlem yapmamız gerekiyor. Sen eğer kesme bölümünde atıyorum 200 us harcarsan, oluşan durumların sadece yarısını tespit etmiş olursun.

Ki bu sadece 1 kesme olması durumu. Faklı kaynaklardan çok sayıda kesme ile çalışmanı gerektirecek durumlar da olabilir.
Gökçe Tağlıoğlu

eseneren

ruzgarbey, tagli

Ben kesme kullanınca dıyelım kı saat yaptım ve kesmede cok kalıyor onuda hesaplar sanıyeye bır eklerım dıye dusunurdum.

Okuldaki gib matematik mat sınıfında kimya kimya sınıfında kalıyor ıkısını bırlestırme ıcın bılgılerın oturması lazım.
Hem timer hem kesme vs bu sekılde projelerle ugrasmadıgımdan buyuk ıslere gırısmedıgımden anlayamadım.

Soyledıklerınızı sımdı anladım tesekkur ederım ikinizede.

Saygılar.
Seçim yapmak için durum hakkında bilgi sahibi olmak zorunda değilsin, sonucuna hazır olmak için durum hakkında kaygılanırsın.  http://bit.ly/gixfTk

kahraman10

Alıntı yapılan: Ruzgarbey - 10 Ocak 2011, 15:58:47
sevgili üstadım.anlatmaya çalıştığımız kesmelerde acele etmemiz gerektiği değildir.şöyle açıklayayım eğerki sadece 1 adet kesme kullanıyorsanız örneğin RB0/INT,başka kesme kullanmayacaksanız USART,TIMER vs. kesmede istediğiniz kadar kalabilirsiniz,isterseniz bütün programı kesme etiketine yazabilirsiniz bu size kalmış bir şeydir.

Üstad aranılan cevap bu anlatmak istediğim şey de bu. Kesmeden bir an önce çıkmak lazım beklemeyi sevmez falan demeye gerek yok bunun için.

Neyse konuyu dağıtmayalım, hard kesme yaparken "kesme içine yada dışında" verilen bir delayms komutu sorun çıkartıyor.

Ne zaman sorun çıkarıyor ?
Diyelimki şebekeye bakıyoruz 10 ms aralıklarla kesme oluşacak süreyi biliyoruz, kesme dışında verilen herhangi bir delay, 10 ms den fazla ise
o delay komutu ve arkasındaki komutlar çalışmıyor. Kesme ise çalışmaya devam ediyor.
Şimdi örnek kod diyeceksiniz, gerek yok hard kesme yapın döngüye delayms 100 yazın altınada 2 buton işlevi koyun. Kesme rutininede yapın işte bişiler bakın butonlar çalışmayacak.
Delay yerine sayan geciktiren bir döngü kurarsanız sorun olmayacak.
ha, kesmenin içine delayms koyarsak nolur ? eğer 10 ms den önce bitirmezsek işi ardışık kesmeyi alamayız.



CLR

Zamanlama önemli ama burada daha başka yapılan bir hata daha var, aynı delay altprogramı, ana program ve interrupt içinde kullanılmamalıdır.
Interrupt için ayrı delay altprogramı yazılmalı. Aksi halde main içindeki delay işletilirken interrupt gelirse, interrupt içindeki aynı delay altprogramı çalışacağı için kitlenme veya daha başka sorunlarınız olabilir.
Knowledge and Experience are Power

eseneren

Program Counter pragmın neresınde kaldıgını tutacak, kesmeye gıdecek oradakı ıslerı yapacak sonra bıttıgınde program counterdakı deger yuklenıp devam edecek.
Neden delayda kesme gelırse sorun olsun ??
Seçim yapmak için durum hakkında bilgi sahibi olmak zorunda değilsin, sonucuna hazır olmak için durum hakkında kaygılanırsın.  http://bit.ly/gixfTk

CLR

Alıntı yapılan: senerenemre - 11 Ocak 2011, 17:19:52
Program Counter pragmın neresınde kaldıgını tutacak, kesmeye gıdecek oradakı ıslerı yapacak sonra bıttıgınde program counterdakı deger yuklenıp devam edecek.
Neden delayda kesme gelırse sorun olsun ??

Soruna soruyla cvp vereyim, Registerin içeriği değişmeyecek mi?
Knowledge and Experience are Power

eseneren

Seçim yapmak için durum hakkında bilgi sahibi olmak zorunda değilsin, sonucuna hazır olmak için durum hakkında kaygılanırsın.  http://bit.ly/gixfTk

kahraman10

Alıntı yapılan: eemkutay - 11 Ocak 2011, 16:44:39
Zamanlama önemli ama burada daha başka yapılan bir hata daha var, aynı delay altprogramı, ana program ve interrupt içinde kullanılmamalıdır.
Interrupt için ayrı delay altprogramı yazılmalı. Aksi halde main içindeki delay işletilirken interrupt gelirse, interrupt içindeki aynı delay altprogramı çalışacağı için kitlenme veya daha başka sorunlarınız olabilir.

Hocam Yazılımı proton ile yapıyoruz assamlber değil . dediğin işlem proton da yapılabiliyorsa ben bilmiyorum öğrenmek içinse sabırsızlanıyorum.

CLR

Alıntı yapılan: kahraman10 - 12 Ocak 2011, 17:02:02
Alıntı yapılan: eemkutay - 11 Ocak 2011, 16:44:39
Zamanlama önemli ama burada daha başka yapılan bir hata daha var, aynı delay altprogramı, ana program ve interrupt içinde kullanılmamalıdır.
Interrupt için ayrı delay altprogramı yazılmalı. Aksi halde main içindeki delay işletilirken interrupt gelirse, interrupt içindeki aynı delay altprogramı çalışacağı için kitlenme veya daha başka sorunlarınız olabilir.

Hocam Yazılımı proton ile yapıyoruz assamlber değil . dediğin işlem proton da yapılabiliyorsa ben bilmiyorum öğrenmek içinse sabırsızlanıyorum.

Bu olayda dil farkı yok, Derleyici normalde main içinde kullanılan fonksiyonu, interrupt içinde kullanmana izin vermemesi gerekir. Veriyorsa programı yazan kişi dikkat edecek.
 
Knowledge and Experience are Power

CLR

Alıntı yapılan: gerbay - 12 Ocak 2011, 21:05:20
derleyiciler buna izin verir. doğrusu da o zaten. dikkat etmesi gereken kişi kullanıcıdır.


C derleyicileri uyarır, kullanıcı düzeltir. Asm'de öyle birşey yok herşey programcıya bakar.  Proton, basicte ne olur bilmiyorum.
Knowledge and Experience are Power

CLR

Alıntı yapılan: gerbay - 12 Ocak 2011, 22:49:58
hangi derleyici uyarıyor? mesela GCC uyarmıyor, diab uyarmıyor, greenHills in derleyicisi uyarmıyor..

onu derleyici ayırdedemez. mesela RTOS larda event sinyalleme işini interrupt servis rutini içinden de yapabilirsiniz, başka bir task dan da.. aynı sinyalleme rutinini çağırıp sinyalleyebilirsiniz..   ya da RTOS larda ki Queue olayını ele alalım, başka bir task da producer olabilir, interrupt servis rutini de aynı Queue ya aynı push metodu ile push edebilirler..

bu gayet nizami bir olaydır.

Mesela Hitech uyarıyor. Push/pop yapılabilir tabii. Dikkat gerektirir. 
Knowledge and Experience are Power

CLR

Alıntı yapılan: gerbay - 13 Ocak 2011, 00:10:21
hi-tech sanırım pic ler yüzünden bir istisna olarak uyarı veriyor ama ben bunu yıllardır çeşitli platformalarda yapıyorum ve şimdiye kadar hiç uyarı almadım. yazdığınız gibi en basit anlamda registerlar saklanıp tekrar geri yüklenebilir.

mesela ARM için keil ın güncel derleyicisi ARMCC ya da GCC için gelen "__irq"  keyword ü var. interrupt servis rutinlerinde bunu belirtiyorsunuz. bu şekilde bildirim yaptığınız fonksiyonların başına register ları stack e atan kod üretiliyor, sonunda da stack den çeken kod üretiliyor. Tüm bu işler otomatik yapılıyor.  Tabi bunu zamanında 7 word stack derinliği olan MCU lar için derleme yapan bir compiler dan beklemek fazla bir beklenti olur..

Stm32 için keilde denedim, uyarmadı, haklısın ama fonksiyonlar içinde global değişkenler çok kullanılır, registerlerden bazıları global ise bahsettiğin stack yöntemide etkisiz kalır çünkü derleyici global değişkenleri back-up yapmayacaktır. Dolayısıyla data interrupt içinde bozulur. Kullanıcının dikkat etmesi gerekir bu durumda ama derleyici "bak kardeş aynı fonksiyonu hem main içinde hemde int. içinde kullanıyorsun dikkat et" gibi uyarı vermesi debug açısından önemli bence.



         
Knowledge and Experience are Power

kahraman10

biraz açarmısınız konuyu ?
rutinde delay verdim diyelim, intrrupt altında delay veremez miyim yani ?
veya tam tersi, hadi veremezsin dedin ikinci bir delay komutu varmı ? yok e nolacak ?
Alıntı yapılan: eemkutay - 12 Ocak 2011, 18:05:35
Alıntı yapılan: kahraman10 - 12 Ocak 2011, 17:02:02
Alıntı yapılan: eemkutay - 11 Ocak 2011, 16:44:39
Zamanlama önemli ama burada daha başka yapılan bir hata daha var, aynı delay altprogramı, ana program ve interrupt içinde kullanılmamalıdır.
Interrupt için ayrı delay altprogramı yazılmalı. Aksi halde main içindeki delay işletilirken interrupt gelirse, interrupt içindeki aynı delay altprogramı çalışacağı için kitlenme veya daha başka sorunlarınız olabilir.

Hocam Yazılımı proton ile yapıyoruz assamlber değil . dediğin işlem proton da yapılabiliyorsa ben bilmiyorum öğrenmek içinse sabırsızlanıyorum.

Bu olayda dil farkı yok, Derleyici normalde main içinde kullanılan fonksiyonu, interrupt içinde kullanmana izin vermemesi gerekir. Veriyorsa programı yazan kişi dikkat edecek.
 

eseneren

Arkadasım konuya cok hakım degılım ama asm olarak dusununce cok mantıklı delay fonk cagırdın ıc ıce bır kac dongu ile mısal normal programın calısırken delay ıcındesın bırden kesme geldı( gelmez olasıca ) sonra kesmen calısıyor ve sen ıcınde yıne aynı fonk cagırıyorsun degıskenlerın degerı degısıyor. Yenıden dondugunde ne olacak bır aksaklık olur.Bu aksaklık degıl benım ıcın ben o delayı buton ark ıcın kullanıyordum o sırada ıntterrupt geldı gecıkmemde sıkıntı yok dıyorsan bence kullanılır, ama sen noktayı anladın....
Seçim yapmak için durum hakkında bilgi sahibi olmak zorunda değilsin, sonucuna hazır olmak için durum hakkında kaygılanırsın.  http://bit.ly/gixfTk