View Single Post
Old 18-12-2008, 03:00 PM   #1
uydanh
Đệ tử 4 túi
 
Tham gia ngày: Jan 2007
Bài gửi: 79
:
UART của dspic30f6014a.

Em xin hỏi module uart của dspic30f6014a có điểm gì khác nhau rất rất cơ bản so với con 30f4012 trong các bài viết của anh Nam hay không? Tại vì em viết nghĩ không có gì sai nhưng nó lại không bao giờ truyền đúng được.
Chương trình em chỉ đơn giản như thế này: Truyền 1 số 8 bit lên máy tính(ở đây là số 0x31). Trên máy tính nhận và hiển thị ra lại. Em sử dụng thạch anh ngoài 7.3728M (mà có sử dụng thạch anh nội cũng sai luôn).
Chương trình trên dspic.
Code:
#include "p30f6014a.h"
        _FOSC(CSW_FSCM_OFF & XT_PLL4);		//Clock = 29.4912 MHz
	_FBORPOR(MCLR_EN & PBOR_OFF);
	_FWDT(WDT_OFF);
	_FGS(CODE_PROT_OFF);

void Init_Uart1_module(void);

int main(void){
	Init_Uart1_module();
	U1TXREG=0x31;
	while(1){};
}

void Init_Uart1_module(void){
	U1MODE = 0x8000; //Main I/O, 8-bit, no parity, 1 stop bit
	U1STA  = 0x0400; //bit10=UTXEN cho phep phat ky tu
	U1BRG  = (((7372800/9600)/16)-1);	//9600 bps @ Fcy = 29.4912 M
}
Chương trình trên không báo lỗi gì hết. Truyền rất ổn định lên máy tính nhưng ngặt nổi giá trị ổn định đó lại là giá trị sai.
Còn chương trình trên máy tính đã thử chạy rất tốt (khi nối 2 chân 2 3 cổng COM với nhau. Em đoán là do thạch anh làm tốc độ baud ko đồng bộ giữa dspic và máy tính. Nhưng lại thấy ko có gì không đồng bộ ở đây.
Chương trình trên máy tính
Code:
Private Sub Form_Load()
MSComm1.CommPort = 5 'khai bao cong COM
If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False 'Neu cong COM mo thi dong lai
End If
MSComm1.Settings = "9600,N,8,1" 'Thiet lap cac thong so truyen thong
MSComm1.RThreshold = 1 ' cu nhan duoc 2 byte thi nhay vao ngat
MSComm1.InputLen = 0 ' moi lan doc se doc toan bo vung dem
MSComm1.InBufferCount = 0 ' xoa bo dem nhan
txtreceive1.Text = ""
MSComm1.InputMode = 1 ' doc du lieu len dang binary
MSComm1.PortOpen = True
End Sub

Private Sub MSComm1_OnComm()
Dim buffer() As Byte
If MSComm1.CommEvent = comEvReceive Then
   buffer = MSComm1.Input
   txtreceive.Text = Hex(buffer(0))
End If
End Sub
Kết quả truyền số 0x31 lên máy tính thì bị "nhận nhầm" thành 0x67.
Mong mọi người giúp đỡ.
uydanh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn