2018年7月6日金曜日

Dynabook分解修理


 ◎昨年暮れ、電車の網棚からDynabook AZ85/UG が落下。
電車の網棚に置いたバックを下ろそうとしたところ、ちょっと何か引っかかる感覚があり、強引にバックの持ち手を引っ張ったところ、バックの勢いに、持ち手を放してしまい、バックは勢いよく床に落下、バックのDynabookを確認したところ、右のヒンジの付近が大破、電源のスイッチも浮き上がり押しても無反応、ああああああああ!
 帰宅後、「とりあえず、ハードディスクだけでも無事であってくれ!」 と思いながら、クラッシュDynabookを分解、筐体の損傷は激しいものの、マザーボードは奇跡的無事、そこで、分解途中で、電源スイッチ(内部 基板上)を押すと、いつもの通り起動、不幸中の幸い、しかし依然として、普段の使用には耐えない状態、何とかして、筐体を入手出来ないかと。。。
 

 ◎ヤフオク
  筐体入手に、Dynabookのジャンク品が無いかとヤフオクを検索、筐体だけ必要なので(メモリ、ハードディスク、LCDディスプレイなどは不要) 予算5000円前後でDynabook AZ」でジャンク品を探すのですが、AZシリーズ自体出品数が少なく、なかなか予算内で落札できず、3か月経過、そんな時、秋葉原でノートPC のジャンク品を漁っていた時(Dynabookのジャンク品はほとんど1世代より古い型ばかりで)、中古ノートPC売り場で、同じ筐体のものがあるのを見つける、はじめ AZシリーズの下位モデルと思いきや、「Dynabook T55」 あれれ!
そこで、ヤフオクの検索条件に Tシリーズを追加、一気に対象が増えました、しかし依然として、落札に至らず。
苦節6か月ようやく、Dynabook T45 ジャンク品を落札、届いたT45を確かめると、美品、筐体損傷なし、メモリなし、ハードディスクなし、送料込みで7300円、


 
T45AG85を移植
 一抹の不安を持ちながら、移植開始、
・両方の筐体を開く、まずマザーボードを確認、基板は同じ(乗っかっているパーツは結構異なっていました。)。
AZ85のメモリ、ハードディスクを外す。
ここからはAZ85T45平行して作業を行う。
・光学ドライブを外す。
・マザーボードに繋がっているフラットケーブルを外す(同じフラットケーブルでもコネクタのロックが異なっているものがある、要注意)。
・マザーボードのCPUクーラーを外す。固定のねじを外し、マザーボードを外す。
 ・LCDディスプレイ部を外す。
 ・その他のパーツを筐体から外す。
 ・取り外したAZ85のパーツをT45の筐体に取り付ける。


◎復活 Dynabook
 ・T45に電源アダプタをつなげスイッチON 無事起動(まずは念のため、最初はバッテリーパックを外した状態)


◎バッテリーパックの装着
バッテリーパックがT45AZ85で共通かどうか不明、いろいろ調べると、ヤフーショッピング等で購入できるDynabookのバッテリーパックの対応機種のリストにT45の記載があるもののAZ85は無い、注意書きに「型式が異なる場合、極性等が異なる場合があるので、他の型式のPCへの流用は行わない」との記載 覚悟を決めて、T45のバッテリーパックを装着、スイッチON、バッテリーパックの異常発熱等が無いか確かめながら、復活Dynabookの機能の確認をおこないました、最初バッテリーの状態を画面で確認すると、バッテリーが認識されていない表示、やはりだめかと思いながら十数分放置、すると充電が10%の表示、最終的に100%の充電が確認できました。


◎まとめ
 今までデスクトップPC、オフコン、EWS等の分解修理の経験(十数年まえ)はあったのですが、初のノートPCの分解で当初不安で、ヤフオクであまり高額のジャンク品には手が出ませんでした。実際にDynabookの分解を始めると、筐体の開きやフラットケーブルの扱いに若干手間取るものの、デスクトップPCの分解修理と大差無いことが実感されました。今思えば、ヤフオクでもう少し頑張れば、、、、6か月かけての復活は少々時間を無駄にした感が否めません。


2017年12月10日日曜日

IOT事始め その2

 前回に引き続き、Texas Instruments のマイコン RM57 Launch Padを利用してIOTの実現を試みた内容を忘備録的に述べます。
 前回のデモプログラムでは ただRM57が抱えている、固定のHTTPファイルを単にWebブラウザに配信するだけで物足りなさを感じていました。RM57の処理した結果をHTTPファイルに反映させる必要があると考えました。まず、デモプログラムのファイルシステム(fsdata)にある、index.htmlを書き換えることで、動的なHTTPファイルを実現出来ないかと考えました。
 ソースとなるHTMLファイルに書き換え領域を示すタグを仕込み、その領域をRM57で処理した結果で書き換えれば、多少の制約があるが程々のものができるのではないか、しかしデモプログラムのソースをチェックすると。fs.cにfs_read()はあるけれど、fs_write()がありません。安直にfs_read()でindex.htmlを読み込み、タグをRX57のプログラムで適当に編集した文字列で置き換え、fs_write()でこのファイルを更新してしまえば、当初のIOTの実現が達成されるのではと。。。
 そうなると、ファイルシステム(fsdata)を動的なものに置き換える必要があります。以前、SDカードの読み込みをRM57で試していましたが、なかなかうまくいかず挫折していましたが、今回再度挑戦、、、長期戦を決断しました。

 ファイルシステムをSDカードのファイルシステム FatFs に置き換えることで動的なファイルシステムを実装することにしました。

 RM57は、豊富ペリフェラルを持ちSDメモリーカードに使用するSPIも単独で使用することができました。
 後はひたすら、httpd.cの fs_read(),fs_open()を FatFsのf_read(),f_open()に置き換えることで生じる膨大なビルドエラーに対応しました。
 あと、#define で LWIP_HTTPD_DYNAMIC_FILE_READ 、LWIP_HTTPD_DYNAMIC_FILE_READ を定義する必要があります。
  

 なんとか、SDカードにあるHTMLファイルが Webブラウザに表示できるようになりました。 すると今度はWebブラウザからRM57を制御したくなりました。
 今から十数年まえ、NetscapeのWebサーバでCGIを使っていた事を思い出すと、httpd.cのコメントにCGIの記載があることに気が付きました。
 
 今度はCGIの実装に挑戦です。 


 このプログラムはWebブラウザで入力されたRGBの色の値をRM57に送り、LCDディスプレイにその色で描画するといったものですが。自己満足は十分に満たしたものとなっています。
  

  

2017年6月21日水曜日

IoT事始め

 遅ればせながら、IoTを体験したいと思い、Texas Instruments LaunchPad(LAUNCHXL2-RM57L) の デモアプリケーションを試してみました。

 このデモアプリケーションでは、HTTPDの機能、DHCPからのIPアドレスの取得、シリアル通信によるログ出力が実現されています。

