2011年12月19日   【マイコン開発】

ルネサス・RX62Nでエレキー

ルネサス・RX62Nでエレキー

エレキープロジェクト第12ステージです。

今回はRenesasのマイコン RX62N を使用しました。
これはCQ出版社の「インターフェース 2011年5月号」付録です。

【ポート配置】
LED出力 → P15(負論理/基板実装品)
Buzzer出力 → P12/P13(作動出力)
Dot入力 → P66(要プルアップ抵抗)
Dash入力 → P65(要プルアップ抵抗)
速度調整 → AN0(VR入力)

【ソフトウエア機能】
 いつも通りですが下記を使用。
A/Dコンバータ
タイマ割り込み


【デバッグ】
 E1エミュレータとCubeSuite+ を使用してデバッグしてみました。
 CubeSuite+ と RX用CコンパイラをルネサスのWebサイトからダウンロード、新規プロジェクトを作成、マイコン型番を指定後、下に記述してあるソースコードを貼りつければ動作します。

ルネサス・RX62N・CubeSuite+

【動作の様子】



【関連記事】
PSoCマイコン トレーニング・キットでエレキー試作
トランジスタ技術 8月号付録78K0(μPD78F0730 )でモールス信号解析
Interface 9月号(ColdFire)でエレキー
Interface 2009年5月号付録ARM(LPC2388)でエレキー
Interface2008年5月号付録(FR60)でエレキー
Interface2007年5月号付録(V850)でエレキー
PIC12F675でエレキー
PIC12F629でエレキー
R8C/Tinyマイコンでエレキー
Interface付録 ルネサスSH-2Aでエレキー

【ソースコード】

#include <machine.h>
#include "iodefine.h"

//----------------------------------------------------------------------------
// Define Code Parameter
//----------------------------------------------------------------------------
#define FALSE 0
#define TRUE 1

#define PORT_OUTPUT 1
#define PORT_INPUT 0

#define LIMIT_VALUE 0x02 // チャタリングフィルタ用

#define MAX_SPEED 5
#define MIN_SPEED 15

typedef enum
{
PARA_ALL_OFF = 0x00,
PARA_DOT_ON,
PARA_DOT_OFF,
PARA_DASH_ON,
PARA_DASH_OFF
} PARA;

//----------------------------------------------------------------------------
// Define Port
//----------------------------------------------------------------------------
// 出力
#define PORT_LED PORT1.DR.BIT.B5
#define PORT_BUZZ1 PORT1.DR.BIT.B2
#define PORT_BUZZ2 PORT1.DR.BIT.B3

// 入力
#define PORT_DOT   PORT6.PORT.BIT.B6
#define PORT_DASH PORT6.PORT.BIT.B5

// 入出力設定
#define PORT_DDR_LED PORT1.DDR.BIT.B5
#define PORT_DDR_DOT PORT6.DDR.BIT.B6
#define PORT_DDR_DASH PORT6.DDR.BIT.B5
#define PORT_DDR_BUZZ1 PORT1.DDR.BIT.B2
#define PORT_DDR_BUZZ2 PORT1.DDR.BIT.B3
#define PORT_DDR_SPEED PORT4.DDR.BIT.B0

//----------------------------------------------------------------------------
// Define User Memory
//----------------------------------------------------------------------------
unsigned int ParaTime = 0x0000;
unsigned int SpeedData = MIN_SPEED;

PARA ParaCode = PARA_ALL_OFF;
unsigned char CntDotOn = 0x00;
unsigned char CntDashOn = 0x00;

unsigned char FlgBuzzOn = FALSE;

//----------------------------------------------------------------------------

void main(void);

//----------------------------------------------------------------------------
// ボリューム電圧値
//----------------------------------------------------------------------------
void ChkVolume( void )
{
unsigned int tmp;
if( ! AD0.ADCSR.BIT.ADST )
{
tmp = 0x03ff - AD0.ADDRA;
SpeedData = (tmp >> 4) + MAX_SPEED;
AD0.ADCSR.BIT.ADST = 1;
}
}

//----------------------------------------------------------------------------
// LEDを点灯する処理
//----------------------------------------------------------------------------
void LED_ON( void )
{
PORT_LED = 0;
}

//----------------------------------------------------------------------------
// LEDを消灯する処理
//----------------------------------------------------------------------------
void LED_OFF( void )
{
PORT_LED = 1;
}

//----------------------------------------------------------------------------
// Buzzer 反転処理
//----------------------------------------------------------------------------
void BUZZER_TGL( void )
{
PORT_BUZZ1 = ! PORT_BUZZ1;
PORT_BUZZ2 = ! PORT_BUZZ1;
}

//----------------------------------------------------------------------------
// Buzzer Off する処理
//----------------------------------------------------------------------------
void BUZZER_OFF( void )
{
PORT_BUZZ1 = 0;
PORT_BUZZ2 = 0;
}

