H8/3048fone シリアルインターフェイスSCI1 ビットレートの設定

1. プログラム例

SCI1初期化のプログラム例を示す。この例では通信速度38400bit/secと通信速度19200bit/secでの初期化を示してる。
H8/3048fone SII1の初期化
/**********************************************************
SCI1へ出力,WINDOWSのHyperTerminalなどで受信できる。
Async, 8bit , NoParity, stop1 通信速度を変更する例
 38400 または 19200 bit/sec
**********************************************************/
#include <3048fone.h>
#include "h8_3048fone.h"

 /*SCI-ch1の初期化 38400bit/sec*/
void myinitSCI1_38400()
{
    short int i;
    SCI1.SCR.BYTE = 0;       /* clear all flags */
                      /* 2400-38400baud are available at n=0(cks1=0,cks2=0) */
    SCI1.SMR.BYTE = 0;       /* Async, 8bit , NoParity, stop1, 1/1 */
    SCI1.BRR = 19;          /* 38400baud (CPU=25MHz) */
    for(i=0;i<1000;i++);      /* wait more than 1bit time */
    SCI1.SCR.BYTE = 0x30;    /* scr = 0011 0000 (TE=1,RE=1) */
    return;
}

 /*SCI-ch1の初期化 19200bit/sec*/
void myinitSCI1_19200()
{
    short int i;
    SCI1.SCR.BYTE = 0;       /* clear all flags */
                      /* 2400-38400baud are available at n=0(cks1=0,cks2=0) */
    SCI1.SMR.BYTE = 0;       /* Async, 8bit , NoParity, stop1, 1/1 */
    SCI1.BRR = 40;             /* 19200baud (CPU=25MHz) */
    for(i=0;i<1000;i++);      /* wait more than 1bit time */
    SCI1.SCR.BYTE = 0x30;    /* scr = 0011 0000 (TE=1,RE=1) */
    return;
}

main()
{
    int count=0;
    /*myinitSCI1_38400(); 必要に応じてどちらか片方*/
    myinitSCI1_19200();
    while (1) {
        SCI1_printf("Hello %6d\n",count++);
    }
}

2.H8/3048ハードウエアマニュアル
H8/3048ハードウエアマニュアルの13に「シリアルコミュニケーションインタフェース」があり,
表13.3よりφ=25MHzのところを探して次の値を得る
ビットレート
n
N
1200
1
162
9600
0
80
38400
0
19

表13.3の後ろに次のように書いてある
 N : BRRの値
 n : SMRのCKS1,CKS0の値

BRRの値       → SCI1.BRR
SMRのCKS1,CKS0の値 → SCI1.SMR.BYTEの下位2ビット
            またはSCI1.SMR.BIT.CKS

3.設定値の意味
現在使用しているシリアル通信は,調歩同期式といって,送信する側があらかじめ定めた速度(1秒間に送信するビット数)で送信するので,受信側も同じ速度で受信する前提で成り立っている。

(1) 38400bit/secの場合
H8CPUは自分の責任で1秒間に38400ビット(38400bit/sec)を送り出さなければならない。
幸いなことに25MHz(=25000000Hz)のクロック信号が得られているので,これをもとに作業すればよいが,実は32(または 128,512,2048)分周されたクロック信号しか使うことができない設計になっている。32分周された25000000/32Hzのクロック信号を もとに考えることになる。
送信1bitに要する時間をp[sec],クロック信号1周期をT[sec]とすると,
p=1/38400[sec],T=32/25000000[sec]である。(T<p)
T[sec]をN個数えてp[sec]を作ることを考えると,NT=pより,N=p/Tである。
N=(1/38400)/(32/25000000)=25000000/(38400×32)= 20.34505
となり, N =20個を数えれるのが一番近いことになる。
CPUの内部カウンタは0から数えるので,設定値はN-1=19となる。この値を8ビットレジスタBRRに設定する。
なお32分周のクロックを使うとき,n=0をレジスタSMRの下位2ビットに設定する。
このことをハードウエアマニュアルでは,表で与えている。

(2) 1200bit/secの場合
同様に考えるとp=1/1200[sec] ,T=32/25000000[sec]であり,
N =(1/1200)/(32/25000000)=25000000/(38400×32)= 651.0417
となり, N =651個を数えれるのが一番近いことになる。ところが,設定レジスタBRRは8ビットしかないため,255までしか設定できない。
そのため,使用可能な128分周された25000000/128Hzのクロック信号をもとに考えることになる。
N =(1/1200)/(128/25000000)=25000000/(1200×128)= 162.7604
となり, N =163個を数えれるのが一番近いことになる。
CPUの内部カウンタは0から数えるので,設定値はN -1=162となる。
また128分周のクロックを使うとき,n=1をレジスタSMRの下位2ビットに設定する。

参考

 32分周クロックφ:n=0
 128分周クロックφ/4:n=1
 512分周クロックφ/16:n=2
 2048分周クロックφ/64:n=3