nhận dữ liệu 16 bit qua UART trên PIC 16F887

thucmetqua

Trứng gà
mình đang điều khiển động cơ với tốc độ đặt (có tầm từ 0-2000) được gửi từ máy tính mà pic thì 8 bit, là 1 string,do C# gửi xuống (giả sử 1234 thì tách thành kí tự "1" "2" "3" "4" rồi lần lượt gửi xuống) mà viết mỗi lần nhận đc 8 bit thì đưa vô 1 phần tử trong mảng rồi tổng hợp lại thì mối khi send xuống thì nó đứng lun, ko chạy cả chương trình đã viết trong main. bạn nào có gợi ý gì thì giúp với
 

thucmetqua

Trứng gà
tình hình là mình đã làm đc theo cách trên là chi số cần gửi ví dụ như 1234 thành 1,2,3,4 trên c# để gửi rồi cộng chúng lại có trọng số ở PIC nhưng đôi khi vẫn chưa chính xác và code khá dài bạn nào có thể cho mình bít cách xử lý dữ chuỗi cần gửi trên c# và xử lý của Pic thế nào cho ngắn gọn ko.
Thanks.
 
với chuổi số của bạn là 4 chữ số vậy bạn có thể gửi nó 2 lần, không nhất thiết phải gửi 4 lần. bạn có thể đưa code của bạn viết lên để mọi người biết cách viết của bạn thì mới có thể góp ý được. chứ bạn cứ nói xuông vậy thì ai biết bạn viết sao mà góp ý được.
 

thucmetqua

Trứng gà
đây là code mình nhận Uart:

#INT_RDA
void Receive_isr()
{

c=RCREG;
RCREG=0x00;
c=c-0x30;
i++;
}

void UART_receive()
{
if(i>=3)
{
i=0;
value=c[0]+c[1]*10+c[2]*100+c[3]*1000;
LCD_putcmd(0xc0);
LCD_display(value);
}
}

Mong được bạn góp ý
 
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 :D) tham khảo từ bạn bè)
*****************
Chúc bạn thành công.
 
Top