RP Store Tìm linh kiện theo mã, gửi BOM nhận báo giá Gửi BOM

dsPIC Tutorial 4-Module UART và I2C

Collapse
This is a sticky topic.
X
X
 
  • Giờ
  • Show
Clear All
new posts
  • namqn
    Trưởng lão PIC bang
    • Feb 2006
    • 3020

    #61
    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

    Comment

    • harakiri
      Đệ tử 1 túi
      • Sep 2007
      • 12

      #62
      Ý 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.

      Comment

      • harakiri
        Đệ tử 1 túi
        • Sep 2007
        • 12

        #63
        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
        Last edited by namqn; 05-12-2009, 02:54 PM. Lý do: định dạng code

        Comment

        • greenfield
          Đệ tử 6 túi
          • Jul 2009
          • 152

          #64
          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);

          Comment

          • namqn
            Trưởng lão PIC bang
            • Feb 2006
            • 3020

            #65
            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

            Comment

            • greenfield
              Đệ tử 6 túi
              • Jul 2009
              • 152

              #66
              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!

              Comment

              • namqn
                Trưởng lão PIC bang
                • Feb 2006
                • 3020

                #67
                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

                Comment

                • greenfield
                  Đệ tử 6 túi
                  • Jul 2009
                  • 152

                  #68
                  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

                  Comment

                  • namqn
                    Trưởng lão PIC bang
                    • Feb 2006
                    • 3020

                    #69
                    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

                    Comment

                    • tahi
                      Đệ tử 4 túi
                      • Mar 2009
                      • 64

                      #70
                      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;
                                      }

                      Comment

                      • shinosuke
                        Nhập môn đệ tử
                        • Mar 2010
                        • 3

                        #71
                        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
                        Last edited by shinosuke; 26-05-2010, 03:03 PM.

                        Comment

                        • channan
                          Nhập môn đệ tử
                          • Nov 2009
                          • 3

                          #72
                          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;
                          Last edited by channan; 20-09-2010, 10:42 AM. Lý do: space in text look messy !!

                          Comment

                          • channan
                            Nhập môn đệ tử
                            • Nov 2009
                            • 3

                            #73
                            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 !

                            Comment

                            • HoanNguyenHuu
                              Nhập môn đệ tử
                              • Jul 2011
                              • 3

                              #74
                              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!!!

                              Comment

                              • HoanNguyenHuu
                                Nhập môn đệ tử
                                • Jul 2011
                                • 3

                                #75
                                Đợi mãi không thấy bác nào lên tiếng, nản quá?

                                Comment

                                Working...