2012年11月24日土曜日

Spy-Bi-Wireアダプタ実験(続き)

先日のディスクリート構成のSpy-Bi-Wireの電圧変換用アダプタにエントリで、MOS-FETのソース-ドレイン間にショットキーダイオードを入れない状態で、きちんと認識されるかどうかテストするのが今後の課題という旨の内容を書きましたが、DesignSpark-PCBで設計した基板が出来上がりましたので、それを使ってテストしました。

結果から言うと、ショットキーダイオード抜きでは正常に動作しませんでした。

考えられる原因は使用しているMOS-FET(BSS138)の寄生ダイオードでの電圧降下が大きすぎるということです。

MOS-FETの寄生ダイオードの詳細な特性は、データシートにも記載されていないので、折をみてきちんと測定したいと思います。

ちなみに、MOS-FETの寄生ダイオードがこの用途に不向きで、別途ダイオードをつけるのであれば、FETにこだわらなくてもバイポーラトランジスタでもこの機能を実現可能です。バイポーラトランジスタの場合はベース抵抗が必要なので、プロトタイプを作成して実験してみたいと思います。

2012年10月11日木曜日

DesignSparkで基板設計

RSコンポーネンツという電子部品の販売会社が配布している、DesignSparkという回路図と基板用のCADソフトを使って、先日作成したディスクリート部品によるSpy-Bi-Wireのアダプタ基板を設計してみました。

接続方法としては、LaunchPADのRev1.5以降で基板に実装されているピンヘッダに、基板のはんだ面に実装したソケットを使って主回路の部分をLaunchPADに固定し、ボードインコネクタに取り付けたフラットケーブルと、フラットケーブルの末端に取り付けた圧接コネクタを用いてターゲット基板に接続するというものです。

回路図は図のような感じで、10ピン1列のソケットとMOSFETのBSS138、ショットキーダイオードのBAS40がライブラリに入っていなかったので、ライブラリを作成しましたが、既存のシンボルとPCBフットプリントを使えると至極簡単に作成できます、もっとも一から作ろうとすると習熟は必要なようです。

PCBについては、比較的簡単に裏面への配置も出来ますし、配線後の部品の移動やビアの移動が簡単に行えますが、Eagleのように簡単には寸法を測った記録を残しておけないようです。

PCBに関しては3Dでも見られるので、裏面に配置すべき部品と表面に配置すべき部品が正しく配置されたかどうかを容易に確認できますが、問題点としてはライブラリエディタで作成した部品の高さ方向の情報が正しく設定できない点くらいですね。

ちなみに、回路にLEDを挿入した目的は、ターゲット側のコネクタを反対向きに接続したときには赤、正しく接続したときには緑の光を出すことで、誤接続を容易に確認できるようにすることです。

2012年9月23日日曜日

MSP430時計のソフトウェアをアップデート

昨年製作して、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;
}


2012年8月25日土曜日

ディスクリート部品によるSpy-Bi-Wire電圧コンバータ(その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の値もデータシートに示される値より十分小さくなることが期待できるためです。

2012年6月16日土曜日

北大とJST、トンネル効果を利用した新型トランジスタを開発

JSTと北大の研究により、新型トランジスタが開発されたそうです。

このトランジスタは、現在主流のウェハ表面に100nm未満の精度で作られた、何層ものパターンを用いて生成されるものではなく、かなり大きな柱状のデバイスをシリコン基板上に作るもので、シリコン基板上にInAsという化合物半導体の芯を持つ柱を立てて作られるものです。

このトランジスタを用いて、現在のLSIと同じ程度の回路規模を実現するためには、柱の小型化が鍵になりますが、問題点はゲート領域を確保するためにある程度の柱の高さを確保する必要がある点です。

このトランジスタの動作原理は上記のリンク先の図2(d)に示されるように、ゲート領域の無添加InAsの伝導帯の静電ポテンシャルが変化することによってON/OFFの切り替えを行っています。

OFF状態
ゲート領域の伝導帯ソース領域の価電子帯よりも高いレベルにあり、ポテンシャル障壁によって電流は流れない状態になっています。
ON状態
ゲートに+電圧を印加した際にソースの価電子帯よりも下がって、ドレイン領域と同レベルになり、なおかつゲート領域とソース領域が、ごく薄いポテンシャル障壁を持つことによって、トンネル効果によりドレイン-ソース間の電流が流れます。
このため、柱を細くするのは問題なくても、柱の高さ低くしてゆくとスイッチとして機能しなくなります。

原理としては面白いと思いますが、実用化へのハードルは高そうです。

2012年6月9日土曜日

OPERAについて

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)、と上記の計算で求めた値よりも大きくなっています。

ケーブルの緩みなどを勘案すると設計した遅延時間よりも相当に大きくなっていたのでしょう。

参考

2012年5月4日金曜日

「驕る平家は久しからず」

