AKI-H8/3052で遊ぶ ~ シリアルポート

H8はシリアルポートを持っています.というか,H8にプログラムを書き込んでいるなら,すでに使ってるかと思いますが….

AKI-H8/3052には,最初からRS-232C用のレベル変換ICが載っているので,そのまま書き込み用のケーブルを使って通信可能です.

プログラム

とりあえず,最低限動くものです.フラグの意味等,細かい部分は各自で調べてください.


////////////////////////////////////////////////////////////////////////////
//               シリアルポート

// ビットレート設定リスト(25MHz時)
typedef enum {
    BR2400   = 80,   //n=1,SMRの設定
    BR4800   = 162,  //n=0,SMRの設定,以下すべて0
    BR9600   = 80,
    BR19200  = 40,
    BR38400  = 19,
    BR57600  = 13,
    BR115200 = 5,
} BaudRate;

//SCI初期化
void sci_init(BaudRate b)
{
    int i;
    SCI1.SCR.BYTE = SCI1.SMR.BYTE = 0;// 初期値は0
    SCI1.BRR = b;                     // ビットレート
    for (i = 0; i <4000; i++) ;       // 待つ
    SCI1.SCR.BYTE = 0x70;             // 受信割り込み許可,送受信許可
    SCI1.SSR.BYTE;                    // ダミーリード
    SCI1.SSR.BYTE = 0x80;             // エラーフラグクリア
}

// char送信
void sci_putchar(char c)
{
    if (c=='\n') sci_putchar('\r');  // 改行はCRLF
    while (!SCI1.SSR.BIT.TDRE);     // 送信を待つ
    SCI1.TDR = c;
    SCI1.SSR.BIT.TDRE = 0;          // TDREクリア
}


// 受信割り込み
void int_rxi1(void)
{
    // とりあえず,エコーバック
    char rd;
    rd = SCI1.RDR;         // 受信データ
    SCI1.SSR.BIT.RDRF = 0; // RDRFクリア
    sci_putchar(rd);       // エコーバック
}

// エラー割り込み
void int_eri1(void)
{
    SCI1.SSR.BYTE &= 0x80;            //エラーなら エラーフラグクリア
}

// 文字列出力
void sci_puts(char *s) {
    while (*s) sci_putchar(*s++);
}

使い方


int main()
{
    sci_init(BR38400);   // SCI初期化(デバッグモニタと同じ速度で)
    EI; // enable interrupt(無くても良い?)

    sci_puts("Hello world.\n");

    for(;;);
}

終わりに

実は,H8が無い環境でプログラムを微妙に修正してから載せているので,もしかしたら実機で動かないかも….

この文書の履歴

Copyright © 瓶詰堂 all rights reserved.