RL78 旧ページからの移植

興味があるところを読む

PWMしてみた

2016/10/23
RL78ではPWMをするときにタイマを最低でも二つ使う。一つはマスターと呼び、こいつはPWM周波数を決める。もう一つはスレーブと呼び、こいつはPWMのデューティーを決める。

スレーブは複数有っても構わなくて、複数有れば複数のデューティーのPWMを同時に出力可能だ(マスターは一個だけなので周波数は同じになる)。

今回はマスター一個にスレーブ二個で試した。つまりタイマを3個使う。


マスター:TAU1のチャンネル0

スレーブ:TAU1のチャンネル1と2

コード生成でこんな感じで設定した(スレーブのチャンネル2はデューティーを10%にしてる)。割込みは使わないけど、実験用に発生させることにした。
んで端子配置表へ反映させると、TO11とTO12が端子配置される。

更にコード生成させると”R_TAU1_Create()"にそれなりのコードが出力される。このコードの中で大事なのはデューティーを決めるレジスタとその値だ。

なんとなくわざとらしい数値がある(0640と0140)んで、これをいじってデューティーが変わるか調べれば良い。 
今回はスレーブのチャンネル1だけを調べてるんで、オシロをTO11(P30)に接続しておく。
コードはこんな感じで作ってみた。
デューティーは50%で0x640だから100%なら二倍の0xC80だろうってことで(コード生成時に100%にすれば計算するまでもなかった)。
ステップ実行するとオシロに表示される波形の幅が変化する。
RL78のハードウエアマニュアルを読むのが面倒くさい自分には、コード生成は確かに便利だわ。 
//================================================================================================
// TO11/12 16ビット・タイマ出力(モーターPWM)
//================================================================================================
void To11Main(void)
{
    To11Duty(80); // duty 80%
    R_TAU1_Channel0_Start();
    To11Duty(10); // duty 10%
    R_TAU1_Channel0_Stop();
}
// PWMのduty設定:duty比 0~100(%)
void To11Duty(uint8_t d)
{
    if (d >= 100) TDR11 = 0x0C80U;  // 100%=0x0C80U, 50%=0x0640U  
    else TDR11 = (0x0C80U / 100U) * d;
}
void To10Intr(void){    NOP();  }   // PWMマスター10INTR
void To11Intr(void){    NOP();  }   // PWMスレーブ11INTR
// TO12 16ビット・タイマ12出力(予備PWM出力)
void To12Main(void)
{
    TDR12 = 0x0C80U;    // duty 100%
    R_TAU1_Channel0_Start();
    TDR12 = 0x0640U;    // duty 50%
    TDR12 = 0x0U;  // duty 0%
    R_TAU1_Channel0_Stop();
}
void To12Intr(void){    NOP();  }   // PWMスレーブ12INTR 

ILI9341+グラフィックLCD

2016/10/29 参考HP データシート

グラフィックLCDを使うことになった。LCDを直接操作するわけじゃなくて、コントローラICのILI9341(ILI9340でも動くと思う)のいじり方。

・RL78と9341は16bitのパラレルで接続してる。

・リセットはハード的に発生してる。

ってことで、あちこちググり回って見付けたのが上記の参考HP。

とても分かりやすく、更にソースも載せてくれてるんでいたって簡単に完成した。有り難うございます。

ところでどのHPもCPUと9341をSPIで接続してるけど、今回は16bitパラレル接続(P7/8)なんで、IO部分だけを修正すれば動くはずと目星を付けて作ったのがこれ。

要するにSPIで出力してるのをポート出力に変更しただけ。 