○デモアプリケーション(開発環境、ソースコード)を TI Wikiよりダウンロード。


 ※(http://processors.wiki.ti.com/index.php/LAUNCHXL2_RM57L:_lwIP_Demo)


○開発環境の整備
 ・Code Composer Studio(CCS)は  Version: 6.2.0.00050 にアップデート
 ・HALCoGen  は Window10で一部の画面表示が乱れるので、Windows7 で インストール(アップデート)を行いました。(Window10で一部の画面表示が乱れはかなり少なくなっていますが、まだ使用には耐えられないようです。)
○デモアプリのダウンロード
 ・デモアプリをダウンロードし展開
(フォルダ「HALCoGen EMAC Driver with lwIP Demonstration\v00.03.00¥」に実行ファイル、ソースコードが展開されます。)
(HALCoGenのサブパッケージもインストールされるようです。前述のアップデートは不要かも?ここでアップデートも行われるかも?)
HALCoGen によるRM57のコンフィグレーション
 ・GIO、SCI1、MIIおよびPINMUXの設定を行いました。ただひたすら、Wikiの説明通りの修正作業となりました。
   (from MII_RX_AVCLK4 to MII_RXCLK....の記述がいまいち不明で balls T4, U7 のMII_RXCLK、 MII_TX_CLKを選択。)
 ・RM57Lのコンフィグレーションソースの生成
○CCSによるデモアプリの生成
 ・Wikiの説明通りプロジェクトのインポート、コピーを行う。
 ・HALCoGenの生成ソースコードへのリンクを行う。
 ・HL_phy_dp83640.h、HL_sys_main.cを修正する。
XDS110 Emulator設定
 ・targetConfigsフォルダのRM57L8xx.ccxmlの修正
   「RM57L8xx_0」を「RM57L8xx」に、「XDS110 USB Debug Probe_0」を「XDS110 USB Debug Probe」に修正。
○デバッグ実行
 ・ターミナルソフトをCOM3、9600BPSで立ち上げ実行


LAUNCHXL2-RM57Lはネットに接続していないのでDHCPからのIPアドレス取得エラーが表示されているが、一応稼働しているらしい。






○ちょっと修正

 最初、LauchPadへの接続が不調で、過去に作成した、RM57Lプロジェクトにこのデモアプリケーションのソースを組み込み。なんとか、IoTの実現の第一歩にたどりついた様子を掲載します。



※今回のデモアプリケーションにBOOSTXL-K350QVGへの表示機能を追加したアプリケーション。














※ルータにLaunchPadを接続して、デバック実行
 DHCPによるIPアドレスの取得に成功している。








※WebブラウザでLauchPadにアクセスする。

表示されている内容は、Cのソースコードに変換して、プログラムで定義されたデータの形で扱われている。(固定の表示)








◇コンパイルエラーが多少出る。
 ・HL_pinmux.c の pinMuxReg->PINMUX[9] = PINMUX_BALL_R4_ | PINMUX_BALL_N17_EMIF_nCS_0 | PINMUX_BALL_L17_EMIF_nCS_2; でコンパイルエラー
 対処:PINMUX_BALL_R4_を削る。  など

◇Launch Padのパッケージを開封した際、MACアドレスが同封されていることを期待していたのですが、、、、残念、古い古い、ノートPC(Win95)のEtherNetカードのMACアドレスを流用しようと思います。(ローカルで使う分には、何を使おうが関係ないのですが。。。。)


◇今後は、RM57Lとのデータやパラメータの送受信が HTTPDを介して 実現できたらと思います。























2015年8月28日金曜日

LaunchPad ブースターパック(TFT液晶)を試しました。 その2

MSP432 LaunchPad 用の BoosterPack を RM46x LaunchPad に 試してみました。

これらのLaunchPadは、BooserPackに使用するピンヘッダーの機能が共通なので、LM4F120 LaunchPad のように ピンの変換を行う必要はありません。
 ただ、BooserPack BOOSTXL-K350QVG-S1 に RM46用のサンプルが無いだけだと思います。

 とりあえず、画面表示に挑戦してみました。

ポイントは、
 ・SPI 機能は MibSPI3 モジュール を使用 
   ただし動作モードはSPIモード(MibSPIモードでは行わない。)
 ・GPIO 機能は 少々面倒
  SPI CS ピンは直接 GPIO(GIO)を使えません。
  High-End Timer (N2HET) モジュールのGIO機能を使う。
 ・HALCoGenに慣れること。






HALCoGenの設定

 SPIの設定 
*MIBSPI3とSPI3は同じモジュール(としてあつかう。?)

  SPIの設定2
*DataFormat 0 を設定。
*ボーレートを16MHzで設定
*ClockPolarityをチェック
(SPI MASTERとなる。)

  ピン設定
*SPI SIMO CLKのピン設定





 










SPI コーディング

   spiDAT1_t dataconfig_t;
   uint32 blocksize;

   //  DataFormat 0 を指定
   dataconfig_t.DFSEL = SPI_FMT_0;

   dataconfig_t.CS_HOLD = true;
   dataconfig_t.WDEL = false;
   dataconfig_t.CSNR = 0;

   blocksize = 1;

・・・・・・・・・
   uint8_t dat;

・・・・・・・・・
   //SPI 出力
   uint16  srcbuff[8];
   srcbuff[0] = dat;
   spiTransmitData(spibase,&dataconfig_t,blocksize,srcbuff);


高性能 LaunchPad を試しました。

 
MCUのクロックスピードが220MHz、FlashROM 1.25MB RAM 192KB デジキーで購入できる最高スペックのLaunchPad(2015年8月時点) を購入しました。

 届いたLaunchPadを開封すると、MSP430に比べ小さいパッケージに、どでかいボード(MSP430の2.5倍)が窮屈そうに入っていました。
 早々、にUSBケーブルでPCにつなぐと2つのLEDが異なった周期点滅。
 以下の操作でLEDの点滅が変化


 ・LightSensor を指で 隠すと LED B の点滅が遅くなる。 
 ・UserSW Aを押すと、 LED Aの点滅が早くなる。
 ・Baud Rate: 19200, Data Bits: 8, Stop Bits: 2 and Parity: None. でターミナルソフトにつなぐと、ガイダンスが出力される。

 次に、LED チカチカの もっとも簡単なプログラムを作成にトライしました。(いきなり)
・Code Composer Studio(CCS)でワークグループを作成し、プロジェクトの新規作成を。
 => Target の
 => 再度 CCSをインストールし直す。(結果同じ)  

http://processors.wiki.ti.com/index.php/LAUNCHXL2_RM46:_Project_0 を 参考にする。
 =>RM46 対応の Target Configuration File を作成する。(プロジェクト作成の前。)
 =>HAL Code Generator を インストール
 =>サンプル Project0を 作成  ここで、Taget の 個別のMCUの選択リストにRM46があることに気づく。




 
 
 






Hercules RM46x LaunchPad の 感想

・IO ピンが多い、ほぼすべてのMPUのピンが利用可能。
・サンプル(デモ)プログラムがほとんど無い。 
  CCSプロジェクトファイル、プログラムソースに加え、HALCoCen. プロジェクトファイルがそろった、サンプルプログラムが提供れる事を期待。
・sys_main.c が 邪魔。 システム、各ペリフェラルのパラメータを HALCoCen. で 修正するたびに sys_main.cが出力 main.cと かぶり 邪魔になります。
・デジキーの価格設定が高い。TI ではほぼ20ドル が 4、721円 Hercules RM57L LaunchPadの価格では?と 。。。。





  
   

2015年8月21日金曜日

LaunchPad ブースターパック(TFT液晶)を試しました。

 MSP432 LaunchPad 対応のBoosterPack (BOOSTXL-K350QVG-S1 Kentec QVGA Display)を購入しました。
早速、MSP432に搭載、デモアプリ BOOSTXL-K350QVG-S1_GrlibExample_MSP432P401R を試しました。

このデモアプリ
 最初 4隅に赤○の表示、これを 順にタッチして、メインメニューが表示、ボタン選択で、テストグラフィックの表示、TIロゴの表示を行います。

さて、このブースターパック、過去に悪戦苦闘して、TFT液晶を表示させてきた事を思い起こすと、結構すぐれもののアイテムだと気付きました。

 今まで、TFT液晶表示を行おうとすると、TFT液晶のフレキケーブルの扱い、バックライトLEDの昇圧回路の作成等、手間暇とコストが結構かかりました。(特に実体顕微鏡での半田づけが大変)
 このBoosterPack、TFT液晶の入出力IFは 2.52mmの2×10のピンフレーム(ソケット)が2個、タッチパネル付き、それが、デジキーで3500円前後 正に理想的なアイテムです。

そこでBoosterPackを 単にTFT液晶モジュールとして試しました。
 デモアプリを CCSで LM4F120XL 用に修正し デバッグ開始、するとタッチパネル キャリブレーション画面の表示後、メインメニューが表示されました。

 (ただ現時点では、タッチパネルの扱いが不調で、キャリブレーション画面のチェックはスルーしてしまいます。)


 <<MSP432 => LM4120XLの変更点>>
 ・SPI  UCB0 => SSI0
 ・ADC 14Bit ADC(A13,A14) ⇒ 12Bit ADC(AIN1,AIN2)  ※
 ・GPIO(SDC) P4.6 => PD3
   ・・・・・・・・・・・・・・・・・・・・・・・・

  ※ADC関連のパラメータは 1/4 に(適宜)

 

黒のLaunchPad(MSP432)を試しました。

 TIのサイトをチェックしていたら。MSP432なるMCUがリリースされているのに気付きました。
手軽に使えたMSP430の32ビット版 勝手知ったる ARM Cortex-Mシリーズ (ARM® Cortex®-M4F)    さらに、LauchPadがデジキーで購入可能。早速購入、デモアプリを試しました。

 開発環境のCCS ver.6.1も問題無く導入完了(TIの場合、開発環境のダウンロードで一旦メールを受け取らなければいけない。これを忘れると。TIのサイト内で堂々巡りをすることになります。今回同じメールを3通受け取りました。。。。)

 デモアプリは、PCのGUIアプリの操作で点滅LED(LED2)の色、点滅間隔を変化させます。
(PC GUIアプリで R:0 G:0 B:140 を指定、LauchPadのLED2点滅を青に、)


そのほか、
 ・UART機能 
    LauchPad(MSP430)経由で確認 
 ・Stellaris LM4F120XL プログラムの移植
    グラフィク液晶表示(SG12864)の移植
       ==>成功
    SDカード読み込みの移植(SPI機能)
       ==>目下のところ不調


MSP432の使い勝手は普通!!・・・・まだ、簡単なテストプログラム段階ですが、何の違和感も無く、プログラム開発が出来ました。







2013年3月11日月曜日

LaunchPad UART,UART,UART,,,,

 Texas Instruments MSP430G2553のUART機能を試しました。しかし、ほんの些細なことに気付けず、お手上げ一歩手前、結構手こずりました。
 以下に、その顛末を記します。
 
UART機能を使う場合、Tx/Rxをクロス配線
1.Software UARTの検証
 もともと、MSP430LaunchPadには、UART機能の無い、MSP430G2231が付属していてデモプログラムはPCとの間でSoftUARTによる通信を実現していました。
 そこで、MCUをUART機能を持つMSP430G2553に置き換え、Software UARTを試すことにしました。
 1)CCS Ver4で新規プロジェクトを作成、
 作成時のProject Templatesで [Grace Examples/Hello world via software UART]を選択
 2)実行(Debug)
