|
Tài trợ cho PIC Vietnam |
Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC |
|
Ðiều Chỉnh | Xếp Bài |
16-05-2010, 06:13 PM | #11 |
Đệ tử 1 túi
Tham gia ngày: Jul 2009
Bài gửi: 11
: |
Interrupts disabled during call to prevent re-entrancy: (@MUL1616)
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; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// } } thay đổi nội dung bởi: namqn, 16-05-2010 lúc 08:02 PM. |
|
|