電気電子ネタとは全く関係ありませんが、今年の夏休みに北アルプスの風吹大池に行きましたので、その時の記録をコミケで頒布いたします。
幸か不幸か雨に降られましたので、防水システムの検討を現在進めていて、来年の夏休みに実地テストをしてみようと考えています。
電気電子ネタとは全く関係ありませんが、今年の夏休みに北アルプスの風吹大池に行きましたので、その時の記録をコミケで頒布いたします。
幸か不幸か雨に降られましたので、防水システムの検討を現在進めていて、来年の夏休みに実地テストをしてみようと考えています。
先日のエントリーで紹介した論文では、インダクタを負荷とスイッチ素子の間に直列に入れる構成となっておりました。これは、インダクタが自身の磁束を一定に保とうという性質を持つことを利用したものといえますが、別な考え方をすれば直列にインダクタが入っているならキャパシタを並列に入れるというやり方も成り立つはずですので、実行に移してみました。
定電流制御を行う対象の素子は、直列接続された複数のLEDで、電流検出にはLEDに直列に挿入した抵抗を用いています。電流検出とON/OFF制御にはマイコン(MSP430G2211)に内蔵されたコンパレータを使用し、スイッチにはフォトカプラを介して接続したPNPトランジスタを使用しています。
実験を行った回路構成では、12V電源と電圧調整用コンデンサの間にPNPトランジスタを挿入し、電流が規定値より小さい時にONそれ以外はOFFとするようにしています。LEDは赤色LED(VF≒2V)を5個直列接続して、LEDとGNDの間に電流検出用抵抗器(36Ω)を挿入しています。
マイコンの方は電源生成に2.6V出力の3端子レギュレータを使用したので、電流検出用抵抗器から入力するピンとGNDの間に2V程度のツェナーダイオードを保護用に入れて使用しています。
実験結果については、オシロスコープを持っていないので波形は見えていませんが、テスターで測った平均値では電流制御がうまく行われているようでした。
回路図その他については追って示したいと思います。
前回のエントリーに書いた、パワー系の制御に関連して面白い論文を見つけました。
この論文では、プッシュプル型ドライバに接続されたチョークコイルを通して負荷に電流を供給する際に、電流値が許容される誤差の範囲を超えているかどうかによって、ドライバのハイサイドもしくはローサイドのスイッチング素子をON/OFFさせるというもので、参考文献にはまだ当たっていないのですが数学的に有限時間内に収束することが証明できるそうです。
この制御自体は、最近のマイコンであれば十分に実装可能な方式ですので、前回取り上げた8ピンのMSP430でコンパレータを内蔵したものを使って、出力電流固定の定電流制御の実験をしてみたいと思います。
MSP430のバリューラインに8ピンのものが2品種あるのですが、電源で2本、デバッグ用のSpy-Bi-Wireで2本の合計4本は用途が限定されていて、自由になるピンは4本しかありません。
SPIやI2Cのインタフェースを備えているので、8ピンのMSP430を何らかのセンサとして使って、シリアルインタフェースバスのスレーブとして動作させるというのが典型的な用途なのかなとも思います。
ただし、SPIの場合はチップセレクトのためにピンを一本使ってしまいますので、空きピン全てがSPIバスインタフェースのために使われてしまいます。I2Cの場合は割り込みリクエストを一本出しても残り一本がアナログ入力に使えそうなので、センサとして使えそうです。
とはいえ、バリューラインの安いチップといっても、MCUですのでソフト開発が必要になり何かのセンサモジュールとして大量に生産するのでなければ、コスト面で有利とはいえません。
8ピンのMSP430で制御系が完結するようなシステムの候補としては、パワー制御関係のものが考えられそうなのでそういうネタで何か作ってみようと考えています。
最新の投稿が今年の2月となっておりまして、少々驚きました。
つい最近、秋葉原の千石電商に行ったところ、MSP430 Launchpadが\1,050(税込み)に値上がりしており、円安の影響の大きさを感じました。
さて、ここで円高の時に仕入れた、MSP430 Launchpad関連アイテムの頒布のお知らせをさせていただきたいと思います。
以上、宣伝でした。
ちなみに、8ピンのMSP430を使ったネタを現在検討中です。
先に実験を行っていた、MSP430 LaunchPadからSpy-Bi-Wireの信号線を引き出して、LaunchPadの3.6Vとは異なる電圧電源のシステムに搭載されたMSP430マイコンのSpy-Bi-Wire端子と接続するためのアダプタのキット化を行いまして、コミックマーケット84にて頒布しましたが、その回路方式と機械的な実装方式について紹介します。
安価なMSP430 LaunchPadを、ターゲットシステムの電源電圧がMSP430の動作電圧範囲(1.8V~3.6V)全域にわたって対応可能なICEとして使用できるようにするための、レベル変換アダプタを検討していました。
LaunchPadから引き出すことができるデバッグ用の信号であるSpy-Bi-Wireは、2本の信号線で構成されており、その構成は単方向の信号であるSBWTCKと、双方向の信号であるSBWTDIOの2本です。SBWTDIOの方向制御を行う信号は出力されないため、高圧→低圧と低圧→高圧の双方向レベル変換を制御信号なしで行う必要があります。
当初は、双方向レベル変換専用ICのTXS0104Eを使用していましたが、I2Cの仕様書に掲載されていたMOSFETとその寄生ダイオードを使う方式を基にした回路方式の実験がうまく行きましたので、その方式を元に基板を製作してキット化しました。
基板については、TIから発売されているLaunchPad用の容量性接触センサのモジュールの実装方式を参考に、LaunchPadの基板両端にある10ピンピンヘッダ取り付け用の穴と同一位置に10ピンのソケットもしくはピンヘッダを取り付けることで、基板をスタッキングできるようにしています。
また、ターゲットシステムへの接続は10芯のフラットケーブルを使用してSpy-Bi-Wireの2本の信号とターゲット側の電源及びグランドの接続を行う仕組みとしています。フラットケーブルと接続するコネクタのピン割り当ては5ピン×2列の構成に対して隣り合う列のピンに同一の線を接続し、ケーブルには極性キーのないコネクタを両端に圧接することでコネクタの接続方向の自由度を高める工夫を加えています。
回路構成は回路図の通り、ごく単純なものです。
回路図の左側が低圧(ターゲットシステム)に接続される部分で、回路図の右側に示した2個の10ピンの端子が高圧(LaunchPad)側に接続される部分となります。低圧(ターゲットシステム)側は低圧(ターゲットシステム)側の信号にMOSFETのソースを接続するとともに低圧側のVCCでプルアップし、ゲートは単純に低圧側のVCCに接続しています。また、低圧側から高圧側に電流を流せるように寄生ダイオードと並列にVFの小さなショットキーダイオードを接続しています。
動作としては、ターゲット側から信号がLowにドライブされてVGS>VthとなったときにMOSFETがONになりMOSFETによって高圧(LaunchPad)側の信号線がLowにドライブされることを利用した低圧→高圧レベル変換と、高圧側から信号がLowにドライブされたときダイオードを通じて低圧側の信号線がLowにドライブされることを利用した高圧→低圧レベル変換の機能を、一本の信号線上に付加した形になります。
両サイドの10ピンコネクタ(ソケットまたはピンヘッダ)は、LaunchPadの表側または裏側に取り付けられるように配置しています。
中央のフラットケーブル接続用10ピン(5×2)コネクタは、LaunchPadとは反対側の面に取り付けるようにしていますが、このときLaunchPadに接続される側の信号線のプルアップ抵抗R1の配置が不適切であったために、コネクタのシュラウドと干渉してしまいます。
LaunchPadに接続される側の信号線についてはLaunchPad上にプルアップ抵抗が実装されていますので、このアダプタでは必ずしも取り付けなくても構いません。
基板は鉛フリーハンダによるハンダメッキ仕上げになっていますので、鉛フリーハンダを使用する工具が使用可能です。
最初にMOSFET、ショットキーダイオード、抵抗の各面実装部品を基板に取り付けます。このとき、このアダプタをLaunchPadの裏に取り付けるようにする場合はR1を取り付けないようにします。
基板両サイドに1列×10ピンのコネクタ(ソケットまたはピンヘッダ)を取り付けますが、このときLaunchPadの1列×10ピンのピンヘッダ(またはソケット)に取り付けてからアダプタの基板をかぶせるようにして取り付けるとハンダ付けが簡単に出来ます。
LaunchPadに直接搭載することが可能な、I2Cのレベル変換回路を基にしたSpy-Bi-Wire用レベル変換アダプタの紹介をいたしました。
再度の頒布については追って公表する予定です。
秋月電子では、オリジナルのユニバーサル基板の取り扱いが行われていますが、そのような中に面実装部品用のユニバーサル基板というものがあるので、使ってみたことがあります。
サイズをきちんと測ったわけではないのですが、SOT-23-3の部品と1608(メトリック)サイズの部品はうまく実装できました。
ところが、1.27mmピッチの14ピンICを実装しようとすると、ショートしてしまう箇所があることが分かりました。
そいういうわけで、長方形のランドのサイズを測ってみると、短辺が0.8mm、長辺が2.2mm、短辺側のピッチが0.95mm、長辺側のピッチが2.35mmでした。
ピン間隔が広くてピン数が少ないディスクリート半導体や受動部品を付けるには十分なようですが、ピン数が多いICやピン間隔が狭い部品の場合は注意が必要なようです。
先日のディスクリート構成のSpy-Bi-Wireの電圧変換用アダプタにエントリで、MOS-FETのソース-ドレイン間にショットキーダイオードを入れない状態で、きちんと認識されるかどうかテストするのが今後の課題という旨の内容を書きましたが、DesignSpark-PCBで設計した基板が出来上がりましたので、それを使ってテストしました。
結果から言うと、ショットキーダイオード抜きでは正常に動作しませんでした。
考えられる原因は使用しているMOS-FET(BSS138)の寄生ダイオードでの電圧降下が大きすぎるということです。
MOS-FETの寄生ダイオードの詳細な特性は、データシートにも記載されていないので、折をみてきちんと測定したいと思います。
ちなみに、MOS-FETの寄生ダイオードがこの用途に不向きで、別途ダイオードをつけるのであれば、FETにこだわらなくてもバイポーラトランジスタでもこの機能を実現可能です。バイポーラトランジスタの場合はベース抵抗が必要なので、プロトタイプを作成して実験してみたいと思います。
RSコンポーネンツという電子部品の販売会社が配布している、DesignSparkという回路図と基板用のCADソフトを使って、先日作成したディスクリート部品によるSpy-Bi-Wireのアダプタ基板を設計してみました。
接続方法としては、LaunchPADのRev1.5以降で基板に実装されているピンヘッダに、基板のはんだ面に実装したソケットを使って主回路の部分をLaunchPADに固定し、ボードインコネクタに取り付けたフラットケーブルと、フラットケーブルの末端に取り付けた圧接コネクタを用いてターゲット基板に接続するというものです。
回路図は図のような感じで、10ピン1列のソケットとMOSFETのBSS138、ショットキーダイオードのBAS40がライブラリに入っていなかったので、ライブラリを作成しましたが、既存のシンボルとPCBフットプリントを使えると至極簡単に作成できます、もっとも一から作ろうとすると習熟は必要なようです。
PCBについては、比較的簡単に裏面への配置も出来ますし、配線後の部品の移動やビアの移動が簡単に行えますが、Eagleのように簡単には寸法を測った記録を残しておけないようです。
PCBに関しては3Dでも見られるので、裏面に配置すべき部品と表面に配置すべき部品が正しく配置されたかどうかを容易に確認できますが、問題点としてはライブラリエディタで作成した部品の高さ方向の情報が正しく設定できない点くらいですね。
ちなみに、回路にLEDを挿入した目的は、ターゲット側のコネクタを反対向きに接続したときには赤、正しく接続したときには緑の光を出すことで、誤接続を容易に確認できるようにすることです。
昨年製作して、MTM07とC81で展示していたMSP430を使った時計のソフトウェアを更新し、時刻合わせの機能を付加しました。
最近の電子式時計では操作用の押しボタンスイッチが機能別に複数取り付けられているようで、1つのボタンを長押しとそれ以外で機能を共用させる方式は流行らない様なのですが、汎用ポートの数が限られているのでスイッチの数を抑制する方向で設計しました。
コメント等がほとんど無く、不要なマクロ定義がありますが、暫定版として公開いたします。
#include// State Machines That Gray Coded Style #define INITIAL 0x00 // bin 0000_0000 #define HOLD 0x01 // bin 0000_0001 #define MIN_SET 0x03 // bin 0000_0011 #define HUR_SET 0x04 // bin 0000_0100 #define CNT_DN 0x07 // bin 0000_0111 #define ALARM 0x06 // bin 0000_0110 #define STOP 0x05 // bin 0000_0101 #define SET_CLOCK 0x08 // bin 0000_1000 unsigned char state; // External Variable Used to Keep State unsigned int set_min; unsigned int set_hour; unsigned char cnt_dn; unsigned char intf; unsigned char ccintf; unsigned char sec; unsigned char length; unsigned char gstate; static unsigned char hour,min,min_base,hour_base; void sr164_set (unsigned char hour, unsigned char min) { unsigned char i,h,m,s; h = hour; m = min; for(i=0;i<16;i++){ if(i<8){ P1OUT &= 0x2F; s = 0x80 & h; if(s){ P1OUT |= 0x80 + 0x20 + 0x0C; }else{ P1OUT &= 0x7F; } h = h * 2; P1OUT |= 0x4C; } else{ P1OUT &= 0x2F; s = 0x80 & m; if(s){ P1OUT |= 0x80 + 0x20 + 0x0C; }else{ P1OUT &= 0x7F; } m = m * 2; P1OUT |= 0x4C; } } } void set_clock(void){ unsigned char lstate; P1IE &=~0x0C; lstate = 0; while ((P1IN & 0x08)==0); while (lstate < 2){ while(lstate == 0){ if(((P1IN & 0x04)==0)){ if(min_base<59){ min_base++; }else{ min_base=0; } min = ((min_base/10) * 16) + (min_base % 10); sr164_set(hour,min); while((P1IN & 0x04)==0); }else if((P1IN & 0x08)==0){ lstate++; } } while ((P1IN & 0x08)==0); P1OUT &=0x2C; while(lstate == 1){ if(((P1IN & 0x04)==0)){ if(hour_base<23){ hour_base++; }else{ hour_base=0; } hour = ((hour_base/10) * 16) + (hour_base % 10); sr164_set(hour,min); while((P1IN & 0x04)==0); }else if((P1IN & 0x08)==0){ lstate++; } } } TACCTL0 |= CCIE; gstate = INITIAL; } void main (void) { volatile unsigned int i,j,m,n,p,q; // Initial Settings cnt_dn = 0; intf = 0; ccintf = 0; sec = 0x00; set_min = 0x00; set_hour = 0x00; length = 0; gstate = INITIAL; //state = INITIAL; // State Machine Initialize // X'tal and Timer Settings WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer BCSCTL3 |= XCAP_3; // Set X_CAP 12.5pF TACTL = TASSEL_1 + MC_1 + TACLR; // ACLK, up mode, Timer CLR TACCTL0 = CCIE; CCR0 = 0x7FFF; // Set TACCR0 to 16383 // GPIO Settings P1DIR |= 0xF3; // Set LED Port Output P1IE |= 0x0C; // P1.3, P1.4 Interrupt Enable P1IES |= 0x0C; // P1.3, P1.4 Fall Edge Interrupt Enable P1IFG &= ~0x0C; // P1 Interrupt state Cleared P1OUT=0xEF; // When X'tal OSC is fault, Red LED Blink while (BCSCTL3 & LFXT1OF) { // Blink LED and Buzzer for(j=80;j>0;j--){ P1OUT ^= 0x03; for(i=63;i>0;i--){;} } } /* Assign Slow Clock to System Clock */ BCSCTL2 |= SELM_3 + SELS; // MCLK and SMCLK assigned to CPU and Peripheral Clock _BIS_SR(LPM3_bits - CPUOFF + GIE); P1OUT &= 0xAC; P1OUT |= 0x2C; sr164_set(0xFF, 0xFF); // sr164_set(0x00,0x00); hour = 0x00; min = 0x00; hour_base = 0; min_base = 0; i = 0; while(1){ if(ccintf==1){ ccintf=0; if(((P1IN & 0x08)==0) && (length < 3)){ length++; }else if(length > 2){ length = 0; gstate = SET_CLOCK; }else if(P1IN & 0x08){ length = 0; } if(intf>0){ if(sec & 0x0001){P1OUT &= 0xAC;} else if(~(sec & 0x0001)){P1OUT |= 0x2F;} } if(gstate == SET_CLOCK){ P1OUT |=0x2F; set_clock(); }else if((cnt_dn>0) && (sec==0)){ sr164_set(hour,min); cnt_dn--; }else if(cnt_dn == 0){ sr164_set(0xFF,0xFF); P1OUT &= 0xAC; intf=0; P1IE |= 0x0C; } } if((TAR & 0xFFFF)!=0){ TACCTL0 |= CCIE; } if(intf==1){ sr164_set(hour,min); intf = 2; } } } #pragma vector=PORT1_VECTOR __interrupt void Port_1(void){ volatile unsigned int i,j; P1IE &=~0x0C; if(~(P1IFG & 0x08)|~(P1IFG & 0x04)){ P1IFG &= ~0x0C; cnt_dn = 3; intf = 1; } } #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A(void){ TACCTL0 &= ~CCIE; TACCTL0 &= ~CCIFG; if(sec<59){ sec++; }else{ sec=0; if(min_base<59){ min_base++; }else{ min_base=0; if(hour_base<23){ hour_base++; }else{ hour_base=0; } } } // sr164_set(0xFF,sec); min = ((min_base/10) * 16) + (min_base % 10); hour = ((hour_base/10) * 16) + (hour_base % 10); ccintf = 1; }
MSP430を2本の線でデバッグできる、I2CライクなSpy-Bi-Wireを、3.6V電源で動作するLaunchpadから引き出して、エネループ2本(約2.5V)で動作するシステムに接続する方法として、レベルトランスレータと呼ばれる双方向レベルコンバータのTXSE0104Eを使用したものを、以前製作して使用していましました。
この方法の良い点は確実に動作させられることと、使い方が簡単であるということですが、TXSE0104Eは入手経路が限られるという問題もあります。他方、I2Cの参考資料に掲載されているMOS-FETを使用したレベル変換方式では、使用するMOS-FETの特性が重要になってきます。
デバッグのターゲットとなるシステムの電源電圧は2.5Vですので、MOS-FETのVthがそれよりも十分低い必要があります。また、ソース-ドレイン間の寄生ダイオードのVFも十分に低い必要があります。
まず、Vthの条件を満たすMOS-FETとしてはBS108またはBSS138が候補に挙がりました。秋葉原でも入手可能な部品という点ではBSS138が秋月電子通商で販売されているので、こちらを選定しました。
ただし、寄生ダイオードのVFとしては、440mAをパルス状にして流したときのデータしかなく、Typで0.8Vと比較的高い値を示していました。このため、今回の実験ではVFが0.3V程度と比較的低いショットキーダイオードのBAT43をMOS-FETのソース-ドレイン間に並列接続しています。
上の図に示した回路構成の電圧コンバータをLaunchpadとターゲットとなる回路に接続して、CCSから接続テストを行った結果、デバイスの認識とプログラムの書き込みに成功しました。
次のステップとしては、MOS-FETと並列に挿入しているショットキーダイオードを外したらどうなるか、というあたりの実験をしてみたいと思います。その理由は、Spy-Bi-Wireで接続した際に流れる電流は440mAよりもはるかに小さく、寄生ダイオードのVFの値もデータシートに示される値より十分小さくなることが期待できるためです。
JSTと北大の研究により、新型トランジスタが開発されたそうです。
このトランジスタは、現在主流のウェハ表面に100nm未満の精度で作られた、何層ものパターンを用いて生成されるものではなく、かなり大きな柱状のデバイスをシリコン基板上に作るもので、シリコン基板上にInAsという化合物半導体の芯を持つ柱を立てて作られるものです。
このトランジスタを用いて、現在のLSIと同じ程度の回路規模を実現するためには、柱の小型化が鍵になりますが、問題点はゲート領域を確保するためにある程度の柱の高さを確保する必要がある点です。
このトランジスタの動作原理は上記のリンク先の図2(d)に示されるように、ゲート領域の無添加InAsの伝導帯の静電ポテンシャルが変化することによってON/OFFの切り替えを行っています。
原理としては面白いと思いますが、実用化へのハードルは高そうです。
CERNなどの研究計画で、CERNから発射したニュートリノをイタリアにあるOPERAと呼ばれる施設で到達時間を測定し、速度を求めるという実験が行われ、光速よりも速いという測定データが出たことを覚えているでしょうか?
その原因は、6月8日の朝日新聞夕刊によると、OPERA施設内の計時に用いられる信号伝送を行う光ケーブルの接続点で1.5mmの隙間があったためだそうです。
詳細を見ていないので推測ですが、仮にケーブルの光ファイバー同士を密着させるべき所が外れていた場合、光ケーブルから飛び出した信号が1.5mm先の光ケーブルにうまく入るかどうかが、まず疑問として浮上してきます。
一般的に光コネクタは精密加工されており、光ケーブル同士の接点で反射が起こらないように光ファイバのコア同士を密着させる機能を持っています。
緩みの原因が光コネクタへの挿入不良であった場合、受ける側の光信号が大きく減衰するだけでなく、空気中を経由することによる伝播時間遅延が発生します。
この条件で簡単に計算してみると
c=3×108m/sとしてL=1.5×10-2mの距離を進んだ場合を考えます。
t=L/c(sec)とすると、15/3×10-3-8=5×10-11secとなり、50psecとなります。
そうすると、OPERA側の時計は最も良い条件でも、本来の時刻より50psec遅れた時刻となっているため、光の速度とほぼ同じ速度で移動してきた粒子が、光よりも50psec早く到達したことになり、「光よりも速い粒子」が「発見」されてしまいます。
実際のところ光ケーブルが外れていたら、まともに観測はできないと思いますが、詳細はプレスリリースを待ちたいところです。
ちなみに、「超光速」を撤回=ニュートリノ再検証―機器に不備・国際研究グループという記事によると、GPS衛星からの信号伝播時間の遅れは1億分の7秒(7×10-8)、と上記の計算で求めた値よりも大きくなっています。
ケーブルの緩みなどを勘案すると設計した遅延時間よりも相当に大きくなっていたのでしょう。
5月4日付けのNHKニュースによると、先日倒産が報じられた国内のDRAMメーカー、エルピーダが、米国のマイクロンによる再建支援を受けることになったそうです。
かつて、電子立国 日本の自叙伝というNHKの番組で世界最高水準と謳われた日本のDRAM産業が、かつて追い越したはずの米国企業に救済されるというのも皮肉な話ですが、確かにその番組でも、最終回にDRAM一辺倒では先が無いというような指摘はあったんですね。
結果的に、番組放映後10年も経たないうちに国内各メーカーが個別に持っていたDRAM部門を寄せ集めた、国策企業としてのエルピーダが誕生し、それでも10年余りで倒産し米国企業の救済を受けることになった訳ですが、倒産に至った経緯を真摯に反省して、社内の旧弊を取り除かなければ、同じ失敗を繰り返すであろうことは明白なわけで、経営陣には相応の覚悟が求められるのでしょう。
Semiconductor Todayによると、NTTの基礎研究所(厚木市森の里)で窒素化合物半導体を、六角形に結合したホウ素と窒素の化合物(h-BN)の薄膜をサファイア基板上に生成してから、その上に窒素化合物半導体デバイスを作ることで、サファイア基板から半導体デバイスを切り離して、他のシリコンや金属、透明なプラスチックなどの基板上に貼り付ける方法を開発したそうです。
これは、サファイア基板と半導体デバイスの間に挟まれた、h-BNの層を機械的な力で剥離させることによって実現するそうです。この方法を用いると特殊な機材や化学処理の必要が無く結晶の欠陥も少ないそうです。
この方法を用いて作成したLEDは、従来のLEDと同じ順方向電流で、およそ2.5倍の輝度が得られたそうです。
LED表示機やLED照明の低消費電力化に寄与しそうな成果ですね。
プロジェクト先から戻ってきて、てんやわんやであったことに加え、国内IT大手の大赤字の影響で再び職探しの身となっております。
実際のところ、国内の大手電機が軒並み不振に喘いでいる状況ではありますが、フォトマスクのメーカーなど、ごく一部では生き残れる可能性があるようです。
そんな訳ですが、製作品のアイディアは相変わらず海外の情報に依拠しておりまして、実にシンプルな構成の容量型タッチセンサの実験を試みようと画策しております。
先のエントリで、一旦は動いたように見えたLED時計ですが、またもや狂い始めました。
ただ、今回は周囲温度の影響を強く受けたためと推測てきます。マイコンは工業規格品ですので余裕がありますが、電池と水晶振動子の動作温度範囲が0℃付近ぎりぎりとなっています。
このセットは、仙台市の郊外のアパートの一室に置いてあり、部屋の防寒性能が全くないため、暖房を使用しなければ外気温と同じ温度まで室温が低下します。
つい先日、仙台市中心部の最低気温が-6℃を記録しましたが、その時に電池もしくは水晶振動子に障害が発生したと考えられます。
寒冷地での使用を考慮した場合、動作温度範囲の広い部品を選定する必要があることに改めて思い至った次第です。
先のエントリーにあるように、CPUクロックとタイマーの駆動クロックを同一として、時計として動作させた場合に一秒のカウントが不規則に余分なカウントアップを起こす問題がありました。
マイコンチップ内部の動作状況を観測することはできませんので、あくまでも想像ですが原因としては、CPUからのタイマのレジスタ読み出しアクセスのタイミングと、タイマのレジスタが変化するタイミングがぶつかる事によって、内部のフリップフロップがメタステーブルを起こしているのではないかと考えました。
そこで、問題の起きていたソフトウェアでは、ポーリングによってタイマーの秒カウントの制御を行なっていた部分を、タイマ割り込みによって秒カウントの制御を行うように変更しました。全体の修正を行なってから未だ24時間経過して居ませんが、概ね正常にカウントしているように見えます。
昨日は、第81回コミックマーケットにて、冊子とデータCDを頒布させて頂きました。お買い上げいただいた皆様に感謝いたします。
また、ブースに訪問していただいた皆様並びに、近隣ブースの皆様に御礼申し上げます。
本題に入りますと、先日製作した時計のソフトウェアの問題と思われる、原因不明な時刻進みの問題があるのですが、CPUクロックと内蔵タイマーのクロックを同一として、内蔵タイマーのレジスタをポーリングさせた場合、もしかすると僅かなタイミングのズレによってメタステーブルのような状態が発生して、秒を余分にカウントしてしまうのではないかと思いつきました。
この問題に関して、正月休み中に実験してみたいと思います。
MTM07では試作版タイマー2機種と節電機能付きLED時計(ソフトウェア開発中)を展示させて頂きました。
初日の12月3日は十分な準備ができないまま公開いたしましたが、単身赴任先から戻ってプリンタが使えた12月3日の晩に作成し、12月4日に使用した資料をGoogleドキュメント上で公開いたします。
オリジナルドキュメントは全てPDF化してあります。
LED時計については、時刻合わせの機能が未実装ですので、今後実装してゆきたいと存じます。
また、12月4日の展示では、12月3日と異なりLED時計の時刻の進み方が異様に速いという奇妙な現象が起きておりますので、こちらについても調査したいと思います。