PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > dsPIC - Bộ điều khiển tín hiệu số 16-bit

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

dsPIC - Bộ điều khiển tín hiệu số 16-bit Theo dự kiến của Microchip, vào khoảng năm 2011 dsPIC sẽ có doanh số lớn hơn PIC

 
 
Ðiều Chỉnh Xếp Bài
Prev Previous Post   Next Post Next
Old 26-06-2008, 12:33 AM   #7
hpecom
Đệ tử 2 túi
 
Tham gia ngày: Nov 2005
Bài gửi: 45
:
Dạ em đã sửa lại code.
Em thử nhiều lần thì phát hiện rằng: trong vòng lặp While() thứ 2 của hàm Main() nếu số lần truyền là số chẵn thì không bị mất dữ liệu, còn nếu số lần truyền là số lẻ thì sẽ mất ký tự cuối cùng, không biết điều này có liên quan gì đến việc cấu hình không vậy anh?

Code:
#include	<p30f4011.h>

	_FOSC(CSW_FSCM_OFF & XT_PLL4);//FRC_PLL4
	_FWDT(WDT_OFF);
	_FBORPOR(PBOR_OFF & MCLR_EN);
	_FGS(CODE_PROT_OFF);

//----------------------------------------------------------------------------
//Cac hang so cua chuong trinh (gia tri tuc thoi dung trong chuong trinh)
#define	Fcy		4000000			//Tan so thuc thi lenh (Thach anh 4MHz)
#define	baud	9600			//Toc do baud cua RS232
#define _ISR_PSV __attribute__((interrupt, auto_psv))
//----------------------------------------------------------------------------
//Cac prototype cho cac chuong trinh con
void Init_PORTS(void);
void Init_ADC10(void);
void Init_TMR1(void);
void Init_UART1(void);
//void Init_UART2(void);
//----------------------------------------------------------------------------
//Khai bao bien toan cuc
unsigned int CRC_Calc(int* pMes);

unsigned int gFlag_1,gFlag_2;
unsigned char gFwd[]={0x01,0x06,0x01,0x50,0x00,0x01,0x49,0xE7};
unsigned char gRev[]={0x01,0x06,0x01,0x50,0x00,0x02,0x09,0xE6};
unsigned char gStop[]={0x01,0x06,0x01,0x50,0x00,0x00,0x88,0x27};
unsigned char gSpe[]={0x01,0x06,0x00,0x80,0x03,0x89,0x0A};
unsigned char gRec[10]={0,1,2,3,4,5,6,7,8,9};
unsigned char gRPos=0;
unsigned char gTPos=0;
unsigned char gRCount=0;
unsigned char gCmd=0;
int gEE_Return;
//============================================================================
//CHUONG TRINH CHINH
//Kiem tra co gFlag (co bao UART1 nhan du lieu)
//Truyen ky tu nhan duoc
//============================================================================
int main(void) {
	Init_PORTS();			//Khoi tao cac cong I/O
	Init_TMR1();			//Khoi tao Timer 1
	Init_UART1();			//Khoi tao module UART1
	//Init_UART2();			//Khoi tao module UART2
	_LATE0=0;				//Cho phep nhan Data
	while (1) 
	{	if(gFlag_1)
		{	gFlag_1=0;
			_LATB0^=1;
			_LATE0=1;						//Cho phep gui Data
			
			/* Thuc hien truyen du lieu ra cong UART1
			_ Neu truyen 2n ky tu thi khong mat Data
			_ Neu truyen (2n+1) ky tu thi mat ky tu cuoi cung
			*/
			while(gTPos!=gRPos)
			{	U1TXREG = gRPos;				//
				while (!U1STAbits.TRMT);
				U1TXREG = gTPos;				//
				while (!U1STAbits.TRMT);
				U1TXREG = gRCount;				//
				while (!U1STAbits.TRMT);
				U1TXREG = gCmd;					//
				while (!U1STAbits.TRMT);
				U1TXREG = gRec[gRPos];			//
				while (!U1STAbits.TRMT);
				U1TXREG = gRec[gTPos];			//
				while (!U1STAbits.TRMT);		//
				if(++gTPos>9) gTPos=0;
			};
			_LATE0=0;						//Cho phep nhan Data
		}
	};
}
//============================================================================
//Function tinh CRC
//============================================================================
unsigned int CRC_Calc(int* pMes)
{	unsigned int mCRC_Reg=0xFFFF;
	unsigned char mHighByte;
	unsigned char mLowByte;
	return 1;	
}
//============================================================================
//Proc khoi tao cac cong I/O
//============================================================================
void Init_PORTS(void) {
	TRISB = 0x0000;			//RB0 la ngo ra
	LATD = 0;				//Xoa thanh ghi chot cong D
	TRISD = 0xFFFE;
	LATE=0;
	TRISE=0x0000;			//PortE la Digital Output
}
//============================================================================
//Proc khoi tao va setup Timer1 (Ngat sau 1S)
//============================================================================
void Init_TMR1(void) {
	TMR1 = 0;				//Xoa so dem trong TMR1
	PR1 = 0x3D09;			//Nguong tran la 1 giay (=4000000/256)
	_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
}
//============================================================================
//Proc khoi tao module UART1 
//Baud rate = 9600, 8 bit Data, no Parity, 1 bit stop
//============================================================================
void Init_UART1(void) {
	U1MODE = 0x8000;		//Main I/O, 8-bit, no parity, 1 stop bit
	//U1MODE = 0x8400;		//ALT I/O, 8-bit, no parity, 1 stop bit
	U1STA = 0x0400;			//bit10=UTXEN
	U1BRG = (((Fcy/baud)/16)-1);	//38400 bps @ Fcy = 8 MHz
	_U1RXIF = 0;
	_U1RXIE=1;
}
//============================================================================
//Proc Xu ly ngat Timer1
//============================================================================
void _ISR_PSV _T1Interrupt(void)
{	_LATD0^=1;
	_T1IF = 0;				//Xoa co ngat
}
//============================================================================
//Proc Xu ly ngat khi UART1 nhan Data
//Dung mang 10 ky tu lam bo dem (+4 ky tu bo dem cua dsPIC)
//============================================================================
void _ISR_PSV _U1RXInterrupt(void)
{	gFlag_1 = 1;
	_LATB1^=1;
	while(U1STAbits.URXDA)
	{	gRec[gRPos]=U1RXREG;
		if (++gRPos>9)	gRPos=0;
		if(++gRCount>9) gRCount=0;
	};
	_U1RXIF = 0;
}
Trong code trên em cho truyền 6 ký tự, kết quả nhận được đầy đủ nhưng giá trị nhận được không như mong muốn: Lệnh truyền thứ 5 và thứ 6 là em truyền 2 ký tự cuối cùng nhận được. Nhưng sao chương trình truyền toàn giá trị 0.
Chương trình xử lý ngắt có sai không anh?
__________________
Biết thì nói là biết,
Không biết thì nói là không biết,
..

thay đổi nội dung bởi: hpecom, 26-06-2008 lúc 12:38 AM.
hpecom vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
 


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


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


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam