特殊工作室 R8C/15

最終更新日:2005年7月17日

R8Cはトラ技の原稿を書いて以来ご無沙汰だったのですが、ラジオデパートのエイティーラボラトリで話し込んで元気をもらったので、少し再開してみることにしました。


2005年7月2日

ラジオデパートにぶらっと寄ってみると、ATB-R8CQ_EXという、トラ技4月号付録マイコンを載せる基板を800円で販売していました。それを組み立てると、下のようになります。800円で買えるのはこの基板だけで、部品は自分で用意することになると思います(たぶん)。

まずは手元にあった部品を使ってこれを組み立てました。実はE8のコネクタを実装するパターンも用意されているのですが、肝心のコネクタが手元になかったので未実装です。E8は宝の持ち腐れになってますね、もらい物ですけど。

できた基板に付録マイコンを載せて、2つのLEDを交互に点灯するプログラムを実行して動作を確認しました。というより、たまたまそのプログラムを書いたまま放置したマイコンだった、というのが実情です。付録マイコンも量産試作品がいくつもあるので、どれにどのプログラムを書いたか把握しきれません。まあ、動いたからよしとしましょう。


2005年7月9日

ATB-R8CQ_EXにはLEDが4つあるので、リハビリにまずはその点滅から。トラ技5月号を参考に、Cで書いてます。何の変哲もないですね。ATB-R8CQ_EXの説明書通り、P1_0とP1_2を入れ替えています。

#include "sfr_r815.h"                  

void set_IO();
void spin_wait();
void spin_wait_inner();
void set_mainClock();

void main(void)
{
        set_mainClock();
        set_IO();
        
        for (;;) {
                p1_2 = 0;
                p1_1 = 1;
                p1_6 = 1;
                p1_7 = 1;
                spin_wait();

                p1_2 = 1;
                p1_1 = 0;
                p1_6 = 1;
                p1_7 = 1;
                spin_wait();

                p1_2 = 1;
                p1_1 = 1;
                p1_6 = 0;
                p1_7 = 1;
                spin_wait();

                p1_2 = 1;
                p1_1 = 1;
                p1_6 = 1;
                p1_7 = 0;
                spin_wait();

        }       
}

void
spin_wait() {
        int i, j;

        for (i = 0; i < 10; i++) {
                for (j = 0; j < 10000; j++) {
                        spin_wait_inner();
                }
        }
}

void
spin_wait_inner() {
        /* nothing */
}

void
set_IO() {
        pd1_1 = 1;
        pd1_2 = 1;
        pd1_6 = 1;
        pd1_7 = 1;
        p1_1  = 1;
        p1_2  = 1;
        p1_6  = 1;
        p1_7  = 1;
}

void
set_mainClock() {
        prc0 = 1;
        cm13 = 1;
        cm05 = 0;
        cm06 = 0;
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        ocd2 = 0;
        prc0 = 0;
}

2005年7月10日

昨日に引き続いて、簡単な確認プログラムを作成しました。LED点滅周期をA/D変換割込みで設定し、スイッチ入力割込みでLEDの点灯・消灯を切り替え、LED点滅も時間待ちループからタイマX割込みに置き換えました。どれもトラ技5月号の範囲内で、マイコンの使い方として難しいところはありません。ただ、ATB-R8CQ_EXはスイッチがプルアップされていないので、マイコン側の設定でプルアップをONにする必要があるのですが、それを忘れて原因究明に時間がかかった、というのが一番難しかったところです(^^;;;)。


2005年7月17日

前回の内容に、シリアルのエコーバックを追加しました。ほとんどトラ技5月号の範囲内なのですが、ソースコードを載せるとまあこんな感じ。私が使っているPCのシリアルポートが一つなので、こういうプログラムをデバッグするのはHEWが使えず面倒です。

int ad_data;
int timer_count;
int led_state;
char rx_data;
char rx_err;

void main(void)
{
        char c;

        ad_data = 128;
        timer_count = 0;
        led_state = 0;

        set_mainClock();
        set_AD();
        set_IO();
        set_int3();
        set_timerX();
        set_UART0();

        set_LED();

        adst = 1;
        while (adst == 1)
                /* nothing */;

        asm("FSET I");

        txs = 1;

        UART0_tx_str("R8C UART0テストプログラム\r\n");
        for (;;) {
                /* nothing */
        }       
}

void
set_IO() {
        pd1_1 = 1;
        pd1_2 = 1;
        pd1_6 = 1;
        pd1_7 = 1;
        p1_1  = 1;
        p1_2  = 1;
        p1_6  = 1;
        p1_7  = 1;
        pu06  = 1;      /* p3_3プルアップ */
}

void
set_mainClock() {
        prc0 = 1;
        cm13 = 1;
        cm05 = 0;
        cm06 = 0;
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        ocd2 = 0;
        prc0 = 0;
}

void
set_int3() {
        tcc03 = 1;
        tcc06 = 1;
        tcc10 = 1;
        tcc11 = 1;
        ilvl0_int3ic = 1;
        ir_int3ic    = 0;
}

#pragma interrupt int3_intr (vect=26)
void
int3_intr() {
        p1_7 = ~p1_7;
}
        
void
set_AD() {
        vcut = 1;
        ch0 = 0;
        ch1 = 0;
        ch2 = 1;
        md = 0;
        adgsel0 = 1;
        cks0 = 0;
        bits = 0;
        smp = 1;
        ilvl0_adic = 1;
        ir_adic = 0;
}

#pragma interrupt ad_intr (vect=14)
void
ad_intr() {
        ad_data = ad & 0xff;
        adst = 1;       /* A/D変換再開 */
}

void
set_timerX() {
        txck0 = 1;
        prex  = 249;
        tx    = 49;
        ilvl0_txic = 1;
        ir_txic = 0;
}

#pragma interrupt timerx_intr (vect=22)
void
timerx_intr() {
        if (timer_count >= ad_data) {
                timer_count = 0;
                ++led_state;
                if (led_state > 2) {
                        led_state = 0;
                }
                set_LED();
        } else {
                ++timer_count;
        }
}

void
set_LED() {
        if (led_state == 0) {
                p1_2 = 0;
                p1_1 = 1;
                p1_6 = 1;
        } else if (led_state == 1) {
                p1_2 = 1;
                p1_1 = 0;
                p1_6 = 1;
        } else {
                p1_2 = 1;
                p1_1 = 1;
                p1_6 = 0;
        }
}

void
set_UART0() {
        smd0_u0mr = 1;
        smd2_u0mr = 1;
        te_u0c1 = 1;
        re_u0c1 = 1;
        u0brg = 0x40;
        ilvl0_s0ric = 1;
        ir_s0ric = 0;
}

void
UART0_tx(char tx_data) {
        while (ti_u0c1 != 1)
                /* nothing */;
        u0tb = tx_data;
}

void
UART0_tx_str(char *str) {
        while (*str != '\0') {
                UART0_tx(*str);
                ++str;
        }
}

char
UART0_rx() {
        unsigned short rx_reg;
        char rx_data;
        char err;

        while (ri_u0c1 != 1)
                /* nothing */;
        rx_reg = u0rb;
        rx_data = rx_reg & 0xff;
        err = (rx_reg >> 8) & 0xf0;
        return rx_data;
}

#pragma interrupt UART0_rx_intr (vect=18)
void
UART0_rx_intr() {
        unsigned short  rx_reg;

        rx_reg = u0rb;
        rx_data = rx_reg & 0xff;
        rx_err = (rx_reg >> 8) & 0xf0;
        if (rx_err == 0) {
                UART0_tx(rx_data);
        }
}

ホーム 特殊工作室