PDA

View Full Version : bị lỗi khi chạy thử giao tiếp UART


spin
28-10-2009, 11:11 AM
http://i181.photobucket.com/albums/x89/spin_hut/uarterror.jpg
code:
/************************************************** *****************************
; viet lai Vidu4-1.c cua anh Nam bang C30 de chay tren mot dsPIC *
; Chuong trinh thuc hien viec sau: Xuat chuoi ky tu 'Xin chao!' ra cong *
; RS232 *
;************************************************* ******************************
#include "p33FJ256GP710.h"

//Cac prototype cho cac chuong trinh con
void Init_TMR1(void);
void Init_UART1_Module(void);

//Bang hang so trong ROM
const unsigned char __attribute__ ((space(psv), address (0x0200)))
Chuoi1[] = "Xin chao! \0";

//Cac bien toan cuc
unsigned char flag, idx;

//------------------------------------------------------------------------------
//Chuong trinh chinh
int main(void)
{
// Init_TMR1(); //Khoi tao Timer 1
Init_UART1_Module(); //Khoi tao module UART1
_PSV=1;
PSVPAG = __builtin_psvpage(Chuoi1);
flag = 0; //Xoa co bao het thoi gian cho
while (1)
{
if (flag)
{ //Cho den khi het thoi gian cho
idx = 0;
while (Chuoi1[idx])
{ //Neu chua het chuoi thi
U1TXREG = Chuoi1[idx++]; //Xuat tiep 1 ky tu
while (!U1STAbits.TRMT); //Cho den khi truyen xong ky tu
};
flag = 0;
};
};
}

//Chuong trinh con khoi tao module UART1
void Init_UART1_Module(void)
{
U2MODEbits.STSEL = 0; //Main I/O, 8-bit, no parity, 1 stop bit
U2STAbits.UTXEN = 1; // Enable UART Tx
U1BRG = (((8000000/38400)/16)-1); //38400 bps @ Fcy = 8 MHz
}

mong anh chị giúp đỡ

namqn
28-10-2009, 11:52 AM
Bạn dùng dsPIC33F, với bảng vectơ ngắt dài hơn so với dsPIC30F. Địa chỉ đầu tiên dành cho chương trình ứng dụng đối với dsPIC33F là 0x0200, trùng với địa chỉ mà bạn đang dùng cho chuỗi Chuoi1[]. Do đó, bạn nên chỉnh lại địa chỉ 0x0200 thành một giá trị đủ lớn để có chỗ cho code của chương trình.

Thân,

spin
28-10-2009, 03:29 PM
Bạn dùng dsPIC33F, với bảng vectơ ngắt dài hơn so với dsPIC30F. Địa chỉ đầu tiên dành cho chương trình ứng dụng đối với dsPIC33F là 0x0200, trùng với địa chỉ mà bạn đang dùng cho chuỗi Chuoi1[]. Do đó, bạn nên chỉnh lại địa chỉ 0x0200 thành một giá trị đủ lớn để có chỗ cho code của chương trình.

Thân,

em đã sửa lại address (0x0200)-->address (0xF000)

BUILT successful

dùng 1 chuyển đổi USB-to-serial Port (com7) đã setup các thông số đầy đủ cho Hyper 38400>>8-bit>>1 stop bit nhưng hiển thị trên Hyper Terminal mà không thấy gì hết ạ.
mong anh chỉ giúp ạ

spin
09-11-2009, 08:38 AM
anh namqn giúp em với.. sửa mãi mà nó vẫn vậy.

code:

#include "p33FJ256GP710.h"

_FOSC(FCKSM_CSECMD & OSCIOFNC_OFF & POSCMD_XT);
// Clock Switching is enabled and Fail Safe Clock Monitor is disabled
// OSC2 Pin Function: OSC2 is Clock Output
// Primary Oscillator Mode: XT Crystanl
_FWDT(FWDTEN_OFF); //Turn off WatchDog Timer
_FGS(GCP_OFF); //Turn off code protect
_FPOR(FPWRT_PWR1); //Turn off power up timer
//Cac prototype cho cac chuong trinh con
void Init_TMR1(void);
void Init_UART1_Module(void);

//Bang hang so trong ROM
const unsigned char __attribute__ ((space(psv), address (0xF000)))
Chuoi1[] = "Xin chao! \0";

//Cac bien toan cuc
unsigned char idx;

//------------------------------------------------------------------------------
//Chuong trinh chinh
int main(void)
{
CLKDIVbits.PLLPOST=0; // N1=2
CLKDIVbits.PLLPRE=0; // N2=2
Init_UART1_Module(); //Khoi tao module UART1
_PSV=1;
PSVPAG = __builtin_psvpage(Chuoi1);

while (1)
{

idx = 0;
while (Chuoi1[idx])
{ //Neu chua het chuoi thi
U1TXREG = Chuoi1[idx++]; //Xuat tiep 1 ky tu
while (!U1STAbits.TRMT); //Cho den khi truyen xong ky tu
};

};

}

//Chuong trinh con khoi tao module UART1
void Init_UART1_Module(void)
{
U2MODEbits.STSEL = 0; //Main I/O, 8-bit, no parity, 1 stop bit
U2STAbits.UTXEN = 1; // Enable UART Tx
U1BRG = (((4000000/9600)/16)-1); //9600 bps @ Fcy = 4 MHz

}

biendt
09-11-2009, 08:58 PM
còn code của em không hiểu sao nó cũng không tuyền được dữ liệu lên phần mền giao tiếp công com là Terminal .Làm thế nào để bit được là cổng Com đã nhận được chip?
code của em :


//------------------------------------ConFig cho DsPic-------------------
_FOSC(CSW_FSCM_OFF & FRC_PLL4);
_FWDT(WDT_OFF);
_FBORPOR(PBOR_OFF & MCLR_EN & PWMxL_ACT_HI & PWMxH_ACT_HI);
_FGS(CODE_PROT_OFF);
//------------------------------------------------ -----------------------
unsigned int t=100;
void Init_UART1_Module(void) {
U1MODE = 0x8000; //Main I/O, 8-bit, khong co parity, 1 stop bit
U1STA = 0x0400; //bit10=UTXEN
U1BRG = (((8000000/38400)/16)-1); //38400 bps @ Fcy = 8 MHz
}
int main()
{

Init_UART1_Module();

while(1)
{


while (!U1STAbits.TRMT); //Cho den khi bo dem phat trong
t=U1TXREG;



}
}

mtuankct
11-11-2009, 10:15 PM
Để kiểm tra công com còn hoạt động hay không thì nối chân TX và RX lại với nhau rồi truyền thử bằng terminal nếu nhận được là vẫn ổn.
Mình đã từng làm một số chương trình nhỏ về UART theo mình nếu chương trình của bạn bị lỗi thì nên tìm một chương trình mẫu có sắn trên mạng về nạp thử để kiểm tra xem có lỗi phần cứng không. Nếu ok thì đem só sánh với chương trình của bạn để tìm chỗ sai.
Mình nghĩ đây là một cách học tốt, anh Nam và mọi người chắc không có nhiều time để ngồi đọc code từng người tìm giúp chỗ sai được

tungnh
12-11-2009, 09:18 AM
còn code của em không hiểu sao nó cũng không tuyền được dữ liệu lên phần mền giao tiếp công com là Terminal .Làm thế nào để bit được là cổng Com đã nhận được chip?
code của em :


//------------------------------------ConFig cho DsPic-------------------
_FOSC(CSW_FSCM_OFF & FRC_PLL4);
_FWDT(WDT_OFF);
_FBORPOR(PBOR_OFF & MCLR_EN & PWMxL_ACT_HI & PWMxH_ACT_HI);
_FGS(CODE_PROT_OFF);
//------------------------------------------------ -----------------------
unsigned int t=100;
void Init_UART1_Module(void) {
U1MODE = 0x8000; //Main I/O, 8-bit, khong co parity, 1 stop bit
U1STA = 0x0400; //bit10=UTXEN
U1BRG = (((8000000/38400)/16)-1); //38400 bps @ Fcy = 8 MHz
}
int main()
{

Init_UART1_Module();

while(1)
{


while (!U1STAbits.TRMT); //Cho den khi bo dem phat trong
t=U1TXREG;



}
}

code sai, U1TXREG = t;

tungnh
12-11-2009, 09:25 AM
anh namqn giúp em với.. sửa mãi mà nó vẫn vậy.

code:

#include "p33FJ256GP710.h"

_FOSC(FCKSM_CSECMD & OSCIOFNC_OFF & POSCMD_XT);
// Clock Switching is enabled and Fail Safe Clock Monitor is disabled
// OSC2 Pin Function: OSC2 is Clock Output
// Primary Oscillator Mode: XT Crystanl
_FWDT(FWDTEN_OFF); //Turn off WatchDog Timer
_FGS(GCP_OFF); //Turn off code protect
_FPOR(FPWRT_PWR1); //Turn off power up timer
//Cac prototype cho cac chuong trinh con
void Init_TMR1(void);
void Init_UART1_Module(void);

//Bang hang so trong ROM
const unsigned char __attribute__ ((space(psv), address (0xF000)))
Chuoi1[] = "Xin chao! \0";

//Cac bien toan cuc
unsigned char idx;

//------------------------------------------------------------------------------
//Chuong trinh chinh
int main(void)
{
CLKDIVbits.PLLPOST=0; // N1=2
CLKDIVbits.PLLPRE=0; // N2=2
Init_UART1_Module(); //Khoi tao module UART1
_PSV=1;
PSVPAG = __builtin_psvpage(Chuoi1);

while (1)
{

idx = 0;
while (Chuoi1[idx])
{ //Neu chua het chuoi thi
U1TXREG = Chuoi1[idx++]; //Xuat tiep 1 ky tu
while (!U1STAbits.TRMT); //Cho den khi truyen xong ky tu
};

};

}

//Chuong trinh con khoi tao module UART1
void Init_UART1_Module(void)
{
U2MODEbits.STSEL = 0; //Main I/O, 8-bit, no parity, 1 stop bit
U2STAbits.UTXEN = 1; // Enable UART Tx
U1BRG = (((4000000/9600)/16)-1); //9600 bps @ Fcy = 4 MHz

}

xem lại tấc độ truyền nhận trên chip và terminal trên máy tính xem thế nào, và kiểm tra như ban mtuankct đã nói.

tkpro
13-11-2009, 10:06 PM
xem lại tấc độ truyền nhận trên chip và terminal trên máy tính xem thế nào, và kiểm tra như ban mtuankct đã nói.

có thể kiểm tra bằng cách nối luôn các chân Tx và Rx phía trước Max232!

tahi
25-11-2009, 05:23 PM
#include <p33FJ256GP710.h>
#include "uart.h"
//CASE4: Star-up using internal FRC, after that switching to Primary Oscillator with PLL
_FOSCSEL(FNOSC_FRC);// Select Internal FRC at POR
_FOSC(FCKSM_CSECMD & OSCIOFNC_OFF & POSCMD_XT);// Enable Clock Switching and Configure POSC in XT mode
_FWDT(FWDTEN_OFF);// Watchdog Timer Enabled/disabled by user software
_FGS(GCP_OFF); //Code protect off
//************************************************
void Oscillatior_configuration(void)
{
//Fcy=Fosc/2 (always), Fin/N1 = (0~8MHz), Fin/N1*M = (100~200MHz), Fin/N1*M/N2 = (12.5~80MHz)
//M(2->253) , N1(2->33), N2(2,4,8)
//If using PLL: Fosc= Fin*M/(N1*N2)
//For primary oscillator, xt mode with PLL. Fin = 8MHz, =>Fosc = 80MHz, Fcy = 40Mips
// Configure PLL prescaler, PLL postscaler, PLL divisor
PLLFBD = 38; /* M=30 */
CLKDIVbits.PLLPOST = 0; /* N1=2 */
CLKDIVbits.PLLPRE = 0; /* N2=2 */
// Initiate Clock Switch to Primary Oscillator with PLL (NOSC = 0b011)
__builtin_write_OSCCONH(0x03);
__builtin_write_OSCCONL(0x01);
// Wait for Clock switch to occur
while (OSCCONbits.COSC != 0b011); //COSC update new value from NOSC when switching successful
// Wait for PLL to lock
while(OSCCONbits.LOCK!=1) {};
}
int main()
{ int i;
//configure crystal
Oscillatior_configuration();
// UART1 initialization
OpenUART1(0xC000,0x0550,0x80); //status chua dung lam'
//Send string
putsUART1((unsigned int*)"\n\rThis is a simple UART1 test\n\r");
for(i=0;i<=9;i++)
{
while(BusyUART1()); //Wait
WriteUART1(0x30+i); //Send character
}
CloseUART1();
}

