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)
-   -   Module UART trong dsPIC30F4013 (http://www.picvietnam.com/forum/showthread.php?t=3053)

gunnroses 05-11-2008 09:44 PM

Module UART trong dsPIC30F4013
 
1 Attachment(s)
Em làm mạch test như sau. Do nối nhầm chân T1In và R1OUT của max232 vào chân 15 ,16. Sau đó e cắt mạch và câu dây vào chân 25, 26(U1Tx, U1Rx). Code tương tự như trong Tut4 về UART
Code:


#include "p30f4013.h"

        _FOSC(CSW_FSCM_OFF & FRC_PLL4);                //Clock = 32 MHz
        _FWDT(WDT_OFF);
        _FBORPOR(MCLR_EN & PBOR_OFF);
        _FGS(CODE_PROT_OFF);

//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,                //cho den khi bo dem phat trong(bit TRMT=1)
                        };
                        flag = 0;
                };
        };
}

//Chuong trinh con khoi tao module UART1
void Init_UART1_Module(void) {
        U1MODE = 0x8000;                //Main I/O, 8-bit, no parity, 1 stop bit
        U1STA = 0x0400;                        //bit10=UTXEN
        U1BRG = (((8000000/38400)/16)-1);        //baud=38400 bps @ ;clock=32,Fcy = 8 MHz
}

//Chuong trinh con khoi tao Timer 1, tran sau moi 1 giay o muc xung 8 Mips
void Init_TMR1(void) {
        TMR1 = 0;                        //Xoa so dem trong TMR1
        PR1 = 0x7A12;                //Nguong tran la 1 giay tuong ung voi clock = 32 MHz
        _T1IF = 0;                        //Xoa co ngat cua Timer 1
        T1CON = 0x8030;                //Dung fcy lam clock, prescale = 1:256
        _T1IE = 1;                        //Cho phep ngat khi Timer 1 tran
}

//Chuong trinh xu ly ngat Timer 1
void _ISR _T1Interrupt(void) {
        _T1IF = 0;                        //Xoa co ngat
        flag = 1;                        //Bat co cho phep xuat chuoi ky tu
}

Em sử dụng phần mềm Terminal thì chỉ nhận được những ký tư : øÉÎ@ÃÈÁÏA@
Khi sờ tay vào chân Tx thì các nhận được các ký tự linh tinh khác.
Không biêt có phải do mạch bị nhiều hay k? và cách giải quyết thế nào?

namqn 05-11-2008 11:01 PM

Bạn đã xem luồng này chưa:
http://www.picvietnam.com/forum/showthread.php?t=326

Theo các phiên bản datasheet mới nhất (DS70138E, DS70138F) của dsPIC30F4013 thì FRC chạy ở 7.37 MHz. Bạn cần sửa lại giá trị 8000000 thành 7372800 trong chương trình con khởi tạo module UART.

Thân,

gunnroses 05-11-2008 11:17 PM

Vâng. Rất chuẩn. Em truyền chính xác rồi. Cám ơn anh nhiều lắm.Cho em hỏi nếu không khai báo chuỗi trong không gian PSV thì sửa code thế nào???

namqn 05-11-2008 11:51 PM

Trích:

Nguyên văn bởi gunnroses (Post 20144)
Vâng. Rất chuẩn. Em truyền chính xác rồi. Cám ơn anh nhiều lắm.Cho em hỏi nếu không khai báo chuỗi trong không gian PSV thì sửa code thế nào???

Nếu bạn muốn dùng một bộ đệm trong RAM để lưu chuỗi thì cứ dùng các biến array, chẳng hạn:
Code:

        unsigned char Chuoi1[32];
Thân,


Múi giờ GMT. Hiện tại là 05:24 PM.

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