PCのターミナルソフト(ボーレート2400)で「Hello world.」を確認
2.UART機能の検証
 まずは、送信(TX)のみのプロジェクトを作成。
 1)新規プロジェクトを作成。
 作成時のProject Templatesで[Empty MSP430 Grace Project]を選択
 2)GraceでUART機能を設定
Grece Device OverViewで[USCI  A0 UART...]を選び、UARTの端子設定、ボーレート設定を行いました。
3)実行(Debug)
software UARTと同様にPCのターミナルソフトでMSP430からの通信を待つが音沙汰なし。
4)試行錯誤
 まず、P1.1、P1.2のピンの設定に問題があると思い、GraceでGPIOの設定を先に、その後UART設定を行う。Graceでの設定と、src/csl/GPIO_init.c等のソースコードの内容に祖語があると思いジタバタ、(プロジェクトのビルドでGraceの設定内容がソースコードに反映されることに気付くのは結構経ってから)
 UARTのボーレートが正しく設定されていないと思い、Basic Clock System(BCS)の設定を1、8、12、16MHzで試す
  等々、試行錯誤を繰り返す。

3.「え! こんなことが。。。」
 試行錯誤を散々繰り返した、もう、MSP430のUART機能はデータシートだけの機能とあきらめ、BaseBoadを作成、一応、UARTの入出力Pinを用意、LCD表示を確かめた後、だめ元で、UART機能をBaseBoad上で試す。すると、PCのターミナルソフトに「Hello world.」の表示が、、「え! なんで」と言う気持ちになりました。
   
 そこで、BaseBoad上のMSP430をLaunchPadに戻して、UARTの通信を確かめると、沈黙
Stellaris-MSP430 UART
つくづくLanchPadを眺めると、P1.1(TXD)、P1,2(RXD)の表記に目が留まりました。
「うそ!TX/RX 逆じゃないか!!」
つまり、LaunchPad MSP430 デモプログラムのSoftwareUARTのTX/RXピン構成が、MSP430G2553のUARTのTX/RXピン構成と逆になっているということです。
そこで、LaunchPad上のTX/RX配線をクロスさせ、試行錯誤で作成したプログラムを試すと殆どがUARTの機能が実現されていたことを確認しました。


4.Stallaris UART
 Stallaris LM4F120 のUART機能はさほどの苦労もなく試すことが出来ました。試したプログラムは SDカードのテキストファイルを読み込み、1行ごとにUART出力、これをMSP430で受けてLCD表示するといったものです。


Memo
1.MSP430のUART 受信(RX)は1バイト毎のRX割り込みで取り込み。
初め、RX(UCA0RXIFG)割り込みフラグクリアまで受信データを取り込む形で試しました。すると、受信データの最後の1バイトのみ取り込んだ結果になりました。
そこで、いろいろ試しているうちに、受信データのバイト数分RX割り込みが発生することがわかり、割り込み毎に1バイトづつ取り込むように修正、あとは、受信データの終わりの認識方法をどうするか、、、タイマを使い周期的に受信バイト数の監視を行い、増減なしで受信完了の処理を行うようにしました。
 

2013年2月6日水曜日

LPC1114 System Oscillator を試しました。

NXP LPC1114 のUART機能検証を続けています。まず、これまでに現れた不具合は、
・LPC1114のUSRT設定 
 LPC1114側のボーレート115200で PC側ターミナルソフトで文字化けが起こる。
 LPC1114側のボーレート9600で、PC側(115200)で正常な通信を確認。
・Systick設定
 Systick割り込みインターバルが想定の1/2

 ということで、システムクロックの設定について何か問題でもあるのかとも思いました。
 もともとNXP他が提供するサンプルソースはSystem Osillator(外付けクリスタル)をクロックソースにしていて、これをIRC Oscillator にして機能検証を行っていました。

そこで、クロックソースをSystem Oscillatorに戻して、これまでの検証を繰り返しました。(手持ちの水晶発振子が8MHzだったのでそれを使用)