・IM0~3を0001にセットすることで16bitバスになる(9341マニュアルより抜粋)。
・またレジスタへのアクセスは8bit幅だけど、GRAMは16bit幅でアクセスすることが読み取れる。
CMDを書くときはDCX=L、DATAを書くときはDCX=Hにしておいて、WRXで↑エッジを出してやる。 
・GRAMに上位8bitゼロで書き込むと赤だけ表示されなかった(CPUボードは北斗電子製)。
・この後で16bitで書き込んだら赤も表示されたから、上位側が赤なんだろな。 
//
// lcd.c ILI9341+4DLCD-28QA 2016/10/15
//   http://imagewriteriij.blogspot.jp/2014/01/raspberry-pi-9-lcd-1.html
//   http://nopnop2002.webcrow.jp/TFT/ILI9340-1.html
//
#include "r_cg_macrodriver.h"
#include "iodefine.h"
#include "r_cg_userdefine.h"
// LCD Ports define
#define LCD_BKL     P3_bit.no1  // BackLight
#define LCD_CSX     P6_bit.no5  // CSX
#define LCD_DCX     P6_bit.no4  // DCX
#define LCD_WRX     P6_bit.no7  // WRX
#define LCD_RDX     P6_bit.no6  // RDX
// Prototype
static void lcd_test(uint16_t r, uint16_t g, uint16_t b);
static void clear(uint16_t r, uint16_t g, uint16_t b);
static void colorbar(void);
static void write_dc(uint8_t dc, uint8_t c);
static void write_dc_w(uint16_t w);
static void write_dc_w16(uint16_t w);
static void lcd_init(void);
static void addset(uint16_t x, uint16_t y);
static uint16_t rgb565_conv(uint16_t r, uint16_t g, uint16_t b);
//================================================================================================
// LCD main
//================================================================================================
void LcdMain(void)
{
/* 手動でリセットするなら・・・
 LCD_CSX = 0;   // CS=L(これは要らないかも)
 LCD_DCX = 1;   // D/C = H
 RESET = 0;     // Reset = L
 delay1ms(100); // delay 100ms
 RESET = 1;     // Reset = 1
 delay1ms(100); // delay 100ms
*/
    LCD_BKL = 1;    // バックライトON
    LCD_CSX = 0;    // CS=L
    lcd_init();

    lcd_test(0, 255, 255);
    lcd_test(255, 255, 0);
    lcd_test(255, 0, 255);

    LCD_CSX = 1;    // CS=H
    LCD_BKL = 0;    // バックライトOFF
}
// デバッグ用のLCD表示
void lcd_test(uint16_t r, uint16_t g, uint16_t b)
{
    clear(r, g, b);
    colorbar();
}
// lcd initial
static void lcd_init(void)
{
    LCD_WRX = 1;
    LCD_RDX = 1;
    delay1ms(25);
    write_dc(0,0xC0);       //Power control 
    write_dc(1,0x23);
    write_dc(0,0xC1);       //Power control 
    write_dc(1,0x10);
    write_dc(0,0xC5);       //VCM control 
    write_dc(1,0x3e);
    write_dc(1,0x28); 
    write_dc(0,0xC7);       //VCM control2 
    write_dc(1,0x86);
    write_dc(0,0x36);       // Memory Access Control 
    write_dc(1,0x48);
    write_dc(0,0x3A);       
    write_dc(1,0x55); 
    write_dc(0,0xB1);       
    write_dc(1,0x00);    
    write_dc(1,0x18); 
    write_dc(0,0xB6);       // Display Function Control 
    write_dc(1,0x08); 
    write_dc(1,0x82);
    write_dc(1,0x27);    
    write_dc(0,0xF2);       // 3Gamma Function Disable 
    write_dc(1,0x00); 
    write_dc(0,0x26);       //Gamma curve selected 
    write_dc(1,0x01); 
    write_dc(0,0xE0);       //Set Gamma 
    write_dc(1,0x0F); 
    write_dc(1,0x31); 
    write_dc(1,0x2B); 
    write_dc(1,0x0C); 
    write_dc(1,0x0E); 
    write_dc(1,0x08); 
    write_dc(1,0x4E); 
    write_dc(1,0xF1); 
    write_dc(1,0x37); 
    write_dc(1,0x07); 
    write_dc(1,0x10); 
    write_dc(1,0x03); 
    write_dc(1,0x0E); 
    write_dc(1,0x09); 
    write_dc(1,0x00); 
    write_dc(0,0XE1);       //Set Gamma 
    write_dc(1,0x00); 
    write_dc(1,0x0E); 
    write_dc(1,0x14); 
    write_dc(1,0x03); 
    write_dc(1,0x11); 
    write_dc(1,0x07); 
    write_dc(1,0x31); 
    write_dc(1,0xC1); 
    write_dc(1,0x48); 
    write_dc(1,0x08); 
    write_dc(1,0x0F); 
    write_dc(1,0x0C); 
    write_dc(1,0x31); 
    write_dc(1,0x36); 
    write_dc(1,0x0F); 
    write_dc(0,0x11);       //Exit Sleep 
    delay1ms(120); 
    write_dc(0,0x29);       //Display on 
    write_dc(0,0x2c);       //Memory Write
}
// clear
static void clear(uint16_t r, uint16_t g, uint16_t b)
{
    int i,j; 
    for (i=0;i<240;i++) {       // x = 0 to 239
        for(j=0;j<320;j++) {    // y = 0 to 319 
            addset(i,j);
            write_dc_w16(rgb565_conv(r, g, b));
        }
    }
}
// write color bar
static void colorbar(void)
{
    int i,j; 
    for(i=0;i<240;i++){         // x = 0 to 239
        for(j=0;j<320;j++){     // y = 0 to 319 
            if(j<106) {
                addset(i,j);
                write_dc_w16(rgb565_conv(255,0,0)); //red
            } else if(j<212) {
                addset(i,j);
                write_dc_w16(rgb565_conv(0,255,0)); //green
            } else { 
                addset(i,j);
                write_dc_w16(rgb565_conv(0,0,255)); //blue
            }
        }
    }
}
// set address
static void addset(uint16_t x, uint16_t y)
{
    write_dc(0,0x2A); // set column(x) address
    write_dc_w(x);
    write_dc_w(x);
    write_dc(0,0x2B); // set Page(y) address
    write_dc_w(y);
    write_dc_w(y);
    write_dc(0,0x2C); // Memory Write
}
// RGB565 conversion
// RGB565 is R(5)+G(6)+B(5)=16bit color format.
// Bit image "RRRRRGGGGGGBBBBB"
static uint16_t rgb565_conv(uint16_t r,uint16_t g,uint16_t b)
{
    uint16_t RR,GG,BB;
    RR = (r * 31 / 255) << 11;
    GG = (g * 63 / 255) << 5;
    BB = (b * 31 / 255);
    return(RR | GG | BB);
}
// Write data/command
static void write_dc(uint8_t dc, uint8_t c) 
{
    LCD_DCX = dc;   // 0=command, 1=data
    P7 = c;         // 下位8bitのみ(上位8bitはdont care)
    LCD_WRX = 0;    // WR out
    NOP();
    LCD_WRX = 1;    
}
// Write data word
static void write_dc_w(uint16_t w)
{
    uint8_t hi,lo;
    hi = (uint8_t)(w >> 8);
    lo = (uint8_t)(w & 0x00FF);
    write_dc(1,hi);
    write_dc(1,lo);
}
// Write data word by 16bit
static void write_dc_w16(uint16_t w)
{
    uint8_t hi,lo;
    hi = (uint8_t)(w >> 8);
    lo = (uint8_t)(w & 0x00FF);
    LCD_DCX = 1;    // 1=data
    P8 = hi;        // 上位8bit
    P7 = lo;        // 下位8bit
    LCD_WRX = 0;    // WR out
    NOP();
    LCD_WRX = 1;    
}

