Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

Ynt: int_ext kesmesi

Başlatan styx75, 09 Şubat 2016, 15:12:33

styx75

selam arkadaşlar.
aşağıda verdiğim kod çok basitbir kesme uygulaması,  rb0 butonuna bastıgımız zaman kesme oluşuyor kesme fonksiyonu icraa edilip while geri dönüyor,sorum ise butona basılı tutdugumuz zaman program karışıyor,basılı oldugu sürece aynı şlemleri yapması gerekmezmi neden program şaşırıyor.yani ileride bir  butona basılı tuttugum sürece bir değişkeni kesme içinde arttıp yada azaltmak ve bunu glcd ye basmak istesem sıkıntı olmazmı budurum. ccs c de yeniyim saygılar.


#include <18F4520.h>    
#fuses HS,noWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD 
#use delay (clock=20000000)
#define FAST_GLCD
#include <HIZLI.c>
#include <graphics.c>
#include <DS1307.c> 
#use fast_io(b) 
#use fast_io(e)
//---------------------------------
char saniye[5] ;       
char dakika[5]; 
char saat[5] ;  
char gun[5];  
char ay[5] ;    
char yil[5];
char ikinokta[]=":";
char slaj[]="/";
BYTE sec; BYTE min; BYTE hrs; BYTE day;
BYTE yr;BYTE dow;BYTE month;

void bip(){
output_high(pin_e0);
delay_ms(50);
output_low(pin_e0);
}

#int_ext               
void  ext_kesmesi (){ 
bip();

}


void goster(){
glcd_rect(0, 0,125, 8, YES, Off);
glcd_text57(0, 0, saat, 1, On); 
glcd_text57(12, 0, ikinokta, 1, On); 
glcd_text57(34, 0, saniye, 1, On);
glcd_text57(29, 0, ikinokta, 1, On); 
glcd_text57(17, 0, dakika, 1, On); 
glcd_text57(115, 0, yil, 1, On);
glcd_text57(110, 0, slaj, 1, On); 
glcd_text57(98, 0, ay, 1, On);
glcd_text57(92, 0,slaj, 1, On); 
glcd_text57(80, 0, gun, 1, On);
glcd_update();
}
//----------------------------------------  
void hesap(){
sprintf(saniye,"%02d",sec);
sprintf(dakika,"%02d",min);
sprintf(saat,"%02d",hrs);
sprintf(gun,"%02d",day);
sprintf(ay,"%02d",month);
sprintf(yil,"%02d",yr);
}
//--------------------------------------
void main ( ){
setup_psp(PSP_DISABLED);        
setup_timer_1(T1_DISABLED);     
setup_timer_2(T2_DISABLED,0,1); 
setup_adc_ports(NO_ANALOGS);    
setup_adc(ADC_OFF);             
setup_CCP1(CCP_OFF);            
setup_CCP2(CCP_OFF);
ds1307_init(); 
ds1307_set_date_time(8,2,16,2,22,30,00); 
glcd_init(on);
set_tris_b(0x01);   // RB0 pini giriş,diğer uçlar çıkış olarak yönlendiriliyor
output_b(0x00); 
set_tris_e(0x00); 
output_e(0x00);
ext_int_edge(H_TO_L);   // INT_EXT kesmesinin düşen kenarda aktif olacağını belirtir
enable_interrupts(INT_EXT);  // INT_EXT kesmesini aktif yapar
enable_interrupts(GLOBAL);   // Aktif
bip();
delay_ms(100);
bip();
delay_ms(100);
bip();
delay_ms(100);

//-----------------------------------------------
while(1){
 
ds1307_get_time(hrs,min,sec); 
ds1307_get_date(day,month,yr,dow); 
hesap();
goster();
delay_ms(200); 

 }
}


mesaj birleştirme:: 09 Şubat 2016, 15:37:48

#include <18F4520.h>    
#fuses HS,noWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD 
#use delay (clock=20000000)
#define FAST_GLCD
#include <HIZLI.c>
#include <graphics.c>
#include <DS1307.c> 
#use fast_io(b) 
#use fast_io(e)
//---------------------------------
char saniye[5] ;       
char dakika[5]; 
char saat[5] ;  
char gun[5];  
char ay[5] ;    
char yil[5];
char ikinokta[]=":";
char slaj[]="/";
char bas[5];
BYTE sec; BYTE min; BYTE hrs; BYTE day;
BYTE yr;BYTE dow;BYTE month;
int say=0;
void bip(){
output_high(pin_e0);
delay_ms(50);
output_low(pin_e0);
}

void goster2(){
sprintf(bas,"%02d",say);
glcd_rect(0, 40,20, 20, YES, off);
glcd_text57(0, 30, bas, 1, On);
glcd_update();
}
#int_ext               
void  ext_kesmesi (){ 
say++;
bip();
goster2();

}