LPC1114各レジスタ設定値
<LPC1114 UART設定:ボーレート9600 Systick設定:480000>
    システムPLL制御レジスタ(SYSPLLCTRL)      0x25    MSEL:5 (M=6)  PSEL:4(P=4)             
   システムPLLステータスレジスタ(SYSPLLSTAT)   0x01    PLL はロック状態             
   システムオシレータ制御レジスタ(SYSOSCCTRL)   0x00    オシレータはバイパスされません。/周波数範囲1 ~ 20 MHz             
   システムPLLクロックソース選択レジスタ(SYSPLLCLKSEL) 0x01  システムオシレータを選択             
   メインクロックソース選択レジスタ(MAINCLKSEL)  0x03    システムPLL クロック出力を選択             
   システムAHBクロック分周器レジスタ(SYSAHBCLKDIV) 0x01    1 で分周             
   システムAHBクロック制御レジスタ(SYSAHBCLKCTRL) 0x1105F                 
  これらの設定でメインクロック48MHz稼働を確認しました。

   UARTクロック分周器(UARTCLKDIV)  0x01                          
   UARTライン制御レジスタ(U0LCR)  0x03   8 ビットの文字長/1 ストップビット/パリティなし/DLAB=0                       
   UART分数分周器レジスタ(U0FDR)  0x10   DIVADDVAL=0/MULVAL=1
   UARTボーレート分周器レジスタ(U0DLL)  0x00                        
   UARTボーレート分周器レジスタ(U0DLM)  0x05   DL=0x0500
  これらのUART設定では、ボーレートは2343となりそう。
        BaudRate = 48M/(16*0x0500) = 2343

   システムtick カウンタ校正レジスタ(SYSTCKCAL) 0x04   システムtick タイマ校正値0x04              
   システムタイマリロード値レジスタ(SYST_RVR)  0x752FF   RELOAD              
   システムタイマ校正値レジスタ(SYST_CALIB)  0x04    TENMS=0x04   default値
  これらのSystick設定では、Systick割り込み間隔は 20mSになりそう。
   Systick割り込み間隔 = 0x752FF/(48M*1/2 ) = 0.02 Sec.

計測内容
 ・UARTのTX信号を測定すると、ビット巾は約0.1mSであった。
、    実際のUARTのボーレートは、9600であった事が確かめられた。
     PC側のボーレート設定9600のターミナルソフトでUART通信を確認。
    (PC側ボーレート115200でもUART通信が成立してしまうことを確認、前回、LPC1114側でボーレートを9600に設定すると115200のボーレートになると考えたことは、誤り。)

 ・Systick割り込みでGPIOのHigh/Lowを出力すると、High、Lowそれぞれの巾は10mSであった。
  

その他、
  UARTでボーレートを115200にした場合やはり、PC側で文字化けを起こした。(前回と同じ)
  ボーレートは115200付近であろうと思われ、 UART分数分周器レジスタ(U0FDR)でボーレートの微調整を試しましたが、不調に終わりました。

  LPC111xのデータシートでは システムオシレータの範囲は1~25MHzでした、しかしユーザーマニュアルでは一部10MHz~25MHzの表記があります。ドキュメント内、ドキュメント間で整合性がとれていないのではと思います。

まとめ、
  サンプルコードを利用したUART設定でボーレートは正しく設定された。ただし、ユーザーマニュアルのレジストリ設定と実際のレジストリ設定で食い違いがあるように思える。
  また、Systick設定では、ユーザーマニュアルの「システムtick タイマクロックはシステムクロック1/2」という事は実際と異なると思われる。

  
 現時点でのLPC1114のアプリケーション開発はユーザーマニュアルより、NXP等から提供されるサンプルコードを優先して参考にしたほうがよさそうです。




                  

2013年2月4日月曜日

TI LaunchPad 電子温度計 その後

以前作成した、TI Stellaris LaunchPad 電子温度計の動作確認を行いました。
まず準備したものは、観賞魚用小型水槽、ヒータ、水中ポンプ。 水8リットル(5℃)を水槽にいれ、そこに電子温度計につないだヒータ(300W)、循環用に水中ポンプを設置しました。
電子温度計に40℃の温度設定をすると、ヒータのスイッチが入り、徐々に水槽の水温が上昇しました。あとは、設定温度+αでスイッチが切れるのドキドキしながら待ちました。さて水温が40℃に到達、しばらくしてヒーターのスイッチが切れました。まず第一段階クリア。
ヒータのスイッチが切れた後、水温は惰性で若干上昇後、緩やかに下降を始めました。設定温度の40℃を切ったところで再度ヒーターのスイッチが入り所定の動作確認が出来ました。
●最初の設定
測定間隔5秒(目盛5分)、温度表示域30~46℃(目盛2℃) 
温度設定:40℃、動作:ヒーター、温度調整巾1℃(40.5℃でヒータースイッチOFF、39.5℃以下でヒータースイッチON)

水温は12~13分で上昇、下降を繰り返しました。水温は39.2℃~40.8℃の範囲で変化 

●温度調整巾 0.4に変更
(40.2でヒータスイッチOFF、39.8℃以下でスイッチON)

水温は7分で上昇、下降を繰り返しました。水温は39.5℃~40.5℃の範囲で変化。

今回テストした電子温度計は、まあ、観賞魚用の温度コントローラ並みの機能、しかしヒーターのスイッチにリレーを使用、その動作保障は10万回、つまり、7分サイクルの温度調節で8カ月でこの電子温度計の寿命を迎えることになります。

2013年2月3日日曜日

LPC1114 システムクロックについて(Systick)

LPC1114FN28のシステムクロック設定の検証を続けています。
今回はSystickタイマの動作を確認することでメインクロックの動作を確認しました。

Systickタイマのサンプルコードは「lpc11xx.keil-examples-CMSIS-update.zip」にあるプロジェクト「systick」のsysticktest.cのみを利用しました。

1.Systick割り込みでGPIOのHigh/Low出力を行い。出力周波数を計測。
  1)サンプルコード systicktest.c について
    以下のコードで 10mS でSystick割り込みを実現しています。
    #define SYSTICK_DELAY  (SystemCoreClock/100)
    SysTick_Config( SYSTICK_DELAY );
  2)割り込みで呼ばれる SysTick_Handler(void)にGPIO PIO1_4のHigh/Low出力を追加。
       void SysTick_Handler(void)
       {
         int i;
         TimeTick++;
         TimeTick &= 0x7fffffff;
          i = TimeTick & 0x01;
         GPIOSetValue( 1, 4, i );
       }
  3)GPIO出力周波数測定。
    測定された周波数は40~50Hz。(自作の周波数カウンタでの結果)
    Systickの設定を 10μS にして実行 測定周波数 49700Hz
       #define SYSTICK_DELAY  (SystemCoreClock/100000)

    また、メインクロックは48MHzであった。
  こkまでの結果をみると、Systick設定、システムクロックの設定で整合性はとれているおもわれる。    。。。。?
      
 

※ユーザーマニュアル17章「システムtick タイマ」の記載「システムクロックの周波数の半分に固定されています。」 で SysTick_Config()や、SystickのRELOADに設定される値はコーディング上二分の一される必要があると思われる。

LPC1114 UART及びメインクロックの確認

トラ技付録LPC1114でUARTの機能を以下の手順で検証しました。
メインクロックの表示


1.プログラムコードの入手
 NXPからサンプルコード「lpc11xx.keil-examples-CMSIS-update.zip」を入手し、以下のプログラムコードを抽出利用しました。
 ・uarttest.c フォルダUART
 ・uart.c、core_cm0.c フォルダCommon/src 
 ・uart.h、type.h フォルダCommon/inc
