ラベル 知識共有 の投稿を表示しています。 すべての投稿を表示
ラベル 知識共有 の投稿を表示しています。 すべての投稿を表示

2020年11月6日金曜日

MSP430マイコン 備忘録3 (MSP430F2619)

こんにちは。D2の小西です。
かなり長い間記事を書いておらず、久々の投稿になります。
とりあえず、この備忘録も今回で一旦キリが良いところまで来ました。 

<プログラム内容>
本プログラムでは、LPM(Low Power Mode)ごとの違い、DACの使い方、IOピンによる割り込み、について触れる。DAC1にはA0~A2(ADC)の平均値が直接出力され(最もシンプルな入出力関係)、DAC0にはTimerBに紐づいた内部カウンタを利用したアナログ三角波電圧が出力されアナログ的にLEDを調光する。
GPIOピン(P2.4の押しボタン)の立ち下がり割り込みによって入るLPMを切り替える。LPM3ではDCOが停止するため、TimerBのクロックソースもLFXT1Sに切り替える。LPMごとにLEDの調光周波数を変化させて、現在のモードを可視化する。
  P5.4 -> MCLK.....; MCLKを出力・監視
  P5.5-> SMCLK....; SMCLKを出力・監視
  P5.6 -> ACLK.....; ACLKを出力・監視

・Low Power Mode:LPMとは、プロセッサの消費電力を抑えるために、不必要なときには高速なクロックシステム自体を停止させる動作モードのことを指す。モードによって停止するクロックシステムの深度が異なり、より多くのクロックを停止させた方が消費電力を抑制できる。 

MSP430F2619のLPMとクロックシステムの可否の対応を下記に示す。 
Mode        Enable / Disable
Active        CPU, MCLK, SMCLK, DCO        Nothing
LPM0        SMCLK, DCO                          CPU, MCLK are disabled
LPM2        ACLK, DC generator              CPU, MCLK, SMCLK, DCO are disabled.
LPM3        ACLK                              CPU, MCLK, SMCLK, DCO are disabled. DC generator disabled.
LPM4        Non active                             CPU and all clocks disabled


MSP430x2xx Family User's Guide.pdfには、“2.4 Principles for Low-Power Applications Often, the most important factor for reducing power consumption is using the MSP430 clock system to maximize the time in LPM3.“、とある。すなわち、制御周期中にいかに長時間LPM3に潜ることができるかが低消費電力システムを構築する要である。 



ピン配置と役割は以下の通り。
P2.4 -> Push Botton...; 割り込みトリガ用プルアップ押しボタン

P4.0 -> Yellow LED....; TimerBを出力する(ここがLPM復帰のトリガとなる)
P4.1 -> Red LED........; LPM3のときだけ点灯する(ステータス表示)
P4.2 -> Blue LED.......; LEDを調光する三角波がUp modeのときだけ点灯する
P4.3 -> Green LED.....; LPM0のときだけ点灯する(ステータス表示)

P5.4 -> MCLK.....; MCLKを出力・監視
P5.5-> SMCLK.....; SMCLKを出力・監視
P5.6 -> ACLK......; ACLKを出力・監視

P6.0 ~ P6.2 -> 可変抵抗を入力..; ADC入力
P6.6 -> DAC0.....; ADCの変換結果を直接出力する
P6.7 -> DAC1.....; TimerBのカウンタを利用して、アナログ三角波電圧を出力する


まずはフローチャート
TimerBのコンペアマッチが発生すると、LPMから脱出してActive Modeに戻ってくる。アップモードかダウンモードかに従ってTimer counterの値をインクリメント/デクリメントして、アナログ的に三角波を生成する。LPM中にボタン(P2.4)が押されて入れれば、フラグを切り替えて次に入るLPMを切り替える。


次に、回路図。
可変抵抗の中間電位をA0~A2に入力してアナログ指令値を得る。DAC0、DAC1、ポート4に各種LEDを接続する。

また、実験風景。
LEDの役割は図に示した通り。

実験の様子を撮影した動画・結果
左上のプルダウンボタンを押すことでLPM0->(0:06)->LPM3->(0:11)-> LPM0->(0:14)-> LPM3と切り替えている。()内の数字は動画のタイムスタンプを表している。


