SNSへはこちら

EPSONマイコンC17で遊んでみよう(6) - レジスタ定義ヘッダ・逐次ADC

レジスタ定義ヘッダ

ついに作りました。EPSON のテクニカルマニュアル、レジスタのビットごとの説明とアドレスが別の場所に書かれていて非常にわかりにくいんですよね。
今回使った S1C17W23 向けのものです。以下の Gist に上げてあります。使う方は参考にどうぞ。

Register Definitions for EPSON C17 MCU. GitHub Gist: instantly share code, notes, and snippets.

ADC

こちらは原因不明ですが、厄介でした。
簡易的な記事になりますが、ご容赦ください(需要ないし、まあいいっか)

初期化シーケンスでも上手くいかない

当該テクニカルマニュアルを見て、それに従いましたが、どうやってもペリフェラル有効化シーケンス中に ADC のビット (MODEN) がゼロ になってしまいます。以下の初期化シーケンスを御覧ください。

AD 変換の前に先立って、初期化の段階で MODEN を有効にするというような内容ですが、どうやらこれでは初期化シーケンス中に MODEN が 0 に戻ってしまうようです
これは僕のコードの書き方が悪いのかも知れませんが、いくらか試行錯誤してこうなったということだけお伝えします。

うまくいく方法

結局は、MODEN を AD 変換開始時と同時に有効化することで解決しました。よくわからんけど。
以下にそのコードをお示しします。clock_init では OSC3 を有効化し、システムクロックをそれに切り替えています。詳細は省きますね。要望があったらコメントどうぞ。

#include <c17_regs.h>

#include "clg.h"
#include "t16.h"
#include "t16b.h"
#include "rfc.h"
#include "snda.h"

// T16_3 underflow event => Peripheral clock trigger
static void adc_timer_init(void) {
    T16_3CLK = 1; // OSC1 / 1
    T16_3CTL = 0x101; // MODEN & PRUN
}

void adc_init(void) {
    P1MODSEL |= 1 << 0;
    P1FNCSEL |= 2 << (0 * 2); // P10: VREFA0
    P1MODSEL |= 1 << 1;
    P1FNCSEL |= 2 << (1 * 2); // P11: ADIN00

    adc_timer_init();

    ADC12_0CFG = 0x3; // Voltage Measurement Range
}

static unsigned int adc_get(int ch) {
    ADC12_0TRG &= ~(0x7 << 8); // Start Channel
    ADC12_0TRG |= ch << 8;
    ADC12_0TRG &= ~(0x7 << 11); // End Channel
    ADC12_0TRG |= ch << 11;

    ADC12_0CTL |= 3; // Trigger Software Start & MODEN

    while( !(ADC12_0INTF & (1 << ch)) );
    ADC12_0INTF = 1 << ch;
    ADC12_0CTL &= ~(1 << 1);

    return *(&ADC12_0AD0D + ch);
}

float get_voltage(int ch) {
    const unsigned int adc_value = adc_get(ch);
    return adc_value / (float)(1 << 12) * 3.3f;
}

int main(void) {
    clock_init();
    adc_init();
    while(1) {
        const volatile float val = get_voltage(0);
        (void)val;
    }
}

一旦〆

ここまで EPSON マイコンを触ってきました。なかなか一般市場では出て来ないレアなマイコンでしたが、意外と機能も控えめでした。
一方で RFC という独自の A/D コンバータ方式のペリフェラルが積んであって、とても面白かったです。RC パタパタをするだけだから、回路規模が通常の逐次 ADC に比べて非常に小さいのでしょう。

今は半導体不足ということもあり、Digi-Key でなかなか手に入らない現状でしたが(そのため、高い高い評価ボードを購入)、少しばかり楽しませてもらいました。テクニカルマニュアルには某ルネサスのような謎日本語記述もなく、割りとスッキリと説明記述があって理解も進みやすかったです。

低消費を謳っている一方で、ペリフェラルがかなり古風で違和感があったりもしました(例えば逐次 ADC のクロック源はタイマーである、など)。トラ技の本などでは「16bit は廃れる運命にある」など言われていますけど、今後の進化に期待ですね。
あとは LCD コントローラを使っていなかったのですが、こちらは手に入り次第、また記事にしたいと思います。