MSP430F5xx の RTCバグ

はてブ数 2009/06/07デバイス::MSP430

MSP430F5xxx(REV L)には、RTCに設定できないというとても迷惑なバグ(RTC3 Errata)があります。

ErrataのPDFを見るとサンプルプログラムの中にRTC_Workaround.zipというファイルがあるからそれを使えとなっています。

中にはアセンブラで書かれたRTC操作ファンクションがあり「編集禁止」と書かれています。これを C から使おうとしたらハマりました。

  • 割り込み禁止中でも構わず割り込みを許可する。
  • LARGE CODE MODELでは動作せず、呼び出すとスタックを破壊しプログラムが暴走する。

LARGE MODELにはいつ切り替わるのかよく分かりませんが、とにかくRTC設定ファンクションを呼び出すと変数が破壊されておかしいし、禁止中の割り込みが呼ばれて大変な目に合うし……と散々でした。*1

ついでにC++からも利用できないので、その辺修正したライブラリを置いておきます。

  • rtc_func.lzh
    • LARGE CODE MODELに対応した。
    • C++から利用可能にした。
    • SetXXXXX() を呼び出すと「常に割り込みが禁止(GIE=0)されて戻ってくる」ので受側で適当に処理してください。

*1 : CALLAで呼び出しているのに、アセンブラ側で RET で戻っているのが原因。CALLにはRET、CALLAにはRETA。

2008/10/23(木)SDのCRC7計算ルーチン

SD Card専用のCRC7計算ルーチン(C言語汎用)。戻り値をそのまま「6byte目」として送信できる。このソースは自由にご利用ください。

//******************************************************************************
// Calc SD CRC7
//******************************************************************************
int calc_sd_crc7(char *buf) {
	int crc, crc_prev;
	int i,j;
	crc = buf[0];
	for(i=1; i<6; i++) {
		for(j=7; j>=0; j--) {
			crc <<= 1;
			crc_prev = crc;
			if (i<5) crc |= (buf[i]>>j) & 1;
			if (crc & 0x80) { crc ^= 0x89; }	// Generator
		}
	}
	return crc_prev | 1;
}

元データに x7 かけるのを見落としていたため、えらいハマった(汗)

思うに

CRCの説明って、どこもあんまりストレートじゃないなあ。

「引き算の代わりにXORを使った」(2進数)のわり算でいえばいいんですが、桁借り*1を無視した(2進数の)わり算って書いてあれば、すぐに思い出せたのにと思ったのでした。*2

*1 : 上の桁から1借りてくること。上の桁に影響なくいつでも桁狩りできると思えばいい

*2 : さもなくばもっとシンプルに「GF(2)における多項式除算」とか

2008/09/30(火)MSP430

MSP430とは

Texas Instruments(TI)製の超低消費電力マイコンシリーズです。TIというと、Burr-Brown買収によりDACやオペアンプというイメージが非常に強いのですが、流行の組み込みマイコンを作っているとは意外でした。

今回はeZ430-F2013という安価な開発キット*1を使用してあれこれいじっていますので、それをまとめておこうと思います。

あと、この開発キットで開発可能なMSP430F2013のDIP品が秋月で扱ってます。

続きを読む

PIC16F88 による シリアル接続型PIC-ADC

はてブ数 2007/10/08デバイス

PIC16F88を用いたシリアル接続型のAD変換プログラムと回路図です。PCに接続出来ますので、そのままPCでデータ処理が行えます。(写真は動作確認時のもの)

pic_adc.jpg

仕様

AD変換回数1000sps(1msに1回)
AD変換解像度10bit
AD変換誤差1bit
シリアル通信速度RS-232C 38400bps
シリアル通信オプションパリティなし、フロー制御なし
電源電圧3.3~5V程度

PIC16F88用ですが、USARTとADコンバータの乗っているPICならば簡単に移植できます。きちんとレベルコンバータIC(MAX232C)を通してますので、いわゆるUSBシリアルでも動作します。

変換レートの1000spsは内部タイマで割り込みをかけているので、(クロックと同じ程度)正確な間隔で計測されます。外部に8MHz水晶発振器などをつければ、正確に1kHzの間隔でサンプリングできます。

回路図とファームウェア

pic_adc.gif

シンプルな回路構成です。電源は3.3~5Vで動作すると思います。もっと違う電圧でも動くでしょう。簡便のためPICの内部発振を使っていますが、より正確な計測が必要な場合は外部に水晶をつけてください。

PICの電源に大容量低インピーダンスコンデンサをつけていますが、たまたま手元にあっただけでここまで大きい必要はありません。100uF程度で十分でしょう。AD変換の精度のことを考えると、低インピーダンス品は使いたいところですが。

使い方

RS-232C経由でコマンドを送信することで制御を行います。コマンドは文字 1byte です。

送信文字機能
Rデバイスをリセットします。AD変換を停止させます。
SAD変換を開始します。
VPICファームウェアのバージョン情報を表示します。

AD変換中に送られるデータは2byteで1つのデータとなっています。並びはビッグエンディアンです。例えば、受信データ配列をchar buf[size]、電源電圧を5Vとすれば、次のようにAD変換電圧を取得できます。

for(int i=0; i<size; i+=2) {
    float volt = ((buf[i]<<8) + buf[i+1])*5/(float)1024;
         :
         :(データ処理)
}

ライセンス

修正BSDライセンスとします。質問とか相談とか、開発とかありましたらコメント欄にどうぞ。