下記はLPM0のときとLPM3のときの測定結果です。LMP0に入ったときは、MCLKは停止しているがSMCLKは動作している。また、LPM3に入ったときは、MCLK, SMCLKともに停止しており、低消費電力に動作しようとしている。
  LPMode_FLAG = 0 (LPM0)              LPMode_FLAG = 1 (LPM3)

サンプルコード
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
Blog: DAC, LPM(GitHub Gist)
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

前回の備忘録1,2でも触れた内容については触れず、新しく出てきたところだけ触れていきます。

<52~67行> 
54. DAC12_1CTL |= DAC12SREF_2 + DAC12IR + DAC12AMP_2;
55. DAC12_0CTL |= DAC12SREF_2 + DAC12IR + DAC12AMP_2;
    DA変換器に関する初期設定
 ( U. G. P.588   25. DAC12_xCTL, DAC12 Control Register )
 ・DAC12SREFx : DACに使用する基準電圧を選択する
   00 VREF+    01 VREF+
   10 VeREF+   11 VeREF+

 ・DAC12IR : 許容できる入力電圧の範囲を指定する
   0: DAC12 full-scale output = 3x reference voltage
   1: DAC12 full-scale output = 1x reference voltage

 ・DAC12AMPx : DAC12の入力および出力アンプのセトリング時間と消費電流を選択
                           Input Buffer                Output Buffer
            000         Off DAC12 off,          output high Z
            001         Off DAC12 off,          output 0 V
            010         Low speed/current       Low speed/current
            011         Low speed/current       Medium speed/current
            100         Low speed/current       High speed/current
            101         Medium speed/current    Medium speed/current
            110         Medium speed/current    High speed/current
            111         High  speed/current     High speed/current

66. DAC12_1DAT = 0x000;
 ・DACの出力電圧を決定するレジスタ
  DAC12SREFで指定した基準電圧を4095=2^12-1として、"所望の電圧÷Vref×4095" を指定する。


<71~81行>
73. ADC12CTL0 = SHT1_3 + SHT0_3 + REFON + ADC12ON + MSC;
 ・複数のチャンネルをまとめて変換させるときはMSC(Multiple sample and conversion)ビットを立てる。

80. ADC12MCTL3 = SREF_1 + INCH_10 + EOS;
 ・複数のチャンネルをまとめて変換させるとき、使用する最後のMCTLxに
  EOS(End of Sequence)ビットを立てる。


<91~115行>
103. P5SEL |= MCLK | SMCLK | ACLK;
 ・GPIOのI/Oピン以外の機能を使用する

111. P2IE |= P2LPM; // P2.4 interrupt enabled [JP10]
 ・ポート2の4番ピンの割り込みを許可する

112. P2IES |= P2LPM; // 0: low-to-high edge 1: high-to-low edge
 ・割り込みのトリガ極性を指定する。

113. P2IFG &= ~P2LPM; // P2 IFG cleared
 ・割り込みフラグのクリア


<193行~>
202. __bis_SR_register(GIE); // 汎用割り込み許可
 ・割り込みを使ってLPMから復帰することがほとんどなため必須

206. DAC12_0CTL |= DAC12ENC; // DAC go working
 ・DACを起動・使用可能にする。 停止させれば低消費電力が図れる。


<302~313行>
304. __bis_SR_register(LPMx0_bits + GIE); // Enter LPM0 w/ interrupts 
 ・LPMxに入るときのコマンド。 おそらく、この1行を実行した段階でLPMに入り、
  while文の中ではあるがこのコマンドの行でLPM復帰待ち状態で停止する。


以上。
-------------------------------------------------------

これで、MSP430シリーズの最大の売りである低消費電力/LPMを使えるようになりました。
次回は続くかどうかは分かりませんが、I2Cやシリアル通信なんかを使って周辺素子と接続できればなと思います。

2018年10月24日水曜日

MSP430マイコン 備忘録2 (MSP430F2619)

 M2の小西です。
今回もMSPマイコンについて備忘録2を記します。

