78K0班(2005/09/04) UART

今回は、UARTで遊んでみます。78K0/KF2のユーザーズマニュアルを見ると、シリアルインタフェースとしてUART0, UART6, CSI10, CSI11, CSIA0, IIC0があります。豪勢ですね。ここではPCと普通にシリアル通信を行うために、UART0を使ってみます。


まあ普通のシリアル通信なので驚くことはないのでは?と思っていましたが、甘かったです。このスターター・キットのようにクロックが20MHzの場合、UART0ではボーレートとして9600bpsを選べません(ボーレートが低すぎる)。そういう場合は、もっと高機能のUART6を使います。ちなみにUART6では、300bpsでもOKです。

もう一つ、受信側はシフトレジスタとデータを格納するバッファレジスタの両方がありますが、送信側にはシフトレジスタしかありません。ちなみにUART6には、送信側にもバッファレジスタがあります。

入力された文字をそのままエコーバックするプログラムを作ってみました。上のような訳で、送信中かどうかを示すフラグを用意しました。

void tx_char(unsigned char c) {
        while (tx_flag == 1)
                ;
        TXS0 = c;
        tx_flag = 1;
}

void tx_string(unsigned char *msg) {
        unsigned char *p;

        for (p = msg; *p != '\0'; ++p) {
                tx_char(*p);
        }
}

void main()
{
        h_initial();

        P5 = 0xfd; /*  P5.1は点灯 */

        BRGC0 = 0b11001000;     /* 38.4Kbps */
        ASIM0 = 0b00000101; /* No-parity, 8bit, 1 stop bit */
        P1.0 = 1;
        PM1.0 = 0;
        PM1.1 = 1;
        POWER0 = 1;
        uart_timewait();

        RXE0 = 1;
        SRIF0 = 0;
        SRMK0 = 0;
        SRPR0 = 1;

        TXE0 = 1;
        STIF0 = 0;
        STMK0 = 0;
        STPR0 = 1;
        tx_flag = 0;
        uart_timewait();

        EI();

        tx_string("TK-78K0/KF2スターターキットへようこそ\r\n");
        tx_string("入力した文字をエコーバックします\r\n");
        for (;;) {
        }
}

__interrupt void intst0() {
        P5.6 ^= 1; /* P5.6は点滅 */
        tx_flag = 0;
}

__interrupt void intsr0() {
        unsigned char c, er;

        P5.3 ^= 1; /* P5.3は点滅 */
        er = ASIS0;
        c = RXB0;
        if (er != 0)
                return;
        tx_char(c);
}

ホーム 特殊工作室 78K0班