2.Keil uVision4で新規プロジェクトTestUART01を作成ビルド
 ・上記のサンプルコードファイルをプロジェクトTestUART01に追加
 ・system_LPC11xx.cは、GPIOを試したプロジェクトで使用したものをプロジェクトTestUART01に追加
3.プロジェクトTestUART01をデバッグ
 1)サンプルコードそのままで実行
    ・PCのターミナルソフトでUARTの通信は確認できなかった。
 2)ボーレートを遅くして実行
    ・UARTInit();によるボーレート指定を 115200から9600に変更した。
    ・最初、1)と同様にUARTは沈黙、、、いろいろもがくうちに、たまたま、PCのターミナルソフトのボーレートを115200で試すと、本来のUARTの動作が確認出来ました。


 LPC1114のボーレートが9600、PC側のボーレート115200でUARTの送受信が確認出来ました。
初めてUARTの動作確認
後は、LPC1114側のUART設定かメインクロックの設定の問題と思い、プログラムコードを点検しました。(特にメインクロックの設定はもともとクロックソースとしてシステムクロック(外部)であったのをIRCクロックに変更したので要注意)

 4.プログラムコードsystem_LPC11xx.cの確認
   1)システムPLL 制御レジスタ(SYSPLLCTRL)設定とメインクロック(SystemCoreClock)の計算に誤りと思われるコードがある。

  
 SYSPLLCTRLの設定値は0x00000023で分周比M=4 ポスト分周比P=2となりIRCクロック12MHzではメインクロックは24MHzとなるはず、
 しかしsystem_LPC11xx.cのSystemCoreClockUpdate()で計算されるメインクロックは48MHzとなりました。
 

 計算式
   SystemCoreClock = __IRC_OSC_CLK * ((LPC_SYSCON->SYSPLLCTRL & 0x01F) + 1);はレジスタSYSPLLCTRLのポスト分周比Pが考慮されていない。
 次のように修正した、
   SystemCoreClock = __IRC_OSC_CLK * ((LPC_SYSCON->SYSPLLCTRL & 0x01F) + 1) / (0x01 << ((SYSPLLCTRL_Val & 0x060) >> 5) );

5.system_LPC11xx.c修正の検証
 ひとまずメインクロックの計算式を修正した段階でUARTの検証を行った、当然、計算されるメインクロックは2分の1の 24MHz となるので LPC側のボーレートは2倍になります。PC 側のターミナルソフトのボーレートを230400に設定しました。

その結果は、文字化けが多発、一部の英数XYZ12345がエコーバックで表示出来ている。つまり、ボーレートに若干のずれがあると言うことでしょう。

6.UARTボーレートの調整
 LPC1114とPC側のボーレート設定の不一致は、ひとまず棚上げ、LPC1114のボーレートの調整を行いました。
 ユーザマニュアルでUART 分数分周器レジスタ(U0FDR)の設定でボーレートの調整が出来ることがわかり試しました。

文字化けがなかなか解消されない。
その結果は、DIVADDVALを1に、MULVALを12にした場合 最も文字化けが少なくなるが依然、使用に耐えるレベルにない。



 現時点で、システム周りのクロックは理解したつもりだが、まだ、その扱いがしっくりこない、

2013年2月2日土曜日

LPC1114FN28 GPIO でジタバタ

 数か月遅れで、トラ技(2012年10月号)付録マイコンLPC1114を試しています。付録DVDにあったサンプルプログラム「MDK_sample」を修正して、各機能のチェックを行おうと思いました。
 

 第一歩GPIOを確かめてみました。
 これが不幸の始まり。

 
 まず、トラ技の記事の「端子配置/機能」(P60、P61)を眺め、パラレルデータインターフェース用に8ビットまたは4ビットのデータポートを確保しようと思いました。
 当然、PIO0_0~PIO0_7(ポート0)または、PIO1_0~PIO1_7(ポート1)のいずれかを使うことになります。しかし、PIO0_0、PIO0_1はRESETとISPへの切り替え用となっているので、ポート0はデータポートしては使えないと判断、またPIO1_6、PIO1_7はUART用に使われます、ポート1も使えない、、、、、、、(強引にPIO0_4~PIO0_11で8ビットのデータポートを確保するしかないのかと思いました。)

 8ビットデータインターフェースは諦め、一まず、次のように、4ビット(PIO1_0~PIO1_3)のデータポートを実現しようとしました。
1.I/O設定(MDK_sample main.c)
 1)LPC_IOCON->PIO1_1 = 0xd0;を追加するがコンパイルエラーが発生次の通り修正
    LPC_IOCON->R_PIO1_0 = 0xd1;
    LPC_IOCON->R_PIO1_1 = 0xd1;
    LPC_IOCON->R_PIO1_2= 0xd1;
    LPC_IOCON->SWDIO_PIO1_3 = 0xd1;
 2)LPC1114に書き込めど、動かず、
    LPC_IOCON->PIOx_yで設定できるGPIOは動作確認できるが、それ以外のGPIOは不能となる。

 LPC_IOCON->R_PIOx_yについて、ユーザーマニュアル 6章「I/O設定」を繰り返し読む、レジスタの説明で[R機能]が優先、しかし[R機能]の意味が解らない、、、
 LPC_IOCON->SWDIO_PIO1_3について はシリアルワイヤデバッグ(SWD)のピンが優先、したがって、SWDの機能を無効にすればPIO1_3が使えるようになると思いました。
 しかし、ユーザマニュアルにSWDを無効にする方法もレジスタの表記も無い。NXPの他のドキュメントを繰るとCRP(Code Read Protection)の機能でSWDを無効に出来そうだと、、、、、


2.CRPの設定
 1)アドレス0x000002FCに値0x12345678を書き込む。
   startup_LPC11xx.sを以下の用に修正

        ・・・・・・・・・・・・・・・・・・
                IF      :LNOT::DEF:NO_CRP
                AREA    |.ARM.__at_0x02FC|, CODE, READONLY
CRP_Key         DCD     0xFFFFFFFF
                ENDIF

CRP_Key DCD 0xFFFFFFFF を CRP_Key DCD  0x12345678 に変更
 2)FlashMagicでCRP1の設定を確認
   FlashMagic ISP/Read Security....でCRP1を確認(通常はCRP is disable)
 3)GPIO PIO1_3の出力を調べるが、不調
   依然として、High/Lowの出力が出来ない。
 4)プログラムのフラッシュの書き込み不能に。
   CRPに関するドキュメントでは、CRP1ではプログラムの書き込みは可能なはず、しかしFlashMagicでのプログラム書き込みは不能。またセクタ0の消去は不能(ドキュメント通り)
そこで全消去をしようと思ったが、FlashMagicではそのような機能は無いようです。
 5)LPC1114 一つ廃棄
   LPC1114を試して1週間、最初の石は不能に、、、

 
LPC1114について、ネットを調べまくると、多くのソースコードでLPC_IOCON->R_PIO1_0 の設定があります。LPC1114自体 PIO1_0はCRPなどの面倒な設定なしで普通に使えるはず。。。。
問題は「Keil uVision4」でしょうか?「Keil uVision4」でR機能、SWD機能を前提にする環境があるのか、もしかしてGNU GCCを使えば このGPIOの問題は解決か。。。。

