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)
-   -   dsPIC Tutorial 4-Module UART và I2C (http://www.picvietnam.com/forum/showthread.php?t=623)

namqn 11-11-2009 10:27 PM

Trích:

Nguyên văn bởi harakiri (Post 31121)
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,

harakiri 12-11-2009 12:22 AM

Ý 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 05-12-2009 02:00 PM

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

greenfield 20-12-2009 08:18 PM

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

namqn 20-12-2009 08:59 PM

Trích:

Nguyên văn bởi greenfield (Post 32402)
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,

greenfield 21-12-2009 09:12 PM

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!

namqn 21-12-2009 10:30 PM

Trích:

Nguyên văn bởi greenfield (Post 32425)
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,

greenfield 21-12-2009 11:25 PM

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

namqn 22-12-2009 07:37 AM

Trích:

Nguyên văn bởi greenfield (Post 32429)
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,

tahi 15-01-2010 11:33 AM

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


shinosuke 25-05-2010 05:36 PM

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

channan 20-09-2010 11:37 AM

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;

channan 20-09-2010 11:58 AM

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 !

HoanNguyenHuu 09-04-2012 12:42 PM

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 15-04-2012 12:41 AM

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


Múi giờ GMT. Hiện tại là 06:03 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