void goster1(){
glcd_rect(0, 0,125, 8, YES, Off);

glcd_text57(0, 0, saat, 1, On); 
glcd_text57(12, 0, ikinokta, 1, On); 
glcd_text57(34, 0, saniye, 1, On);
glcd_text57(29, 0, ikinokta, 1, On); 
glcd_text57(17, 0, dakika, 1, On); 
glcd_text57(115, 0, yil, 1, On);
glcd_text57(110, 0, slaj, 1, On); 
glcd_text57(98, 0, ay, 1, On);
glcd_text57(92, 0,slaj, 1, On); 
glcd_text57(80, 0, gun, 1, On);

glcd_update();
}
//----------------------------------------  
void hesap(){
sprintf(saniye,"%02d",sec);
sprintf(dakika,"%02d",min);
sprintf(saat,"%02d",hrs);
sprintf(gun,"%02d",day);
sprintf(ay,"%02d",month);
sprintf(yil,"%02d",yr);

}
//--------------------------------------
void main ( ){
setup_psp(PSP_DISABLED);        
setup_timer_1(T1_DISABLED);     
setup_timer_2(T2_DISABLED,0,1); 
setup_adc_ports(NO_ANALOGS);    
setup_adc(ADC_OFF);             
setup_CCP1(CCP_OFF);            
setup_CCP2(CCP_OFF);
ds1307_init(); 
ds1307_set_date_time(8,2,16,2,22,30,00); 
glcd_init(on);
set_tris_b(0x01);   
output_b(0x00); 
set_tris_e(0x00); 
output_e(0x00);
ext_int_edge(H_TO_L);   
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL); 
bip();
hesap();
goster1();
goster2();



//-----------------------------------------------
while(1){
 
ds1307_get_time(hrs,min,sec); 
ds1307_get_date(day,month,yr,dow); 
hesap();
goster1();
delay_ms(200); 

 }
}


kodu bu şekilde yenilediğim zaman proteusda çalışıyor ama butona üst üsde birkaç kez bakınca program kitleniyor lütfen yardım.

vitruvius

#1
Birincisi, harici kesme için şu kodu yazmışsınız:

ext_int_edge(H_TO_L);   // INT_EXT kesmesinin düşen kenarda aktif olacağını belirtir


Yanına düştüğünüz notun da söylediği gibi kesme düşen kenar gördüğü zaman aktif olur. Basılı tutmanız daha çok düşen kenar üretmez. Önemli olan lojik seviyedeki geçiştir.

İkincisi, bu kodları incelemeyi kimsenin isteyeceğini sanmıyorum. Sorununuzu canlandıran minimum uzunlukta bir kod paylaşın ki incelemek kolay olsun. Gereksiz yerlerle meşgul olmayalım.

Üçüncüsü de kesme içinde gecikme yaratan fonksiyonlar çağırmaktan kaçının. Onun yerine kesme içinde bir bayrak ayarlayıp bu bayrağın durumunu ana döngünüz içinde kontrol ederek işlem yapın.

styx75

yanıtınız için teşekkür ederim.

JOKERAS

Buton arkı,Debounce kontrolü yapmadan buton okuyamazsınız!
Heleki Kesme kullanarak.

dursuncemal

ext_int_edge(H_TO_L); // rb0  h den l ye dustugu anda interrupt rutinine girersiniz. interrupt icindeki fonksiyonunuzdan ciktiktan sonra tekrar  girebilmek icin ayni sartin olusmasi gerekir.yani elinizi butondan cekip tekrar basmaniz gerekecek;

programin kilitlenmesine gelince;inerrupt gelince inerruptin icinde  interupu disable yap (disable_interrupts(INT_EXT);) asagidaki gibi uygun zamada enable yap.

while(1){

ds1307_get_time(hrs,min,sec);
ds1307_get_date(day,month,yr,dow);
hesap();
goster1();

enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);

delay_ms(200);

}
}
:=

RaMu

   Kesme içinde uzun işlemler, beklemeler, uzun müddet kesmede takılmak
hiç iyi bir programlama tekniği değil ama,
istediğini yapabilir misin? yaparsın!

   RB0 daki butona basılınca mcu ya sıfır gelsin,
kesme  ext_int_edge(H_TO_L);  şeklinde kurulu olsun,
buton debounce için donanımsal çözüm uygulansın, kondansatör felan ...

Kesme içinde RB0 pinindeki butondan el çekilene kadar işlem yapılsın:

#int_ext               
void  ext_kesmesi (){ 

while (input(pin_B0) == 0 )) //RB0 daki butona basılı olduğu müddetçe while içini işle
  {
say++;
bip();
goster2();
//burada ufak bir bekleme eklenmesi gerekecek
  } // while RB0 sonu
}

Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

styx75

#6
yardımlarınızı esirgemediginiz için çok teşekkür ederim.program yoluna girmeye başladı,yaş 42 den sonra osilatör yavaşlıyor kusurabakmayın :)
ayrıca ccs c gayet güzel bir  derleyici.alıştıkca zevk alıyorsunuz.

mesaj birleştirme:: 09 Şubat 2016, 20:31:42

glcd de yazdıgımız yazının yada karekterin negatifini nasıl alıyoruz.

dursuncemal

#7
negatifi derken - anlaminda mi yoksa goruntuyu tersleme anlamindami? eger goruntunun tersi ise tablodan okunan degeri terslemen gerekir.
:=

styx75

evet sözgelimi "styx75" yazdık bunu ptotonda yazının tamamı çerceve içinde siyah fon üzerinde yazdırıla biliyor,siyh derken proteusu kasderek bunun için bir komut bulamadım.

dursuncemal

eger karakterlerinizi yada grafiklerinizi tablodan aliyor iseniz cok kolay tersleyekecsiniz.
:=

RaMu

Kullandığın GLCD kütüphanesine göre değişebilir,
graphics.c kütüphanesinde:
glcd_text57(x,y,textptr,size,color)
kısmındaki açıklamalarda mevcut aslında.
color yazan kısma ON yazılırsa > siyah=karakterler dolu,
OFF yazılırsa > invert = karakter pikselleri boş olarak yazılır.

size kısmına 1,2,3,4,.. yazılarak harflerin ~ karakterlerin boyutu büyütülebilir.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

styx75

evet ramu bey çok teşekkür ederim.