Renesas Synergy™

FAQ 1006820 : 初期化処理(78K0S/Kx1+)

[はじめに]
78K0S/Kx1+に内蔵された周辺機能は、一つの端子に複数の機能が割り当てられていることがあります。そのために、初期化段階でどの機能を使用するかを指定する必要があります。また、内蔵された周辺機能もいくつかのモードをもち、目的に応じて初期設定で指定する必要があるものがあります。ここでは考え方だけを説明します。具体的な設定は初期化処理プログラムを参照して下さい。マイコンの起動についてはFAQの「マイコンの電源投入からの動き」も参照して下さい。

参 考
マイコンはできるだけ多くのアプリケーションに適用できるようにするため、多くの機能を内蔵しています。また、内蔵された機能にも多くの動作モードを持たせることで、いろんな使い方に対応できるようになっています。
従って、実際にマイコンを使用する際には、最初にどの機能をどのようなモードで使用するかを設定する必要があります。
パソコンや一般のコンピュータを使う際に、周辺機能を使用する場合でも、殆んどの場合に周辺機能の動作モードを意識する必要はありません。これは、パソコンやコンピュータのOSで処理しているために使用者は気にする必要がないためです。
しかし、組み込み用途では、これらの処理は全て使用者が対処する必要があります。ここらが、パソコンやコンピュータのプログラム経験はあるが、マイコンは初めての人がつまずく部分の一つです。


また、内蔵RAMや汎用レジスタも電源投入時にはその内容が不定になっています。従って、初期設定の中でRAMの初期化も行なう必要があります。これらがきちんと行なわれていないときに、値が不定の内蔵RAMや汎用レジスタを参照するようなプログラムを作成すると、そのときの値により処理が変わってしまい不安定な動きをすることになります。
C言語を使用する場合には、通常はスタートアップ・ルーチンと呼ばれるプログラムが先ず起動し、使用する変数(内蔵RAMに配置されている)を初期化するので特に意識する必要はありません。また、スタック・ポインタについても、適当なところに設定してくれるので意識する必要はありません。

おまけ
初めてアセンブラでプログラムを作成するときに忘れがちなのがスタック・ポインタの設定です。これは、マイコンの黎明期からよくある問題点です。歴史的なマイコン・キットであるTK-80が出て、初めてマイコンをいじった人がかなりいました。そこで簡単なプログラムを作成して、組み込み用に使おうとしたら、TK-80では動いていたブログラムが動作しないと言う例がありました。この原因として多かったのがスタック・ポインタの設定忘れです。TK-80ではリセットによりモニタ・プログラムが動作して、そこでスタック・ポインタを設定していました。そのため、特に意識する必要がなかったのです。
同じく多かったのが、入出力に使用していた8255のモード設定抜けや、アドレスデコードの問題です。(TK-80ではアドレスのA15だけでROMかRAMかを指定していました。従って、8000H番地と0F000H番地は同じRAMとなり、どちらのアドレスでアクセスしても同じ結果になりましたが、きちんとデコードしたときにアドレスの違いで動作しなくなるケースがありました。)


[初期設定の考え方]
78K0S/Kx1+を用いたシステムを設計する際に最初に行なうのはどのような機能を使用するか、特にポート以外のどの内蔵周辺機能を使用するかの決定です。ポートについては入力ポートと出力ポートの数が確保できれば先ずは問題ありません(ドライブ能力や出力の構成(オープン・ドレインかどうか)または入力レベル(耐圧)などのポートについての検討項目がありますが、78K0S/Kx1+では該当しません)。
78K0S/Kx1+ではポート以外の内蔵周辺機能として以下の機能があります(内蔵周辺機能で使用しない端子はポートとして使用できます)。

①クロック機能(外部の発振子/外部クロック入力/内蔵高速発振器)
②ウォッチドッグ・タイマ
③RESET端子機能
④シリアル(UART)機能(内蔵しないデバイスもある)
⑤タイマ機能
⑥外部割込み機能
⑦アナログ入力機能(内蔵しないデバイスもある)
⑧低電圧検出機能