chưa test nhưng chắc ko lỗi gì, nếu phần cứng chuẩn thì chỉ còn phần mềm..có oscilloscope thì cắm thẳng vào chân max232 xem tín hiệu thế nào, nếu có tín hiệu ra..thì có thể cổng com của máy tính có vấn đề, nếu ko có tín hiệu ra thì configure UART sai hoặc pin của vdk tèo rồi.
nhớ include uart.h nhé...để nó còn biết các hàm putsUART1 và WriteUART1

khuyến mãi thêm hàm đểu , gửi số kiểu int lên terminal

putiUART1(unsigned int number)
{ char buf[5];
sprintf(buf,"%u",number);
putsUART1((unsigned int*)buf);
}

nhớ include cái string.h vào nhé...

spin
27-11-2009, 11:08 AM
tình hình là thế nầy ạ:
1. em thử cổng COM: nối 2 chân 2,3 vào--> truyền nhận ở terminal rất tốt, gõ cái j là ra cái đó --> vậy là ok đúng không ạ
2. em thử mạch RS232: em nhấc 2 chân truyền nhận (nối với VDK) thì kết quả --> truyền nhận ở terminal cũng rất tốt
vậy lỗi tại VDK??
3. em dùng oscilloscope đo ở chân OUT của chip kết quả là có xung xuất sau mỗi thời gian ngắt timer, cho trễ ở timer dài thì xuất xung chậm, mà ngắn thì cũng xuất nhanh.

