22-09-2015, 09:11 AM
|
#82
|
Nhập môn đệ tử
Tham gia ngày: Nov 2014
Bài gửi: 9
:
|
Trích:
Nguyên văn bởi tungbka
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;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
}
}
|
Không ai trả lời vấn đề này sao???
|
|
|