5月4日付けのNHKニュースによると、先日倒産が報じられた国内のDRAMメーカー、エルピーダが、米国のマイクロンによる再建支援を受けることになったそうです。

かつて、電子立国 日本の自叙伝というNHKの番組で世界最高水準と謳われた日本のDRAM産業が、かつて追い越したはずの米国企業に救済されるというのも皮肉な話ですが、確かにその番組でも、最終回にDRAM一辺倒では先が無いというような指摘はあったんですね。

結果的に、番組放映後10年も経たないうちに国内各メーカーが個別に持っていたDRAM部門を寄せ集めた、国策企業としてのエルピーダが誕生し、それでも10年余りで倒産し米国企業の救済を受けることになった訳ですが、倒産に至った経緯を真摯に反省して、社内の旧弊を取り除かなければ、同じ失敗を繰り返すであろうことは明白なわけで、経営陣には相応の覚悟が求められるのでしょう。

2012年4月16日月曜日

従来より低コストで高輝度な青色LED開発へ

Semiconductor Todayによると、NTTの基礎研究所(厚木市森の里)で窒素化合物半導体を、六角形に結合したホウ素と窒素の化合物(h-BN)の薄膜をサファイア基板上に生成してから、その上に窒素化合物半導体デバイスを作ることで、サファイア基板から半導体デバイスを切り離して、他のシリコンや金属、透明なプラスチックなどの基板上に貼り付ける方法を開発したそうです。

これは、サファイア基板と半導体デバイスの間に挟まれた、h-BNの層を機械的な力で剥離させることによって実現するそうです。この方法を用いると特殊な機材や化学処理の必要が無く結晶の欠陥も少ないそうです。

この方法を用いて作成したLEDは、従来のLEDと同じ順方向電流で、およそ2.5倍の輝度が得られたそうです。

LED表示機やLED照明の低消費電力化に寄与しそうな成果ですね。

更新が止まっていますが…

プロジェクト先から戻ってきて、てんやわんやであったことに加え、国内IT大手の大赤字の影響で再び職探しの身となっております。

実際のところ、国内の大手電機が軒並み不振に喘いでいる状況ではありますが、フォトマスクのメーカーなど、ごく一部では生き残れる可能性があるようです。

そんな訳ですが、製作品のアイディアは相変わらず海外の情報に依拠しておりまして、実にシンプルな構成の容量型タッチセンサの実験を試みようと画策しております。

2012年1月12日木曜日

またもや狂い始めたクォーツ時計

先のエントリで、一旦は動いたように見えたLED時計ですが、またもや狂い始めました。

ただ、今回は周囲温度の影響を強く受けたためと推測てきます。マイコンは工業規格品ですので余裕がありますが、電池と水晶振動子の動作温度範囲が0℃付近ぎりぎりとなっています。

  • 電池:エネループ -5℃~50℃
  • 水晶振動子:AB26T -10℃~60℃

このセットは、仙台市の郊外のアパートの一室に置いてあり、部屋の防寒性能が全くないため、暖房を使用しなければ外気温と同じ温度まで室温が低下します。

つい先日、仙台市中心部の最低気温が-6℃を記録しましたが、その時に電池もしくは水晶振動子に障害が発生したと考えられます。

寒冷地での使用を考慮した場合、動作温度範囲の広い部品を選定する必要があることに改めて思い至った次第です。

2012年1月10日火曜日

何となく動いたような(LED時計)

先のエントリーにあるように、CPUクロックとタイマーの駆動クロックを同一として、時計として動作させた場合に一秒のカウントが不規則に余分なカウントアップを起こす問題がありました。

マイコンチップ内部の動作状況を観測することはできませんので、あくまでも想像ですが原因としては、CPUからのタイマのレジスタ読み出しアクセスのタイミングと、タイマのレジスタが変化するタイミングがぶつかる事によって、内部のフリップフロップがメタステーブルを起こしているのではないかと考えました。

そこで、問題の起きていたソフトウェアでは、ポーリングによってタイマーの秒カウントの制御を行なっていた部分を、タイマ割り込みによって秒カウントの制御を行うように変更しました。全体の修正を行なってから未だ24時間経過して居ませんが、概ね正常にカウントしているように見えます。

2012年1月1日日曜日

謎解明の手がかり

昨日は、第81回コミックマーケットにて、冊子とデータCDを頒布させて頂きました。お買い上げいただいた皆様に感謝いたします。

また、ブースに訪問していただいた皆様並びに、近隣ブースの皆様に御礼申し上げます。


本題に入りますと、先日製作した時計のソフトウェアの問題と思われる、原因不明な時刻進みの問題があるのですが、CPUクロックと内蔵タイマーのクロックを同一として、内蔵タイマーのレジスタをポーリングさせた場合、もしかすると僅かなタイミングのズレによってメタステーブルのような状態が発生して、秒を余分にカウントしてしまうのではないかと思いつきました。

この問題に関して、正月休み中に実験してみたいと思います。

フォロワー