Picproje Elektronik Sitesi

DERLEYİCİLER => CCS C => Konuyu başlatan: styx75 - 09 Şubat 2016, 15:12:33

Başlık: Ynt: int_ext kesmesi
Gönderen: styx75 - 09 Şubat 2016, 15:12:33
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.
Başlık: Ynt: int_ext kesmesi
Gönderen: vitruvius - 09 Şubat 2016, 16:10:08
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.
Başlık: Ynt: int_ext kesmesi
Gönderen: styx75 - 09 Şubat 2016, 17:21:47
yanıtınız için teşekkür ederim.
Başlık: Ynt: Ynt: int_ext kesmesi
Gönderen: JOKERAS - 09 Şubat 2016, 18:08:53
Buton arkı,Debounce kontrolü yapmadan buton okuyamazsınız!
Heleki Kesme kullanarak.
Başlık: Ynt: Ynt: int_ext kesmesi
Gönderen: dursuncemal - 09 Şubat 2016, 18:42:56
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);

}
}
Başlık: Ynt: Ynt: int_ext kesmesi
Gönderen: RaMu - 09 Şubat 2016, 18:54:48
   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
}

Başlık: Ynt: int_ext kesmesi
Gönderen: styx75 - 09 Şubat 2016, 19:47:15
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.
Başlık: Ynt: Ynt: int_ext kesmesi
Gönderen: dursuncemal - 09 Şubat 2016, 20:45:35
negatifi derken - anlaminda mi yoksa goruntuyu tersleme anlamindami? eger goruntunun tersi ise tablodan okunan degeri terslemen gerekir.
Başlık: Ynt: int_ext kesmesi
Gönderen: styx75 - 09 Şubat 2016, 21:05:17
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.
Başlık: Ynt: Ynt: int_ext kesmesi
Gönderen: dursuncemal - 09 Şubat 2016, 21:46:53
eger karakterlerinizi yada grafiklerinizi tablodan aliyor iseniz cok kolay tersleyekecsiniz.
Başlık: Ynt: Ynt: int_ext kesmesi
Gönderen: RaMu - 09 Şubat 2016, 21:51:23
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.
Başlık: Ynt: int_ext kesmesi
Gönderen: styx75 - 09 Şubat 2016, 21:58:28
evet ramu bey çok teşekkür ederim.