![]() |
|
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 |
|
|
|
|
#1 |
|
Đệ 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. |
|
|
|
|
|
#2 |
|
Trưởng lão PIC bang
|
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
|
|
|
|
|
#3 |
|
Nhập môn đệ tử
Tham gia ngày: May 2012
Bài gửi: 6
: |
Thiết lập I/O của dspic30f4013
Em đang làm cái đồ án dùng chip dspic30f4013, bài lập trình thì ngon rùi nhưng phần khai báo vào ra để lắp nút ấn mà em chịu. Em định cho nút ấn ở port F thui vì các port khác em dùng rùi. em gửi đoạn code mong các bác chỉ giúp khai báo ở chỗ nào nhé:
/************************************************** ***************************** ; timer1.c la chuong trinh viet bang C de chay tren mot dsPIC * ; Chuong trinh thuc hien viec sau: * ; Su dung Time 1 de tao xung nhip 20ms va thoi gian duty Cryle * ************************************************** ****************************** | __________ | | | | | | | | |____| |________________________________________| <--1,5ms--> <----------------------20ms-------------------------> ; Tac gia : Luu Tuan Khanh * ; Don vi : Uneti * ; Ten tap tin : ltchuan.c * ; Ngay : 23/5/2011 * ; Phien ban : 0.01 * ; Nhung tap tin can thiet khac: p30F4013.gld, p30f4013.h * ; Cong cu duoc dung: MPLAB X IDE beta6.00.01 * ; C30 3.25 * * ------------------------------------------------------------------------------*/ #include <p30fxxxx.h> #include <timer.h> /************************************************** ****************************/ //output SERVO #define LAT_SERVO1 _LATB0 #define LAT_SERVO2 _LATB1 #define LAT_SERVO3 _LATB2 #define LAT_SERVO4 _LATB3 #define LAT_SERVO5 _LATB4 #define LAT_SERVO6 _LATB5 #define LAT_SERVO7 _LATB6 #define LAT_SERVO8 _LATB7 #define LAT_SERVO9 _LATB8 #define LAT_SERVO10 _LATC13 #define LAT_SERVO11 _LATC14 #define LAT_SERVO12 _LATD9 #define congtac1 _TRISF0 #define congtac2 _TRISF1 #define den _LATB9 /*********************Bat dau khai bao bien*************************/ unsigned long counter_servo = 1; unsigned int speed_servo[13]; //--------------------Ket thuc khai bao bien------------------------// void config_servo(void); void timer1_init(void); int goc(float goc); void __attribute__((interrupt, no_auto_psv)) _T1Interrupt(void){ IFS0bits.T1IF = 0; //truoc khi ra ngoai thi thi xoa bit _T1IF T1CONbits.TON = 1; //timer for 1us*20000=20ms //1ms=1000 thuc te xxx min //test 0.5ms - 2.4ms tuong ung voi 1-180do //Do thuc te if(++counter_servo > 2010) counter_servo = 0; if(counter_servo >= speed_servo[1] + 62) // MAX 240 LAT_SERVO1=0; // MIN 60 else LAT_SERVO1=1; // MIN 60 if(counter_servo >= speed_servo[2] + 62) // MAX 240 LAT_SERVO2=0; // MIN 60 else LAT_SERVO2=1; if(counter_servo >= speed_servo[3] + 62) // MAX 240 LAT_SERVO3=0; // MIN 60 else LAT_SERVO3=1; if(counter_servo >= speed_servo[4] + 62) // MAX 240 LAT_SERVO4=0; // MIN 60 else LAT_SERVO4=1; if(counter_servo >= speed_servo[5] + 62) // MAX 240 LAT_SERVO5=0; // MIN 60 else LAT_SERVO5=1; if(counter_servo >= speed_servo[6] + 62) // MAX 240 LAT_SERVO6=0; // MIN 60 else LAT_SERVO6=1; if(counter_servo >= speed_servo[7] + 62) // MAX 240 LAT_SERVO7=0; // MIN 60 else LAT_SERVO7=1; // MIN 60 if(counter_servo >= speed_servo[8] + 62) // MAX 240 LAT_SERVO8=0; // MIN 60 else LAT_SERVO8=1; if(counter_servo >= speed_servo[9] + 62) // MAX 240 LAT_SERVO9=0; // MIN 60 else LAT_SERVO9=1; if(counter_servo >= speed_servo[10] + 62) // MAX 240 LAT_SERVO10=0; // MIN 60 else LAT_SERVO10=1; if(counter_servo >= speed_servo[11] + 62) // MAX 240 LAT_SERVO11=0; // MIN 60 else LAT_SERVO11=1; if(counter_servo >= speed_servo[12] + 62) // MAX 240 LAT_SERVO12=0; // MIN 60 else LAT_SERVO12=1; } void config_servo(void){ ADPCFG = 0xffff; TRISB = 0x00; TRISC = 0x00; TRISD = 0x00; TRISF = 0x00; LATB = 0x00; LATC = 0x00; LATD = 0x00; LATF = 0x00; } void timer1_init(void) { config_servo(); T1CON = 0; // Timer reset T1CONbits.TSIDL = 0; //hoat dong ngay ca o che do ngu T1CONbits.TGATE = 0; //Gated time accumulation enabled(TCS must be set to ‘0’ when TGATE = 1. Reads as ‘0’ if TCS = 1) //T1CONbits.TSYNC = 0; //bit nay duoc bo qua khi bit TCS = 0; chi quan tam khi TCS = 1; IFS0bits.T1IF = 0; // Reset Timer1 interrupt flag IPC0bits.T1IP = 0b111; // Timer1 Interrupt priority level=7 // muc uu tien 7//quan trong IEC0bits.T1IE = 1; // Enable Timer1 interrupt T1CONbits.TCKPS = 0b00; // Bo chia tan so 1 : 1 TMR1 = 0x0000; PR1 = 295 ; // Ngat khi dem tran 10us //PR1 = 29491 ; // ngat khi dem tran 1ms // T = (1/Fosc)s ma Fosc = (XTFREQ * PLL) /4 // PR1 = 29.4912 * 1 * 1 cycle (33.9084201388888888888888ns) = 1 us T1CONbits.TCS = 0; // Timer1 Clock= Internal // Internal clock (FOSC/4) T1CONbits.TON = 1; // Enable Timer1 and start the counter } int goc(float goc){ float goc1 = 0; unsigned int goc2 = 0; if(goc == 0) return 0; else{ goc1 = 18 * goc; goc1 = goc1/18; goc2 = (int) goc1; }; return goc2; } |
|
|
|
|
|
#4 | |
|
Nhập môn đệ tử
Tham gia ngày: Nov 2010
Bài gửi: 2
: |
Trích:
Hi bạn,bạn muốn dùng port F để làm nút nhấn thì theo ý kiến của mình bạn nên set Port F là "TRISF = 0xff" và cấu hình port F là digital (nếu port này có chân nào là Analog,mình chưa đoc datasheet nên ko rõ). Chúc bạn thành công ! |
|
|
|
|
|
|
#5 | |
|
Nhập môn đệ tử
Tham gia ngày: Nov 2014
Bài gửi: 9
: |
Trích:
|
|
|
|
|
![]() |
|
|