3.GCCによる開発
  以前LPC2388のプロジェクトをひな形に、付録DVDのサンプルプロジェクトを参考に
  1)プログラムソース
    main.c
    cr_startup_lpc11.c (Rev.01 2011.04.17 Munetomo Maruyama)
    system_LPC11xx.c (17. November 2009 by ARM)
  2)memory.def
     ROM0000.ld(created from nxp_lpc13_c.ld (v3.1.4 (200912230917)) )をリネイム
  3)Makefile
    コンパイルオプション COMPILE_OPTS = -c  -mcpu=cortex-m0  -mthumb
    ライブラリディレクトリ LIBRARY_DIRS = -L /usr/local/arm-tools/arm-elf/lib/thumb  -L /usr/local/arm-tools/lib/gcc/arm-elf/4.6.3/thumb (GCCのインストールにより適宜に修正)
  4)動作確認
    今まで沈黙していたPIO1_0につないだLEDが点滅

よし、GCCでのプログラム開発でLPC1114の全てのGPIO入出力に目途がたったと思いました。
しかし、いままで集めたサンプルプロジェクト中から、使えそうなものを修正し、動作の検証を行ったところ、前述の「Keil uVision4」と同じGPIOの不調が起きました。その不調の原因を調べると、どうも使っていたsystem_LPC11xx.cが異なっていたことに気づきました。
 実際2つのsystem_LPC11xx.cを比較しても、GPIOの不調が起こるコーディングは見つけ出せない(現在)

 さてそうなると、前述の「Keil uVision4」が原因で起こるGPIO不調に疑問、、そこでプロジェクトのsystem_LPC11xx.cを見ると、GPIO不調のGCCプロジェクトのsystem_LPC11xx.cと同じでした。
 そこで、system_LPC11xx.cを置き換え、検証すると「Keil uVision4」のGPIOの不調は解消。


まとめ
 ●LPC1114で R機能、SWD機能の共有ピンの GPIO動作不調はsystem_LPC11xx.cによる。
※「MDK_sample」のsystem_LPC11xx.c に System AHB clock 制御レジスタ (SYSAHBCLKCTRL)の設定を追加するとGPIO は正常に。
追加コード
  #define AHBCLKCTRL_Val        0x0001FFFF
  LPC_SYSCON->SYSAHBCLKCTRL = AHBCLKCTRL_Val; ....(2013/2/3)

 
 ●GCCでのビルド(make)では、コンパイルオプション -mcpu=cortex-m0 -mthumb が必須
またリンクするライブラリ(libc.a等)は thumb配下のライブラリを指定。
(LPC2388ではARM・thumbどちらでも可、LPC1114はthumbのみ可)

 ●CRP(Code Read Protection)設定 CRP1は現時点で設定しない方がよい。



    
 

2013年1月24日木曜日

トラ技(2012-10)付録 LPC1114を試しました。

 遅ればせながら、CQ出版 トランジスタ技術 2012年10月号 付録の NXP LPC1114を試しました。

 昨年 同誌をとりあえず購入、3か月余り書棚にしまいこんだままでした。しまいこんだ割には、その付録が気になっていました。付録は他の雑誌付録と違ってLPC1114単体、「一体どうやって使うのだろう?」 4KバイトのRAM、32KバイトのフラッシュROM、記事の通り「チョコット試す」にはもったいないようなスペック。
 今日、改めて記事を眺めてみました。すると、LPC1114を試すには、USB シリアル(RS232C、UART)のIFドライバIC、電源レギュレータ―等諸々、が必要であることが分かりました。
  入手できそうなIFドライバはFT231X(ICパッケージはSSOP-20)、電源レギュレータは手持ちかあるが結構手間取ることになりそう。
 ふと、傍らのTIのLaunchPad パッケージに目が止まりました。LunchPadを使えば、「USB-UART(Rx Tx)変換が簡単に利用出来そう!」「Vddの出力もある!」「USBドライバーのインストール不要!」 早速LPC1114のプログラミングに挑戦。以下にその顛末を述べます。    
 
まず、開発環境の整備
 
1.MDK-ARMのインストール(不要)
Interface誌付属 FM3基板を試したときインストールしたKeil uVision4の機能を確かめる。
 新規プロジェクト作成で対応CPUをみると
LPC1114/201  ~ LPC1114/323 が対応していました。
そこで LPC1114/102 用にデバイスデータベースをインストールしました。
 1)付録CDで立ち上がるIE HTMLページでMDK-ARM_NXP_LPCxxxx.exeを実行
 2)Keil uVision4を再度立ち上げ新規プロジェクト作成
   Select a CPU Data Base Fileで「NXP LPC Family Device Database」が選択可能になり そこに登録されているLPC1114/102でプロジェクト作成が可能になりました。
2.MyARM_sampleのインストール
   サンプルプログラムを入手するためインストールしました。
3.Flash Magicのインストール
サンプルプログラムによる、プログラム開発の実施
  
  
  
  
4.LPC1114の周辺回路の構築
   ・電源 Vdd、Vss    必須
   ・UART Rx、Tx    必須
   ・スイッチ SW1 (PIO0_1)  SW2(Reset) 必須(ブートローダでISPを起動させるため・・・後述)
   ・LED  LED1(PIO0_7) LED2(PIO1_5)  適宜
5.サンプルプログラムMDK-sampleをビルド/プログラム書き込み/実行
 

メモ
●Flash Magicでのプログラム書き込み。
  FlashMagic側) Baud Rateを115200に指定 InterfaceをNone(ISP)に
  PC側) デバイスマネージャでCOMポート ボーレートを1152000 に設定
●書き込み失敗時
  SW1(PIO0_1) SW2(RESET)同時 Push後 再度書き込む。
   (CPUリセット時 PIO0_1がLowの場合 ISPが起動、UARTによるプログラムの書き込みが可能になります。)

●トラ技2012-10号 P62 の図1の回路図でRXD/TXDの配線間違いがあるので注意
(Flash Magicで、てこずった原因)

2013年1月15日火曜日

NHD-C12864でチャート表示を試しました。

  TI Stellaris LaunchPadで作成した電子温度計の表示をSUNLIKE社SG12864aの他、Newhaven Display NHD-C12864でも試しました。
 SG12864のデータインターフェースはパラレル、一方NHD-C12864はシリアル、当初、SG12864の方が、表示能力に勝ると思われたのですが、最小限の表示プログラム改造でNHD-C12864を稼働させると、遜色ない結果になりました。逆に、SG12864で起こる表示の乱れがNHD-C12864で起こらない満足いく結果になりました。
 
 
NHD-C12864による温度チャート表示

SG12864による温度チャート表示
SG12864では頻繁に表示の乱れが起こり、各信号のタイミング調整でなんとか、対応しようとしています。











  NHD-C12864は、マイコンとのIFは5本(GPIO4本 /RES1本)、さらに、LCDドライバICが1つで、これがSG12864に較べ扱いやすいLCDとなっていると思われます。



 





グラフィックLCD NHD-C12864A1Zを試しました。

Newhaven Display International社 グラフィックLCD NHD-C12864A1Z-FSB-FBWを試しました。
 これまではTI Stellaris LaunchPadでSUNLIKE社グラフィックLED SG12864 を使用していました。SG12864ではGPIOピンを13本占有するので、開発アプリケーションが自ずと制限されます。
 そこで、データインターフェースがシリアルのLCDを探したところ、DigiKeyでNHD-C12864A1Zを見つけ、早速に入手しました。

NHD-C12864A1Zは、
 ・マイコンとのインターフェースはGPIOピン4本でOK
 ・0.1インチ(2.54mm)ピッチの12本のピン (6×2)
 ・3.3V駆動 (No.9ピン H+ ヒータ用の12Vの給電があるが、いまいち不明?)