データ・フラッシュ・メモリを使う

RL78にはデータ・フラッシュ・メモリってのが載ってて、これをEEPROMの代わりに使える。FRAMとかが載ってればもっと簡単なんだけどさ。

ちゅうわけでこのデータ・フラッシュ・メモリへのアクセスを試す。さすがのルネサスで、いつも通り分かりにくいんでメモ。


アクセスには専用のライブラリが必要なんだそうだ。

FDLとEELと言う名前の二種類のライブラリがあり、FDLは低レベルのライブラリで、EELは高レベルのライブラリ。

・FDLは小型高速だけど自分でやることが多い。

・EELはでかいし遅いけどアクセスが簡単になる。

なおEELは下請け処理としてFDLを使ってるんで、FDLがBIOSでEELは上位ドライバみたいな雰囲気かな。TIで言えばCSLとBSLみたいな関係。

この辺の事はマニュアルのP5(1.はじめに)辺りに書かれてるけど、例によって役人言葉表現なんで頭が痛くなる。

ライブラリには旧来のCA78K0Rコンパイラ用と新型のCC-RLコンパイラ用の二種類があるんで、自分の環境に合わせてDLする。

・「データフラッシュライブラリ」と言うのがFDL(ここでは使わないので不要)。

・「EEPROMエミュレーションライブラリ」ってのがEELだ(EELライブラリにはFDLも含まれている)。

