avatar_Adem AYDIN

RB0/INT Kesmesi {Çözüldü}

Başlatan Adem AYDIN, 03 Haziran 2017, 19:55:23

Adem AYDIN

#include <16f877.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000)
#use fast_io(b)

#int_ext
void Rb0_Kesmesi()
{
output_toggle(pin_b1);
delay_ms(500);
}

void main()
{
set_tris_b(0x01);
output_b(0x00);
ext_int_edge(H_TO_L);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
while(81);
{
output_toggle(pin_b2);
delay_ms(250);
}
}


1. Sorum: Programda tuşa basıldığında yani kesme oluştuğunda programa rb0_kesmesi kısmına gitmesi gerektiğini nasıl anlıyor?

2. Sorum: Kesmeden nasıl çıkıyor, pic basicdeki gibi bunu belirtmek gerekiyor mu?

3. Sorum:
#int_ext
komutu ne işe yarıyor işlevi nedir?
Teşekkürler.
ALLAH 'ın Dini Galip Gelmesi İçin (Malınızla ve Canınızla) Çalışın.

mg1980

#1
interrupt external (harici kesme) kısaltması sanırım ama yazdığınız gibi bir yazım şekli görmedim. Bu haliyle derlenmemesi lazım. Orada bir eksiklik var gibi.

Adem AYDIN

Derledim çalışıyor ama sorularım var bunlara cevap arıyorum.
ALLAH 'ın Dini Galip Gelmesi İçin (Malınızla ve Canınızla) Çalışın.

fatih88

#int_ext deyimi ccs c de interrupts service routine (ısr) hengi kesmenin kullanılacağını belirtmek için kullanılır bu bölüm yazılmazsa derleme olmaya bilir  bu satır olmadıkçada  denetleyici kesmeye girmeyecektir.
ccs c interrupt bayraklarını otomatik olarak temizler ekstra bir komut yazmaya gerek yok eğer bayrağın silinmesini istemiyorsanız siz kendiniz silmek istiyorsanız şu komutu yazarak otomatik bayrak temizlemeyi iptal edebilirsiniz
#int_ext noclear 
bilgi paylaştıkça çoğalır!!

www.fayelektronik.com

Adem AYDIN

Teşekkür Ederim, şu soruma yanıt verirmisiniz? Örneğin, 2 fonksiyon varken program kesmeye girdiğinde hangi fonksiyona gideceğini nasıl belirtiyoruz, yada nereye gideceğini nasıl biliyor?

void Rb0_Kesmesi()
{
output_toggle(pin_b1);
delay_ms(500);
}


void Led_Yak()
{
output_toggle(pin_b1);
delay_ms(500);
}

Burada olduğu gibi hangisine gitmesi gerektiğini nasıl biliyor, belirtmek gerekiyormu?
ALLAH 'ın Dini Galip Gelmesi İçin (Malınızla ve Canınızla) Çalışın.

mg1980

Kesme fonksiyonunun hemen #int_ext tanımlamasından sonra yazılıyor olmasından sanıyorum.

fatih88

anladığım kadarıyla program çalışırken kesme oluştuğunda ve kesme bittiğinde kaldığı yerden nasıl devam ettiğini soruyorsanız kesme oluştugu an program akışındaki adres özel bir kaydediciye kaydedilir ve kesme sonlandıktan sonra program akışı kaldığı yerden devam eder yada ben soruyu anlayamamış olabilirim
bilgi paylaştıkça çoğalır!!

www.fayelektronik.com

Adem AYDIN

Yani ben anlatamışta olabilirim, kesme oluştuğunda hangi fonksiyona gideceğini nasıl biliyor? Şöyle söyleyeyim while içerisindeyken kesme oluştu diyelim, program hangi fonksiyona gidiyor?

Buna
void Rb0_Kesmesi()
{
output_toggle(pin_b1);
delay_ms(500);
}

yada buna gitmesi gerektiğini nasıl biliyor, yada belirtiyoruz?

void Led_Yak()
{
output_toggle(pin_b1);
delay_ms(500);
}
ALLAH 'ın Dini Galip Gelmesi İçin (Malınızla ve Canınızla) Çalışın.

mg1980

#8
void Rb0_Kesmesi() fonksiyonunu #int_ext tanımlamasından hemen sonra yazacağınız için doğrudan ona gidiyor sanırım.Çünkü başka bir yerde buna ait bir komut yok.

fatih88

ccs c de hangisini öne yazdıysanız o nun öncelik sırası olacak diye bir durum yok ccs c öncelik sıralaması belirlemiş mesela dış kesmemi önemlidir seri kesmemi tabiki seri kesme onun için il seri haberleşme kesmesi icra olur ama onuda ccs c de istediğiniz kesme sıralamasına yüksek değerli kesme sırası verebilirsiniz
bilgi paylaştıkça çoğalır!!