これらの中で、①③については起動時にオプション・バイトで指定することになります。その他については、通常はプログラムの初期設定で指定します。これらの指定は、携帯機器で特に省電力モードでの電流の制限が厳しい場合を除くと、起動時の初期設定で指定しておくことをお奨めします。
なお、ひとつの端子に複数の機能が割り当てられているからといって、端子の機能を切り替えて使用するのは問題があるので推奨できません。バスのようにデータの方向が切り替わったりするものを除いて、全ての信号には出力元と入力先が存在し、その間の関係は通常は固定されています。そのような接続関係にある信号の端子の機能を切り替えるには、お互いの間で問題が生じないように十分に検討を行なう必要があります。どのような問題が発生するかは個々のケースで異なるので、これで大丈夫と言った画一的な対策はありません。

コーヒーブレーク
信号の方向が切り替わるバス、中でもデータバスでも、ハイインピーダンス状態には注意が必要です。場合によっては、バスが発振状態になることがあり、十分なアクセス時間を確保したつもりでも発振によりバスが安定せず正常なアクセスができないことがあります。(この場合にはバスを抵抗でプルアップすれば、発振は収まります。)
また、ハイインピーダンス状態では端子が長い期間に亘って中間電位にとどまることがあり、これが貫通電流の原因になることもあります。貫通電流についてはFAQの貫通電流を参照して下さい。


[動作クロックの設定]
マイコンの動作の基本となるのが動作クロックです。通常は最初に設定することになります。使用するクロック・ソース(外部の発振子/外部クロック入力/高速内蔵発振器)の指定はオプション・バイトで指定しますので、初期設定ではCPUの動作クロックの分周比や周辺回路のクロックの分周比を指定することになります。この関係を下図に示します。



78K0S/Kx1+ではCPUの動作クロックやA/Dの変換時間が電源電圧の影響を受けます。そこで、電源電圧に応じてクロック周波数をダイナミックに変更するか、クロック周波数は固定で使用するか決める必要があります。
電源電圧に応じて動作クロックを変更して使用するには、低電圧検出機能等を用いて電源電圧を監視する処理を追加し、その中でクロックの分周比の変更を行なう必要があります。電源電圧の低下については割り込みで処理し、上昇はポーリングで処理します。
また、動作クロック周波数等を固定して使用したいときには、低電圧検出機能を用いて動作クロック周波数に対応した電圧まで電源電圧が上昇するのを待ちます。この場合には、上に示したクロック指定の「クロック分周比の設定」の前に、電源電圧が規定の電圧になったかの判断分岐を追加します。

[ウォッチドッグ・タイマの設定]
ウォッチドッグ・タイマの指定には低速内蔵発振器の設定も関連します。ウォッチドッグ・タイマを使用しないときには、オプション・バイトで「低速内蔵発振器を停止可能」に設定し、その上で初期設定の中でプログラムによりWDTを停止し、さらに低速内蔵発振器を停止します。
ウォッチドッグ・タイマ(WDT)は何も設定しないと、最長の期間でオーバー・フローするモードで動作を開始します。その状態で使用するなら、プログラムでの設定は不要です。オーバー・フローする時間を変更する場合には、動作クロックを変更しますが、動作クロックを低速内蔵発振器ではなく、システム・クロックに変更するときにはオプション・バイトで内蔵低速発振器を停止可能に設定しておく必要があります。
動作クロックの変更は1度しかできません、必ず初期設定の中で処理して下さい。



[リセット端子の設定]
78K0S/Kx1+では外部からのリセット入力端子も入力ポートとして使用できるようになっており、その設定をオプション・バイトで指定するようになっています。
オプション・バイトでの指定はPOC(パワー・オン・クリア)解除後に有効になり、それまではこの端子はリセット端子として機能します。そのため、電源投入時(正確にはPOC解除時点)に端子にロー・レベルが入力されているとリセットがかかり続けてしまいます。そのため、通常状態ではハイ・レベルで必要なときのみロー・レベルとなる信号しか入力できません。