最初、シリアルのデータインターフェースはSPI(SSI)やI2Cを使うと予想していたのですが、ドキュメントに記載された、初期化コードをみると、単純にGPIOのHi/Low出力でSCLとSI(SDA、Tx)を実現しているようで以下のコーディングを行いました。

  * シリアルによるデータ出力 1バイトの出力データ siout を シフトさせながら1ビットづつ出力

     for(i=0;i<8;i++)
     {
      lcd_SCL_low();          //SCL:Low
      if(siout & _10000000B)
      {
        GPIOPinWrite(LCD_PORT_BASE, LCD_PIN_SI, LCD_PIN_SI);  //SI:High
      }
      else
      {
        GPIOPinWrite(LCD_PORT_BASE, LCD_PIN_SI, 0);      //SI:Low
      }
      lcd_SCL_high();        //SCL:High
      siout = siout <<1;       //1ビットのシフト
     }


*感想 
  ・表示内容により、濃淡のムラがある。
  ・比較的簡単に表示が実現。
   (SG12864では、各信号の出力タイミングの調整が必要でしたが、今回は簡単に表示が確認出来ました。)

2013年1月12日土曜日

.Net (VC++) Chartクラスを使ってグラフを表示


先日作成した電子温度計(Stellaris LM4F120)とPCとの連携を行いたいと思い、測定データをPCに取り込み、データのグラフ表示を試しました。
以前VC++でグラフ表示を行った時 System::Drawing::Graphics等の Drawing配下のクラスを利用しましたが、今回は、Chartクラスを使ったグラフ表示を試しました。
 
===================================================================
1.概要
     電子温度計 [UART] ==(USB)== [COMポート]  PC
                      測定温度

  デザイン
   VC++でWindowsフォームアプリケーションでプロジェクトを作成する。
   Form1にChart、SerialPort オブジェクトを追加 設定する。

  初期処理
   Chart/Seriseに1024個のDataPointを値0で登録する。
  メイン処理  
   シリアルポート受信イベントで電子温度計が出力する温度データを取り込む。
   取り込んだ温度データを順次 Chart/Serise/DataPointオブジェクトに設定する。

===================================================================
2.VC++プロジェクト作成<<非時系列チャート>>
 1)Chart設定
   Form1にChartオブジェクト chart1 を作成
     プロパティ設定 Seriseコレクション(ChartType:Line)
 2)SerialPort設定
   Form1にSerialPortオブジェクト serialPort1を作成
     プロパティ設定 BaudRate と PortNameを設定
   
   
 3)コーディング コンストラクタ Form1(void)
   ①Charting/Seriesオブジェクト series1tをローカル宣言
     System::Windows::Forms::DataVisualization::Charting::Series^  series1t;
   ②chart1のSeries1を①で宣言したseries1tに読みだす。
     series1t = this->chart1->Series["Series1"];
   ③Charting/DataPointオブジェクトを初期値で作成。
     
     System::Windows:・・・:Charting::DataPoint^  tmppoint
      = (gcnew System::Windows::・・・::Charting::DataPoint(i,0));
   
   ④Charting/DataPointオブジェクトを①で宣言したseries1tに登録する。
     series1t->Points->Add(tmppoint);
   *③④を繰り返し1024のDataPointオブジェクトをseries1t(chart1/Series1)に登録する。

   ⑤シリアルポートをOpenする。
     this->serialPort1->Open();

 4)コーディング シリアルポート受信イベント処理 (serialPort1_DataReceived)
   ①Charting/Series、Pointsオブジェクト series1t、tmppoint をローカル宣言
   ②DateTime型で現在時刻を取得する。
     DateTime timesp =   System::DateTime::Now;
   ③シリアルポート受信データを取り込み、温度データを抽出する。
     strreceive = this->serialPort1->ReadLine();   [[strreceive:String]]
     strvalue = strreceive->Substring(7,6);  [[strvalue:String 温度データ位置:7]]
   ④取得した温度データでSeries1のDataPointを更新する。
     (インデックス指定で、一旦Series1のDataPointを削除して、取得した温度データでDataPointオブジェクトを作成し登録し直す。)
     series1t = this->chart1->Series["Series1"];
     tmppoint = series1t->Points[IntPointIndex];    [[IntPointIndex:DataPointインデックス]]
     series1t->Points->Remove(tmppoint);
     System::Windows:・・・:Charting::DataPoint^  tmppoint1
      = (gcnew System::Windows::Forms::DataVisualization::Charting::DataPoint(IntPointIndex,System::Convert::ToDouble(strvalue)));
     series1t->Points->Insert(IntPointIndex,tmppoint1);

  5)エラー対処
    このコーディングでプログラムを実行すると、不定期のタイミングで「InvalidOperationException ”コレクションが変更されました。実行されない可能性があります。” エラー」が発生します。
    ①原因の予想
      チャート表示処理中にチャート情報の更新が重なったため起きたエラーと思われます。
    ②対処
      Serise1/DataPointオブジェクトの削除、挿入処理はChartを一旦非表示にして実行する。
         this->chart1->Visible = false;       


===================================================================
3.VC++プロジェクト作成 <<時系列チャート>>

 1)Chart設定
     プロパティ設定 Seriseコレクション(ChartType:Line  XValueType:Time
 2)SerialPort設定
   
   
 3)コーディング コンストラクタ Form1(void)
   ①シリアルポートをOpenする。

 4)コーディング シリアルポート受信イベント処理 (serialPort1_DataReceived)
   ①Charting/Seriesオブジェクト series1tをローカル宣言
   ②DateTime型で現在時刻を取得する。
   ③シリアルポート受信データを取り込み、温度データを抽出する。
   ④取得した温度データでDataPointを作成し Series1に登録する。
         System::Windows:・・・:Charting::DataPoint^  tmppoint2
          = (gcnew System:・・・:Charting::DataPoint(timesp.ToOADate(),System::Convert::ToDouble(strvalue)));
      series1t->Points->Add(tmppoint2);
   ⑤Series1に登録されたDataPointオブジェクトが1024を超えた場合。先頭のDataPointオブジェクトを削除する。
      series1t->Points->RemoveAt(0);

===================================================================
※メモ
 ●DataPointの設定
 DateTime値をDataPointのX値に設定する場合 ToOADate()メソッドを使用する。
●チャートデータの更新処理の工夫
 データDataPointコレクションの更新時 Chatオブジェクトは非表示にする。 (前述)

※気になる点
●MicroSoftのmsdnオンラインドキュメントの不備
ChartクラスのSystem名前空間からの継承階層はSystem::Windows::Forms::DataVisualization::Charting::Chartですが、オンライドキュメントでSystem名前空間から繰るとSystem::Windows::Forms名前空間 止まりでした。また、DataVisualization名前空間配下の Series等のクラスではドキュメントの繰り方で、内容の無いページが現れます。
 とにかく、Chartクラスを使うのには情報が少ない。

2012年12月27日木曜日

Stellaris LaunchPadで電子温度計を作ってみました。

  TI Stellaris LaunchPadに温度センサーを繋げて温度表示を行いました。
 最初、単にStellaris LM4F120のAIN端子に温度センサを繋げて、「はい終了!」のつもりが。。。
 以前 MSP430で温度計を作ったときは、電圧出力型温度センサを使ったのですが、今回はLM4F120のADCが12ビットなので、
せっかくなら、「精度のある温度センサを!」
せっかくなら、「複数の温度センサを!」
といったことで、結構手間取るはめになりました。


1.温度センサについて
 今回使用した温度センサはUS Sensor社のUSP11491 です。

