Kesme Konusunda Kafayı Yemek Üzereyim

Başlatan ertan2002, 04 Temmuz 2012, 05:50:50

ertan2002

Merhaba arkadaşlar saat 6 ya geliyor ve hala şu kesmeyi halledemedim :S


int BasilanTusSayisi=0;
 
#int_ext
void TusKesmesi(void)
{

//GirilenSifre[BasilanTusSayisi] = Tuslar[portb>>4];
//output_c(input_c()+1);

BasilanTusSayisi++;
output_c(BasilanTusSayisi);
 //lcd_gotoxy(1,BasilanTusSayisi);
  //printf(lcd_putc, "%d", BasilanTusSayisi);
 // delay_ms(500);
//BasilanTusSayisi=0;   
  output_toggle(pin_e2);
//output_high(PIN_E2);

}


key paddeki her butona bastığımda kesmeyi aktif yaptırıyorum. kesmede problem yok çalışıyor..  yani içeri girip pinlerin çıkışlarını ayarlayabiliyorum ve her butona bastığımda tekrar giriyor. Yani bir kereye mahsus değil..

her kesmeye girdiğinde BasilanTusSayisi isimli değişkeni 1 arttırmak istiyorum ama artmıyor.  bu şekilde deniyorum bana ilk değerini veriyor
output_c(BasilanTusSayisi);

oysa output_c(input_c()+1); ile yapınca 0 dan itibaren sayıyor..

şimd ilk olarak int BasilanTusSayisi=3; yaparsam ve kesme metodu içinde de
BasilanTusSayisi++;

output_c(BasilanTusSayisi);

bu şekil yaptığmda, 4 yapıyor ama bir daha kesme yaptığımda 5 olmuyor. basilantussayisi artmıyor. sorun kesmede değil sanırm. static olara tanımladım olmadı, int4,in8 yaptım olmadı.. problem nerede bir türlü işin içinden çıkamadım..

değişkene ilk değerini main içinde verdim yine olmadı

anladığım kadarıyla global değişkenlere farklı fonksiyonlar içinden değer atayamıyorum, yani kalıcı olmuyor..  bu konuda fikirlerinizi bekliyorum


teşekkürler



z

volatile int BasilanTusSayisi=0;

yazmayı dene
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ertan2002

teşekkürler yanıt için, daha önce denedim onu, şimdi yine denedim sonuç aynı..

GreeN

Watchdog timer yada donanımsal bir sebepten işlemci resetliyor olabilir. Böylece her seferinde başlangıç değeri alıyor olabilir.
Terörü Lanetliyoruz.

vitruvius

Bence programın tamamını ve şemanızı vermenizde fayda var.

Sepiroth

Either you feel it, or not...

ertan2002

#6
buyrun kodlar burada :S


#include <16f877.h>

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD


#use delay (clock=4000000)
#use fast_io(d) //d ye taşıdım başka e il
#use fast_io(c)
#use fast_io(b)
//#define use_portb_lcd TRUE
#define use_portd_lcd TRUE

//#include <LCDMenu.c>
//#include <SifreKontrolu.c>

#byte portb=0x06 

const char Tuslar[] = { 1,2,3,
                        4,5,6
                        7,8,9,7};
                        
char GirilenSifre[10];               
int BasilanTusSayisi=0;
  
 
#int_ext
void TusKesmesi(void)
{

//GirilenSifre[BasilanTusSayisi] = Tuslar[portb>>4];
//output_c(input_c()+1);

BasilanTusSayisi = BasilanTusSayisi + 1;

output_c(BasilanTusSayisi);
 //lcd_gotoxy(1,BasilanTusSayisi);
  //printf(lcd_putc, "%d", BasilanTusSayisi);
 // delay_ms(500);
//BasilanTusSayisi=0;   
  output_toggle(pin_e2);
//output_high(PIN_E2);

}
void main()
{


   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_CCP1(CCP_OFF);
   setup_CCP2(CCP_OFF);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   ext_int_edge(L_TO_H);
   
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);
   //portb=0;
   
   set_tris_d(0x00); // d ye taşıdım
   set_tris_e(0x00);
   set_tris_b(0x01);
   set_tris_c(0x00);
   
 //  output_e(0x00);
   //portb=0;
 //  output_c(0);
   
   //lcd_init();  
  // MenuBas();
   
   
   
//   if (SifreKontrol(12345))
  // {
//  output_high(PIN_E0);
//  output_low(PIN_E1);
  
   
   //}
  // else
//   {
  // output_high(PIN_E1);
  //output_low(PIN_E0); 
  // }
   

}



lcd ye menü bastırdığım fonksiyonu pasif yaptım o yüzden lcdnin çalışmamasına bakmayın.. dikkat ederseniz E2 deki ledin yandığı, her tuşa bastığımda toggle dan dolayı yanıp sönüyor..

[IMG]http://i48.tinypic.com/6f4d2h.png[/img]

mesaj birleştirme:: 04 Temmuz 2012, 15:35:14

hatayı çözdüm sanırım.. main i şöyle düzenledim

void main()
{
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_CCP1(CCP_OFF);
   setup_CCP2(CCP_OFF);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   ext_int_edge(L_TO_H);
   
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);
   
   set_tris_d(0x00);
   set_tris_e(0x00);
   set_tris_b(0x01);
   set_tris_c(0x00);
   set_tris_a(0x01);
   
   while(1);
}
   


şimdi sormak isteğim şu. burada sonsuz bir döngü oluşturuluyor..  bu pic için iyi bir şey mi? bir delay kullanmak gerekiyor sanırm da yine de sonsuz döngüyle iş yapmanın ötesinde farklı yollar yok mu? 



justice_for_all

mclr pinin boşta  :o 4k7 dirençle pull up yapman gerek
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

ertan2002

onunla alakalı değil sorun:) bu while sonsuz döngüsü olmasa lcd ye görüntü geliyor ve tekrar siliniyor.. sanırm while şart..

GreeN

Alıntı yapılan: ertan2002 - 04 Temmuz 2012, 19:13:39
onunla alakalı değil sorun:) bu while sonsuz döngüsü olmasa lcd ye görüntü geliyor ve tekrar siliniyor.. sanırm while şart..

sorun sadece while(1) değil.
portb nin tüm pinleri giriş olarak ayarlamalısın.
Terörü Lanetliyoruz.

ertan2002

evet güzel noktayı yakaladınız bende bir kaç saat önce fark ettim.. sadece nedense kesmeyi giriş yapmışım. oradaki sarı noktaların neden olduğunu fark etmedim, sonra baktım giriş olarak ayarlı değil, düzelttim ama sonuç aynı..

sanırm döngü programın sonlanmasını engelliyor bu sayede dışarıdaki değişkenler sıfırlanmıyor. main içindeki kod bittikten sonra sanırım global değişkenlerin bellekteki yeri kayboluyor ya da değeri null a dönüyor.

bu tarz bir açıklamadan başka bir şey aklıma gelmiyor

WrtM

ben c den anlamam ama isis ekranında encoder çıkışların kısa devre göstriyo (sarı renkli yer)

ertan2002

o sarı rengin sebebi giriş olarak ayarlı olmamasıydı. onu düzelttim, problem onla alakalı değil

erdemtopal

merhaba,

aynı devreyi ben de kurdum. aynı sorunla karşılaştım.
lcd de ne yaptıysam arka arkaya yanyana 4 basamaklı rakam yazamadım.
1111 2222 gibi oluyor. 1250 gibi bir değer yazamadım.
bu sorun çözüldü mü?