[シリアル(UART)機能の設定](78K0/KY1+,KU1+にはない)
78K0S/Kx1+のUARTでは、LINバスに対応した機能を内蔵していますが、ここでは通常のUART機能についてのみ説明します。UART関係の設定は全てプログラムで設定します。
UART機能を使用する際には、そのフォーマットを通信に合わせて設定する必要があります。UARTによる通信では、通信速度以外にデータのビット長(7ビット/8ビット)、パリティの有無、ストップ・ビット長(1ビット/2ビット)および通信するビット順序を指定する必要があります。
これ以外に、送信許可や受信許可の制御がありますが、動作電流が特に気になる場合を除いては初期設定の段階でこれらを許可するのがいいでしょう。
UART6について設定が完了したら、対応したポートの設定を行って初期設定は完了です。あとは、割り込みを使用するために、対応した割り込み要求フラグをクリアして、マスクを解除します。完了をベクタ割り込みで処理するには、使用するときにCPUを割り込み許可します。ベクタ割り込みを使用しない場合にはCPUは割り込み禁止状態で使用して下さい(このとき、UART関連の割り込みでスタンバイを解除することはできます)。他で割り込みを使用し、UARTではポーリングだけで処理する(スタンバイの解除を行なわない)場合には、割り込みはマスクしたままで、割り込み要求フラグをポーリングして下さい。割り込みについてはFAQの「割り込みの動作の基本」を参照して下さい。



[タイマ機能の設定]
タイマの働きについてはFAQの「タイマ・カウンタの基礎的な内容」も参照して下さい。
タイマの設定はどのような使い方をするかで大きく異なります。使い方では以下の4つに大きく分けることができます。各々の使い方の後ろのタイマの名称はその使い方ができるタイマを示します。実際のマイコンでは同じタイマを複数内蔵することを意識して、TM00のようにここで示したタイマ名称の後に数字が追加されます。

 (1)時間測定(インターバル・タイマ)  ・・・・・TM0、TMH、TM8
 (2)外部イベント・カウント   ・・・・・・・・・TM0
 (3)パルス幅/間隔測定     ・・・・・・・・・TM0
 (4)パルス出力         ・・・・・・・・・TM0、TMH

(1)のインターバル・タイマはもっとも基本的な使い方であり、タイマと割り込みの設定だけで使用することができます。
8ビットのタイマであるTM8、TMHについて、初期設定の例を以下に示します。ここでは、実際のタイマの起動はまだ行なわず、モードの設定までです。実際にタイマを使用するときにタイマ動作許可に設定して下さい。



16ビット・タイマのTM0での初期設定の例を以下に示します。16ビット・タイマでインターバル・タイマを構成するにはCR000レジスタをコンペア・レジスタとして使用し、割り込みとしてはINTTM000を使用します。ここでは、タイマ関連のモード設定(及び割り込みの初期設定)までで、タイマの起動は行ないません。必要になったタイミングで「TM00とCR000の一致でクリア&スタート」モードをTMC00レジスタに設定します。



(2)外部イベント・カウントは外部からパルスを入力して、その数をカウントします。カウントした結果があらかじめ設定した数に達したら割り込みを発生するような使い方になります。そのため、入力するパルスのどのエッジでカウントするかと、対応したポートを設定する必要があります。



ここでは、タイマ関連のモード設定(及び割り込みの初期設定)までで、タイマの起動は行ないません。必要になったタイミングで「TM00とCR000の一致でクリア&スタート」モードをTMC00レジスタに設定します。

(3)パルス幅測定はタイマのキャプチャ機能を利用して実現します。キャプチャに使用できるレジスタは2本内蔵されているので、最大2つのパルス幅を測定できます。この場合にはタイマはフリーランで使用します。1つのパルス幅測定では、TI000端子を使用して「TI000の有効エッジでクリア&スタート」で使用するのが便利です。
最初に、2つのパルス幅を測定する場合の初期設定の例を以下に示します。



以上で初期設定は完了したので、測定を開始するときに、「フリー・ランニング」モードをTMC00レジスタに設定します。これで、2つのパルス入力に対して、エッジが検出されると、そのときのタイマの値がCR000またはCR010にキャプチャされ、それぞれ対応した割り込みが発生します。そこで、キャプチャされた値と前回の値との差をとることでパルス幅を測定できます。