<プログラム内容>
可変抵抗を動かしてアナログ指令値を変えることで、PWM変調にてLEDの明るさを更新させます。また、分周したクロックも別のLEDに出力することで可視化します。

ピン配置と役割は以下の通り。
P4.1 -> Red LED........; PWM変調調光
P4.2 -> Blue LED.......; 1Hz クロックで点滅
P4.3 -> Green LED.....; 2kHz クロックで点滅
P6.0 -> 可変抵抗入力..; AD変換入力

メインクロックとは別でクロックが2つもあるのは、メインクロックから別のクロックを作ってみるテストです。


まずはフローチャート
Timer-Bのコンペアマッチに反応してG_LEDを反転させCLK1が生成される。CLK1に従ってインクリメントするTB_CM変数がTpwm2にコンペアマッチすると、B_LEDが反転し、CLK2が生成される。

次に、回路図。
3つのLEDはタイマーBの出力に割り当てられているポート4にそれぞれ接続。可変抵抗の中間電位をA0に入力してアナログ指令値を得る

また、実験風景。
各LEDの役割は示した通り。下記の動画では、左上の可変抵抗をグリグリ回して赤LEDの明るさを変化させる


可変抵抗を回すことで赤LEDの明るさが変化しています。青LEDは約1Hzで、緑LEDは視認できませんが2kHzで点滅しているのが確認できます。



サンプルコード
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑


前回の備忘録1でも触れた内容については触れず、新しく出てきたところだけ触れていきます。

<51行> 
50.   // Setup ADC //   The ADC12OSC is generated internally and is in the 5-MHz range
51.   ADC12CTL0  = SHT0_2 + SHT1_2 + REFON + ADC12ON;
 AD変換器に関する初期設定1
 ( U. G. P.575   23.3.1 ADC12CTL0,  ADC12 Control Register 0 )
        ・SHT0x,1x : ADC12の0チャネル-7チャネル, 8チャネル-15チャネルに関する
          Sample Hold Timeを指定する。ADC用クロックを何周期使ってアナログ入力値を
          安定させるかを決めます。

//      0000:4       ADC12CLK cycles     0001:8    ADC12CLK cycles
//      0010:16     ADC12CLK cycles     0011:32   ADC12CLK cycles
//      0100:64     ADC12CLK cycles     0101:96   ADC12CLK cycles
//      0110:128   ADC12CLK cycles     0111:192  ADC12CLK cycles
//      1000:256   ADC12CLK cycles     1001:384  ADC12CLK cycles
//      1010:512   ADC12CLK cycles     1011:768  ADC12CLK cycles
//      1100:1024 ADC12CLK cycles     1101:1024 ADC12CLK cycles
//      1110:1024 ADC12CLK cycles     1111:1024 ADC12CLK cycles


        ・MSC : マルチサンプリング変換フラグ。AD変換は16チャネル用意されているが、あるタイミングで
       全てのチャネルの変換を開始する場合に立てる。 
      
        ・REFON : 変換に使用する基準電圧をマイコン内部で生成するか決定する。使わないならエコのためOFF
        ・REF2_5V : 内蔵基準電圧の値を決める
   //   0 : 1.5V
   //   1 : 2.5V

        ・ADC12ON : 1を立てるとADC12が起動する
        ・ENC : Enable Convertion 1を立てるとAD変換が使用可能になる
        ・ADC12SC : 初期設定完了後に、1を立てたときからAD変換が開始される



<52行> 
52.   ADC12CTL1  = SHP + ADC12SSEL_0;
 ( U. G. P.577   23.3.2 ADC12CTL1,  ADC12 Control Register 1 )
 AD変換器に関する初期設定2
        ・SHSx : Sample and Hold を開始するソースを選択する, Timerを選択するとCMがフラグとなる
   //   00 : ADC12SC bit           01 : Timer_A.OUT1
   //   10 : Timer_B.OUT0        11 : Timer_B.OUT1

        ・SHP : Sample and Hold のモード選択
   //   0 : SAMPCON signal is sourced from the sample-input signal.
   //   1 : SAMPCON signal is sourced from the sampling timer.

        ・ADC12SSELx : AD変換のクロックソースを選択
   //   00 : ADC12OSC     01 : ACLK
   //   10 : MCLK             11 : SMCLK