ah có điều là cứ báo Unable to open COM7. please check your port setting

em set các thông số cho terminal là : 9600 data bits:8, parity: none, stop bits: 1, Flow control: none

huhuhuhu... làm thế nào đây ạ... hic..

tahi
29-11-2009, 09:07 PM
à thì ra bạn dùng com ảo, chắc là dùng máy tính xách tay rồi. T cũng đã bị trường hợp code chạy ngon với com 1 đến 4, còn từ 5 đến 9 là héo, o biết làm sao

U1BRG = (((4000000/9600)/16)-1); //9600 bps @ Fcy = 4 MHz

Sửa lại dòng này thử xem, đặt lại U1BRG = 0x19 (=25) ,nhiều khi do complier......Nhưng nếu sai tốc độ, tớ nghĩ vẫn nhận được nhưng ra giá trị linh tinh....

3. em dùng oscilloscope đo ở chân OUT của chip kết quả là có xung xuất sau mỗi thời gian ngắt timer, cho trễ ở timer dài thì xuất xung chậm, mà ngắn thì cũng xuất nhanh.

Bạn điều khiển I/O bình thường hả. Giờ co transmit liên tục,rồi đo ở chân của Max232 nối với cổng Rs232 xem có xung ra ko nhé...

while (1)
{
//Neu chua het chuoi thi
U1TXREG = 0x30; //Xuat tiep 1 ky tu
while (!U1STAbits.TRMT); //Cho den khi truyen xong ky tu
}