Kesme içerisinde işlenmeyen kodlar

Başlatan gokhangokcen, 09 Nisan 2018, 17:42:01

gokhangokcen

Cümleten iyi günler dilerim, ccs c compiler 5.074 kullanarak bir alarmlı saat yapmaya çalışıyorum. Başıma anlamsız bir kaç olay geldi. Dün uğraştığım çalışan kodlar bugün anlamsız bir biçimde çalışmıyor. Kesme içerisinde P10 ekran taranıyor, aynı zamanda 2 tane sayaç arttırılıyor(du). Şu an ekranı tarıyor fakat sayaç değerim 0003 olup kalıyor. Başka hiç bir yerde bu sayaç kullanılmıyor, müdahale edilmiyor her şeyi remark ettim main içerisinde. ama 3 oluyor sayaç dahada artmıyor. Herhangi bir buton okuma ya da menü içerisine girdiğimde tekrar anamenüye çıkış yapınca sayaç saymaya başlıyor. Daha önce böyle bir olay başına gelen oldu mu? kodlarım aşağıdaki gibidir;

/*******************************************************************************
* Dosya Adı          : P10_Panel_Alarmlı_Saat_Programı
* Yazan              : Gökhan Gökçen
* Versiyon          : V1.0
* Tarih              : 08/04/2018
* Açıklama          : P10 Panelli Alarmlı Saat
*
*Program açılışta eepromdaki verileri okur,
*
*
*
*
*
*
*
*
*******************************************************************************/    

//--------------------------40 pin MCU PIN_diagram
//                        _____________
//MCLR/VPP----------------|1        40|-------RB7/PGD
//RA0/AN0-----------------|2        39|-------RB6/PGC
//RA1/AN1-----------------|3        38|-------RB5
//RA2/AN2/VREF-/CVREF-----|4        37|-------RB4
//RA3/AN3/VREF+-----------|5        36|-------RB3/PGM
//RA4/T0CKI/C1OUT---------|6        35|-------RB2
//RA5/AN4/SS/C2OUT--------|7        34|-------RB1
//RE0/RD/AN5--------------|8        33|-------RB0/INT
//RE1/WR/AN6--------------|9        32|-------VDD
//RE2/CS/AN7--------------|10        31|-------VSS
//VDD---------------------|11        30|-------RD7/PSP7
//VSS---------------------|12        29|-------RD6/PSP6
//OSC1/CLKI---------------|13        28|-------RD5/PSP5
//OSC2/CLKO---------------|14        27|-------RD4/PSP4
//RC0/T1OSO/T1CKI---------|15        26|-------RC7/RX/DT
//RC1/T1OSI/CCP2----------|16        25|-------RC6/TX/CK
//RC2/CCP1----------------|17        24|-------RC5/SDO
//RC3/SCK/SCL-------------|18        23|-------RC4/SDI/SDA
//RD0/PSP0----------------|19        22|-------RD3/PSP3
//RD1/PSP1----------------|20        21|-------RD2/PSP2
//                        |____________|

#include <18F4620.h>
#include <string.h>


#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                  //Watch Dog Timer uses 1:128 Postscale
#FUSES H4                      //High speed osc with HW enabled 4X PLL
#FUSES NOBROWNOUT              //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
//#FUSES NOMCLR
#FUSES NOCPD

#use delay(clock=40000000)
#use I2C(Master, SDA = pin_D3, SCL = pin_D2)



#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)

#include "DS3231.c"
#include <math.h>
/*******************************P10 Panel kütüphanesi**************************/
#include <P10_Panel_Driver.c>

/***********************************Tanımlamalar*******************************/
#define encoder_switch  pin_a2

/********************************Global Değişkenler****************************/
unsigned int int_syc = 0 , i = 0 , saat_oku = 0 , set = 0 , Aux1 = 0 , Enc1 = 0 , ayar = 0 , yarim_saniye = 0;
unsigned int alarm_saatleri[10] , alarm_dakikalari[10];
int1 toggle = 0;
unsigned long sayac = 0 , donus = 0 ,Q = 0 ,sure_sayac = 0 ;
unsigned char s = 00 , min = 36 , hr = 9;
//unsigned char dt = 06 , mt = 04 , yr = 18 , dy = 6;      //6 cuma 7 cumartesi ...
short hr_format = _24_hour_format , am_pm = 0;
char MenuCikis = 0 , MenuNo = 0;