//----------------------------------------------------------------------------
// Buzzer On する処理
//----------------------------------------------------------------------------
void BuzzOnOff( void )
{
if( FlgBuzzOn )
{
BUZZER_TGL();
}
else
{
BUZZER_OFF();
}
}

//----------------------------------------------------------------------------
// Dotポートチェック
//----------------------------------------------------------------------------
char ChkDotPort( void )
{
if( ! PORT_DOT )
{
return TRUE;
}
else
{
return FALSE;
}
}

//----------------------------------------------------------------------------
// Dashポートチェック
//----------------------------------------------------------------------------
char ChkDashPort( void )
{
if( ! PORT_DASH )
{
return TRUE;
}
else
{
return FALSE;
}
}

//----------------------------------------------------------------------------
// Set Output port
//----------------------------------------------------------------------------
void SetOutput( void )
{
if( (ParaCode == PARA_DASH_ON) || (ParaCode == PARA_DOT_ON) )
{
LED_ON();
FlgBuzzOn = TRUE;
}
else
{
LED_OFF();
FlgBuzzOn = FALSE;
}
}

//----------------------------------------------------------------------------
// Check Input port
//----------------------------------------------------------------------------
void ChkInputPort( void )
{
// for Dot
if( ParaCode != PARA_DOT_ON )
{
if( CntDotOn < LIMIT_VALUE )
{
if( ChkDotPort() ) // Dotポートチェック
{
CntDotOn ++;
}
else
{
CntDotOn = 0x00;
}
}
}
// for Dash
if( ParaCode != PARA_DASH_ON )
{
if( CntDashOn < LIMIT_VALUE )
{
if( ChkDashPort() ) // Dashポートチェック
{
CntDashOn ++;
}
else
{
CntDashOn = 0x00;
}
}
}
}

//----------------------------------------------------------------------------
// Set Parameter Dash
//----------------------------------------------------------------------------
char SetParaDash( void )
{
if( CntDashOn >= LIMIT_VALUE )
{
CntDashOn = 0x00;
ParaCode = PARA_DASH_ON;
ParaTime = (SpeedData * 3);
return TRUE;
}
return FALSE;
}

//----------------------------------------------------------------------------
// Set Parameter Dot
//----------------------------------------------------------------------------
char SetParaDot( void )
{
if( CntDotOn >= LIMIT_VALUE )
{
CntDotOn = 0x00;
ParaCode = PARA_DOT_ON;
ParaTime = SpeedData;
return TRUE;
}
return FALSE;
}


//----------------------------------------------------------------------------
// キー処理メイン関数
//----------------------------------------------------------------------------
void KeySequence( void )
{
if( ParaTime ) 
{
ParaTime --;
if( ! ParaTime )
{
if( ParaCode == PARA_DOT_ON )
{
ParaCode = PARA_DOT_OFF;
ParaTime = SpeedData;
}
else if( ParaCode == PARA_DASH_ON )
{
ParaCode = PARA_DASH_OFF;
ParaTime = SpeedData;
}
else if( ParaCode == PARA_DOT_OFF )
{
if( !SetParaDash() )
{
ParaCode = PARA_ALL_OFF;
}
}
else if( ParaCode == PARA_DASH_OFF )
{
if( !SetParaDot() )
{
ParaCode = PARA_ALL_OFF;
}
}
else
{
ParaCode = PARA_ALL_OFF;
}
SetOutput();
}
}

if( ParaCode == PARA_ALL_OFF )
{
if( !SetParaDot() )
{
SetParaDash();
}
}
SetOutput();
}



//----------------------------------------------------------------------------
// 初期化
//----------------------------------------------------------------------------
void Init( void )
{
// Port
PORT_DDR_DOT = PORT_INPUT;
PORT_DDR_DASH = PORT_INPUT;
PORT_DDR_SPEED = PORT_INPUT;

PORT_DDR_LED = PORT_OUTPUT;
PORT_DDR_BUZZ1 = PORT_OUTPUT;
PORT_DDR_BUZZ2 = PORT_OUTPUT;

BUZZER_OFF();
LED_OFF();

// Timer
MSTP( CMT0 ) = 0; // Wakeup CMT0,CMT1
CMT0.CMCOR = 12000000/512/100 - 1; // CMCOR is 5ms Count 
CMT0.CMCR.WORD = 0x0043; // CMIE is Enable, PCLK/512
IEN( CMT0, CMI0 ) = 1; // CMI0 Enable
IPR( CMT0, CMI0 ) = 1; // CMI0 Interrupt Level is 1
// A/D
MSTP(AD0) = 0; 
AD0.ADCSR.BYTE = 0x40; 
AD0.ADCR.BYTE = 0x08; 
AD0.ADDPR.BYTE = 0x00; 
AD0.ADSSTR = 0x19; 
}