この中にはライブラリの他にマニュアルとインストール方法とサンプルソフトが入っている。

なおググって見付けたEELマニュアルはサンプルとは異なるので使わない。

で、ここではRL78のCA78K0Rコンパイラ用のEELを使ってる。 

EELのインストール

CS+で新規プロジェクトを開始し、インストールマニュアルに従ってEELのソースなどを追加する。

ファイルの上で右クリックして既存のファイルを追加(下図では既に追加済み)

DLしたライブラリの中のこの辺のフォルダ内のソースを入れてやる。

Cで作るんでASMやINCのファイルは不要なのだ。

ところでここはいじらなくて良いのかな?アクセス禁止のままでも動いてるから、多分ライブラリがDFLCTL=0x01をやってるんだと思う。

EELのビルド

EEL単独で使う事はあり得ないんで、ここでは当然CS+のコード生成と組み合わせて使う。

まずはコード生成のクロック発生回路を適当に決めてコード生成をさせる。

ビルドするとエラーになる。エラー原因はmain()関数とWDTの割り込みベクタの重複なので解決する。

RA78K0R error E3404: Multiple symbol definition '_main' in file 'DefaultBuild\r_eel_sample_c.rel'. 
First defined in file 'DefaultBuild\r_main.rel'
r_eel_sample_c.c  と r_main..c の両方にmain()がある

・r_main.c 内のmain()関数をコメントアウトするか名前を変える。

RA78K0R error E3404: Multiple symbol definition '_@vect04' in file 'DefaultBuild\r_cg_wdt_user.rel'. 
First defined in file 'DefaultBuild\r_eel_sample_c.rel'
r_cg_wdt_user.c と r_eel_sample_c.c の両方に同じvect04がある

・コード生成で「WDTを使わない」設定にする。

もしWDTを使いたいなら r_eel_sample_c.c のWDTベクタ宣言をコメントアウトし

↓r_cg_userdefine.h にプロトタイプ宣言を追加
r_cg_wdt_user.c 内の割込み関数からコールしてやる

EELをいじる

早速動かしてみた。

サンプルでは0x55と0xAAをデータフラッシュに書き込み、それを読み出して確認してる。

サンプルの動きをざっと追ってみた。


Openなどの前準備。
「/* data write processing */」で0xAAと0x55を dubWriteBuffer にセットしてからデータフラッシュに書き込む。
「/* data read processing */」でデータフラッシュから dubReadBuffer に読み出す。
書いた値と読み出した値が等しいかチェック。
Closeなどの後処理をする。
永久ループ。

動きの確認はこんな感じでやった。

「/* Execute EEL_CMD_READ command */」の下の行にブレークポイントをセットしてからRUNする。
 dubReadBuffer を見るとゼロになってる。
永久ループの中にブレークポイントをセットしてからRUNする。
 dubReadBuffer を見ると0xAAと0x55になってる。
ふむふむ、確かに読み出せてる。


