78K0班(2005/08/08)LED点滅

チュートリアルの次はLED点滅でしょう、というわけで、7セグメントLEDの小数点を点滅させてみます。チュートリアルプログラムをもとに、以下のようなプログラムを作りました。というより、ほとんどチュートリアルから不要部分を削除しただけなのですが。

--- initialise.c ---
#include "common.h"

void hdwinit(void)
{
        IXS = 0x00;
        IMS = 0xCC;

        OSCCTL = 0x51;
        MOC = 0;

        while (OSTC.0 == 0)
                ;
        MCM = 7;
        PCC = 0;

        RCM = 0x03;
}

void h_initial(void)
{
        PM5 = 0x00;   /* ポート5の全ビットを出力モードに */
}

--- main.c ---
#include "common.h"

void time_wait_inner() {
}

void time_wait() {
        int     i;
        for (i = 0; i < 10000; i++) {
                time_wait_inner();
        }
}

void main()
{
        int     i;

        h_initial();

        P5 = 0xff;    /* 全LEDを消灯 */
        for (;;) {
                P5.7 = !P5.7;    /* 小数点を反転 */
                for (i = 0; i < 50; i++)
                        time_wait();
        }
}

main関数以降は何の変哲もないので(ポートモードレジスタは、0で出力、1で入力というのが私の直感には反するのですが)、スタートアップルーチンから呼ばれるhdinitを見ておきます。


まず最初に、IXS(内部拡張RAMサイズ切り替えレジスタ)と、IMS(メモリサイズ切り替えレジスタ)を設定します。が、78K0/KF2のユーザマニュアルの609ページを見ると、IMSを設定した後IXSを設定してくださいと書いてあって、チュートリアルプログラムはなんか順番が逆なんですけど。

両方のレジスタとも、マイコンによって設定する値は決まっていて、この評価ボードの78K0/KF2の場合、IMSは0xCC、IXSは0です。これで、内部高速RAMは1Kバイト、内部ROMは48Kバイト、内部拡張RAMは6Kバイトになります。

        IXS = 0x00;
        IMS = 0xCC;

次に、クロックの設定を行います。やはり、クロック周りは面倒です。78K0/KF2のユーザマニュアルの6.6.1 (1) X1クロックを発振する場合の設定手順例 参照ですね。最後に、使わないクロックを停止します。

        OSCCTL = 0x51;
        MOC = 0;

        while (OSTC.0 == 0)
                ;
        MCM = 7;
        PCC = 0;

        RCM = 0x03;

ホーム 特殊工作室 78K0班