//----------------------------------------------------------------------------
// メイン
//----------------------------------------------------------------------------
void main(void)
{
Init();
set_psw( 0x00010000 ); // Set I=1, IPL=0 of PSW
CMT.CMSTR0.BIT.STR0 = 1; // Start CMT0

while( 1 )
{
ChkVolume(); // 速度調整
}
}

//----------------------------------------------------------------------------
// タイマ割り込み
//----------------------------------------------------------------------------
void Timer5msec(void) // Interrupt Function
{ // Multiple Interrupt Enable
KeySequence(); // キー処理メイン関数
ChkInputPort();
BuzzOnOff();
}


プロジェクトに追加されている intprg.c の下記を追加修正

// CMTU0_CMT0
void Excep_CMTU0_CMT0(void)
{
Timer5msec();
}






    


2011年11月30日   【セミナー】

電気自動車・日産リーフの分解

運良く「浜松工業技術支援センター」で行われた「電気自動車・日産リーフの分解」に立ち会うことが出来ました。

正式名称は「電気自動車分解研修会」、主催は「静岡県経済産業部商工業局新産業集積課」です。

貴重な体験をさせて頂き、講師を始め関係者の方々に感謝いたします。


インバータモジュール
電気自動車・日産リーフの分解

モータ等外されたリーフのボンネット内(バンパーは発泡スチロールでした)
電気自動車・日産リーフの分解

分解された3相ACモータ(水冷)
電気自動車・日産リーフの分解

インバータモジュール内部(インバータ用メインCPUはSH-2)
電気自動車・日産リーフの分解

インバータモジュールの水冷部分(パワー半導体の裏側)
電気自動車・日産リーフの分解

360V→12V・DCDCコンバータと充電切替用リレー
電気自動車・日産リーフの分解

約7.5V のリチウム電池が48個(運転席下から後部座席の下一面)
電気自動車・日産リーフの分解

電気自動車分解時に使用される絶縁工具
電気自動車・日産リーフの分解

浜松工業技術支援センターの紅葉は見頃でした
浜松工業技術支援センターの紅葉

NHKに取材される知り合いの自動車整備士の先生

    


2011年11月15日   【マイコン開発】

ルネサス・E1用アダプタ

ルネサスのE1オンチップデバッギングエミュレータとRL78の接続方法はマニュアルにある配線を行いますが、この配線に入っているプルアップ抵抗は書込、またはデバッグ用にしか使用しない場合があります。

RL78/G13シリーズの接続図

ルネサス・E1接続

RL78/G12シリーズの接続図

ルネサス・E1接続

そこで、下記のような接続アダプタを作成してみました。

ルネサス・E1用アダプタ

実際の配線はこのような感じです。

ルネサス・E1用アダプタ

熱収縮チューブを被せて完成です。

ルネサス・E1用アダプタ
    


2011年11月05日   【マイコン開発】

マイクロチップICD3故障!

マイクロチップICD3

先日、マイクロチップICD3とターゲットボードの接続を誤って電源ラインとグランドラインが入れ変わったままつなげてしまいました。

その結果ICD3で書き込もうとしても下記のエラーメッセージが出てしまいます。

ICD3Err0045: You must connect to a target device to use MPLAB ICD 3.

分解調査した結果、モジュラージャックのメスとオスの両部分が電源ショートによる熱で溶けて、コネクタ部の電源、グランドラインが断線状態となっている事が判明しました。

【対応】
oICD3の後ろのネジ1本を外す。
oケースを開ける。
o両面テープで固定されている基板をケースから出す。
o基板上のモジュラージャックの端子をハンダゴテで温めて元の位置に戻す。
oオス側のモジュラージャックも溶けている場合は不要な部分の樹脂を削り取る。
o基板裏の保護ダイオードが破損している場合は適当なダイオードに交換。

基板裏の保護ダイオードの位置(今回は無事でした) 下

マイクロチップICD3

【対応結果】

 無事復帰しました。
 一番上の写真は復旧後の状態です。




    


2011年10月29日   【マイコン開発】

PIC EUSART受信エラー処理

XBeeリモコン

PICを使用してEUSART(UART)通信を行う際に注意しないといけないことはエラー処理

マニュアルには下記のように記載されてあります。

四角(オレンジ)「Framing Error(FERR)」
  右受信データ取得時確認。
  右受信データ読込またはContinuous Receive Enable bit(CREN)=0でクリア

四角(オレンジ)「Overrun Error(OERR )」
 右CREN=0でクリア


【マニュアルの抜粋】

PIC EUSART受信エラー処理


【C言語によるソースコード例】

    if( FERR || OERR )   /* エラー確認 */
    {
        CREN = 0;
        NOP();
        CREN = 1;
    }   
    else if( RCIF == 1)   /* 受信確認 */
    {
        buf = RCREG;      /* 受信結果レジスタ値を変数に格納 */
    }