2.Rcの選択について
 今回使用の温度センサは、計測温度の上昇に伴い、抵抗値が減少します。したがってLM4F120が出力する電圧Vccの分圧回路を組む必要があると考えました。分圧回路を構成する2つの抵抗 1つはこの温度センサ、もう1つは固定抵抗(Rc) つまりRcを決める必要があります。
温度測定回路、温度計算式等

 ①各温度(-55~150℃)での温度センサの抵抗値を計算
   ※ただし 温度センサの B値は (0~50℃)でこの温度範囲外はBを補正する必要がありそうですが、それこそ、精密な温度計が必要になりそうで今回は目をつぶります。
 ②Rcを仮に設定して、各温度(-55~150℃)での分圧(V)を計算し、1℃あたりの分圧の変化⊿Vを把握
 
⊿Vが大きいほど測定温度の分解能が大きくなる。
   ●Rc 3.3KΩ の場合 35~54℃(45℃がピーク)で⊿Vが大きくなる。
 
   ●Rc 5KΩ の場合 20~50℃(34℃がピーク)で⊿Vが大きくなる。
 
   ●Rc 10KΩ の場合 0~40℃(19℃がピーク)で⊿Vが大きくなる。
 ※測定温度域が低い場合 Rcを大きく 高い場合 Rcを小さくすることになります。
 
3.Stellaris LM4F120のADCの使い方。
 StellarisWareのサンプルプログラムを参考に温度測定回路の電圧Vを取り込み温度表示をおこないました。比較的簡単に出来ました。
 しかし、複数温度センサー構成を試みたところ、なかなか2ch以降の電圧Vの取り込みが行えませんでした、StellarisのADCのシーケンス、シーケンスステップがなかなか理解できなかったのが要因でした、ドキュメントに関連するブロック図でもあったらと思います。
 
 
 
//////// 3チャネルのADC取り込み設定//////////////////////////////////////////
////////////////端子設定/////////////////////////////////////////////////////////////////////
 ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
 ROM_GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_3|GPIO_PIN_2|GPIO_PIN_1);
 ///////////////ADC0の使用宣言///////////////////////////////////////////////////////
   ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
 ///////////////シーケンス設定///////////////////////////////////////////////////////////
 ROM_ADCSequenceConfigure(ADC0_BASE, 2, ADC_TRIGGER_PROCESSOR, 0);
 //////////////ステップ設定////////////////////////////////////////////////////////////////
 ROM_ADCSequenceStepConfigure(ADC0_BASE, 2, 0, ADC_CTL_CH0 |ADC_CTL_IE );
 ROM_ADCSequenceStepConfigure(ADC0_BASE, 2, 1, ADC_CTL_CH1 |ADC_CTL_IE );
 ROM_ADCSequenceStepConfigure(ADC0_BASE, 2, 2, ADC_CTL_CH2 |ADC_CTL_IE |ADC_CTL_END);
//////////////シーケンス稼働////////////////////////////////////////////////////////////////
    ROM_ADCSequenceEnable(ADC0_BASE, 2);
    ROM_ADCIntClear(ADC0_BASE, 2);
 
//////// 3チャネルのADC 取り込み  //////////////////////////////////////////
///////////////ADCトリガ////////////////////////////////////////////////////////////////////
     ROM_ADCProcessorTrigger(ADC0_BASE, 2);
///////////////ADCコンバージョン完了待ち////////////////////////////////////////////////////////////////////
    while(!ROM_ADCIntStatus(ADC0_BASE, 2, false))
    {
    }
   ROM_ADCIntClear(ADC0_BASE,2);
  ///////////////ADCデータ取得////////////////////////////////////////////////////////////////////
    ROM_ADCSequenceDataGet(ADC0_BASE, 2, ulADC0_Value);
 
ulADC0_Valueは配列 ulADC0_Value[0]がCh0  ulADC0_Value[1]がCh1  ulADC0_Value[2]がCh2 の値を格納
 
 

Stellaris LaunchPadを試してみました。

SG12864によるアルファベット&テストパターン表示
2月前に購入した TI Stellaris LaunchPad をいじり始めました。
 

 開発環境の Code Composer Studio v5 はライセンス切れで、GNU GCCでのプログラミングを試しました。

  他のマイコンとは異なり、Stellarisでは、レジストリを直接操作するようなプログラミングはせず、レジストリの操作を遮蔽した各種関数を使用たプログラミングとなりました。




 
1.デバイスドライバ―のインストール
 TIのHPから、ICDIドライバー(spmc016.zip)をダウンロードし、以下のドライバーをインストールしました。
 ・Stellaris ICDI JTAG/SWD Interface
 ・Stellaris ICDI DFU Device
 ・Stellaris Virtual Serial Port

2.LM フラッシュ・プログラマ のインストール
  ・ダウンロードファイル:LMFlashProgrammer_1470.zip

3.StellarisWare  のインストール
 StellarisのドキュメントをTIのサイト探すのですが、プログラミングガイド、レジストリのリファレンスマニュアル等が見つからず、使えそうなドキュメントは各種関数のユーザーガイド(LM4F120H5QR_ROM_UserGuid.pdf)ぐらいで、プログラム開発は困難と思われました。
 StellarisWareには、LM3S,LM4Fシリーズのサンプルコードが含まれこれが開発の糸口になります。

  *TIからStellarisWareのファイルを ダウンロードすると、ダウンロード元でSW-LM3S-9453.exe(129MB) と SW-LM3S-9453(356M)の2つの異なったファイルが得られます。
 SW-LM3S-9453.exeを実行するとインストールエラーになり、そこで強引にSW-LM3S-9453のファイル名をSW-LM3S-9453.exeに変更してインストールを実行しました。
 

4.GNU GCC
 GCCはすでにインストール済み(Interface誌 付属FM3基板 Cortex-M3 用)
 StellarisWareのサンプルコードのディレクトリで make は成功しました。

※Stellaris LaunchPadの価格が1259円(DigiKey)に改定されていました。しかも在庫0 もう少し多めに買っとけば良かったかなと。。。。

2012年10月9日火曜日

TI LaunchPad  Stellaris を購入しました。

  テキサスインスツルメンツ(TI)より、Stellaris LM4F120 LaunchPadが発売され、半分収集癖から、とりあえず購入しました。このLaunchPadはMSP430と同レベルの価格で450円(C2000 LaunchPadが特別に高いということでしょうか)


 以前試した、Stellaris LM3S8962 の経験から使いやすいマイコンと予想しています。

今回 のマイコン LM4F120 はARM  Cortex-M4 で従来のM3からどの程度進化したのか期待をこめてパッケージを眺めています。
 今は、C2000 LaunchPadの使い方が解り始めたところで、当分このLanchPadの機能を検証していきたいとおもいます、 Stellaris LanchPadを試すのはずっと先になりそうです。

 











 
 
※LanchPad 3機種 
              CPU Bit Clock  RAM      Flash     特徴
MSP430          16  16MHz  128~512B 2KB~16KB  手軽に開発
C2000(TMS320)     32  60MHz  12KB     64KB     かなりユニーク
Stellaris(LM4F120)   32  80MHz  32KB     256KB     一般的(予想)

3機種のLaunchPad 単純に比較はできないと思いますが。今回のStellaris LanchPad は、以下の点でマイコンの学習用に最も適していると思われます。
  • メモリが大きい、      
  • CPU コアが ARM Cortex-M4   
  • 外部出力のPinが多い、 J1~J4の Vcc GND Reset 以外の外部ピンが殆どGPIOで使えます。
  • 超 低価格