<54行> 
54.   ADC12MCTL0 = SREF_0 + INCH_0;    // VRef = AVcc, channel = A0
 ( U. G. P.578   23.3.4 ADC12MCTL0,  ADC12 Conversion Memory Control resisters )
 AD変換器に関する初期設定3
        ・EOS : End of sequency    1を立てると、複数チャネルを同時に変換するモードにて最後のチャネルであることを示す

        ・SREFx : AD変換に使用する基準電圧を+側・-側ともに選択
        // 000 VR+ = AVCC     and VR- = AVSS
        // 001 VR+ = VREF+   and VR- = AVSS
        // 010 VR+ = VeREF+ and VR- = AVSS
        // 011 VR+ = VeREF+ and VR- = AVSS
        // 100 VR+ = AVCC     and VR- = VREF-/ VeREF- 
        // 101 VR+ = VREF+   and VR- = VREF-/ VeREF- 
        // 110 VR+ = VeREF+ and VR- = VREF-/ VeREF- 
        // 111 VR+ = VeREF+ and VR- = VREF-/ VeREF

        ・INCHx : AD変換するチャネルを選択 ( 1010のTDは内部温度を測れる内蔵温度センサ )
        //  0000 A0,       0001 A1,            0010 A2,          0011 A3,              0100 A4,
        //  0101 A5,       0110 A6,            0111 A7,          1000 VeREF+,      1001 VREF- /VeREF-
        //  1010 Temperature diode,         1011 (AVCC - AVSS) / 2
        //  1100 GND,     1101 GND,         1110 GND,        1111 GND


<68行> 
67.   // setup Timer_B //
68.   TBCTL = TBSSEL_2 + ID_0 + MC_1 + TBIE;
 タイマーBに関する初期設定1
 ( U. G. P.391   13.3.1 Timer_B Control Register TBCTL )

        ・TBSSEL : タイマーBのクロックソースを選択
        //   00 TBCLK :外部入力のタイマー用クロック(P1.0 TBCLK)
        //   01 ACLK  :補助クロック(外部32768HZ発振子) /(div)
        //   10 SMCLK :サブシステムクロック(DCOから) /(div)
        //   11 INCLK :外部入力クロック(P2.1 TAINCLK)


<74-75行> 
74.   TBCCR0 = Tpwm;

75.   TBCCR1 = Tpwm*0.3;
        ・TBCCRx : 各チャネルごとにコンペアマッチする値を指定する(タイマーの周期やデューティを指定)


<76-77行> 
76.   TBCCTL0 = CCIE;

77.   TBCCTL1 = OUTMOD_7;     //
        ・TBCCTLx : 各チャネルごとにタイマーの設定をする 

<89-100行> 
93.   #pragma vector = TIMERB0_VECTOR     // Datasheet; Interrupt Vector Addresses P.16
94.    __interrupt void TIMER_B0(void)     // Timer interrupt 発生時に割り込む関数の定義
95.    {

99.    }        ・タイマーBによる割り込み動作を記述する


<117行> 
117.  ADC12CTL0 |= ADC12SC;           // ADC12 enable, start conversion
        ・SCフラグを立ててADC12の変換開始する。変換が終了すると自動的にSC=0となるから、
    もう一度変換をかけたいときはもう一度SC=1とすればいい。


<122行> 
122.   if(INTERRUPT_FLAG == 1){    }
        ・タイマーBの割り込み時にINTERRUPT_FLAGが立つので、そのつど if ルートに入る


<123行> 
123.   AD0 = ADC12MEM0;
       ・A0の変換結果はADC12MEM0に格納されるので、int型変数AD0に読みだす。

以上。
-------------------------------------------------------

これで、ボタンスイッチ入力・PWM出力・AD変換・割り込み[タイマー、AD変換]までできるようになりました。
次回はポートからの割り込みとLCDへの出力あたりを書けたらなと思います。

2017年7月21日金曜日

バースデーパラドックスが実証されました

