这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 企业专区 » Renesas » campozeng的进程帖★基于RL78/G13的双向信息监测传送系统项目总结

共104条 6/11 |‹ 4 5 6 7 8 9 ›| 跳转至
工程师
2012-09-07 18:07:41     打赏
51楼
代碼已經發送至你郵箱

上位機程序有exe不允許發送,請自行用串口助手測試

高工
2012-09-07 19:45:35     打赏
52楼

代码可以的话发一份给我, lingsking@126.com


工程师
2012-09-07 19:53:42     打赏
53楼
萬年歷代碼已經發送至lingsking@126.com

工程师
2012-09-07 20:59:13     打赏
54楼
DMA數據傳送(AD/ADCR和UART2/RXD2)

使用DMA (Direct Memory Access) controller 可以不通過CPU就可以將外設的數據傳到Ram,或者將RAM的數據傳送到外設。

這樣就可以高速傳送大量數據,也將可以做到real-time了。

下面我們學習一下怎麼用DMA

1、我們定義兩個寄存器,把它在Ram中的地址固定下來,如下圖:

2、我們使用Applilet生成基礎代碼,首先們們定義DMA1,將AD轉換的結果傳送到ADCBuffer,設置如下,注意藍色框中部分:


3、定義DMA1,將UART2/RXD2數據傳送到RX2Buffer,設置如下,注意藍色框中部分:


4、然后生成代碼,加到我們的項目中就可以用了,是不是很簡單呢。

調用下面一些函數就可以使用了:

void DMA0_Init(void);
void DMA0_Enable(void);
void DMA0_Disable(void);
void DMA0_Hold(void);
void DMA0_Restart(void);
MD_STATUS DMA0_CheckStatus(void);
void DMA0_SoftwareTriggerOn(void);
MD_STATUS DMA0_SetData(UCHAR sfraddr, USHORT ramaddr, USHORT count);
void DMA0_UserInit(void);
__interrupt void MD_INTDMA0(void);
void DMA1_Init(void);
void DMA1_Enable(void);
void DMA1_Disable(void);
void DMA1_Hold(void);
void DMA1_Restart(void);
MD_STATUS DMA1_CheckStatus(void);
void DMA1_SoftwareTriggerOn(void);
MD_STATUS DMA1_SetData(UCHAR sfraddr, USHORT ramaddr, USHORT count);
void DMA1_UserInit(void);
__interrupt void MD_INTDMA1(void);

菜鸟
2012-09-08 22:17:15     打赏
55楼
几天没来,又有好东西了,真好

高工
2012-09-10 15:24:51     打赏
56楼

做的比我快。。。


工程师
2012-09-10 17:11:55     打赏
57楼
使用IICA0模塊讀寫EEPROM

IIC的協議就不多描述了,有興趣的朋友可以找相關資料看。

下面開始:

首選把EERPOM的SCL/SDA連接到P60/SCLA0和P61/SDAA0,把A0/A1/A2都接到GND,把EEPROM的slave址設為了0xA0

1、Applilet生成基礎代碼

首先設定MCU的工作時鐘,如下圖:


IICA0模式選擇為Single Master


IICA0設定如下圖


為了測試簡單,先把WDT關了


然后點Generate code,生成后用IAR打開*.eww文件


2、打開CG_serial_user.c文件,改一下代碼,如下圖藍色框中的代碼是我增加進去的,用于發送和接收和完成的標志位





3、打開CG_main.c文件,開始寫我們自己的代碼,如下圖,在頭部定義一此要用的寄存器,見藍色框中部份:


4、然后寫一個簡單的測試程序來測試,我現在把程序寫到main函數中,函數如下:

下面函數的功能主要是:先寫一個字節的數據到EEPROM,寫完后再把數據讀出來,如果讀出的數據與寫進的數據相等,剛把RL78/G13上的LED D2反轉(亮變滅,滅則變亮)。