ソースで変更したのは fdl_descriptor.h の「#define FDL_SYSTEM_FREQUENCY 32000000」だけで、CPUのクロックをF12用に32MHzにした。

このサンプルはmain()の中で全部やっちゃってるから、OpenとWriteとReadとCloseを関数に分けてやれば使いやすくなりそう。


んじゃ関数に分けてみよう。

サンプルでは2byteのR/Wなので、ついでにこれを255byteのR/Wに変更する。

R/Wするbyte数はID番号で指定する(byte数で直接指定することは出来ないのだ。途中にテーブルをかましてるんでここが分かりにくかった)。

例えばID=1なら2byte,ID=2なら3byte・・・ID=8なら255byteのR/Wだ。

ID番号とbyte数の関係は変更することも可能で、eel_descriptor.c に書いてある。


自分の用途では書き換え回数が多くはないのでID=8の255byteのR/Wにしておけば万能だろうと思う。



もし不足するようならID7とかID6もtype_Zにすれば255byteのR/Wが可能になるはずだ。

・1ブロックの最大サイズは255byteまでで、IDの指定範囲(EEL_VAR_NO)は1~64。

・データフラッシュは4Kbyteだけど、半分だけ使えとか書いてあったみたいだから、ID1~ID8全部を255byteにすれば丁度半分の2040byte?

ま、必要になったらその時に調べよっと。 

eel_descriptor.c にID番号とR/Wサイズの関係を指定するテーブルがある。sizeof(type_Z)とか書いてあるけど、直接255とか128とか数値で書いても同じはずだ 

// type_Aやtype_Zなどの宣言は eel_user_types.h にある 
// ここでデータフラッシュをR/Wするbyte数を指定してる
__far const eel_u08 eel_descriptor[EEL_VAR_NO+2] =
{
  (eel_u08)(EEL_VAR_NO),      /* variable count   */  \
  (eel_u08)(sizeof(type_A)),  /* id=1   2byte     */  \
  (eel_u08)(sizeof(type_B)),  /* id=2   3byte     */  \
  (eel_u08)(sizeof(type_C)),  /* id=3   4byte     */  \
  (eel_u08)(sizeof(type_D)),  /* id=4   5byte     */  \
  (eel_u08)(sizeof(type_E)),  /* id=5   6byte     */  \
  (eel_u08)(sizeof(type_F)),  /* id=6  10byte     */  \
  (eel_u08)(sizeof(type_X)),  /* id=7  20byte     */  \
  (eel_u08)(sizeof(type_Z)),  /* id=8 255byte   */  \
  (eel_u08)(0x00),            /* zero terminator  */  \
};
eel_user_types.h 

typedef   eel_u08   type_A[2];
typedef   eel_u08   type_B[3];
typedef   eel_u08   type_C[4];
typedef   eel_u08   type_D[5];
typedef   eel_u08   type_E[6];
typedef   eel_u08   type_F[10];
typedef   eel_u08   type_X[20];
typedef   eel_u08   type_Z[255];

ELの初期化と書き込みと読み出しと終了処理のコール。

データフラッシュへ書き込めたかどうかの確認は、デバッグ状態でメモリウインドウで0x1F000を表示させ、ちょっと下の方を見る方法もあり。 

r_main.c のmain()関数はこんな感じ。 

void main(void)
{
    R_MAIN_UserInit();
    /* Start user code. Do not edit comment generated here */
    eel_Init(FALSE);  // FALSE=強制Formatはしない
    eel_Write();      // ここをコメントアウトしてやればデータフラッシュへ保存されたことを確認可能
    eel_Read();
    eel_Finish();
    while (1U)
    {
        ;
    }
    /* End user code. Do not edit comment generated here */
}

↓R/W関数にデータポインタを渡すなどすれば使いやすいけど、今は未だこれで良いや。