/**********************************Menü Tanımlamaları********************************/

char *Menu[]=
  {
      "        ",      //0
      "SAAT AYARI",    //1
      "ALRM1",          //2
      "ALRM2",          //3
      "ALRM3",          //4
      "ALRM4",          //5
      "ALRM5",          //6
      "ALRM6",          //7
      "ALRM7",          //8
      "ALRM8",          //9
      "ALRM9",          //10
      "ALARM SURE",    //11
      "CIKIS    "      //12
  };

/**********************************Fonksiyonlar********************************/

void write_data    (unsigned int8 row_adr);
void enkoder_oku();
void ana_menu();
void saat_ayar_menusu();
void alarm_ayar_menusu();
void alarm_sure_menusu();
void eepromdaki_degerleri_oku();
void eeproma_degerleri_yaz();

/********************************Kesme Alt Programı****************************/
#int_timer0                                                                  //Timer0 Kesmesi
void Timer0_int()
  {
      set_timer0(133);                                                              //Timer0 800us değerine kurulur
      
      if(++sayac >= 600)                                                            //480ms ara ile saat okumak için sayaç kurulur
        {
            saat_oku = 1;                                                                //Süre dolduğunda saatin okunması için saat_oku değişkeni 1 yapılır
            sayac=0;                                                                      //Sayaç değişkeni sıfırlanır
        }

  if(++sure_sayac >= 625)
      {
        toggle++;
        yarim_saniye++;
        sure_sayac=0;
        if(yarim_saniye>10)yarim_saniye=0;
      }

  switch (int_syc)                                                              //P10Display tarama bölümü
      {
        case 0:          
          output_low(PinOE);write_data(int_syc);
          output_low(PinA);output_low(PinB);output_high(PinOE);        
        break;

        case 1:
          output_low(PinOE);write_data(int_syc);
          output_high(PinA);output_low(PinB);output_high(PinOE);
        break;

        case 2:
            output_low(PinOE);write_data(int_syc);
            output_low(PinA);output_high(PinB);output_high(PinOE);
        break;

        case 3:
            output_low(PinOE);write_data(int_syc);
            output_high(PinA);output_high(PinB);output_high(PinOE);
        break;
        
      }    //switch sonu
      
  int_syc++;if(int_syc>3)int_syc=0;

  
}    //Kesme sonu