void  main(void)
{
 /* Start user code. Do not edit comment generated here */
        UCHAR Status,EEAddress;
        USHORT i;
        __low_level_init();         // init. system
        EEAddress=0xA0;             // define eeprom slave address
        IICWriteCompleteFlag=0;     // if write data complete, =1
        IICReadCompleteFlag=0;      // if read data complete, =1
        PU7_bit.no7 = 1;
        PM7_bit.no7 = 0;
        P7_bit.no7=1;              //define the LED on RL78/G13 board
        for(i=0;i<50000;i++)       //delay
        {
           NOP();
        }
 while (1U)
 {
     if(IICWriteCompleteFlag==0 && IICReadCompleteFlag==0) //if idle
            {
                 IICWriteCompleteFlag=2;
                 IICWriteBuffer[0]=0x00;    //EEPROM add ,thd address where to write data
                 for(i=1;i<15;i++)
                 {
                    IICWriteBuffer[i]=i;    //the data what to write
                 }
                 /** write 2 byte data,first is address, the second byte is data**/
                 Status=IICA0_MasterSendStart(EEAddress, IICWriteBuffer, 2, 150);
                 if(Status != MD_OK)
                 {
                     IICWriteCompleteFlag=0;
                 }
            }
            else if(IICWriteCompleteFlag==1) //if write complete
            {
                IICWriteCompleteFlag=0;
                IICReadCompleteFlag=2;
                for(i=0;i<50000;i++)  //delay for eeprom to access the data
                {
                    NOP();
                }
                for(i=0;i<50000;i++)  //delay for eeprom to access the data
                {
                    NOP();
                }
                /* send address whred to read*/
                Status=IICA0_MasterSendStart(EEAddress, IICWriteBuffer, 1, 150);
                if(Status != MD_OK)
                {
                    IICReadCompleteFlag=0;
                }
                else
                {
                    for(i=0;i<50000;i++) //delay for eeprom to access the data
                    {
                        NOP();
                    }
                    while(IICWriteCompleteFlag==0); // wait write address complete
                    IICWriteCompleteFlag=0;
                    /* read out 1 byte data*/
                    Status=IICA0_MasterReceiveStart(EEAddress, IICReadBuffer, 1, 150);
                    if(Status!=MD_OK)
                    {
                        IICReadCompleteFlag=0;
                    }
                }
            }
            else if(IICReadCompleteFlag==1) //if read complete
            {
                IICReadCompleteFlag=0;
                if(IICReadBuffer[0]==IICWriteBuffer[1])
                {
                     /*if the read out data equ the data writed before*/
                    /* flash the led on the rl78/G13 board*/
                   P7 ^= 0x80;
                }
            }
            for(i=0;i<25000;i++) //delay
            {
                NOP();
            }
 }
 /* End user code. Do not edit comment generated here */
}


IICA0  EEPROM讀寫程序在下面下載:
——回复可见内容——

工程师
2012-09-10 19:54:25     打赏
58楼

IO 模擬IIC 讀寫EEPROM

內置的IICA0/IIC00這些模塊測試一下,好像不太好用,樓上有文檔供大家學習。

現在教大家用IO模擬IIC來讀寫EEPROM.
首先定義SCL/SDA:
#define SDA                        P7_bit.no5
#define SDA_INPUT         PM7_bit.no5
#define SCL                        P7_bit.no6
#define SCL_INPUT         PM7_bit.no6

首先,我們將會用到以下一些函數:
void CreateIICPort(void);
這個涵數用于初始化要用到的IO狀態

void DelayUs(USHORT US);
用于延時DelayUs(5)為延時約5us.

void Start_I2c(void);
啟動IIC總線

void Stop_I2c(void);
停止IIC總線

void  SendByte(UCHAR c);
發送一個字節數據

UCHAR  RcvByte(void);
接收一個字節數據

void Ack_I2c(UCHAR a);
發送應答位

UCHAR ISendStrB(UCHAR sla,USHORT suba,UCHAR *s,UCHAR no); 
     // for 24C32/64/128/256
    // sla 為 EEPROM的slave 址
    // suba 為要寫進數據的地址,大于等于24C32地址是16位的
    // *s 為要寫進的數據的頭地址
   // no 為要寫進的字節數量,如一次寫進16 bytes,則no=16
  此函數用于向EEPROM寫數據,不同的EEPROM 頁編程的大小是不一樣的,大家可以參考datasheet,如24c32一次可寫進16byte 的數據,但必須從每頁的頭地址開始寫


UCHAR ISendStrS(UCHAR sla,UCHAR suba,UCHAR *s,UCHAR no);
     //for 24C02/04/08/16/