こんにちは!

ミステリー作品が好きなM1のケンフィーです。コナンはもちろん、最近のドラマや映画では、「臨床犯罪学者火村英生の推理」「そして誰もいなくなった」「リバース」「僕だけがいない街」「22年目の告白-私が殺人犯です-」が良かったです。今は「愛したって秘密はある」が気になっています。


さて今回は研究室のブログらしい真面目な話をしようと思います。

研究室のキャンプの出欠確認の集計をしていたときのことです。
出欠確認で生年月日も記入してもらいましたが、この事実に気が付きました。

僕たちの研究室で、同じ誕生日の人がいる!!!


つい先日、数理暗号論という講義で「バースデーパラドックス」という話題が出てきたこともあり、「あー!このことかっ」って心の中で叫んでしまいました(笑)「バースデーパラドックス」が何のことか分からない人も多いと思いますので、以下に簡単に解説します。

■□■□■□■□■□■□■□

まず誕生日が同じになる確率は、1/366。(2/29を含む)

これは確率的に367人以上集めてこれば、必ず誕生日が一致することを表しています。では、50%の確率で誕生日が一致するためには何人以上必要でしょうか?ちなみに、確率論的に50%というのは、体験的に、その事象が起こりやすいと分かる確率です。

一見、367人の半分の187人以上だと考えると思いますが、バースデーパラドックスとは、その直感と反して、かなり少数でも50%の確率が一致するというものです。つまり、誕生日だと、√367≒20人以上集まれば、50%の確率で一致するということになります。

今は誕生日の話をしていますが、このパラドックスは学術的にも応用されています。どの分野で応用されているかというと、離散数学を扱う情報系や通信系で使われています。今回は暗号技術で、バースデーパラドックスがどのように使われているか紹介したいと思います。

まず暗号技術では、モデュロ計算(mod,剰余計算)を使った循環輪を活用します。

例えば、mod13において、等比数列を考えると、

2⇒4⇒8⇒3⇒6⇒12⇒11⇒9⇒5⇒10⇒7⇒1⇒2⇒……
(2の5乗は32ですが、mod13すなわち13で割った余りを取ると、6になります。)

と1~12までの12個の数字が離散的に繰り返されます。(簡単に解読されないためにRSA暗号だと4000個、ECC(楕円曲線)暗号だと200個以上の循環輪が使われます)

暗号では、例えば、2(平文)を7乗して(=11)、それを暗号文として相手に渡し、受け取った人は、(13-7)乗して平文に戻します(=復号)。このとき重要なのは、何回かけたか(今の場合7)を第3者に知られないことです。もし、この数字が知られてしまうと、解読されてしまいます。

攻撃者は、入手可能な情報(暗号文や暗号化に必要な情報)を使って、何回かけたか(ECC暗号の場合は何回足したか)を特定しようとします。その手法の一つとして、入手可能な情報を使って、離散的な数字を生成し、数字が一致させて解く攻撃手法があります。

ここで、登場するのが「バースデーパラドックス」です。現在、簡単に解読されないために長い循環輪が利用されています。しかし、どんなに大きな個数の数(nとおく)を使ったとしても、50%の確率で、生成した数字が少し前に生成した数字と一致して、解読するためには、√n個の数字を生成すればよくなります。攻撃するコンピュータは、生成した数字を保存して、新たに生成する数字と比較する必要がありますが、バースデーパラドックスに基づけば、保存する個数は少なく済み、少ないストレージのスペックで十分ということになります。

・・・・・・・・・・・・

現在、スマートフォンが普及し、セキュリティ上の脅威も日々増しています。僕自身、将来的にスマートフォンで仕事をする人が増え、パソコンがクリエイターや研究者、技術者などの専門的なツールになっていくのではないかと考えています。そうなると、暗号技術や暗号数学といった分野もある程度理解していないと、攻撃者に狙われやすくなるような、そんな時代に突入するかもしれませんね。



■□■□■□■□■□■□■□

暗号技術について、もっと知りたい方は
数学が支える情報通信のセキュリティ| 岡山大学 野上 保之 准教授 | 夢ナビTALK