忍者ブログ

Fグループ電子工作講座

秋月電子SH7125ボードで始めるマイコン開発

RL78のコード生成を使う(準備編)

RL78の開発環境を紹介した際に少しだけコード生成機能に触れましたが、もう少し
真面目に設定をしてみます。
※2022/04/28 TIO関連説明修正

関連:
コード生成(PWM編)
コード生成(AD編)
コード生成(UART編)
・I2Cスレーブ(現象対策
コード生成を行うとプロジェクトが変更されるので、コード未生成で開発を進めてきた
プロジェクトへ途中からコード生成を適用するのはお勧めできません。
コード生成を行う場合はコード生成向けにプロジェクトを作成した方が良いと思います。

プログラムを作る前に仕様を決める

自分で一からプログラムを作成する場合はどのピンを何の機能で使用するかを後から
のんびり決める事ができるのですが、コード生成機能を使う場合は最初にある程度ピン
配置を決めておく必要があります。


 はじめに必ず設定してください。
 また、この設定は1度行うと変更できません。
と出るアレです。

何を設定するのか

ルネサスマイコンはある機能をどの端子に割り当てるかを変更する事ができます。
たとえばSH7125ならIRQ1をPA3またはPB3に割り振る事ができます。
RX220ならIRQ1をP31またはPH2に割り振る事ができます。

RL78G10の場合、INTP1をP00またはP03に割り振る事ができます。
コード生成で出る「はじめに必ず設定してください。」はこの割り当て設定です。
RL78のピンアサインを見ると(INTP1)の様にカッコで囲まれた機能が幾つかあり、
これが端子割り当てを決める必要のある機能です。

R5F10Yだと端子割り当て設定で決める必要があるのは
PCLBUZ0
TI01/TO01
INTP1~3
これらを優先度順にどの端子で発動させるか考えます。
自分が使いたい機能が被らないように設定する必要がありますが、RL78初見では
何が何の機能を表しているか見当が付きません。

一部なんだかよくわからない機能もありますが、ざっとこんな感じです
・TI,TO:デジタルタイマー入出力(PWM出力はTO01~) ※2022/4/28 修正
・ANI  :アナログ入力
・INTP :外部割り込み入力
・TxD,RxD:UART通信
・SCL,SDA:I2C通信
・SO,SI,SCK:SPI通信
・KR   :キーマトリクス入力?
・X    :クロック入力
・EXCLK:クロック入力
・RTC  :リアルタイムクロック関連(時分秒管理)
・TOOL0:書き込み時に使用
・RESET:リセット、書き込み時に使用

※2022/4/28 追記
汎用デジタル入出力と使用可能なのはP**の表記のある端子
ただし、P12*系とP13*系は出力として使用できない
入力として使用可能な端子の中に内部プルアップ可能な端子がある
出力として使用可能な端子の中にN-ch出力可能な端子がある
詳細は 周辺機能 > ポート機能 から確認のこと

RL78I1A特有?
・COMP :コンパレータ
・TKBO/TKCO:タイマ出力(PWM)
・DALI :照明用通信?

ここでRL78の使い道を考えてみます。
個人的な使い道は
・通信やセンサー値に応じてモーターを動かす
となり、使う機能の優先順位は
1:電源および書込端子クロック関連
2:PC等との通信で必要なシリアル通信(UART)
3:モーター等の制御に必要なPWM
4:各種センサー入力に必要なパルス入力AD
5:その他機能(ブザー等)は放置
とします。

これを踏まえて機能の発動先を考えると
・PCLBUZ0
・TI01/TO01
→P40はTOOL0専用とするので、他の端子で発動※標準設定

・INTP1
→P00はTXD0で優先的に使うので、P03で発動

・INTP2
・INTP3
→P121,P122はクロック関連で使うので、他の端子で発動※標準設定

R5F10Y16だと
 
R5F10Y47だと

といった感じにしてみます。

これに合わせて設定します。
R5F10Y16だと


R5F10Y47だと

今回の仕様では設定を変更したのはINTP1だけでした。


後で困らないように設定する

RL78/G10だと3.3V書込みで報告した様に一部制限がかかります。
そこで、3.3Vであとから困りにくい様に今のうちの設定を変更しておきます。

パワーオンリセットの電圧を4.20V→2.84V


オンチップデバッグを有効

E1を使う予定が全くない人はオンチップデバッグを有効化する必要はありません。
※工場出荷状態でも3.3Vでオンチップデバッグへ変更(ROM消去)可能


自前のプログラム用ファイルを作成する

コード生成を行うとmain.cに代わりr_cg_main.cが生成されます。
自分で作成するメインプログラムはこの中に記述すればよいのですが、コード生成で
設定を変更する度に、例え何も変更内容が無くても
「このプログラムは他のプログラムで変更されました。再読み込みしますか?」

が出てものすごく鬱陶しいのと、他のプロジェクトに機能移植をするときに困るので
自分で作成するプログラムは別のファイルに記述します。

プロジェクト生成時に自動生成されるmain.cを使うことも不可能ではないのですが、
コード生成する度に自動的にプロジェクトから除外され更に鬱陶しいことになります。
素直にファイルを新規作成しましょう。

ファイル名は何でも良いのですがここではHEWの設定に習い、プロジェクト名.cと
しておきます。
ファイル(右クリック)→追加→新しいファイルを追加


ファイルの中身は
#include "iodefine.h"    //端子の基本設定読み込み
#include "r_cg_macrodriver.h"    //uint16_tとか読み込み

void user_main(void){
    while(1){
    }
}
としておきます。

<解説>
iodefine.hはSHとかRXとかと同じです。

r_cg_macrodriver.hは変数型式の定義です。
素直にunsigned shortとかを使えばいいものの、コード自動生成で生成されるプログラムが
r_cg_macrodriver.hで定義される独自型式uint16_t等を使っているため、r_cg_macrodriver.h
をインクルードしておかないとr_cg_adc.hをインクルードしようとすると
E0520020:識別子 "uint16_t" は定義されていません。
等エラーを吐きます。

void user_main(void)
これが自作のメイン関数です。
関数名は何でも構いません。
この中に自作のプログラムを記述します。

ファイルは出来ましたが、このままではuser_mainが実行されないので
 ファイル→コード生成→r_cg_main.c内に
user_mainを登録します。


プロトタイプ宣言は
Global variables and functionsの下の

/* Start user code for global. Do not edit comment generated here */
この間に書いてください
/* End user code. Do not edit comment generated here */

Start user code~End user code 以外の個所に書くとコード生成時に勝手に消されます
自作のメイン関数はとりあえずmain関数内のwhileの中で実行しておきます。


ウォッチドッグタイマーの設定

コード生成を利用すると自動的にウォッチドッグタイマー機能が設定されます。

ウォッチドッグ(番犬)タイマーとは
マイコン等に付与される安全装置の一つです。
例えば間違えて無限ループに突入した場合やノイズなどでトラブルが発生した場合、
何も対策がないとフリーズ状態になってしまいます。これがモーター等の出力を制御
する装置であればモーターが動き続けて危険な状態になる可能性があります。
これを防ぐ機能がウォッチドッグタイマーです。

ウォッチドッグタイマーは潜入モノの映画(ザ・ロックとか)やゲーム(MGS2とか)で
登場する見張りの定時連絡に相当します。正常状態なら定時連絡が入り安全確認が
でき、トラブルで定時連絡が途絶えると異常状態であると判断します。
ウォッチドッグタイマーの場合はタイマーを仕掛け、定期的にリセットをかける事で
CPUが正常動作していることを確認します。CPUが暴走して定期的なリセットが行わ
れず、タイマーが限界値に到達した場合は異常と判断して多くの場合はCPUを自動的
にリセットします。
CPU内にウォッチドッグタイマーを持っている場合とCPU外にウォッチドッグタイマー
を追加する場合があります。より安全を考えるなら外部ウォッチドッグタイマーを利
用するのが賢明でしょう。

ホビー用途ならウォッチドッグタイマーを停止させても構いません。
停止する場合はここで停止できます。


ただ、せっかく機能があるので利用したいと思います。
タイマーのカウントと自動リセット機能はコード生成を利用した時点で設定済みです。
あとは定期的にタイマーをリセットするだけです。
ウォッチドッグタイマー機能はr_cg_wdt.cに生成されており、あとはメインループ内で
R_WDT_Restart();
を実行するだけです。

自作メイン関数内で
#include "iodefine.h"    //端子の基本設定読み込み
#include "r_cg_macrodriver.h"    //uint16_tとか読み込み
#include "r_cg_wdt.h"    //ウォッチドッグタイマー

void user_main(void){
    while(1){
        R_WDT_Restart();
    }
}
の様に実行します。

これでコード生成を利用する下準備ができました。
PR

コメント

プロフィール

HN:
ぼんどF博士
性別:
男性
自己紹介:

最新コメント