R8C/M12の高速OnChipオシレ―タを試す


 ルネサス社のマイクロコンピュータ R8C/M12の高速オンチップオシレ―タを試しました。
 R8Cは、高性能で安価なマイコンで開発環境もH8/Tinyのがほとんど使えます。
 ここでは、秋月電子で100円で販売しているR8C/M12を使い、高速OnChipオシレ―タを試しました。ベースになるソフトウエアは、ルネサス社が提供しているアプリケーションノート「AN0089 タイマRB2」を使いました。
 アプリケーションノート「AN0089 タイマRB2」は、R8C/M12に外付けの発振子を使った例なので、高速OnChipオシレ―タを使うように変更しました。

●確認した構成と「AN0089 タイマRB2」からの変更点

 次は、確認した構成の写真です。  R8C/M12はDIPパッケージの中に全てが入っているのでブレッドボードに組みました。

 アプリケーションノート「AN0089 タイマRB2」は、外付けの発振子を使ってタイマで1mS毎に割り込みを発生していますが、信号出力が無く動作状況が見えません、ので次の様に変更しました。
 ・20MHzの高速OnChipオシレ―タで動作させる。
 ・ポート P1にLEDを接続して表示する。
 ・タイマで発生させた1mS毎の割り込みで、フリッププロップを反転させポート P1のビット0に出力。
 ・高速OnChipオシレ―タで作ったシステムクロックをポート P4のビット7に出力。








































●動作確認

 タイマで発生させた1mS毎の割り込みで、フリッププロップを反転させポート P1のビット0に出力した波形。
 2mS周期の信号が得られました。




















 20MHzの高速OnChipオシレ―タで作ったシステムクロックをポート P4のビット7に出力した波形。
 高速OnChipオシレ―タで作ったシステムクロックをポートに出力する機能は、R8C/M12だけの様です。





















●戸惑ったこと

 H8/Tintで使っていたデバッガE8aをR8cの使うとき困りました。
 ターゲットとパソコンをE8aで接続するとき、デバイスの指定をするのですが、R8C/M12がリストに有りません。
 デバイスの指定をするのは、HEWだとばかり思っていたので設定を調べたり、新規にHEWをダウンロードしたりしたのですが解決しません。あきらめてルネサス社のHPを見ていたらE8aのドライバが目に入ってきました。これをダウンロードしたらR8C/M12の設定ができました。


●プログラムリスト

 プログラムリストをそのまま次に示します。
 Tabとかのフォーマットが崩れていますが、、フォーマットの保存方法を知らないのでご容赦願います。


/***********************************************************************/
/* */
/* FILE :r01an0089.c */
/* DATE :Thu, Oct 27, 2011 */
/* DESCRIPTION :main program file. */
/* CPU GROUP :M12A */
/* */
/* This file is generated by Renesas Project Generator (Ver.4.19). */
/* NOTE:THIS IS A TYPICAL EXAMPLE. */
/***********************************************************************/

#include "sfr_r8m12a.h"

/**********************************************************************************/
/* Declaration of function prototype */
/**********************************************************************************/
void main(void); /* Main processing */
void mcu_init(void); /* System clock setting processing */
void timer_rb2_init(void); /* Initial setting of Timer RB2 SFR */
void _timer_rb2(void); /* Timer RB2 interrupt processing */

/**********************************************************************************/
/* Program */
/**********************************************************************************/

/*""FUNC COMMENT""***************************************************
* Outline : Main processing
* Declaration : void main(void)
* Description : User main
* Argument : none
* Return Value : none
*""FUNC COMMENT END""**********************************************/
void main(void)
{

asm("FCLR I"); /* Interrupt disabled */
mcu_init(); /* MCU initialize */
timer_rb2_init(); /* Timer RB2 initialized */

p1 = 0xAA; //P1iにデータを設定
pd1 = 0xFF; //PD1を出力方向に設定

asm("FSET I"); /* Interrupt enabled */

while(1); /* Main processing */
}

/*""FUNC COMMENT""***************************************************
* Outline : System clock setting processing
* Declaration : void mcu_init(void)
* Description : MCU initialize
* Argument : none
* Return Value : none
*""FUNC COMMENT END""**********************************************/
void mcu_init(void)
{
unsigned short i = 0; /* Loop counter */

/*-----------------------------------
- Set XIN clock to System clock -
-------------------------------------*/
prc0 = 1; /* Protect off */
// locodis = 0; /* Low-speed on-chip oscillator on */
hocoe = 1; /* 高速OnChipOscをONに設定 */
exckcr = 0x02; /* ポートP4_6:I/Oポート、 ポートP4_7:クロック出力 に設定 */

while(i <= 2040) i++; /* 発振周波数安定待ち */

hscksel = 1; /* 高速OnChipOscをシステムクロックに選択 */
phisel = 0x00; /* System clock : System base clock with no division */
scksel = 1; /* System base clock : High-speed clock selected */
sckcr &= 0x60; /* CPU clock : System clock with no division */
prc0 = 0; /* Protect on */
}

/*""FUNC COMMENT""***************************************************
* Outline : Initial setting of Timer RB2 SFR
* Declaration : void timer_rb2_init(void)
* Description : timer RB2 initialize
* Argument : none
* Return Value : none
*""FUNC COMMENT END""**********************************************/
void timer_rb2_init(void)
{
ilvlc &= 0xfc; /* interrupt disabled */
mstcr &= 0x71; /* Timer RB2 Active */
tstart_trbcr = 0; /* Stop Timer RB2 operation */

while(tcstf_trbcr == 1); /* Timer RB2 count stop waiting */

trbcr = 0x04; /* Registers TRBPRE and TRBPR, bits TSTART and TCSTF, */
/* and bits TOSST, TOSSP, and TOSSTF in the TRBOCR */
/* register are initialized. */

trbir = 0x00; /* Timer RB2 interrupt disabled */

trbmr = 0x30; /* TMOD0-TMOD1:Set to "00b" in Timer mode */
/* 8bit timer selected */
/* Write to reload register and counter */
/* Select "f2" in Count Source */
/* Provides count source */

/* Period between underflows : 50ns * 2 * 200 * 50 = 1ms */
trbpre = 200-1; /* Set (200 - 1) in TRBPRE register */
trbpr = 50-1; /* Set (50 - 1) in TRBPR register */
asm("nop");
asm("nop");

trbif_trbir = 0; /* interrupt request clear */
trbie_trbir = 1; /* Timer RB2 interrupt enabled */
ilvlc |= 0x01; /* interrupt enabled(Level 1) */

tstart_trbcr = 1; /* Start Timer RB2 operation */
while(tcstf_trbcr == 0); /* Timer RB2 count start waiting */

}

/*""FUNC COMMENT""***************************************************
* Outline : Timer RB2 interrupt
* Declaration : void _timer_rb2(void)
* Description : Timer RB2 interrupt
* Argument : none
* Return Value : none
*""FUNC COMMENT END""**********************************************/
#pragma interrupt _timer_rb2(vect=24)
void _timer_rb2(void)
{
trbif_trbir = 0; /* interrupt request clear */

p1_0 = ~p1_0; //P1iにデータを設定

}






ホームへ戻る