コーヒーブレーク
2つのパルスの幅を測定する場合に、測定できる最大の幅はタイマのビット幅である16ビットまでです。この範囲であれば、割り込み処理の中で今回キャプチャされた値から前回のキャプチャ値を単純に16ビット幅で引き算をするだけで(ボローを無視して)、幅を計算することができます。以下に例を示します。



また、立ち上がりと立ち下がりの両エッジを有効にした場合には、割り込みだけではどちらのエッジかを判断することはできません。この場合、パルスのハイ・レベルの期間かロー・レベルの期間かは、割り込み処理の最初に入力パルスの状態をポートから読むことで判断できます。このときポートから読んだ値が1ならば、検出したエッジは立ち上がりですから、そのとき計算されるパルス幅はロー・レベルの幅になります。


(4)パルス出力には連続パルスの出力と単発のパルス出力があります。また、連続パルス出力には方形波出力とPPG出力及びPWM出力があります。
(a)単発のパルス出力(ワンショット・パルス出力)はTM0だけの機能です。2つのコンペア・レジスタを使って、トリガがかかってから指定された時間後に指定された幅のパルスを出力します。以下に初期設定の例を示します。ここではまだタイマは起動させません。必要なタイミングで「フリー・ランニング」または「TI000端子の有効エッジでクリア&スタート」でTM0を起動して下さい。その後、トリガをかけます。



(b)連続パルス出力のうちで方形波出力はインターバル・タイマでタイマから出力を行なうようにしたものです。タイマの動作モードはインターバル・タイマ・モードと同じに設定します。TMHで方形波出力を行なう場合の初期設定例を以下に示します。ハイ・レベル期間とロー・レベル期間はインターバル時間と同じとなり、デューティ比50%の出力となります。
実際に出力を行なうには、この初期設定の後で、起動したいタイミングでTMHをスタートさせてください。なお、この設定では割り込みを使えるような設定を行なっていますが、割り込みを使用しない場合には割り込みのマスクをセットしたままにしておきます。



TM0で方形波出力を行なう場合の初期設定の例を以下に示します。実際に出力を行なうには、この初期設定の後で、起動したいタイミングで「TM00とCR000の一致でクリア&スタート」モードでタイマを起動します。CR000はコンペア・レジスタで使用しますが、CR010をコンペア・レジスタに設定する場合には、「CR000<CR010」に設定するか「CR010とTM00の一致でタイマ出力が反転しない」ように設定して下さい。
(CR010とTM00の一致でタイマ出力の反転を許可し、CR000>CR010に設定すると、PPG出力になります。)



(c)PPG出力はパルスのアクティブ期間と非アクティブ期間を指定したパルスを出力する機能です。基本的な初期設定は方形波出力と同じで、違いは

CR010もコンペア・レジスタで使用
CR010とTM00の一致でもタイマF/Fを反転
CR010に設定する値をCR000に設定する値より小さくする

ことです。これにより、「TM00とCR000の一致でクリア&スタート」モードでタイマを起動すると、TM00の出力はCR010との一致で出力がアクティブから非アクティブに変化します。その後もカウントを続け、CR000と一致すると出力はアクティブに変化してTM00はクリアされます。この動作はPWM出力と類似の波形となります。16ビットのPWM出力が必要な場合にはPPG出力を使用します。

参 考
方形波出力ではCR000との一致での出力反転とTM00のクリアが1周期に2回発生します。このため、出力はCR000で指定した期間の2倍の周期となります。PPG出力ではCR010は出力反転を行なうだけになり、CR000で指定した期間が周期となります。波形の例を以下に示します。




(d)PWM出力アナログ情報を出力する場合に用います。TMHのPWM出力はカウント・クロックとCMP01で周期を指定し、CMP11でデューティを制御します。TMH1でPWM出力を行なう場合の初期設定の例を以下に示します。この後で、必要なタイミングでTMH1を起動して下さい。



[タイマの使用モード(まとめ)]
タイマは使用目的に応じて動作モードを設定する必要があります。その設定の一覧を纏めたものを以下に示します。


また、一部の機能では入出力のために関連するポートの設定を行なう必要があります。


注)タイマの入出力端子と兼用しているポートはデバイスにより異なります。表中の"/"の左側KB1+KA1+の場合で、右側KY1+KU1+の場合です。

[外部割り込みの設定]
78K0/Kx1+のデバイスでは、2~4本の外部割り込み要求信号をもっています。これらの割り込みは入力のエッジ検出を行い、有効エッジを検出したら割り込み要求フラグをセットします。従って、外部割り込みを使用する場合には、初期設定として有効エッジの指定を行なう必要があります。外部割り込みを使用する場合の初期設定の例を以下に示します。これで、CPUが割り込み受け付け可能になれば(EI命令を実行すれば)、外部から有効エッジの入力があればベクタ割り込みを発生します。CPUが割り込み受け付け禁止の場合にはベクタ割り込みは発生しませんが、STOPモードのようなスタンバイ状態を解除できます。

注 意
INTP0やINTP2はTM0のキャプチャ入力と端子が共通になっています。しかも、エッジ検出で割り込みが発生するところまで同じです。しかし、大きく異なるところがあります。それはSTOPモード時の動作です。キャプチャ入力信号で使用する場合にはTM0のカウント・クロックでサンプリングされてノイズ除去されます。このため、TM0のカウント・クロックが停止するSTOPモードではキャプチャ入力のエッジ検出はできません。一方、外部割り込みはクロックによるサンプリングを行なわないので、STOPモード中でも機能し、STOPモードの解除に使用できます。


[アナログ入力機能の設定] (一部に内蔵していない製品があります)
アナログ入力を扱うためには、A/D変換の変換速度をデバイスの動作電圧に応じて設定する必要があります。また、端子を兼用しているポートを入力に設定するだけでなく、PMC2レジスタの設定を行ないます。これで、実際にアナログ入力が必要なタイミングでADCEビットを1にセットし、ADSレジスタを用いて入力を指定して、A/D変換を起動(ADCSビットをセット)すれば変換がスタートします。

注意事項
A/D変換を行なうには、通常は動作していないコンパレータを動作させる必要があります。ADCEビットを1にすることで、コンパレータが動作するようになりますが、1μ秒が必要です。そのため、ADCEビットをセットしてから1μ秒以上経過してからADCSビットをセットして変換動作をスタートさせます。
ADCEビットをセットしておくと、A/D変換を停止してもコンパレータを動作させるために電力を消費します。STOPモードで省電力にする場合には、コンパレータでの電力消費を抑えるために、前もってADCEビットはクリアしておきます。
ADCEビットを用いなくても、ADCSビットをセットすることでも、コンパレータを動作させ、A/D変換できます。しかし、この場合には最初の変換結果の精度が得られません(低い入力電圧のときに正常な値より大きな結果となることがあります)。これを避けるには、最初の変換結果を無視して、2回目の結果以降を用いる必要があります。
この制限はADCSビットをセットした後の最初の1回目だけであり、その後はコンパレータが動作しているので、ADSレジスタで変換する入力を変更しても、既にコンパレータは動作しているので、問題はありません。


[ポートの設定]
兼用機能で使用しない端子はポートとして使用することができます。ポートとしての初期設定の流れを以下に示します。なお、78K0S/KA1+と78K0S/KB1+のみに存在するP130は出力専用になっているので初期設定は必要ありません。



[低電圧検出機能]
低電圧検出機能では初期設定に注意が必要です。具体的には、低電圧検出によるリセットでは、低電圧検出機能の設定は保持されますが、それ例外の要因(ウォッチドッグ・タイマ、POC、リセット端子)によるリセットでは低電圧検出機能の設定はクリアされてしまいます。しかし、どちらの場合にもリセット解除後は同じベクタ・アドレスからプログラムが起動するので、リセット・コントロール・フラグ・レジスタを用いてどの要因かを判断し、低電圧検出以外の要因によるリセットの場合には、低電圧検出機能の初期設定を行なう必要があります。

適用製品

RL78 ファミリ
78K ファミリ
他にご質問がございましたら、リクエストを送信してください