Bir kesmeyi başka bir kesme ile kesmek !!!

Başlatan nixar_x, 21 Haziran 2007, 02:52:33

nixar_x

Merhaba Arkadaşlar

CCS de seri portla ilgili bazı işlemler yapmak istiyorum. Bu yüzden kabaca bir devre oluşturup aşağıdaki gibi bir deneme kodu yazdım. Kodda şunu istiyorum; Normal bir şekilde ledler yanıp sönerken, int_ext ile dışardan bir kesme geldiğinde ledler daha hızlı yanıp sönsün. Ve bu durum seri porttan bir karakter (mesela 'A') gelene kadar devam etsin. Yani int_ext kesme rutini int_rda kesmesi ile bir nevi iptal edilsin ve pic resetlensin istiyorum. Ama yazdığım kodda bir türlü seri porttan veri gelmiyo gibi. Yani int_rda rutini hiç çalışmıyor. Bu konularda daha yeniyim işin içinden çıkamadım yardımcı olursanız sevinirim..

Kolay Gelsin....



#include <16F628.h> 
#use delay(clock=4000000) 
#fuses XT, NOWDT, NOPROTECT, PUT 
#use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B1) 

void delay_seconds(int n) {      //n saniyelik gecikme yapar... 
     for ( ; n!=0; n--) 
     delay_ms( 1000 ); 
} 
#use fast_io(B) 

///////////////////////////////////////////////////////////////////////////////////////////// 
#int_EXT 
void ihlal() {

 printf("Ihlal var alarmi durdurmak ici A'ya basin");
 
while(1)
{
output_high(PIN_B3);   // ihlal oldu flashlar hızlı yanıp sonuyoo
delay_ms(250);
output_low(PIN_B3);
delay_ms(250);

}
 
     
} 


#int_rda
void durdur()
{
char c;
c = getc();
if(c == 'A')  
  output_low(PIN_A5);  // pic i resetlemek icin(MCLR ucu)
}
  





//////////////////////////////////////////////////////////////////////////////////////////// 
void main(void) { 

     ext_int_edge( H_TO_L ); 
     enable_interrupts(INT_EXT); 
     enable_interrupts(INT_RDA);
     enable_interrupts(global);
                                  //programın başında kesmeler aktif edilmeli

    
     SET_TRIS_B(0xE1);  //1234 çıkış 567 giriş 0 kesme_girişi 
     output_B(0x00); 
     
         do{ 
         
         output_high(PIN_B3);
         delay_seconds(2);
         output_low(PIN_B3);
         delay_seconds(2);
         
     }while(1); 
}

MURSEL

merhaba @nixar_x
sanırım kesme içinde kesme oluşmuyor  aklımda şu şekilde bilgi var
bir kesme oluştugunda  sanırım  global biti 0 oluyor ve hiçbir interuba izin verilmiyor taki interuptan cıkasıya kadar  ama aslında senin sorunun o değil ve buna dikakt et hiç bence hiç bizaman intrup içinde sürekli döngülü biçimde bişeyleri kontrol etme  int içindde  bir degişkeni degiştir  ana programda onu kontrol ederek bişeyler yapmaya calış
burdada sanırım bişeyleri unuttun gibi ne olabilir beklemicegin  bişey basmak istedigin 'A' büyük o  caps lock tuşuna bas evlat sonra 'A' ya bas
ilk uygulamamda sorunum olmuştu  ama rasgele  caps lock basınca durumu fark ettim altta da nedenini acıklıyor zaten
#int_rda 
void durdur() 
{ 
char c; 
c = getc(); 
if(c == 'A')  
  output_low(PIN_A5);  // pic i resetlemek icin(MCLR ucu) 
}



  bi dene bakalım :roll:  :roll:  
a nın ascı hex degeri=97   A nın ascı hex degeri= 65
#int_rda
void durdur()
{
int c;              // degişti int oldu
c = getc();
if(c == 65)     // degişti 65 oldu unutma caps locka  bas
 output_low(PIN_A5);  // pic i resetlemek icin(MCLR ucu)
}
arkadaşım birde bu linki incele ascı degerler filan var umarım işini görür
https://www.picproje.org/index.php/topic,15571 selametle a.e.o

MURSEL

@ nixar_x  yukarıdakinlere dikkat et fakat   asıl hata kodunu buldum
SET_TRIS_B(0xE1);  //1234 çıkış 567 giriş 0 kesme_girişi
işte bu komut senni int_rda kesmene izin verme z neden vermez picin rx ini giriş tx ini cıkış yapman lazım kardeş şöle :roll:
SET_TRIS_B(0x03);  //
 bunları denenedikten sonra  tekrar yap   ben biraz daha farklı sekilde uyarladım en sadece seklinde buyur

birde pici kendi bacagıyla resetleme  cünkü dogru bir yol değil 18 serisinde komutla resetleniyor ama oda mantıklı değil program algoritmasını  biraz düzenli olursa her döngünün içinden break; cıkıp bu kadar az komutla başa hemen dönersin
#include <16F628.h> 
#use delay(clock=4000000) 
#fuses XT, NOWDT, NOPROTECT, PUT 
#use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B1) 
long x=250;

/////////////////////////////////////////////////////////////////////7
#use fast_io(b) 
#int_EXT 
void ihlal() { 

 printf("\fIhlal var alarmi durdurmak ici A'ya basin"); 
  
x=50;    // normal seviyenin 4 kat hızlı   
}
////////////////////////////////////////////////////////////////7
#int_rda 
void durdur(void) 
{ 
int c; 
c = getc();
while(1)
{
if(c==65)   // A karekterine basıncaya kadar   yavaşlamaz A nn hex karşılıgı  65 dir :roll: 
   {
x=250; // normal  seviyeye ayarla
break;   //ve while döngüsnden cık  cıkmassa ben gelir cıkartırım
   }
 break;  // farklı bi tusa basarsada cık 
}
} 
  ////////////////////////////////////////////////////////////////
void main(void) { 

     ext_int_edge( L_TO_H ); 
     enable_interrupts(INT_EXT); 
     enable_interrupts(INT_RDA); 
     enable_interrupts(global); 
                                  //programın başında kesmeler aktif edilmeli 

    
     SET_TRIS_B(0x03);  //
     output_B(0x00); 
      
         do{ 
          
         output_high(PIN_B3); 
         delay_ms(x); 
         output_low(PIN_B3); 
         delay_ms(x); 
          
     }while(1); 
}

al bakalım  :roll: http://dosya.cc/microcelll.rar.html  selametle  a.e.o

bigbey

eğer 1. interrupt oluştuğunda o işi yaparken 2. bir interrupt değerlendirmek istersen ASM kodu ile BSF   INTCON,GIE  komutu ile diğer kurulu olan interrupt'ları da değerlendirebilirsin.
TA6R

MURSEL

o zaman bizde 1 int oluştuugnda
ccs de
enable_interrupts(global);

 yazarsak    diger interrrupt larıda intreupt içinde kullanammızı olanak saglayacaktır
ÖRN;
#int_rda 
void durdur(void) 
{
 enable_interrupts(global);  //[B]İLK BAŞTA bu komutu yazarsaak saglıklı olur ;[/B]int c; 
c = getc(); 
while(1) 
{ 
if(c==65)   // A karekterine basıncaya kadar   yavaşlamaz A nn hex karşılıgı  65 dir :roll: 
   { 
x=250; // normal  seviyeye ayarla 
break;   //ve while döngüsnden cık  cıkmassa ben gelir cıkartırım 
   } 
 break;  // farklı bi tusa basarsada cık 
} 
}

bilgilendirdiginiz iin teşekkürler @bigbey
arkadasım @nixar_x ama sen programda bunu yapmana gerek yok zaten
dedigim gibi  inttupts içinde sürekli döngüyle  bir karekter beklemek  ana programda işlem yapan komutların çalışmasını engelleyecektir bu  yüzden  hız ayarlama vb gibi sorunların cıkıcaktır

nixar_x

Öncelikle ilgilendiğin için çok teşekkür ederim @Mursel. Dediğin gibi rx ve tx in koşullamasında hata yapmışım. Ayrıca kesme içinde gereksiz bir döngü kurmak da mantıksız olmuş. :) Ama bahsettiğin düzeltmeleri gayet iyi anladım. Sağolasın. Dün gece boyu bunu düşünmüştüm yaaa. Bu kodu asıl yapacağım iş için sadece deneme amaçlı yazmıştım ve anladığım iyi oldu.

Son olarak #int_rda kesmesinin içinde while döngüsü kurmanın bir avantajı var mı? Çünkü kod;

#int_rda
void durdur(void)
{
char c;
c = getc();
if(c=='A')  
x=250;
}

şeklinde yazılınca da aynı şekilde çalışıyor. Acaba döngüyü kasıtlı mı koydun merak ettim. İlgilendiğin için tekrar teşekkürler....


Kolay Gelsin..

MURSEL

nixar_x  kardeş döngü yok orada klavteden tuşa basınca hemen kesme olusuyor ve o tusun degerini degişkene yüklüyorum ve diyorum bastıgı tuş  a ise  sunu yap  değilsede canı sagolsun diyip tekara ana programa dönüyor taki  yeni bir tuşa bassa yine kesmeye gider eger bastıgı yuş  a ise  x normal hız degerini yükleyip ana programa tekrar dönüyor yani anlıacan döngü filan yok sürekli oalark
  kolay gelsin takılırsan burdayım :roll:

nixar_x

Eyvallah abi anladım. Döngü olmadığını fark ettim ben de. Zaten onun için sordum acaba farklı bişey mi düşündü diye. Meğersem durum sadece yiğit ve yoğurt yeme farklılığından kaynaklanıyomuş ;) ....


Şimdi asıl işe başlıyorum. Yardımınıza ihtiyacım kesin olur. Şimdiden sağolun. Hade herkese kolay geleee....