Ccs c ' de interruptların sırası veyahut önceliği

Katılım
18 Haz 2018
Mesajlar
74
Puanları
1
Konum
Selçuklu
Selamlar ben Ebubekir , Atatürk Üniversitesi 4. Sınıf Elektrik Elektronik Mühendisliği Öğrencisiyim ve bu forumda yeniyim.
CCS C ile 16f877a üzerinde çalışmaktayım. Bu PİC üzerinde çalışırken kesmelerle ilgili bir algoritma geliştirirken kullandığım kesmelerle ilgili problem yaşamaktayım. Problem ise şöyle ;
External İnterrupts ile RDA İnterrupts çeşitlerini kullanmaktayım. Bildiğiniz üzere External İnterrupts RB0 pin'ine lojik 5 V geldiğinde kesme oluşturup belirtilen etikete gitmektedir. RDA İnterrupts ise RS232 serial port üzerinden haberleşmeden sorumlu olan bir kesme çeşididir. Pic'in RX pininde lojik değişim anında kesme oluşturup etikete gidip belirtilen görevleri yerine getirmektedir. Benim Sorunum ise şu yönde. "Sisteme start verdikten sonra ilk olarak External İnterrupts tetiklemesini kullandığımda sorunsuz çalışmakta.Sonra RDA kesmesi ile kontrol sağladığımda RDA kesmemizde sorunsuz çalışıyor. Fakat RDA kesmesinden sonra tekrar External kesme için tetikleme verdiğimde herhangi bir tepki alamamaktayım. Araştırdığım kadarıyla #priority ile kesme önceliği sağlanabilmekte, bunu kullanarak External interrupts'a öncelik versemde RDA kesmesinden sonra external kesmesi çalışmıyor bi fikri olan var mı ?

BKZ: Kesme için belirlenmiş döngülere giriş esnasında kesmeleri devre dışı bırakıyorum ve her while döngüsüne girişte tekrardan aktifleştiriyorum kesmelerimi.
 
Kesme seviyesi (önceliği) "level" komutu kullanılıyordu yanlış hatırlamıyorsam.
#INT_XXX level = y

y = 0 ile 7 arasında tamsayı
0 - birinci öncelik
1 - ikinci öncelik
....
7 - sonuncu öncelik

Kod:
#INT_RDA level = 0 // birinci öncelikli kesme
#INT_EXT level = 1 // ikinci öncelikli kesme

Hiç denemedim ancak böyle olması gerekiyor.
 
Kesme seviyesi (önceliği) "level" komutu kullanılıyordu yanlış hatırlamıyorsam.
#INT_XXX level = y

y = 0 ile 7 arasında tamsayı
0 - birinci öncelik
1 - ikinci öncelik
....
7 - sonuncu öncelik

Kod:
#INT_RDA level = 0 // birinci öncelikli kesme
#INT_EXT level = 1 // ikinci öncelikli kesme

Hiç denemedim ancak böyle olması gerekiyor.
hocam ilgin için teşekkür ederim fakat ben yazdığım kadarıyla "invalid preprocessor directive" hatası alıyorum geçersiz ön işlemci yönergesi anlamına geliyor kabul etmiyor hata veriyor, sanırım bir eksiklik var.. :)
 
hocam ilgin için teşekkür ederim fakat ben yazdığım kadarıyla "invalid preprocessor directive" hatası alıyorum geçersiz ön işlemci yönergesi anlamına geliyor kabul etmiyor hata veriyor, sanırım bir eksiklik var.. :)

Sanırım bu komut bazı derleyicilerde desteklemiyor.
CCS C manual dosyasına bi göz atabilirsiniz. Yardımcı olmak isterdim ancak benim İngilizce yok malesef.

https://www.ccsinfo.com/downloads/ccs_c_manual.pdf
 
Derleyiciyle alakası yok.
16F877 de kesme önceliği yoktur,
mikrodenetleyicinin böyle bir özelliği yok.

Yaşadığın sorun ise program mantığınla ilgilidir.
En çok yapılan hata kesme içerisinde uart ile veri göndermeye veya almaya çalışmak.
Kodları görmeden her ihtimali söylemek boşa çaba sarf etmek olur.
 
Derleyiciyle alakası yok.
16F877 de kesme önceliği yoktur,
mikrodenetleyicinin böyle bir özelliği yok.

