PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   dsPIC - Bộ điều khiển tín hiệu số 16-bit (http://www.picvietnam.com/forum/forumdisplay.php?f=29)
-   -   bị lỗi khi chạy thử giao tiếp UART (http://www.picvietnam.com/forum/showthread.php?t=5187)

spin 28-10-2009 11:11 AM

bị lỗi khi chạy thử giao tiếp UART
 
http://i181.photobucket.com/albums/x.../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

Trích:

Nguyên văn bởi namqn (Post 30647)
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

Trích:

Nguyên văn bởi biendt (Post 31030)
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

Trích:

Nguyên văn bởi spin (Post 31005)
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

Trích:

Nguyên văn bởi tungnh (Post 31169)
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

Code:

#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
Code:

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
Code:

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....
Trích:

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é...
Code:

while (1)

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



Múi giờ GMT. Hiện tại là 11:39 AM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam