#INT_RDA level = 0 // birinci öncelikli kesme
#INT_EXT level = 1 // ikinci öncelikli kesme
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..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..
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.
#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);}
}
}
#device HIGH_INTS = TRUE
#device HIGH_INTS = TRUE
#INT_EXT fast
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.
#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){
}
}
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?