Yaşadığın sorun ise program mantığınla ilgilidir.
En çok yapılan hata kesme içerisinde uart ile veri göndermeye veya almaya çalışmak.
Kodları görmeden her ihtimali söylemek boşa çaba sarf etmek olur.
Kod:
#include <abab.h>
#include <stdio.h>
#include <stdlib.h>
#use delay(clock=4M)
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES RESERVED //Used to set the reserved FUSE bits
#FUSES NODEBUG
#include<lcd.c>
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,parity=N,stop=1)
#priority ext,rda
#int_ext
void ext_kesme(){
int y;
disable_interrupts(int_ext);
disable_interrupts(int_rda);
      y=y+1;
      if(y==1){
      output_a(0b000000);
      output_e(0b111);
      }
      if(y==2){
      output_a(0b111001);
      output_e(0b111);
      printf(lcd_putc,"\f");
                  lcd_gotoxy(8,1);
                  printf(lcd_putc,"3");
      }
      if(y==3){
      output_a(0b100100);
      output_e(0b110);
      }
      if(y==4){
      output_a(0b110000);
      output_e(0b110);
      }
      if(y==5){
      output_a(0b011001);
      output_e(0b110);
      }
      if(y==6){
      output_a(0b010010);
      output_e(0b110);
      }
      if(y==7){
      output_a(0b000010);
      output_e(0b110);
      }
      if(y==8){
      output_a(0b111000);
      output_e(0b111);
      }
      if(y==9){
      output_a(0b000000);
      output_e(0b110);
      }
      if(y==10){
      output_a(0b010000);
      output_e(0b110);
      y=0;
      }
}
#int_rda
void rda_kesme(){
char t;
disable_interrupts(int_rda);
disable_interrupts(int_ext);
                  t=getc();
                  if(t=='0'){
                  output_a(0b000000);
                  output_e(0b111);
                  printf(lcd_putc,"\f");
                  lcd_gotoxy(8,1);
                  printf(lcd_putc,"0");
                  }
                  if(t=='1'){
                  output_a(0b111001);
                  output_e(0b111);
                  printf(lcd_putc,"\f");
                  lcd_gotoxy(8,1);
                  printf(lcd_putc,"1");
                  }

}
void main(){

     
     
      lcd_init();
      printf(lcd_putc,"HOSGELDIN BABA");
      enable_interrupts(GLOBAL);
      enable_interrupts(L_TO_H);
   
      while(TRUE){
         if(input(pin_b0)==1){
         enable_interrupts(int_ext);}
         if(input(pin_c6)== 1){
         enable_interrupts(int_rda);}
      }





}
Buyrun kodlar bu şekilde..
 
Buldum:
Yukarıda bahsettiğim önceliği kullanmak için önce şu komutu kullanmanız gerekiyormuş:
Kod:
 #device HIGH_INTS = TRUE

KAYNAK: CCS C Manual - Sayfa 80

Screenshot_20201106-010552~2.png


Manuale göre "level" komutu pic24 ailesinde kullanılabiliyormuş.
Ancak araştırdığım kadarı ile yüksek öncelikli kesme için;

Kod:
#device HIGH_INTS = TRUE 
#INT_EXT fast

komutunu bir denemenizi öneririm.
 
PIC24FJ256GB gibi bir pic'e sahip olduğumda kesme önceliği tanımlaması yapabiliyormuşum demek. Tamamdır çok teşekkür ederim ilginiz için iyi günler :)
Buldum:
Yukarıda bahsettiğim önceliği kullanmak için önce şu komutu kullanmanız gerekiyormuş:
Kod:
#device HIGH_INTS = TRUE

KAYNAK: CCS C Manual - Sayfa 80

Ekli dosyayı görüntüle 68507

Manuale göre "level" komutu pic24 ailesinde kullanılabiliyormuş.
Ancak araştırdığım kadarı ile yüksek öncelikli kesme için;

Kod:
#device HIGH_INTS = TRUE
#INT_EXT fast

komutunu bir denemenizi öneririm.
 
Niye kesmeleri açıp kapatıyorsun, bu doğru bir kullanım değil.
Kesme kapatıp açmaları kaldırıp şöyle dene istersen.
Olmazsa kesme içindeki lcd işlerinide kaldırıp deneyebilirsin,
kesme içinde zaman alacak işler yapmamak lazım.

Kod:
#include <abab.h>
#include <stdio.h>
#include <stdlib.h>
#use delay(clock=4M)
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES RESERVED //Used to set the reserved FUSE bits
#FUSES NODEBUG
#include<lcd.c>
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,parity=N,stop=1)
#priority ext,rda
#int_ext
void ext_kesme(){
int y;


      y=y+1;
      if(y==1){
      output_a(0b000000);
      output_e(0b111);
      }
      if(y==2){
      output_a(0b111001);
      output_e(0b111);
      printf(lcd_putc,"\f");
                  lcd_gotoxy(8,1);
                  printf(lcd_putc,"3");
      }
      if(y==3){
      output_a(0b100100);
      output_e(0b110);
      }
      if(y==4){
      output_a(0b110000);
      output_e(0b110);
      }
      if(y==5){
      output_a(0b011001);
      output_e(0b110);
      }
      if(y==6){
      output_a(0b010010);
      output_e(0b110);
      }
      if(y==7){
      output_a(0b000010);
      output_e(0b110);
      }
      if(y==8){
      output_a(0b111000);
      output_e(0b111);
      }
      if(y==9){
      output_a(0b000000);
      output_e(0b110);
      }
      if(y==10){
      output_a(0b010000);
      output_e(0b110);
      y=0;
      }
}
#int_rda
void rda_kesme(){
char t;


                  t=getc();
                  if(t=='0'){
                  output_a(0b000000);
                  output_e(0b111);
                  printf(lcd_putc,"\f");
                  lcd_gotoxy(8,1);
                  printf(lcd_putc,"0");
                  }
                  if(t=='1'){
                  output_a(0b111001);
                  output_e(0b111);
                  printf(lcd_putc,"\f");
                  lcd_gotoxy(8,1);
                  printf(lcd_putc,"1");
                  }

}
void main(){

     
     
      lcd_init();
      printf(lcd_putc,"HOSGELDIN BABA");
      enable_interrupts(GLOBAL);
      enable_interrupts(L_TO_H);
   
      while(TRUE){

      }





}
 

Forum istatistikleri

Konular
128,189
Mesajlar
915,708
Kullanıcılar
449,957
Son üye
sezercakmak

Yeni konular

Geri
Üst