もうちょい動作が確認できてから改造の予定。
//======================================================================================
//
// データフラッシュ(0xF1000~の4K)をEELでアクセスする 2015/08/12 
// ・どの関数も1秒以内に終わるからWDTのリセットはほっとくべ
// 
//======================================================================================
#include "r_cg_macrodriver.h"
#include "r_cg_cgc.h"
#include "r_cg_port.h"
#include "r_cg_userdefine.h"
#include "r_cg_wdt.h"

#include <string.h>             
#include "fdl.h"                    /* FDL library header file               */
#include "fdl_types.h"              /* FDL types definition header file      */
#include "fdl_descriptor.h"         /* FDL descriptor header file            */
#include "eel.h"                    /* EEL library header file               */
#include "eel_types.h"              /* EEL types definition header file      */
#include "eel_descriptor.h"         /* EEL descriptor header file            */
#include "eel_user_types.h"         /* EEL user types definition header file */

//  IDでR/Wするbyte数を指定する(例えばID=1なら2byte,ID=8なら255byteだ)。
//  変更したいなら eel_descriptor.c を見れ(まぁ255byteにしておけば万能だろうと思う)。
#define IDNUM   8      // 255byteのR/Wを行う

// global variable
#define SAM_WRITE_SIZE  255         // テスト用のR/Wバッファのサイズ
eel_request_t   dtyEelReq;
eel_u08         dubWriteBuffer[ SAM_WRITE_SIZE ];
eel_u08         dubReadBuffer[ SAM_WRITE_SIZE ];
fdl_status_t    fdlStatus = 0; 
eel_u08         err_flag = 0;

//======================================================================================
// EELの初期化
//  formatflag:TRUEなら強制的にFormatを行う
//======================================================================================
bool eel_Init(bool formatflag)
{
    dtyEelReq.address_pu08   = 0;
    dtyEelReq.identifier_u08 = 0;
    dtyEelReq.command_enu    = 0;
    dtyEelReq.status_enu     = 0;
    // 開始
    fdlStatus = FDL_Init( &fdl_descriptor_str );    // FDLの初期化
    if( fdlStatus == FDL_OK ) {                     // OKなら
        FDL_Open();                                 // FDLオープン
        dtyEelReq.status_enu = EEL_Init();          // EELの初期化
        if( dtyEelReq.status_enu == EEL_OK ) {      // OKなら
            EEL_Open();                             // EELオープン
            do {
                // EEL開始コマンド発行
                dtyEelReq.command_enu = EEL_CMD_STARTUP;                    // コマンドをセットし
                EEL_Execute( &dtyEelReq );                                  // 実行し
                while( dtyEelReq.status_enu == EEL_BUSY ) EEL_Handler();    // 実行完了を待つ
                // EELブロック不整合エラーならFormatを実行する
                if (formatflag == true || dtyEelReq.status_enu == EEL_ERR_POOL_INCONSISTENT ) {
                    dtyEelReq.command_enu = EEL_CMD_FORMAT;
                    EEL_Execute( &dtyEelReq );
                    while( dtyEelReq.status_enu == EEL_BUSY ) EEL_Handler();
                    formatflag = false;
                }
            // Formatしたら再度EEL開始コマンドを実行する
            } while((dtyEelReq.command_enu == EEL_CMD_FORMAT) && (dtyEelReq.status_enu  == EEL_OK));
        }
    }
    return ( dtyEelReq.status_enu == EEL_OK )? true:false;
}
//======================================================================================
// EELでの書き込み
//======================================================================================
bool eel_Write(void)
{
    int i;
    do {
        // 適当にデータをセットしてやる
        for (i=0;i<SAM_WRITE_SIZE; ++i) dubWriteBuffer[i] = (uint8_t)i;
        dubWriteBuffer[254] = 0x10;
        dubWriteBuffer[253] = 0x20;
        // EEL書き込みコマンド発行
        dtyEelReq.address_pu08   = dubWriteBuffer;
        dtyEelReq.identifier_u08 = IDNUM;   // IDで書き込みbyte数を指定(ID8=255byte)
        dtyEelReq.command_enu    = EEL_CMD_WRITE;
        EEL_Execute( &dtyEelReq );
        while( dtyEelReq.status_enu == EEL_BUSY ) EEL_Handler();
        // データを書き込める領域が存在しないエラーならRefreshを実行する
        if (dtyEelReq.status_enu == EEL_ERR_POOL_FULL) {
            dtyEelReq.command_enu    = EEL_CMD_REFRESH;
            EEL_Execute( &dtyEelReq );
            while( dtyEelReq.status_enu == EEL_BUSY ) EEL_Handler();
        }
        // Refreshしたら再度EEL書き込みコマンドを実行する
    } while((dtyEelReq.command_enu == EEL_CMD_REFRESH) && (dtyEelReq.status_enu  == EEL_OK));
    return ( dtyEelReq.status_enu == EEL_OK )? true: false;
}
//======================================================================================
// EELでの読み出し
//======================================================================================
bool eel_Read(void)
{
    // EEL読み出しコマンド発行
    dtyEelReq.address_pu08   = dubReadBuffer;
    dtyEelReq.identifier_u08 = IDNUM;   // IDで読み出しbyte数を指定(ID8=255byte)
    dtyEelReq.command_enu    = EEL_CMD_READ;
    EEL_Execute( &dtyEelReq );
    while( dtyEelReq.status_enu == EEL_BUSY ) EEL_Handler();
    return  (dtyEelReq.status_enu == EEL_OK )? true:false;
}
//======================================================================================
// EELの終了処理
//======================================================================================
void eel_Finish(void)
{
    dtyEelReq.command_enu = EEL_CMD_SHUTDOWN;
    EEL_Execute( &dtyEelReq );
    while( dtyEelReq.status_enu == EEL_BUSY ) EEL_Handler();
    EEL_Close();
    FDL_Close();
}
//-----------------------------------------------
// EELのコマンド実行と完了待ち(未使用)
//-----------------------------------------------
eel_status_t _eelCmd(eel_command_t cmd)
{
    dtyEelReq.command_enu = cmd;                            // コマンドをセットし
    EEL_Execute(&dtyEelReq);                                // 実行し
    while(dtyEelReq.status_enu==EEL_BUSY) EEL_Handler();    // 実行完了を待つ
    return dtyEelReq.status_enu;                            // 結果を返す
}

途中でCPUを変更する

2015/03/31

CPUを変更するとコード生成から端子配置まで全部やり直さないとならない。

やり直さなくても動いてはいるけど、ポートを一カ所でも変更しようとか、ボーレートを変更しようとするとクロック設定(クロック発生回路)からやりなおしになる。

で、クロック設定をやり直すと自動生成したコードがだだ~っと消えちまう。おまけにピン配置もスッカラカンになる
2016/10/21 追記

解決法を見付けた。

試したのはR5F104PJとPL(同じピン数でROM/RAMサイズが異なるCPU)。

①「マイクロコントローラを変更」でCPUを変更する。この時点で端子配置表はクリアされるが・・・

②続いてクロック発生回路とかを選んで、そこで「端子配置へ反映」をクリックする。

これで端子配置表が復活する。なんと!ただし端子配置表に自分で書いておいた定義名部分は復活しない(消えたまんま)。

事前に配置表をエクセル形式で出力しておけば少しは助かる。

③続いて「コード生成」をクリックする。

これで変更したCPU用のコードが新たに生成される。


ただこのやり方は正式じゃない。ヘルプの「2.4.14 マイクロコントローラを変更する」の備考4にも引き継がれないと書いてある。

ま、動いてるから良いや。

しかしこの中途半端なツール。

コード生成を作成してる部署と、端子配置表を作成してる部署が異なり、これをまとめる人が居ないとかそんな感じ・・・お役所?

ちなみに端子配置表でIOを変更しても、コード生成側には反映されないから気を付けてね・・・なんちゅう仕様じゃ。
スポンサーリンク
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


興味があるところを読む