www.fayelektronik.com

Adem AYDIN

Hemen altında yazdığımız için mi  o kısıma gidiyor? Yoksa başka bir yolu mu var? Yada

void Rb0_Kesmesi(int_ext) //gibi yada bu kısıma bir şey yazmak gerekiyor mu? Nereye gideceğini nasıl bilebiliyor?
{
output_toggle(pin_b1);
delay_ms(500);
}
ALLAH 'ın Dini Galip Gelmesi İçin (Malınızla ve Canınızla) Çalışın.

fatih88

anladığım kadarı ile ccs c diline basicden yeni geçmişiniz ccs c studio yu oluşturan kişiler kullanıcı fazla register bazı uğraşmayın diye macro oluşturmuş yani genel interrupt u açan kısım neresidir örnek verecek olursak 18f452 için ıntcon register içindeki 7. bittir (gie) general interrupt enable dir bunu kesinlikle açmamız gerekli ama ccs c de şu şekil bir makro var bu işi yapan enable_interrupts(GLOBAL); bu işlem kesme oluşursa aktif olan kesmeleri içra etmrsi için kullanılır bu kapalıysa interrupt işlem görmez bu enable_interrupts(global); foksiyonunu birde register bazda yazalım
#byte intcon=ff2
#bit gie=intcon.7
şimdi ben genel interupları açmak için sadece gie=1 veya 0 yazmam yeterli ama bu yeniler için kafa karıştıra bilir onun için enable_interrupts(global); bu fonksiyonu kullanmak mantıklı
bilgi paylaştıkça çoğalır!!

www.fayelektronik.com

fatih88

asıl soruna gelecek olursak derleyici benim o butona bbastığımı her hangi bir komut yazmadan nasıl biliyor butonun 1 veya 0 olduğunu nasıl anlarız ccs c de bir koşul koymamız gerekir örneğin if(!input(button))led_yak();burda ne dedik eger buton 1 den 0 a geçtiyse led yak fonksiyonuna git dedik ama dış kesmede böyle koşul yazmamıza gerek yok peki dış kesme bizim ne işimize yarar çok uzun proğramlarda denetleyici işlemler yaparken çok önemli bir sınır siviçini sürekli döngü içinde dinlemektense dış kesme yaparak sürekli dinleme işinden kurtuluyoruz ve yazdığımız programlar daha rahat çalışıyor ben yazdığım programlarımda kesinlikle interrupt kullanmaya çalışıyorum daha estetik programlar ortaya çıkıyor
şimdi  dış kesme de denetleyici seni nası anlıyor #int_ext bir fonksiyondur asıl işi registerler yapıyor bu yazıldığı anda ıde programımız arka kısımda registerleri kuruyor yani diyorki benim b portumun 0. biti kesmeye acılsın sonra senin kenar seçmeni bekliyor interrupt düşey kenardamı olsun yükselen kenardamı sen bunu belirliyorsun sonra genel interruptu açıyorsun artık denetleyici o bacaktan gelecek sinyali yazdığın proğramdan bağımsız bekliyor butonamı bastın hemen işini gücünü bırakıp #int_ext bloğundaki işlemi yapıp kaldığı yere geri dönerek işlemine devam ediyor
umarım yardımcı olabilmişimdir bildiklerimi yazıya dökmem bana biraz zor geliyor inşallah anlaşılır şekilde olmuştur iyi geceler
bilgi paylaştıkça çoğalır!!

www.fayelektronik.com

Adem AYDIN

Dediğiniz gibi pic basic'den ccs c'ye geçtim, pic basicde kesme oluştuğunda programın nereye gideceğini hangi etikete gideceğini belirtiyorduk, bunda nasıl olgunuğu sormuştum, sanırım programın nereye gideceğini belirlemeye gerek yok yada program bunu bir şekilde yolunu bulup gidiyor burasını tam anlamadım?
ALLAH 'ın Dini Galip Gelmesi İçin (Malınızla ve Canınızla) Çalışın.

Adem AYDIN

Teşekkür ederim çok açıklayıcı olmuş, program bizim belirtmemize gereksinim duymadan nereye gideceğini biliyor, önceki mesajımı sizin mesajınızı görmeden yazdım, cevabın çok açıklayıcı olmuş, tekrar teşekkürler, hayırlı günler.
ALLAH 'ın Dini Galip Gelmesi İçin (Malınızla ve Canınızla) Çalışın.

Powered by EzPortal