Chào bạn thucmetqua,
mình đã làm qua điều khiển Động cơ dùng Pic16F887, chạy OK. Lúc trước mình cũng có tình trạng bị treo như bạn, rồi sửa sao đó, quên mất rồi.
Phần nhận UẢRT bạn dùng ngắt và kết thúc chuỗi ký tự gửi từ máy tính bằng 1 ký tự nào đó.
Vd bạn gởi tốc độ 1500 rpm và ký tự "e" để báo kết thúc, thì sẽ gửi chuổi 1500e
Đây là đoạn code mẫu phần ngắt UẢRT:
Code:
*****************
/////////////////////////////////////////////////////////////
//ngat UART
/////////////////////////////////////////////////////////////
if(RCIE &&RCIF)
{
T0IE=0;
TMR1IE=0;
TMR2IE=0;
INTE=0; //diable another interupts
temp1[v]=RCREG;
if (temp1[v]=='e') //neu nhan dc ky tu ket thuc chuoi
{
uart_flag=1; //co bao dc thuc thi
RCIE=0; // disable ngat uart
}
v++;
}
*****************
[U]Sau khi cờ uart_flag=1; bạn cho lệnh chạy hàm đổi sang số: [/U]
*****************
double String2Num(char *str)
{
double x = 0;
double powel;
unsigned char count = 0 , dot_position = 0;
unsigned char i;
unsigned char buf[20];
unsigned char *ptemp;
ptemp = buf; //con tro den buffer
while( *str != 'e')
{
*ptemp = *str - 0x30;
if( *str == '.') dot_position = count;
ptemp++;
str++;
count++;
}
if( dot_position == 0) dot_position = count; //so nguyen hoan toan
//tinh tong phan nguyen
powel = 1;
for(i = 1 ; i <= dot_position ; i++)
{
x += buf[dot_position-i]*powel;
powel *= 10;
}
//tinh tong phan thap phan
powel = 0.1;
for( i = dot_position + 1 ; i < count ; i++)
{
x += buf[i]*powel;
powel *= 0.1;
}
return x;
}
*****************
Hàm này dùng chuyển dc số thập phân luôn. Để trường hợp bạn gửi Kipd.
*****************
(Trong này mình có dùng 1 số nội dung (bản quyền
) tham khảo từ bạn bè)
*****************
Chúc bạn thành công.