/**********************************Ana Program*********************************/
void main()
{
  set_tris_a(0x07);                                                          //PortA için giriş/çıkış tanımlamaları
  set_tris_b(0x00);                                                          //PortB için giriş/çıkış tanımlamaları
  set_tris_c(0x00);                                                          //PortC için giriş/çıkış tanımlamaları
  set_tris_d(0x00);                                                          //PortD için giriş/çıkış tanımlamaları
  set_tris_e(0x00);                                                          //PortE için giriş/çıkış tanımlamaları

  setup_spi(SPI_MASTER | SPI_L_TO_H | SPI_SS_DISABLED);                      //SPI kullanılmayacak
  setup_adc(ADC_OFF);                                                        //ADC kullanılmayacak
  setup_ccp1(CCP_OFF);                                                      //PWM1 kullanılmayacak
  setup_ccp2(CCP_OFF);                                                      //PWM2 kullanılmayacak
  setup_timer_0(T0_INTERNAL | T0_8_BIT | T0_DIV_64);                        //Timer0 800us süreye kuruluyor
  enable_interrupts(INT_timer0);                                            //Timer0 kesmesi aktif edilir
  enable_interrupts(GLOBAL);                                                //Kesmelere izin verilir
  set_timer0(133);                                                          //Timer0 kesmesine 800us için 133 değeri yüklenir
  
  set=DS3231_read(controlREG);                                              //DS3231'in çalışma bit'i okunur
  if(bit_test(set,7)){DS3231_init();}                                        //Eğer bu bit 0 ise 1 yapılır.DS3231 kurulumu yapılır.
  
  output_a(0x00);                                                            //PortA pinlerine 0x00 değeri yüklenir
  output_b(0x00);                                                            //PortB pinlerine 0x00 değeri yüklenir
  output_c(0x00);                                                            //PortC pinlerine 0x00 değeri yüklenir
  output_d(0x00);                                                            //PortD pinlerine 0x00 değeri yüklenir
  output_e(0x00);                                                            //PortE pinlerine 0x00 değeri yüklenir
  
  //Set_Brightness(100);                                                    //Ekran parlaklığını değiştirmek için kullanılan fonksiyon
  clear_display(0);                                                          //P10Display temizlenir
  getTime(hr, min, s, am_pm, hr_format);                                    //DS3231'den saat,dakika,saniye,am_pm,hr_format bilgileri okunur
  eepromdaki_degerleri_oku();                                                //Eepromdaki değerler (alarm süresi ve alarm zamanları) okunur
  
  while(TRUE)                                                                //Program için sonsuz döngü kurulur
  {
      enkoder_oku();                                                          //Enkoder okuma fonksiyonunu çağırır
      
            sprintf(Text,"%04Lu",sayac);                                      //Saat ve dakika bilgileri Text değişkeni içerisine kopyalanır
            ShowString(1,1,1,0);            

      if(toggle)
        {
            //sprintf(Text,"%02d:%02d",hr,min);                                      //Saat ve dakika bilgileri Text değişkeni içerisine kopyalanır
            //ShowString(1,4,1,0);                                                    //Ekranda sabit olarak Text değişkenini göstermek için kullanılan fonksiyon
        }
        
      if(!toggle)
        {
            //sprintf(Text,"%02d %02d",hr,min);                                      //Saat ve dakika bilgileri Text değişkeni içerisine kopyalanır
            //ShowString(1,4,1,0);                                                    //Ekranda sabit olarak Text değişkenini göstermek için kullanılan fonksiyon
        }
        
      if(saat_oku==0x01)                                                            //Eğer saat_oku değişkeni "1" ise
        {
            getTime(hr, min, s, am_pm, hr_format);                            //DS3231'den saat,dakika,saniye,am_pm,hr_format bilgileri okunur
            //getDate(dy, dt, mt, yr);              
            saat_oku=0x00;                                                      //Saat okuma değişkeni "0"'lanır
        }

while(MenuCikis)
  {
      enkoder_oku();
      
      if(donus>Q)
        {
            Q=donus;
            MenuNo++;
            if(MenuNo>=13)MenuNo=1;
            
            if(MenuNo==1 || MenuNo==11)
              {
                  sprintf(Text , Menu[MenuNo]);
                  ShowString(1,0,1,0);
              } 
                  
            if(MenuNo>=2 && MenuNo<=10)
              {
                  sprintf(Text , "%s%02d:%02d" , Menu[MenuNo] , alarm_saatleri[MenuNo-2] , alarm_dakikalari[MenuNo-2]);
                  ShowString(1,0,1,0);
              }
            if(MenuNo==12)
              {
                  sprintf(Text , Menu[MenuNo]);
                  ShowString(1,4,1,0);
              }
        }
        
                    
      /******************************************************/
      
      if(donus<Q)
        {
            Q=donus;
            MenuNo--;
            if(MenuNo<=0)MenuNo=12;
            
            if(MenuNo==12)
              {
                  sprintf(Text , Menu[MenuNo]);
                  ShowString(1,4,1,0);
              }

            if(MenuNo>=2 && MenuNo<=10)
              {
                  sprintf(Text , "%s%02d:%02d" , Menu[MenuNo] , alarm_saatleri[MenuNo-2] , alarm_dakikalari[MenuNo-2]);
                  ShowString(1,0,1,0);
              }

            if(MenuNo==1 || MenuNo==11)
              {
                  sprintf(Text , Menu[MenuNo]);
                  ShowString(1,0,1,0);
              }
        
        
        }
        /******************************************************/
        if(!input(encoder_switch))
        {
            if(MenuNo==1)  // Program
              {
                  clear_display(0);
                  Q=donus;
                  saat_ayar_menusu();
                  MenuCikis=0;
              }
              
            if(MenuNo>=2 && MenuNo<=10)
              {
                  clear_display(0);
                  Q=donus;
                  alarm_ayar_menusu();
                  MenuCikis=0;
              }
        
            if(MenuNo==12)  // Cikis
              {
                  MenuCikis=0;
                  MenuNo=0;
                  clear_display(0);
                  donus=0;
                  Q=0;
              }
        } // ENTER sonu.
        
  

  }  // while MenuCikis sonu.


  } //while true sonu




}  //Void main sonu


/**********************************Saat Ayar Menüsü*********************************/
void saat_ayar_menusu()
{
  while(MenuCikis)
  {
      enkoder_oku();

      
      if(!input(encoder_switch))
        {
            ayar++;
            yarim_saniye=0;
            while(yarim_saniye<2);
            if(ayar>4)ayar=0;
            Q=donus;
            toggle=1;
            sure_sayac=0;
        }

      switch (ayar)
        {
            case 1:
            
              if(Q>donus)
                  {
                    hr++;
                    if(hr>=24)hr=0;
                    Q=donus;
                  }

              if(Q<donus)
                  {
                    hr--;
                    if(hr>=24)hr=23;
                    Q=donus;
                  }
            
              if(toggle)
                  {
                    sprintf(Text,"%02d:%02d",hr,min);
                    ShowString(1,4,1,0);
                  }
      
              if(!toggle)
              {
                  sprintf(Text,"  :%02d",min);
                  ShowString(1,4,1,0);
              }

            break;
            
            
            case 2:

              if(Q>donus)
                  {
                    min++;
                    Q=donus;
                    if(min>=60)min=0;
                  }

              if(Q<donus)
                  {
                    min--;
                    if(min>=60)min=59;
                    Q=donus;
                  }

              if(toggle)
                  {
                    sprintf(Text,"%02d:%02d",hr,min);
                    ShowString(1,4,1,0);
                  }
      
              if(!toggle)
              {
                  sprintf(Text,"%02d:  ",hr);
                  ShowString(1,4,1,0);
              }
              
            break;

            case 3:

              clear_display(0);
              yarim_saniye=0;
              while(yarim_saniye<3)
              {
              sprintf(Text , "OK!");
              ShowString(7,2,2,0);
              }
              s=0;
              setTime(hr, min, s, am_pm, hr_format);  
              //setDate(dy, dt, mt, yr);
              clear_display(0);
              ayar=4;
              
            break;

            case 4:
              
              MenuCikis=0;
              MenuNo=0;
              ayar=0;
              Q=0;
              donus=0;
              
            break;
        
        }    //Switch sonu
  
  }    //MenuCikis sonu
return;

}  //Saat_ayar_menusu sonu

/**********************************Alarm Ayar Menüsü*********************************/
void alarm_ayar_menusu()
{
  eepromdaki_degerleri_oku();

  while(MenuCikis)
  {
      enkoder_oku();

      if(!input(encoder_switch))
        {
            ayar++;
            yarim_saniye=0;
            while(yarim_saniye<2);
            if(ayar>4)ayar=0;
            Q=donus;
            toggle=1;
            sure_sayac=0;
        }

      switch (ayar)
        {
            case 1:

                if(Q>donus)
                  {
                    alarm_saatleri[MenuNo-2]++;
                    if(alarm_saatleri[MenuNo-2]>=24)alarm_saatleri[MenuNo-2]=0;
                    Q=donus;
                  }
  
              if(Q<donus)
                  {
                    alarm_saatleri[MenuNo-2]--;
                    if(alarm_saatleri[MenuNo-2]>=24)alarm_saatleri[MenuNo-2]=23;
                    Q=donus;
                  }
  
              if(toggle)
                  {
                    sprintf(Text,"%02d:%02d",alarm_saatleri[MenuNo-2],alarm_dakikalari[MenuNo-2]);
                    ShowString(1,4,1,0);
                  }
      
              if(!toggle)
              {
                  sprintf(Text,"  :%02d",alarm_dakikalari[MenuNo-2]);
                  ShowString(1,4,1,0);
              }
            break;

            case 2:
  
                if(Q>donus)
                  {
                    alarm_dakikalari[MenuNo-2]++;
                    if(alarm_dakikalari[MenuNo-2]>=60)alarm_dakikalari[MenuNo-2]=0;
                    Q=donus;
                  }
  
              if(Q<donus)
                  {
                    alarm_dakikalari[MenuNo-2]--;
                    if(alarm_dakikalari[MenuNo-2]>=60)alarm_dakikalari[MenuNo-2]=59;
                    Q=donus;
                  }
  
              if(toggle)
                  {
                    sprintf(Text,"%02d:%02d",alarm_saatleri[MenuNo-2],alarm_dakikalari[MenuNo-2]);
                    ShowString(1,4,1,0);
                  }
      
              if(!toggle)
              {
                  sprintf(Text,"%02d:  ",alarm_saatleri[MenuNo-2]);
                  ShowString(1,4,1,0);
              }

            break;

            case 3:

              clear_display(0);
              yarim_saniye=0;
              while(yarim_saniye<3)
              {
              sprintf(Text , "OK!");
              ShowString(7,2,2,0);
              }
              s=0;
              eeproma_degerleri_yaz();
              clear_display(0);
              ayar=4;
              
            break;

            case 4:
              
              MenuCikis=0;
              ayar=0;
              MenuNo=0;
              Q=0;
              donus=0;
              
            break;
        
        }    //Switch sonu            

  }    //MenuCikis sonu

}    //Alarm_ayarlari sonu

/**********************************Alarm Sure Ayar Menüsü*********************************/
void alarm_sure_menusu()
{
  while(menu)
  {
      enkoder_oku();
  
  }

}

/**********************************Eeprom Değer Okuma Menüsü*********************************/

void eepromdaki_degerleri_oku()
{
  for(int r=0;r<9;r++)
      {
        alarm_saatleri[r] = read_eeprom (r);
        delay_us(10);
        alarm_dakikalari[r] = read_eeprom(r+10);
        delay_us(10);
      }
}

/**********************************Eeprom Değer Yazma Menüsü*********************************/

void eeproma_degerleri_yaz()
{
  for(int r=0;r<9;r++)
      {
        write_eeprom(r , alarm_saatleri[r]);
        delay_us(10);
        write_eeprom(r+10 , alarm_dakikalari[r]);
        delay_us(10);
      }
}



/**********************************Enkoder Okuma Fonksiyonu*********************************/
void enkoder_oku()                                                            //Enkoder okuma fonksiyonu
{

Aux1 = Enc1;                                                                  //Enc1 değişkeni Aux1'in içerisine kopyalanır
Enc1 = input_a() & 3;                                                        //PortA girişleri okunur ve "3" rakamı ile AND işlemine sokularak Enc1 değişkenine aktarılır
//Q=donus;                                                                      //Donus değişkeni Q değişkenine kopyalanır
If ((Aux1 == 2) && (Enc1 == 3))    { donus++;}                                //Eğer enkoder'in dönüş yönü saat yönünde ise donus değişkeni "1" arttırılır
If ((Aux1 == 3) && (Enc1 == 2))    { donus--;}                                //Eğer enkoder'in dönüş yönü saat yönünün tersi ise donus değişkeni "1" eksiltilir
if(donus>=9999)donus=999;


If (Q!=donus)                                                                //Enkoder konumu eski pozisyonundan farklı ise 
{
  MenuCikis=1;
  clear_display(0);
  delay_us(50);
}

}

/**********************************P10 Panele veri basma bloğu*********************************/
void write_data(unsigned int8 row_adr)                                        //P10Display veri yazma bloğu
{
  int8 i=0,j=0;
  int8 k=3;
  while(k!=255)                                  
  {j=15-k;                                        
    for (i=0;i<4;i++)                            
    {
      spi_write(display_ram[j][row_adr]);
      j-=4;
    }
    k--;
  }
  output_high(LATCH);
  delay_cycles(2);
  output_low(LATCH);
}

Bahsi geçen kodların şu an yapması gereken ekrana sayac değerini long cinsinden yazdırmak, ekrana sadece 0003'e kadar yazdırıyor ve bu şekilde kalıyor, kesmeye giriliyor çünkü ekranda görüntü var. başka yerde sayaç içerisine değer yüklenmiyor ya da 0 yapılmıyor. Çözemedim bir türlü. Yardımcı olanlara şimdiden teşekkürler.

Edit::
Sorunu buldum arkadaşlar, yukarıda MenuCikis isminde değişkenim vardı sanırım gözden kaçırdım. değişken 1 olarak tanımlanmış başlangıçta haliyle sürekli menü içerisinde dönüyordu. Menüye girip çıkıncada otomatik olarak 0'lanıyordu program çalışıyordu. İsterlerse mod arkadaşlar silebilir ya da kalabilir. Kodları tamamlayınca buraya yüklemeyi düşünüyorum. P10 modül, DS3231,Rotary enkoder kullanılarak yapılmış bir alarmlı saattir. tamamen bitirince bütün kodlar ile yükleyeceğim.
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

M.Salim GÜLLÜCE

Acizane tavsiyem...
interrupt içinde mümkün olduğunca kod yazmaktan kaçın.
Oluşturduğun bazı flagları set yada reset yap yada bir değişkene değer ata.
Kod çalışmaya başladığında 2. bir interrupt gelmeden interrupt rutinini terkedip normal çalışmaya dönmüş olmasını sağla.