此函數用于向EEPROM寫數據,suba為8位


UCHAR IRcvStrB(UCHAR  sla,USHORT suba,UCHAR  *s,UCHAR  no);
    //for 24C32/64/128/256
此函數用于向EEPROM讀數據,suba為16位

UCHAR IRcvStrS(UCHAR  sla,UCHAR suba,UCHAR  *s,UCHAR  no); 
    //for 24C02/04/08/16/
此函數用于向EEPROM讀數據,suba為8位

大家學會了上面幾個函數就可以隨意讀寫EEPROM了。

如果想進一步學習上面的函數是怎麼寫出來的,就要參考一下IIC時序了

如大家對著下圖的Start condition和下面的Start_I2c函數就很容易理解了:

/*******************************************************************
                     Start iic bus
********************************************************************/
void Start_I2c(void)
{
  SDA=1;   /* send start data signal */
  SCL=1;
  DelayUs(5);    /* wait more than 4.7us*/
  SDA=0;         /* send start signal */
  DelayUs(5);    /* wait more than 4.7us*/
  SCL=0;
}

是不是很簡單呢?

更多的函數,大家可以下面程序回去研究一下,也可以直接運行于RL78/G13開發板上
每一次讀寫正確,板上的D2 LED會翻轉一次。

——回复可见内容——


工程师
2012-09-12 17:06:41     打赏
59楼

受控于上位機的直流電機



視頻:http://v.eepw.com.cn/video/play/id/1963
 

下面我們基于RL78/R13開發板來做一個用上位機控制直流電機正反轉,加速,減速,暫停的程序。

 

1、首先我們按下面的原理圖焊接一個H桥电路

 

從電路上我們可以看出:

PWM1為高電平,PWM2為低電平時,電流經T2流過直流電機再經T5流到地

 

PWM1為低電平,PWM2為高電平時,電流從經T1流過直流電機再經T6流到地

 

PWM1,PWM2同時為高或低電平時,電機就可以停轉了

 

這樣我們就可以實現了直流電機轉向的控制了。

 

PWM1100% DutyPWM250% Duty時,馬達的轉速就減低了。

 

2、很明顯,要實現不同轉速和轉向的控制,我們需要兩路PWM,我們把PWM1/PWM2分別連接到RG78/G13開發板的P16/TO01 P31/TO03

 

因為RG78/G13開發板的UART2連接到UARTUSB上去,所以我們可以很方便的用UART2與上位機進行通訊。

 

到這里硬件電路就建好了,下面開始軟件開發。

 

3、為了加快速度,我們用Applilet生成基本代碼

 

4、系統時鐘設置

設定系統時鐘為32M,如下圖:

 

 

 

 

 

 

為了簡單,關閉WDT,如下圖:

 


5、設置PWM通道

定義Channel0Channel2PWM  Master通道,Channel1Channel3就自動設為Slave通道了,設置如下圖:

 

 

設置Master通道Channel0Channel2Cycle均為100usChannel0的設置如下圖,Channel2的設置與Channel0相同:

 


設置Slave 通道Channel1Channel3Duty value均為50%Channel1的設置如下圖,Channel3的設置與Channel1相同:

 


 6、設置UART2

 

這次實驗只需要接收命令,所以我把UART2設為僅接收,如下圖:

 

 

UART2的參數設置如下圖:

 

 

7、點擊Generate生成代碼

 

8、用IAR打開生成的“PWM.eww”文件。

 

9、在主文件“CG_main.C”定義寄存器,如下圖,藍色框中的代碼是我增加進去的:

 

 

10、串口接收代碼編寫:

CG_main.c中定義的寄存器,有兩個CG_serial_user.c這個文件也要用到,要在頭部定義一下,如下:

 

extern UCHAR DataReceive;

extern UCHAR RXBuffer[2];

 

11、在CG_serial_user.c中的UART2_ReceiveEndCallback函數增加以下代碼:

    藍色部份是我增加的,主要功能是接收到上位機的數據后,先停止UART2接收,然后設置標志位DataReceive,以便主程序處理數據

 

void UART2_ReceiveEndCallback(void)

