Em đang viết chương trình nhận dữ liệu từ máy tính xuống để điều khiển cái động cơ. Nhưng sau khi biên dịch thì xuất hiện cảnh báo sau:
Interrupts disabled during call to prevent re-entrancy: (@MUL1616).
Em có tham khảo các nguồn thì được biết là do trong hàm ngắt và ngoài hàm ngắt em sử dụng lặp lại 1 hàm hay 1 biến gì đó, nhưng em tìm mãi không thấy sai chỗ nào. Mong các pro chỉ giúp. Em cám ơn nhìu.
Chương trình của em như sau:
(Sorry vì em không biết đưa code vào trong ô code ^^!)
Code:
#include <16f877a.h>
#include <def_877a.h>
#include <stdlib.h>
#fuses NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#include <lcd_lib_4bit.c>
/*#define enter RA2
#define s_t RA3
#define f_r RA5
#define up RE0
#define down RE1
*/
void ht(int16 a);
//void ht1(int16 a);
void init();
void pid();
void nhapheso();
//void up_down();
int16 count, tocdo, C, temp, temp1, k, tocdodat ;
signed int16 e2=0;
signed int16 e1=0;
int16 e_sum;
int16 e_del;
int16 duty;
float Kp=0;
float Ki=0;
float Kd=0;
int flag=0;
float u, T=0.01;
unsigned char text[30], text2[5] ;
unsigned char a1[5], dem=0, i=0, j=0,i1;
#INT_RDA
void Receive_isr()
{
text[dem]=getc();
if(text[dem]=='@') //kiem tra dieu kien ket thuc
{
flag =1; //ket thuc nhan, bat co bao
dem=0;
}
else dem++;
}
#INT_EXT
void ngatR0() {
count++;//set_timer0(0);
}
#int_timer1
void Timer11_isr() { // Ham duoc goi khi TImer1 tran (65535->0)
// Chu ky trich mau 0.01
set_timer1(53036);
tocdo= 30*(count + get_timer0());
// printf("%ld\t",tocdo);
count = 0;
set_timer0(0);
}
void main(){
init();
lcd_putcmd(0x01);
while(true){
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
pid();
if(RC1==0) set_PWM1_duty(duty);
if(RC1==1) set_PWM1_duty(1023 - duty);
lcd_putcmd(0x80);
ht(tocdo);
printf("n%4Lu",tocdo);
//lcd_putchar("hi");
}
}
void init()
{
lcd_init();
nhapheso();
disable_interrupts(int_rda);
disable_interrupts(global);
setup_timer_0 (RTCC_DIV_1|RTCC_EXT_L_TO_H); // Timer0 is Counter
setup_timer_1(T1_INTERNAL | T1_DIV_BY_4);
setup_ccp1(CCP_PWM);
setup_timer_2(T2_DIV_BY_4, 255, 1);//4*4*256*1/20000000=204.8us=4.8khz
set_timer0(0);
set_timer1(53036);
enable_interrupts(INT_RTCC);
enable_interrupts(int_timer1);
enable_interrupts(int_ext);
ext_int_edge(L_TO_H);
enable_interrupts(GLOBAL);
lcd_putcmd(0x80);
count=0;
trisc=0;
trisd=0;
trisa=255;
trisb=1;
RC1=0;
if(C==1) RC1=1;
If(C==0) RC1=0;
}
void pid(){
e2 = tocdodat - tocdo;
e_sum += e2;
// e_del = e2 - e1;
// e1 = e2;
u = u + Kp*e2 + Ki*e_sum*T;
if (u>24){
u=24;
e_sum -=e2;
}
if (u<0){
u = 0;
e_sum -=e2;
}
duty = u*1023/24;
}
void ht(long a) {
int nghin,tram,chuc,dvi;
nghin=a/1000;
tram=(a%1000)/100;
chuc=(a%100)/10;
dvi=(a%10);
lcd_putchar(nghin+48);
lcd_putchar(tram+48);
lcd_putchar(chuc+48);
lcd_putchar(dvi+48);
}
void nhapheso(){
lcd_putchar("nhap tu PC");
enable_interrupts(int_rda);
enable_interrupts(GLOBAL);
while(!flag) ;
if(flag){
//if ((strchr(text,'T')) && (strrchr(text, '@')))
text2[0] = text[0];
text2[1] = text[1];
text2[2] = text[2];
text2[3] = text[3];
text2[4] = text[4];
tocdodat = atol(text2);
//----------------------------------------
while (text[i] != 'P')
i++;
while (text[j] != 'I')
j++;
i1 = i;
temp = j - i;
for (i = 0; i < temp; i++)
a1[i] = text[i1 + i + 1];
Kp = atof(a1);
printf("P%f",Kp);
delay_ms(100);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
i = j;
while (text[j] != 'D')
j++;
i1 = i;
temp = j - i;
for (i = 0; i < temp; i++)
a1[i] = text[i1 + i + 1];
Ki = atof(a1);
printf("I%f",Ki);
delay_ms(100);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
i = j;
while (text[j] != 'C')
j++;
i1 = i;
temp = j - i;
for (i = 0; i < temp; i++)
a1[i] = text[i1 + i + 1];
Kd = atof(a1);
printf("D%f",Kd);
delay_ms(100);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
i = j;
while (text[j] != '@')
j++;
i1 = i;
temp = j - i;
for (i = 0; i < temp; i++)
a1[i] = text[i1 + i + 1];
C = atol(a1);
printf("C%Lu",C);
flag=0;
i=0; j=0;
dem=0;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
}
}