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 Tìm Kiếm Bài Trong Ngày Ðánh Dấu Ðã Ðọc 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

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 11-11-2009, 10:27 PM   #61
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi harakiri View Post
Giả sử em nhận được về chip một chuỗi các kí tự " T a1 a2 a3 a4 a5"(a1,a2,a3... là số thập phân có 2 hoặc 3 chữ số nhưng bây giờ nó đang được xem là một chuỗi ký tự). Bây giờ em muốn tách chuỗi ký tự này thành một chuỗi a1 ,a2 ,a3....với a1,a2,a3 được xem là số. Liệu có hàm nào làm được điều này không?
Chuỗi ký tự khác chuỗi số của bạn ở chỗ nào?

Nếu tôi đoán không lầm, bạn muốn chuyển các tham số a1 a2 ... thành các giá trị số sau khi nhận được từ bên ngoài. Trong trường hợp này (giả sử bạn đang dùng C30), mỗi chuỗi ai có thể được dùng làm đối số cho hàm C chuẩn atoi() (sẽ cần #include <stdlib.h>). Đề nghị tham khảo tài liệu hướng dẫn !16-bit Language Tools Libraries" (DS51456) của Microchip.

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-11-2009, 12:22 AM   #62
harakiri
Đệ tử 1 túi
 
Tham gia ngày: Sep 2007
Bài gửi: 12
:
Ý của em là khi em gọi thành phần thứ 2 trong mảng, nó sẽ xuất ra cho em là a1(không kể khoảng trắng là ký tự) và a1,a2 ta không biết trước bao nhiêu ký tự.
Em dúng khoảng trắng để nhận biết nó, cuối cùng đã nhận được.
Cám ơn anh đã quan tâm trả lời giùm em.
harakiri vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-12-2009, 02:00 PM   #63
harakiri
Đệ tử 1 túi
 
Tham gia ngày: Sep 2007
Bài gửi: 12
:
Code:
#include <p33FJ256GP710.h>
#include <stdlib.h> 
_FOSCSEL(FNOSC_FRC);			
_FOSC(FCKSM_CSECMD & OSCIOFNC_OFF  & POSCMD_NONE);  

#define TRUE	1
#define FALSE	0
unsigned char S2Flag, S3Flag, S4Flag, S5Flag;

unsigned int on_off ,time_out,j,t,i,x1,k;
unsigned char input[50];
unsigned char getc();
void putc(unsigned char value);
unsigned char* GetWord(unsigned char a[], int size, int index);
/***********************************************************/
void __attribute__((__interrupt__)) _U2RXInterrupt(void)
{	
input[0]=getc();
j=0;
if(input[0]=='T'||input[0]=='S')
	{
		while(input[j]!='r')
		{
			j++;
			input[j]=getc();
		
		}
		
		U2STAbits.OERR = 0;
        IFS1bits.U2RXIF = 0;    //Clear the UART1 transmitter interrupt flag
		on_off=1;	
	}	        	
}
/************************************************************/
void __attribute__((__interrupt__)) _U1RXInterrupt(void)
{	
input[0]=getc();
j=0;
if(input[0]=='T'||input[0]=='S')
	{
		while(input[j]!='r')
		{
			j++;
			input[j]=getc();
		
		}
		
		U1STAbits.OERR = 0;
        IFS0bits.U1RXIF = 0;    //Clear the UART1 transmitter interrupt flag
		on_off=1;	
	}	        	
}
/**************************************************************/
void __attribute__ ((interrupt, no_auto_psv)) _U2TXInterrupt(void) {
	IFS1bits.U2TXIF = 0;
	
}
/**************************************************************/
void __attribute__ ((interrupt, no_auto_psv)) _U1TXInterrupt(void) {
	IFS0bits.U1TXIF = 0;
}
/***************************************************************/
void InitClock() {
	PLLFBD = 38;	// M = 40
	CLKDIVbits.PLLPOST = 0;	// N1 = 2
	CLKDIVbits.PLLPRE = 0;	// N2 = 2
	OSCTUN = 0;//khong su dung oscillator tuning register
	RCONbits.SWDTEN = 0; // disabe watch dog timer

// Clock switch to incorporate PLL
	__builtin_write_OSCCONH(0x01);		// Initiate Clock Switch to FRC with PLL (NOSC=0b001)
										// luu y : doc thanh ghi OSCCON de thay
	__builtin_write_OSCCONL(0x01);		// Start clock switching
										//ghi lan luot vao 8 bit cao va thap cua OSCCON
	while (OSCCONbits.COSC != 0b001);	// Wait for Clock switch to occur	

	while(OSCCONbits.LOCK != 1) {};		//pll lock status bit
}
/****************************************************************/
void Init_UART1 (void)
{	
	int i;
	U1MODE = 0x0000;        //Clear UART1 registers
    U1STA = 0x0000;

	U1BRG=20;			//set baud rate

	U1MODEbits.PDSEL = 0;	//8bits, no parity
	U1MODEbits.STSEL = 0; 	//1stop bit
	U1MODEbits.ABAUD = 0; 	//No autobaud
	U1MODEbits.BRGH = 0;	//Low speed

	U1STAbits.UTXISEL0 = 0; 
	U1STAbits.UTXISEL1 = 1;
	U1STAbits.URXISEL = 0;

	IEC0bits.U1TXIE = 1; // Enable UART Tx interrupt
	IEC0bits.U1RXIE = 1;
	U1MODEbits.UARTEN = 1; // Enable UART
	IFS0bits.U1RXIF = 0;
	IFS0bits.U1TXIF = 0;  
	U1STAbits.UTXEN = 1; // Enable UART Tx
	/* wait at least 104 usec (1/9600) before sending first char*/ 
	for(i = 0; i < 4160; i++)
	{
		 Nop();
	}

}
/**********************************************************************/
void Init_UART2 (void)
{	
	int i;
	U2MODE = 0x0000;        //Clear UART1 registers
    U2STA = 0x0000;

	U2BRG=20;			//set baud rate

	U2MODEbits.PDSEL = 0;	//8bits, no parity
	U2MODEbits.STSEL = 0; 	//1stop bit
	U2MODEbits.ABAUD = 0; 	//No autobaud
	U2MODEbits.BRGH = 0;	//Low speed

	U2STAbits.UTXISEL0 = 0; 
	U2STAbits.UTXISEL1 = 1;
	U2STAbits.URXISEL = 0;

	IEC1bits.U2TXIE = 1; // Enable UART Tx interrupt
	IEC1bits.U2RXIE = 1;
	U2MODEbits.UARTEN = 1; // Enable UART
	IFS1bits.U2RXIF = 0;
	IFS1bits.U2TXIF = 0;  
	U2STAbits.UTXEN = 1; // Enable UART Tx
	/* wait at least 104 usec (1/9600) before sending first char*/ 
	for(i = 0; i < 4160; i++)
	{
		 Nop();
	}

}
/*****************************************************************************/
void InitPorts() {
	//ODCFbits.ODCF3 = 1;
	//ODCFbits.ODCF5 = 1;
	// S2 (portB Pin 3, chosen as trigger for sending ... to UART)
	// S3 (portB Pin 2, chosen as trigger for sending ... to UART)
	// S4 (portB Pin 1, chosen as trigger for sending ... to UART)
	// S5 (portB Pin 0, chosen as trigger for sending ... to UART)
	AD1PCFGLbits.PCFG0 = 1;      // This is important.  RB0 is muxxed with AN0,
								 // So we need to config the pin as DIGITAL
	AD1PCFGLbits.PCFG1 = 1;
	AD1PCFGLbits.PCFG2 = 1;  
	AD1PCFGLbits.PCFG3 = 1;  
	AD2PCFGLbits.PCFG0 = 1;      // This is important.  RB0 is muxxed with AN0,
								 // So we need to config the pin as DIGITAL
	AD2PCFGLbits.PCFG1 = 1;
	AD2PCFGLbits.PCFG2 = 1;  
	AD2PCFGLbits.PCFG3 = 1;  
	TRISB = 0x000F; //B0&B1&B2&B3 is input  

	S2Flag = S3Flag = S4Flag = S5Flag = 0;	// Some Debounce Flags
}
/*******************************************************************************/


/*************************************************************************/

int main(void) {
	InitPorts();
	InitClock();	// This is the PLL settings
	Init_TMR1();
	Init_UART1();	// Initialize UART1 for 9600,8,N,1 TX/RX
	Init_UART2();	// Initialize UART1 for 9600,8,N,1 TX/RX


	while (1)               
	        {	
				
	          	if (on_off == 1)      
	            {  
				 on_off = 0; 
				// Chuong trinh xuat ra thanh phan thu 1 cua chuoi
					int index = 1; 
					int i=0;
				    int j=0; 
				    int wordIndex = 0;
					unsigned char a[5];
				    while(i<50 || a[i] != 'r')
				     {
				   	  if(input[i] == ' ')
				      {
				      	wordIndex++;
				         i++;
				      }
				      if(wordIndex == index)
				      {
				   		 a[j] = input[i];
				         j++;
				      }
				      i++;
				     }
					   a[j] = ' ';

					i=0;
					while (a[i] != ' ')
					{ 
						int x = atoi(a);
						delay_ms(10);
						x1 = x;
						//putc(a[i]);
						i++;
						
					}
		// Chuong trinh xuat ra thanh phan thu 7 cua chuoi
					int index1 = 7; 
					int i1=0;
				    int j1=0; 
				    int wordIndex1 = 0;
					unsigned char a1[5];
				    while(i1<50 || a1[i1] != 'r')
				     {
				   	  if(input[i1] == ' ')
				      {
				      	wordIndex1++;
				         i1++;
				      }
				      if(wordIndex1 == index1)
				      {
				   		 a1[j1] = input[i1];
				         j1++;
				      }
				      i1++;
				     }
					   a1[j1] = ' ';

					i1=0;
					while (a1[i1] != ' ')
					{ 
						int y = atoi(a1);
						delay_ms(100);
						delay_ms(100);
						delay_ms(100);
						t=y;
						//putc(a1[i1]);
						i1++;
						
					}
					k= t/2 + x1*2;
					putc(k); 
					
				}    
			}

}

 /*******************************************************************************************
//Function: void Init_TMR1(void)
//Input:	None
//Output:	Setup Parameter to Timer1 Operate
//		TMR1 use for delay
*******************************************************************************************/
void Init_TMR1(void)
{
	T1CONbits.TON=0;		//Stop Timer1
	T1CONbits.TGATE=0;		//Disable Gated Timer mode
	T1CONbits.TCKPS=0;		//Select Prescale 1:1
	T1CONbits.TCS=0;
	_T1IF=0;
	_T1IE=1;
	TMR1=0;
}
/*******************************************************************************************
//Function: void delay_us(unsigned int n)
//Input:	n: n us to delay
//Output:	Delay n us
*******************************************************************************************/
void delay_us(unsigned int n)
{
	PR1=n*40;
	time_out=0;
	T1CONbits.TON=1;
	while(time_out==0);
	T1CONbits.TON = 0;
	TMR1=0;
}
/*******************************************************************************************
//Function: void delay_ms(unsigned int n)
//Input:	n: n ms to delay
//Output:	Delay n ms
*******************************************************************************************/
void delay_ms(unsigned int n)
{
	unsigned int i;
	i=0;
	while(i<=n)
	{ 
		delay_us(1000);
		i++;	
	}
}
void _ISR _T1Interrupt(void) 
{
	_T1IF = 0;			//Clear Timer1 flag
	time_out = 1;
}

/*************************************************************************/

void putc(unsigned char value)
{
  while (U2STAbits.UTXBF);
	U2TXREG=value;
}

/****************************************************************************/

unsigned char getc()
{
	
		while (!U2STAbits.URXDA);
			
		return U2RXREG;
}


Đây là đoạn chương trình em định dung 2 module uart một lúc,nhưng khi chạy thử,gửi từ uart2 thì có lúc gửi, lúc không, em đoán là hàm ngat có vấn đề. Mong mọi người xem giúp

thay đổi nội dung bởi: namqn, 05-12-2009 lúc 02:54 PM. Lý do: định dạng code
harakiri vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-12-2009, 08:18 PM   #64
greenfield
Đệ tử 6 túi
 
Tham gia ngày: Jul 2009
Bài gửi: 152
:
Anh Nam ơi cho em hỏi 2 dòng lệnh này dùng để làm gì ạ?
_PSV=1;
PSVPAG = __builtin_psvpage(Chuoi1);
greenfield vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-12-2009, 08:59 PM   #65
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi greenfield View Post
Anh Nam ơi cho em hỏi 2 dòng lệnh này dùng để làm gì ạ?
_PSV=1;
PSVPAG = __builtin_psvpage(Chuoi1);
_PSV = 1; dùng để cho phép sử dụng chế độ PSV. Còn dòng thứ hai thiết lập địa chỉ trang PSV cho thích hợp để có thể truy xuất chuỗi Chuoi1.

Về chế độ PSV, bạn tìm kiếm trong diễn đàn với từ khóa "PSV", đã có bạn hỏi về PSV và tôi đã trả lời.

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 21-12-2009, 09:12 PM   #66
greenfield
Đệ tử 6 túi
 
Tham gia ngày: Jul 2009
Bài gửi: 152
:
Anh Nam cho em hởi cái này. Sao em cài 2 module UART1 và UART2. Cụ thể em lấy U1RX nhận dữ liệu từ cổng COM và U2TX để gửi dữ liệu nhận được về máy tính mà không được. Mong anh Nam chỉ giúp em!
greenfield vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 21-12-2009, 10:30 PM   #67
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi greenfield View Post
Anh Nam cho em hởi cái này. Sao em cài 2 module UART1 và UART2. Cụ thể em lấy U1RX nhận dữ liệu từ cổng COM và U2TX để gửi dữ liệu nhận được về máy tính mà không được. Mong anh Nam chỉ giúp em!
Không hiểu câu hỏi của bạn: Cổng COM nối vào U1RX là thiết bị gì?

Sơ đồ mạch ứng dụng của bạn ra sao? Code liên quan đến 2 module UART như thế nào?

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 21-12-2009, 11:25 PM   #68
greenfield
Đệ tử 6 túi
 
Tham gia ngày: Jul 2009
Bài gửi: 152
:
Cụ thể em dùng dsPIC30F4013 dùng UART1 nhận dữ liệu từ máy tính và trả ký tự nhận được về máy tính qua module UART2 thử được không. Ý của em là dùng một lúc 2 module UART của dsPIC30F4013 đó mà. Em dùng Hyper Terminal của Win
greenfield vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-12-2009, 07:37 AM   #69
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi greenfield View Post
Cụ thể em dùng dsPIC30F4013 dùng UART1 nhận dữ liệu từ máy tính và trả ký tự nhận được về máy tính qua module UART2 thử được không. Ý của em là dùng một lúc 2 module UART của dsPIC30F4013 đó mà. Em dùng Hyper Terminal của Win
Vậy bạn kết nối phần cứng ra sao? Và code liên quan đến 2 module như thế nào? (Đừng nên để người muốn giúp bạn phải lặp lại những câu hỏi thu thập thông tin nhiều lần).

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-01-2010, 11:33 AM   #70
tahi
Đệ tử 4 túi
 
Tham gia ngày: Mar 2009
Bài gửi: 64
:
dsPIC33 ko nhận được uart.
phần cứng dspic33fj128 nối với max232 (loại smd cấp nguồn 3v3)
truyển từ dspic lên pc thì ngon
nhưng truyền từ pc xuống dspic thì ngỏm. Có xung rất đẹp đến chân nhận của dspic

chân truyền nhận đã được remappable.
Khi cấu hình loopback thì đường truyền 1 chuỗi ký tự !!!!!!!!!. Để loopback thì bít U1STAbits.URXDA có được bật lên, nếu để ngắt thì cũng có nhảy vào ngắt nhận

nhưng nếu ko dùng loopback thì bít U1STAbits.URXDA ko bật lên, mà cũng chẳng vào ngắt, mặc dù có xung ở nhân nhận
Code:
//Remap
//UART1 TX1 RP3-3 RPOR1 ; RX1 RP2 RPINR18
	_RP3R = 0x03; 			//RP3 is UART1 output	RB3	
	_U1RXR = 0x02;			//RP2 is uart1 input  	RB2
Code:
/* check for receive errors */
		if(U1STAbits.FERR == 1)
		{
			lcd_putchar('?');
		}
		/* must clear the overrun error to keep uart receiving */
		if(U1STAbits.OERR == 1)
		{
			U1STAbits.OERR = 0;
			lcd_putchar('?');
		}
		/* get the data */
		while(U1STAbits.URXDA)
		{
			ReceivedChar = U1RXREG;
                        _LATA10 =~ _LATA10;
                }
tahi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 25-05-2010, 05:36 PM   #71
shinosuke
Nhập môn đệ tử
 
Tham gia ngày: Mar 2010
Bài gửi: 3
:
Em đang thử làm giao tiếp RS232 qua 1 bộ wireless. Truyền nhận có dây lên terminal thì ok, nhưng cứ cắm bộ không dây vào thì không có tín hiệu. Có ai biết nguyên nhân có thể là do đâu không ạ ?
-----
Đi lại dây ở cổng COM lại chạy tốt rồi

thay đổi nội dung bởi: shinosuke, 26-05-2010 lúc 04:03 PM.
shinosuke vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-09-2010, 11:37 AM   #72
channan
Nhập môn đệ tử
 
Tham gia ngày: Nov 2009
Bài gửi: 3
:
dsPIC30 UART module

Chào các bạn

Mẹo vặt để tính BRG có làm tron 1 số sau dấu chấm thập phân
vd: Sau khi tính BRG = 12.1 làm tròn 12
BRG = 15.5 làm tròn 16
//define in UART header file

#define XTAL (7372800UL) //ETT board has 7.7328Mhz XT crystal
#define PLL (16) //Clock source = Primary XT and PLL_16
#define FOSC (XTAL*PLL)
#define FCY ((FOSC)/4) //Intrustion frequency

#define BAUD_RATE 115200UL //UART baud rate
//UART1 brg value
U1BRG = ((FCY / BAUD_RATE) + 8) / 16;

thay đổi nội dung bởi: channan, 20-09-2010 lúc 11:42 AM. Lý do: space in text look messy !!
channan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-09-2010, 11:58 AM   #73
channan
Nhập môn đệ tử
 
Tham gia ngày: Nov 2009
Bài gửi: 3
:
Chào bạn

Cho tôi hỏi ngoài đề 1 chút:
Làm sao viết source code ở trong các bài post lên vậy?
Cẩm ơn !
channan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 09-04-2012, 12:42 PM   #74
HoanNguyenHuu
Nhập môn đệ tử
 
Tham gia ngày: Jul 2011
Bài gửi: 3
:
Chào các bác!!!
Hiện tại em có đang làm về truyền thông RS485 theo giao thức modbus để truyền thông giữa bộ điều khiển slave (dựa trên VĐK DSPIC30F4011) và phần mềm modbusmaster.
Có bác nào làm về vấn đề này, hay có code mẫu cũng như tài liệu có thể share giúp mình được không??? em đang gặp rất nhiều khó khăn với đề tài này.
Cảm ơn các bác nhiều!!!
HoanNguyenHuu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-04-2012, 12:41 AM   #75
HoanNguyenHuu
Nhập môn đệ tử
 
Tham gia ngày: Jul 2011
Bài gửi: 3
:
Đợi mãi không thấy bác nào lên tiếng, nản quá?
HoanNguyenHuu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời

Tags
dspic30f i2c, dspic30f uart, i2c, rtc

Ðiều Chỉnh
Xếp Bài

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

Similar Threads
Ðề tài Người gửi Chuyên mục Trả lời Bài mới
dsPIC Tutorial 3-Đọc ngõ vào và giao tiếp LCD namqn dsPIC - Bộ điều khiển tín hiệu số 16-bit 92 19-02-2017 11:15 PM
dsPIC Tutorial 2-Các kỹ thuật cơ bản namqn dsPIC - Bộ điều khiển tín hiệu số 16-bit 33 17-10-2013 11:09 PM
dsPIC Tutorial 5-Module ADC và MCPWM namqn dsPIC - Bộ điều khiển tín hiệu số 16-bit 83 12-09-2013 10:33 PM
dsPIC Tutorial 1-Tạo và biên dịch một project (ASM30) namqn dsPIC - Bộ điều khiển tín hiệu số 16-bit 16 22-08-2012 12:35 AM
Alternate UART pin??? alexjp dsPIC - Bộ điều khiển tín hiệu số 16-bit 1 02-05-2006 06:26 PM


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


Đượ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