program içinde kesme aktif etme.

Başlatan subram, 10 Ocak 2013, 14:02:00

subram

daha önce basicte yazığım bir programda karşılaşmıştım aynı sorun! ile. Şimdi de CCS C de. programın başında config ayarları yaptık. sonra ana programda daha önce aktif etmediğim herhangi bir kesmeyi aktif ettiğimde ilginin kesmenin flag biti aktifmiş gibi davranıyor ve kesmeyi aktif ettiğim an kesmeye gidiyor. Bu durunmun banklar arası geçiş ile alakası var mıdır?
http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz

ferit06

Kesmeden çıkmadan flag bitini sıfırlıyormusun? 

subram

daha önce hiç kesmeye  girmiyorumki! kesmeyi "ilk" aktif ettiğim an(program içinde) kesmenin flag biti aktif oluyor.
http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz

CoşkuN

Bayrağın bir olması kesmenin açık olmasına bağlı değil, kesmeler pasif de olsa bayrağı bir yapan bir şart oluşuyor demek ki. Peki bayrağı sıfıra çekince yine mi bir oluyor? Hangi bayrak bu tabi buna göre de yorum yapılabilir.

serhat1990

#4
Alıntı yapılan: subram - 10 Ocak 2013, 14:02:00
daha önce basicte yazığım bir programda karşılaşmıştım aynı sorun! ile. Şimdi de CCS C de. programın başında config ayarları yaptık. sonra ana programda daha önce aktif etmediğim herhangi bir kesmeyi aktif ettiğimde ilginin kesmenin flag biti aktifmiş gibi davranıyor ve kesmeyi aktif ettiğim an kesmeye gidiyor. Bu durunmun banklar arası geçiş ile alakası var mıdır?

Yok Hocam , bunun ile bir alakası olmaz ... Programı koyarsanız hatırladığım kadarı ile yardımcı olmaya çalışırım . Kesme fonksiyonlarını tanımladınızmı ?

Aşağıda yapmış olduğum int kesme ile ilgili komut seti var Hocam . Üniversite yıllarındaki klasörden buldum :)

/* Serhat PicProje */

#include <16f877a.h>          //16f877 kullanılıyor.
#use delay (clock=4000000)
#use fast_io(B)
#use fast_io(D)
#define baslat pin_b7
int zaman=200;
int a=0;
// dıs kesme rb0 kesmesi bölümü //

  #int_ext    //dış external rb0 kesmesi
  void diskesme()        //kesme gerceklesince yapılacak işlemler bu fonksiyonun içinde tanımlanır
    {
      for(a=0;a<10;a++)    //a=0 dan a=10 olana kadar fonksiyon içindeki işlemleri 10 kere tekrarla sonra cık
         {
             output_d(0b00000001);delay_ms(zaman);    // d0 deki ledi yak 200 ms bekle
             output_d(0b00000010);delay_ms(zaman);    //d1 deki ledi yak 200 ms bekle
         }
    }

   void main()             //ana fonksiyon
   
   {
      set_tris_b(0xff);output_b(0x00);       //b portu giriş olarak ayarlandı ve sıfırlandı
      set_tris_d(0x00);output_d(0x00);       //d portu giriş olarak ayarlandı ve sıfırlandı
      ext_int_edge(H_TO_L);                  //ınt _Ext kesmesinin düşen kenarda aktif olacagını belirtir
      enable_interrupts(INT_EXT);            //ınt_ext kesmesini aktif yapar
      enable_interrupts(GLOBAL);             //aktif edilen kesmelere izin verir
      
      while(true)
      {
         if(input(baslat)==1)             // baslat butonuna basılımı ?
         {
         while(1){
            output_d(0x01);delay_ms(1000);   //d0 daki ledi yak 1 sn bekle
            output_d(0x02);delay_ms(1000);     //d1 deki ledi yak 1 sn bekle
                 }
           }
      
   
      }
   }

ferit06

Coskun hocanın mesajına göre yeniden sorayım kesmeyi aktif etmeden kesme flag bitini sıfırlıyormusun?


subram

basicde yaptığımda kesmeyi aktif ettikten hemen "sonra"  flag temizlemiştim sorun çözülmüştü.  merak ettiğim bu flaglar program ilk çalıştığında "normal" şartlarda sorun yaratmıyorken progrma içinde açtığımızda neden sorun yapıyor.

ben sorunumu çözdüm ama nedenini merak ediyorum. bilmediğim bir olay çünkü
http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz

ferit06

Program içinde açtığınızda sorun olması, aktif etmeden önce yapılan işlemler nedeniyle flag=1 olmuştur. Hangi kesmeyi kullanıdığınız ile ilgilidir.

subram

CCS C de RB0 kesmesini kullandım programda öyle çok büyük bir olay yok. butona(başka bacakta) basılıp basılmadığını kontrol ediyor. buton basılmışsa RB0 aktif oluyor. bu  durumda nasıl etkilenir ki? benim kafamda halen banklar arası geçiş olayı var ama acaba....? genel yapı

config komutları

   if(!input(pin_a0))   
      i++;


 kesme aktif etme 
    
ana program
....
   
http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz

serhat1990

Alıntı yapılan: subram - 10 Ocak 2013, 16:13:33
CCS C de RB0 kesmesini kullandım programda öyle çok büyük bir olay yok. butona(başka bacakta) basılıp basılmadığını kontrol ediyor. buton basılmışsa RB0 aktif oluyor. bu  durumda nasıl etkilenir ki? benim kafamda halen banklar arası geçiş olayı var ama acaba....? genel yapı

config komutları

   if(!input(pin_a0))   
      i++;


 kesme aktif etme 
    
ana program
....
   


Hocam , interrupt flag temizlerseniz düzeliyor ... Neden böyle olduğunu görmek için ccs c 'de fonksiyonları incelemek lazım .

#include <16f877a.h>          //16f877 kullanılıyor.
#FUSES XT
#use delay (clock=4000000)
#use fast_io(B)
#use fast_io(D)
#define baslat pin_b7
int zaman=200;
int a=0;
// dıs kesme rb0 kesmesi bölümü //

  #int_ext    //dış external rb0 kesmesi
  void diskesme()        //kesme gerceklesince yapılacak işlemler bu fonksiyonun içinde tanımlanır
    {
      for(a=0;a<10;a++)    //a=0 dan a=10 olana kadar fonksiyon içindeki işlemleri 10 kere tekrarla sonra cık
         {
             output_d(0b00000001);delay_ms(zaman);    // d0 deki ledi yak 200 ms bekle
             output_d(0b00000000);delay_ms(zaman);    //d1 deki ledi yak 200 ms bekle
         }
    }

   void main()             //ana fonksiyon
   
   {
      set_tris_b(0xff);output_b(0x00);       //b portu giriş olarak ayarlandı ve sıfırlandı
      set_tris_d(0x00);output_d(0x00);       //d portu giriş olarak ayarlandı ve sıfırlandı
      ext_int_edge(H_TO_L);                  //ınt _Ext kesmesinin düşen kenarda aktif olacagını belirtir
      
      while(true)
      {
         if(input(baslat)==1)             // baslat butonuna basılımı ?
         {
            clear_interrupt(int_ext);
            enable_interrupts(INT_EXT);            //ınt_ext kesmesini aktif yapar
            enable_interrupts(GLOBAL);             //aktif edilen kesmelere izin verir   
            output_d(0x02);delay_ms(1000);     //d1 deki ledi yak 1 sn bekle
         }
       
     }
      
   
      
   }