INT0 KESMESİ YARDIM

Başlatan picman, 22 Temmuz 2012, 11:28:57

picman

arkadaşlar INT0 kesmesi için GIE=1; INTE=1; kodları ile kesmeyi kurdum ve işlemciyi SLEEP moduna sokuyorum ama sleep moduna girdikten sonra direk kesme fornksiyonu çalışıyor. sebebi nedir acaba bilgisi olan var mı? istediğim şu uykuya girmeden önce kesmeyi kurmak ve uykuya girmek sonra işlemciyi uyandırmak için RB0 ucuna bağlı bir buton ile işlemciyi uykudan uyandırmak. ama nedense uyku moduna girdikten sonra direk interrupt fonksiyonu da çalışıyor. RB0 ucu bir pullup direnci ile 5v bağlı. RB0 ile şase arasında da bir buton var.
Bilgi paylaştıkça artar..

JKramer

Sleep moduna girmeden kesme bayrağını temizlemeyi deneyin.

picman

aslında kod çöyle
void uyku_modu_kontrol(void){

	if(uyku_kontrol==0){ //uyku moduna geçildimi...
		if(saat_temp==0x00 && dakika_temp==0x00){
			uyku_kontrol=1; //uyku moduna geçiş...
			nokia_3310_glcd_temizle();
			RD6=0;
			 //çevre donanım beslemesini kes..
			GIE=1; //tüm kesmeler aktif..
			INT0IE=1; //INT0 kesmesi aktif.. 
			INT0IF=0;
			INTEDG0=0;
			asm("sleep"); //işlemciyi uyku moduna sok.
		}
	}
}


saati kontrol ediyor 24:00 da cihaz kapanması gerek kesme için ayarlamalar doğru mu sizce
Bilgi paylaştıkça artar..

JKramer

Hangi mikrodenetleyci olduğunu yazmamışsınız ama 887 için katalogda; kesme bayrağı, kesmeyi aktif hale getirmeden önce sıfırlanmak zorunda diye yazılmış.

Ayrıca "Power down Mode (Sleep)" ile ilgili bir bölüm var. Burada iki türlü durum mevcut; uyku modundan çıktığında kesme fonksiyonuna dallanma ya da sadece uyanıp devam etme. Bu seçimi GIE bit'i belirliyor. Eğer GIE=0 ise, uyku modundan çıktıktan sonra program kaldığı yerden (sleep komutundan sonraki komut) devam ediyor. Eğer GIE=1 ise, uyku modundan çıktıktan sonra önce sıradaki komut işletiliyor, daha sonra kesme fonksiyonuna dallanıyor. Sleep komutundan sonraki komutun, kesme fonksiyonundan önce işletilmesi istenmiyorsa buraya bir NOP koyulması gerekiyor.

Son olarak INT0 kesmesinin düşen-yükselen kenar ayarları var, onları donanımınıza göre yapmanız gerekiyor.

picman

#4
şimdi arkadaşım kullandığım işlemci 18f452 ben şimdi programda değişiklik yaptım. kodum şöyle..
void uyku_modu_kontrol(void){

	if(PORTB==0x0e){
		if(++uyku_kontrol,uyku_kontrol>100){ //uyku moduna geçildimi...
			uyku_kontrol=0; //uyku moduna geçiş...
			nokia_3310_glcd_temizle();
			RD6=0;
			 //çevre donanım beslemesini kes..
			GIE=1; //tüm kesmeler aktif..
			INT0IE=1; //rb0 kesmesi aktif.. 
			INT0IF=0;
			INTEDG0=0;
			asm("sleep"); //işlemciyi uyku moduna sok.
		
		}
	}
}


yukarıdaki fonksiyon sonsuz döngü içinde portb ye bağlı RB0 ucundaki bir butonu kontrol ediyor. butona belli bir süre basıyorum INT0 kesmesi aktif ediliyor  pic uykuya giriyor tamam buraya kadar sonra butona basıyorum kesme oluşuyor  uykudan çıkıyor kesmeler pasif oluyor. ama ikinci kez bu işlem gerçekleşirken enteresan birşey oluyor pic yine uykuya giriyor ama uykuya girmeden önce RD6 ya bağlı led in sönmesi gerek o sönmüyor pic uykuya girmiş gibi hiç birşey yapmıyor RB0 ucuna bağlı botona basınca da uykudan çıkmıyor. nasıl olur bu...

static void interrupt kesme_islem(void){
	GIE=0; INT0IE=0; INT0IF=0;
	RD6=1; uyku_kontrol=0;
	while(PORTB==0x0e); //butona basılı ise bekle
	//kesmeleri iptalet..
}

buda kesme fonksiyonu içinde sadece kesmeyi pasif yapma kodları var .


sizin değiniz gibi uykuya girmeden önce INT0IF=0; ile bayrağı temizledim GIE=1; ve INT0IE=1; ile kesmeyi aktif yaptım kodlar birkez doğru çalışıyor ama ikinci kez çalışmıyor. pek birşey anlamadım ben bu işten. ben uykuya girdikten sonra pic in kesmeye girmesini istemiyorum. uykuya girdikten sonra ben butona basınca kesme oluşsun sonra kesme iptal olsun istiyorum. sonra cihaz açılsın ben nezaman butona uzun süre basılı tutarsam pic yine uykuya dalsın kesme aktif olsun. ben butona basınca kesme oluşup pic uyansın ve kesme tekrar pasif olsun istiyorum.




mesaj birleştirme:: 22 Temmuz 2012, 13:16:57

uykuya girmeden önce GIE=1; yaptığım kodu GIE=0; diye değiştirdim. şimdi düzgün çalıştı. butona basınca uykuya girmesi ve çıkması normal ama bu sefer program uykudan çıkar ken kesme fonksiyonu çalışmıyor gibi. bu durum normal mi kesme oluşmadan mı pic uykudan çıkıyor.
Bilgi paylaştıkça artar..