{

       /* Start user code. Do not edit comment generated here */

        UART2_Stop();

        DataReceive=1;

       /* End user code. Do not edit comment generated here */

}

 

最后在CG_main.c這個文件里寫一個簡單的測試程序如下:

 

void  main(void)

{

       /* Start user code. Do not edit comment generated here */

        __low_level_init();                       //初始代系統

        Direction=0;                              //定義馬達的初始轉向

        MotorDuty=50;                             //定義馬達的初始轉速

        TAU0_Channel3_ChangeDuty(100);            //通道3100% duty輸出

        TAU0_Channel1_ChangeDuty(100-MotorDuty);  //通道1根據初始化數據輸出

        TAU0_Channel0_Start();

        TAU0_Channel2_Start();                    //啟動PWM模塊

        DataReceive=0;

        UART2_ReceiveData(RXBuffer, 2);           //等待接收上位機的命令,命令為2 byte數據

        UART2_Start();                            //啟動UART2模塊

       while (1U)

       {

            if(DataReceive==1)  //如接收到命令數據,進行如下處理

            {

                if(RXBuffer[0]=='%' && RXBuffer[1]=='F')       // forward  command

                {

                     Direction=0;

                     TAU0_Channel1_ChangeDuty(100);

                     TAU0_Channel3_ChangeDuty(100-MotorDuty);

                }

                else if(RXBuffer[0]=='%' && RXBuffer[1]=='B')    // backward  command

                {

                     Direction=1;

                     TAU0_Channel1_ChangeDuty(100-MotorDuty);

                     TAU0_Channel3_ChangeDuty(100);

                }

                else if(RXBuffer[0]=='%' && RXBuffer[1]=='S')    // stop command

                {

                     TAU0_Channel1_ChangeDuty(100);

                     TAU0_Channel3_ChangeDuty(100);

                }

                else if(RXBuffer[0]=='%' && RXBuffer[1]=='+')    // speed up command

                {

                     MotorDuty +=10;

                     if(MotorDuty>100)

                     {

                         MotorDuty=100;

                     }

                     if(Direction==0)

                     {

                        TAU0_Channel1_ChangeDuty(100);

                        TAU0_Channel3_ChangeDuty(100-MotorDuty);

                     }

                     else

                     {

                        TAU0_Channel1_ChangeDuty(100-MotorDuty);

                        TAU0_Channel3_ChangeDuty(100);

                     }

                }

                else if(RXBuffer[0]=='%' && RXBuffer[1]=='-')    // speed down command

                {

                     MotorDuty -=10;

                     if(MotorDuty<30)

                     {

                         MotorDuty=30;

                     }

                     if(Direction==0)

                     {

                        TAU0_Channel1_ChangeDuty(100);

                        TAU0_Channel3_ChangeDuty(100-MotorDuty);

                     }

                     else

                     {

                        TAU0_Channel1_ChangeDuty(100-MotorDuty);

                        TAU0_Channel3_ChangeDuty(100);

                     }

                }

                else

                {

                    NOP();

                }

                DataReceive=0;

                UART2_ReceiveData(RXBuffer, 2);

                UART2_Start();

            }

       }

       /* End user code. Do not edit comment generated here */

}

 

 

 

 

這樣就大功告成了,把程序下載到開發板,打開串口助手開始測試吧

 

記得把開發板上的J6/J7/J8/J9 接到2-3

 

通過串口助手發送以下命令進行測試

%F

%S

%B

%+

%-

 

 

Campozeng

campozeng@gmail.com

2012-9-12


本文的PDF文檔和完整代碼從下面鏈接下載

——回复可见内容——

——回复可见内容——

下圖是我接H橋電路和RL78/G13開發板,簡單了點,但可以用的哦


工程师
2012-09-13 15:47:10     打赏
60楼
我的RTOS - uCOS-II

這是我第一次移植RTOS,什麽不也懂,請大蝦多指教。

就用uCOS-II做一下測試吧,下載了Renesas提供的uCOS-II進行學習移植,用RL78/G13板上的P7做了一個流水燈

寫BSP如下:



寫一個任務程序如下:



下載到RL78/G13的板上,實現了流水燈。

由於我對RTOS沒經驗,也沒心得,就不多寫現丑了。

共104条 6/11 |‹ 4 5 6 7 8 9 ›| 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]