2012年10月8日月曜日

TI C2000 LaunchPad 割り込み処理で悪戦苦闘

 
 テキサスインスツルメンツ(TI)のC2000 LaunchPad を 試し始めて、ほぼ1カ月たちました。
この、マイコン基板、他のマイコン基板(MSP430 LaunchPad や CQ出版の付属マイコン基板)に
に比べ やたら凝った構成になっているのに気付きました。
 例えば、以下の2点
 ●デジタルアイソレータISO72x
   PCとのシリアル通信(USBシリアル変換)を直接繋げず、デジタルアイソレータで通信によるPCからのノイズをシャットアウトするようになっているようです。
 ●LEDの点滅にロジックIC(バッファ)を使っている。
   今まで、LEDの点滅はGPIOの出力で行うのが定番と思っていたのですが、この基板、バッファを使うことで、GPIO端子が入力であろうと出力であろうと関係なく、端子の電圧レベル(Hi/Low)で点滅します。LEDはGPIO端子のモニタとなっているようです。
これらは、今後Know Howとして生かせそうな気がします。
 さて、開発の方では、CCSv5で作成するプロジェクトがデバッグは出来るものの、FlashROMへの書き込みが不調で、これがなかなか解決できずにいました。
 やむなく、デモプロジェクト(C2kLaunchPadDemo)をCCSv5にインポート(Copyで)し、
 このプロジェクトがFlashROMへの書き込みが成功するのを確かめた上で、大部分の機能を削りLEDの点滅のみのプログラムに改造しました。
 これをCCSv5でCopy/Pasteして新規のプロジェクトとして使用するようにしました。



C2000 LaunchPadのプログラム開発 第一歩
として各種 割り込みを試しました。
1.タイマ割り込
  サンプルプロジェクトtimed_led_blinkを参考にすると、難なくタイマ割り込みを実現できました。
  タイマ設定 TIMER_setPeriod(myTimer, 50 * 500000); の Period 値は const uint32_t になるような値だと問題ないのですが、uint16_tでおさまる値の場合キャスト(const uint32_t)が必要になるようです。
 また、ユーザーが使えるタイマはTimer0のみの1本で、プログラミングで工夫が必要となりそうです。

2.外部割り込み(GPIO)
  サンプルプロジェクトexternal_interruptを参考にすると、難なく外部割り込みを実現できました。
 外部割り込み(XINT1,XINT2)とGPIO入力Pinは1対1で、1つのピンにXINTnを割り当てると、他のPinに割り当てられないようです。つまり他のマイコンのように外部割り込みが ポート(複数のPin)に割り当てるようなことが出来ず、2本のGPIOの入力のみに外部割り込みが割り当て可能となるようです。

3.SCI(UART)割り込み
 サンプルプログラムscia_loopback_interruptsを 参考にするのですが、コーディングミスでSCI割り込みが失敗。各マニュアルをひっくり返すはめに、すると、割り込みを実現するために設定しなければならないレジスタがあまりにも多いことが解りました。
 また、TIが提供するソースコードで以下の誤りがありました。
 sci.cのSCI_setRxFifoIntLevel()の
     // clear the value
        sci->SCIFFTX &= (~SCI_SCIFFRX_IL_BITS); <=レジスタ間違い SCIFFRX 
 (RXFFIL4-0が初期値 11111のまま、で変更不可となってしまいます・・・・)
 
また FIFOがマニュアル上は16ワード(16バイト?)のはずが、4ワードが上限になっているようです。
 
 

2012年9月24日月曜日

TI C2000 LaunchPad を試しました。

2012年8月 テキサス・インスツルメンツ(TI)より、LaunchPad第二弾、C2000 LaunchPadがリリースされました。


 TIのホームページで同LaunchPadの外観を見て、40本のPinが引き出されていて、MSP430 LaunchPadに比べ、拡張性が高いと思い、早々に発注しました。購入価格は1551円
  9月上旬に届けられた、パッケージを開くと、意外と質素、まあ、MSP430 LaunchPadのパケージが価格のわりに凝り過ぎの感が否めなかったからでしょうか。

 まず C2000 LaunchPad で デモプログラムのデバッグが出来るまでの手順を以下に記します。
1.LaunchPadデモプログラムの稼働
   ・付属のUSBケーブルでLaunchPadを PCにつなぎます。(FT2232ドライバ(FTDI)はMSP430 LaunchPad等で導入済み)
     LaunchPadのLED0~3が流れるように点滅します。
   ・PCでターミナルソフトを立ち上げます。シリアル接続でボーレートを11520に設定します。
   ・LaunchPadのResetスイッチを押します。
    TIのロゴマークのパターンがターミナルソフトに出力されます。
   ・スイッチS3を押すと、LEDの点滅が変化し、ターミナルソフトに温度変化が出力されます。
   

2.Code Composer Studio(CCSV5)のインストール
   MSP430を試したときのバージョン4(CCSV4)で、C2000 TMS320F28027のプロジェクトを作成、(TIのホームページよりダウンロード(sprc191.zip)したサンプルプログラム を使用)
 
   ビルドは成功するのですが、LaunchPadとの接続が出来ない。接続エラーも出力しない。(うんともすんとも言わない状態)  CCSV4では無理と判断 CCSV5のインストールを行いました。
 1)TIからCCSV5をダウンロードした ccs_setup_5.2.1.00018.exe を実行
 
    CCSV5はc:\tiのフォルダにインストールされる。
 2)CCSV5を実行 ライセンス登録を行う。
  
   ・ライセンス管理のため ネットワークカードのMACアドレスが必要
    コマンドプロンプトで ipconfig /all を実行 イーサネットアダプタの物理アドレスを使う。
   ・メールで送られてきた ライセンスファイル(TMDFCCS-ALLT90A-v5.lic)を c:\ti\licenceのフォルダに置く。
3.controlSUITEのインストール
  これは、LaunchPadのデモプログラム(C2kLaunchPadDemo)を利用するためにインストールしました。
  デモプログラム
C:\ti\controlSUITE\development_kits\C2000_LaunchPad\f2802x_examples\C2kLaunchPadDemo
4.デモプログラムのデバッグ
 1)CCSV5を立ち上げ、前述のデモプログラムをImportしました。
  ・Buildを実行すると成功、しかしLaunchPadとの接続エラーでデバッグは実行出来ず。
 2)デモプロジェクトにNewでTarget Configuration File を作成しました。
  ・Connection: Texas Instruments XDS100v1 USB Emulatorを選択
  ・Boad or Device: TMS320F28027にチェック
  ・Save Configuration 後 Test Connectionを実行 =>成功
   ※接続ログ 後述
 3)デバッグを実行
  今回 C2000 LauchPad のデバッグ 実行から開始までかなり時間がかかりました。(40秒)

5.開発初期プロジェクトの作成
 1)File/NewでCCS Project を作成する。
       ・Project name 入力
   ・Device Family:C2000
              Variant:2802x Piccolo TMS320F28027
        ・Connection:Texas Instruments XDS100v1 USB Emulator
       ・Project templates and examples  で Empty Project(with main.c) を選択
   *Taget Configration File は TMS320F28027.ccxml で作成されました。
 2)プログラムコーディング/ビルド/デバッグ
   LED0~3の点滅のプログラムはビルド成功しかし、コーディングを進めるに従い、次のエラー発生

../28027_RAM_lnk.cmd", line 114: error #10099-D: program will not fit into available memory.  placement with alignment/blocking fails for section ".text" size 0xaa5 page 0.  Available memory ranges:
   
どうも RAMのエリアが足りないエラーのようです。
   ・cmdファイル 28027_RAM_lnk.cmd の置き換え。
    とりあえずデモプロジェクトで使われている 2つのcmdファイルに置き換えました。
   <cmdファイル>
     ●F2802x_Headers_nonBIOS.cmd
        C:\ti\controlSUITE\development_kits\C2000_LaunchPad\f2802x_headers\cmd
     ●F28027.cmd
        C:\ti\controlSUITE\development_kits\C2000_LaunchPad\f2802x_common\cmd
これで一部WARNINGはでるものの一応ビルドは成功しました。

 何とかLED の点滅が可能になったので、キャラクタLCDでメッセージが表示を試しました。

----------------------------------------
 
  
 現時点では、まだデバッグは出来るものの、フラッシュROMへの書き込みは不調のようで、C2000 LaunchPadでもう少しじたばたしそうです。
----------------------------------------
C2000 LaunchPadの40本のピン 意外とGPIOに割り当てられたピンが少なく、少々残念、購入前に リファレンスマニュアルを読み込んでおけば。。。。。
----------------------------------------
※ 成功のLaunchPad 接続ログ
=======================================
  
[Start]
Execute the command:
%ccs_base%/common/uscif/dbgjtag -f %boarddatafile% -rv -o -F inform,logfile=yes -S pathlength -S integrity
[Result]

-----[Print the board config pathname(s)]------------------------------------
C:\Users\yanagi\AppData\Local\.TI\213602635\
    0\0\BrdDat\testBoard.dat
-----[Print the reset-command software log-file]-----------------------------
This utility has selected a 100- or 510-class product.
This utility will load the adapter 'jioserdesusb.dll'.
The library build date was 'May 30 2012'.
The library build time was '22:52:27'.
The library package version is '5.0.747.0'.
The library component version is '35.34.40.0'.
The controller does not use a programmable FPGA.
The controller has a version number of '4' (0x00000004).
The controller has an insertion length of '0' (0x00000000).
This utility will attempt to reset the controller.
This utility has successfully reset the controller.
-----[Print the reset-command hardware log-file]-----------------------------
The scan-path will be reset by toggling the JTAG TRST signal.
The controller is the FTDI FT2232 with USB interface.
The link from controller to target is direct (without cable).
The software is configured for FTDI FT2232 features.
The controller cannot monitor the value on the EMU[0] pin.
The controller cannot monitor the value on the EMU[1] pin.
The controller cannot control the timing on output pins.
The controller cannot control the timing on input pins.
The scan-path link-delay has been set to exactly '0' (0x0000).
-----[The log-file for the JTAG TCLK output generated from the PLL]----------
There is no hardware for programming the JTAG TCLK frequency.
-----[Measure the source and frequency of the final JTAG TCLKR input]--------
There is no hardware for measuring the JTAG TCLK frequency.
-----[Perform the standard path-length test on the JTAG IR and DR]-----------
This path-length test uses blocks of 512 32-bit words.
The test for the JTAG IR instruction path-length succeeded.
The JTAG IR instruction path-length is 38 bits.
The test for the JTAG DR bypass path-length succeeded.
The JTAG DR bypass path-length is 1 bits.
-----[Perform the Integrity scan-test on the JTAG IR]------------------------
This test will use blocks of 512 32-bit words.
This test will be applied just once.
Do a test using 0xFFFFFFFF.
Scan tests: 1, skipped: 0, failed: 0
Do a test using 0x00000000.
Scan tests: 2, skipped: 0, failed: 0
Do a test using 0xFE03E0E2.
Scan tests: 3, skipped: 0, failed: 0
Do a test using 0x01FC1F1D.
Scan tests: 4, skipped: 0, failed: 0
Do a test using 0x5533CCAA.
Scan tests: 5, skipped: 0, failed: 0
Do a test using 0xAACC3355.
Scan tests: 6, skipped: 0, failed: 0
All of the values were scanned correctly.
The JTAG IR Integrity scan-test has succeeded.
-----[Perform the Integrity scan-test on the JTAG DR]------------------------
This test will use blocks of 512 32-bit words.
This test will be applied just once.
Do a test using 0xFFFFFFFF.
Scan tests: 1, skipped: 0, failed: 0
Do a test using 0x00000000.
Scan tests: 2, skipped: 0, failed: 0
Do a test using 0xFE03E0E2.
Scan tests: 3, skipped: 0, failed: 0
Do a test using 0x01FC1F1D.
Scan tests: 4, skipped: 0, failed: 0
Do a test using 0x5533CCAA.
Scan tests: 5, skipped: 0, failed: 0
Do a test using 0xAACC3355.
Scan tests: 6, skipped: 0, failed: 0
All of the values were scanned correctly.
The JTAG DR Integrity scan-test has succeeded.
[End]
=======================================





    

2012年5月15日火曜日

付属FM3基板 LCD表示(SG12864)

Interface誌 付属FM3基板 でモノクログラフィック SG12864 を繋げてみました。
当初 付属SH-2A基板で使っていたプログラムソースを流用したのですが。まったく動作せず、軽くタイミング調整でなんとかなると思っていたのですが、これに手こずり、いまだ使えずにいます。

◎FM3 <=> SG12864 インターフェース
----------------------------------------
FM3 GPIO       SG12864 PORT
----------------------------------------
P50            D/I       4
P51            R/W     5
P52            E       6
PB0-PB7         DB0-DB7 7-14
P3A            CS1     15
P3B            CS2     16
P53            /RES     17

そこで、SG12864 を使った簡単なプログラムソースが無いか、ネットで調べると、「Sim's blog」さんの   SG12864Aを使ってみました の記事に ソースコード(ATMEL AVRマイコン ATMega168)が掲載、これを拝借、
なにより、ソースが明瞭簡単、各信号の出力タイミングの調整すごく楽そうだったので、このソースコードを試すことにしました。

始めは、ノイズパターン(意味不明の)表示でした。そこで画像データの代りに、0x55、0x50(4本線2本線パターン表示)の固定値を書き込むように変更。
E信号等の出力前にWaitを加えその待機時間を調整、最初十数ドット巾の線が、待機時間の調整で徐々に広がり最終的に全画面表示に、そこで、本来の画像データの表示に戻すと、「初音ミク」登場とあいなりました。



*本来使いたかった私のSG12684のプログラムソースは 付属V850基板のときに作成、付属ARM(LPC2386)基板の時に、別のマイコンでも簡単に対応できるように、いろいろプログラムに工夫をこらしました、おかげで付属ARM(STM32)基板、付属SH-2A基板ではすんなり改造ができたので今回も簡単にできると思っていました。
今回のSG12684のプログラムソースの付属FM3基板への対応、一旦改造に失敗すると、凝ったプログラムは悲惨。。。と 反省


*今回の付属FM3基板 GPIOによるデジタル出力(パラレル)の能力が非常に高いと言えるのかも知れません。

2012年5月11日金曜日

付属FM3基板 第二歩 タイマ割り込み。

Interface誌 付属FM3基板 で タイマ割り込みがようやく使えるようになりました。デュアルタイマ、多機能タイマ何れもタイマ割り込みによるLEDの点滅が実現できました。

苦戦1週間余り、富士通からダウンロードしたサンプルプログラム(mb9bf51xt_dualtimer-v10)を幾度も見直すのですが、これが難解、ただ単に、ただ単に3つのレジスタを設定するだけでタイマを使えるようになるはず、と思いながら、解読。
レジスタおよび、レジスタの項目ごとの設定順をああでもない、こうでもないと。

実際にタイマが機能し始めたとき、このプログラムは何度か試したと思い。なんでこんな簡単なプログラムに手間取ったのか、少々じくじたる思い。

以下にそのプログラムソースを記します。(最も簡単なタイマ割り込みプログラム。

◎多機能タイマについて。
 
 
  多機能タイマのユニット2(3つ目のユニット)が機能しない。富士通のデータシート等を見ると、MB9BF610Tシリーズの多機能タイマは3(最大)となっていて、ほかの資料も最大3ユニット、「ほんとは2ユニット、1ユニット??」という気になる。

 
 
 また、多機能タイマのコーディングでは、しばらく、ユニットと、チャネルとを取り違えるミスをしていて気が付かなかった。凡ミスでユニット2が機能しないだけのことかもしれません。


=======デュアルタイマ  main.c ========
#include "mcu.h"
static volatile uint16_t int_count;

void DT_Handler(void)
    {
     /* Clear Interrupt */
     FM3_DTIM->TIMER1INTCLR = 0xffffffffU;

     int_count++;
     int_count &= 0x7fff;
     FM3_GPIO->PDOR5_f.P1 = (int_count & 0x0040) >>6;
     FM3_GPIO->PDOR5_f.P2 = (int_count & 0x0100) >>8;
}

int32_t main(void)
{
    int i;
     int_count = 0;
     // for LED1
    bFM3_GPIO_DDRF_P3=1;
    // Test Output Port (LED_A LED_B LED_C)
    bFM3_GPIO_DDR5_P0=1;
    bFM3_GPIO_DDR5_P1=1;
    bFM3_GPIO_DDR5_P2=1;

    // Configuration ( Dual Timer )
    /* Clear Interrupt */
    FM3_DTIM->TIMER1INTCLR = 0xFFFFFFFFU;
    FM3_DTIM->TIMER1CONTROL =0x00000000U;
        
    FM3_DTIM->TIMER1CONTROL_f.ONESHOT =0;
    FM3_DTIM->TIMER1CONTROL_f.TIMERMODE =1;
    FM3_DTIM->TIMER1CONTROL_f.TIMERPRE0 =0;
    FM3_DTIM->TIMER1CONTROL_f.TIMERPRE1 =0;
    FM3_DTIM->TIMER1CONTROL_f.TIMERSIZE =1;
    FM3_DTIM->TIMER1CONTROL_f.INTENABLE =1;
    FM3_DTIM->TIMER1LOAD = 0xFFFFFFFFU;
     /* enable interrupt */
    NVIC_EnableIRQ(DTIM_QDU_IRQn);

    //Set the count cycle
    FM3_DTIM->TIMER1LOAD = 0x00020000;
    FM3_DTIM->TIMER1CONTROL_f.TIMEREN =1;

    while(1){
        for(i=0;i<200000;i++){
           bFM3_GPIO_PDORF_P3 =1;
       }
        for(i=0;i<200000;i++){
       bFM3_GPIO_PDORF_P3 =0;
      }
  }
 
}
=======多機能タイマ  main.c ========
#include "mcu.h"

static volatile uint16_t int_count;

void MFT_FRT_IRQHandler(void)
{
    /* Clear Interrupt */
    FM3_MFT0_FRT->TCSA0_f.ICLR = 0x00;
    int_count++;
    int_count &= 0x7fff;
    FM3_GPIO->PDOR5_f.P0 = (int_count & 0x0020) >>5;
    FM3_GPIO->PDOR5_f.P1 = (int_count & 0x0040) >>6;
    FM3_GPIO->PDOR5_f.P2 = (int_count & 0x0080) >>7;
}

int32_t main(void)
{
    int i;

    int_count = 0;

    // LED1
    bFM3_GPIO_DDRF_P3=1;
    // Test Output Port (LED_A LED_B LED_C)
    bFM3_GPIO_DDR5_P0=1;
    bFM3_GPIO_DDR5_P1=1;
    bFM3_GPIO_DDR5_P2=1;

    // Configuration ( // Configuration ( Multi-function Timer ))
    FM3_MFT0_FRT->TCSA0 = 0x00;
    FM3_MFT0_FRT->TCSA0_f.CLK0 = 0x01;
    FM3_MFT0_FRT->TCSA0_f.CLK1 = 0x01;
    FM3_MFT0_FRT->TCSA0_f.CLK2 = 0x00;
    FM3_MFT0_FRT->TCSA0_f.CLK3 = 0x00;
    FM3_MFT0_FRT->TCSA0_f.MODE = 0x00;
    FM3_MFT0_FRT->TCSA0_f.SCLR = 0x00;
    FM3_MFT0_FRT->TCSA0_f.STOP = 0x01;
    FM3_MFT0_FRT->TCSA0_f.BFE = 0x00;
    FM3_MFT0_FRT->TCSA0_f.ICRE = 0x01;
    FM3_MFT0_FRT->TCSA0_f.ICLR = 0x00;
    FM3_MFT0_FRT->TCSA0_f.IRQZE = 0x00;
    FM3_MFT0_FRT->TCSA0_f.IRQZF = 0x00;
    FM3_MFT0_FRT->TCSA0_f.ECKE = 0x00;

    FM3_MFT0_FRT->TCSB0 = 0x00000000;
    FM3_MFT0_FRT->TCDT0 = 0x0000;
  
    NVIC_EnableIRQ(FRTIM_IRQn);

    FM3_MFT0_FRT->TCSA0_f.SCLR = 0x01;

    //Set the count cycle
    FM3_MFT0_FRT->TCCP0 = 0x1000;
 
    FM3_MFT0_FRT->TCSA0_f.STOP = 0x0;

    while(1){
        for(i=0;i<200000;i++){
         bFM3_GPIO_PDORF_P3 =1;
       }
        for(i=0;i<200000;i++){
        bFM3_GPIO_PDORF_P3 =0;
      }
   }
}

2012年5月7日月曜日

付属FM3基板 第二歩 タイマ割り込み。(苦戦中)

Interface誌 付属FM3基板 で タイマ割り込みにトライしています。必要とするタイマの機能は、インターバルの設定と割り込みによる関数こ呼び出しといった、ごく基本的な機能から試しています。

 ペリフェラルマニュアルでは、デュアルタイマと、多機能タイマの2種類のタイマの記載があり、先日富士通サイトからダウンロードしたサンプルコードのうち、「mb9bf51xt_dualtimer-v10」を修正し、一応
の動作を確認しました。

●修正点
   [smpl_dtim.c] / dtim_callback の if (int_flag < 30000 ){の処理に
     FM3_GPIO->PDOR5_f.P0 = (int_flag & 0x0040) >>6;を追加
      (  bFM3_GPIO_DDR5_P0=1;を適宜に追加 ・・・GPIO出力設定 )
        =>タイマ割り込み64回毎に点滅

 
次に、サンプルコード「mb9bf51xt_dualtimer-v10」のsample_main.c  smple_dtm.c DtimDev.h DtimDev_FM3.c DtimDev_FM3.h のソース、ヘッダー
別のサンプルコード「mb9bf61xt_template-v13」 のmb9b610t.h system_mb9bf61x.c  system_mb9bf61x.h のソース、ヘッダー
を使って、KEILの新規プロジェクトを作成しました。ただ、サンプルコードの”mb9bf51”が気になっただけのことですが。

●KEIL新規プロジェクト作成について、
  ターゲットの実デバイス 「mb9b618t」はDataBaseに追加されたようでこれを指定しました。
=> startup_mb9bf61x.s が生成されました。

ここまでは、比較的容易にたどりつけました。

 現在過去のV850~SH2Aで使い続けたプログラムへの対応を行っています。今回使用のサンプルコードは、結構ややこしく組まれています。サンプルコードの解析結果やマニュアルに基づいて、一旦出来るだけ単純化したものにしようとしています。
 まだ、タイマ割り込みが実現できず、2日ほどもがいています。

================================

今回、Cortex-M3としては、3つ目のmcu(STM32、LM3S、FM3)になるのですが、初めて気付いた点がありました。

 
 
  ◎メモリ上のレジスタの領域が2つある、ビットバンド領域とエイリアス領域
     サンプルコードのmb9b610t.hで同じレジスタの項目が定義される箇所が2か所あり、別のアドレスが割り当てられていて、最初は何だこれは!理解不能!という感じでした。

いくつかのサンプルコードをじっくり調べると、どうも、レジスタの1ビットが1ワード(32ビット)に展開されていることが解ってきました。

このような機能が、マニュアル(一部表記に誤り?)でビットバンド領域なる言葉があり、Cortex-M3の機能であることに初めて気づきました。
 
FM3のコーディングでは、ビットバンド領域への書き込みでレジスタを設定するのがよいのか、エイリアス領域への書き込みでレジスタを設定するのがよいのか、、、


いずれにせよ、無秩序に混在したコーディングは避けた方が無難だと言えます。
(ただ、エイリアス領域を使う利点をまだ認識していないだけなのですが。。。)

2012年5月2日水曜日

付属FM3基板 第一歩(GPIO 出力)

Interface誌 付属FM3基板 購入よりほぼ、1週間、暇を見つけながら、ようやく開発の端緒に辿りつけました。

1.USB DIRECT Programmerのインストール
富士通のサイトからダウンロード(usbdirect-v01l06.zip)
  特に問題なくインストール(USBデバイスデバイスドライバは後回し)
2.サンプルプログラムをダウンロード
  ダウンロードファイル mb9b610t-files.zip
  最も初歩のサンプル mb9b610t-files / mb9b610t-series-201204.zip / mb9b610t-series-201204 / mb9bf61xt_template-v13

    main.cの気になる点。
    bFM3_GPIO_DDR3_PC=1; と bFM3_GPIO_PDOR3_PC=1;。。。
    GPIO P3C を High / Low 出力  付属FM3基板のLED1は GPIO PF3 の出力のはず。。。。

3.はんだ付け作業
  過去の付属基板(SH2Aなど)と同様にCN2を基本に、CN3を拡張ように振り分けはんだ付け作業をおこないました。

4.KEIL MDK-ARMのインストール
  http://www.keil.com/fujitsu/ より 「MDK450.EXE」をダウンロードし、MDK-ARMのインストール


  プログラム本体のインストール終了後、「File installation completed」画面が表示 少し戸惑う。
  かまわず、進める。 コマンドプロンプト(DOS窓)でのインストールが進む。で、デバイスドライバ(KEIL Tools By ARM ユニバーサルシリアル。。。。)のインストール が完了

5.付属FM3基板をつなぐ(デバイスドライバのインストール)
 とりあえず、付属FM3基板をPCにつなぎました。(JPP1はオープン)、何も起こらない。。。。
 デモプログラムは書き込まれていないようです。JPP1をショート、JPP2でリセットを行う。PCは新規デバイスを検出しました。
 使用するPCがWindows Vista なのか、デバイスドライバのインストールはすんなりいかず、付属基板は不明なデバイスとなっていました。
 そこでつなぎ直し(JPP1はショート)、改めてデバイスドライバのインストールを行いました。

 デバイスドライバの参照先 
  Program Files / Fujitsu /  FUJITSU USB DIRECT Programmer / driver / WinXP

6.サンプルプログラムのビルドおよび書き込み
 2.で取得したサンプルプログラムをKEIL MDK-ARMでビルド 、USB DIRECT Programmerで付属基板に書き込みました。
 しかし JPP1 オープン(ユーザーモード)で LED1は点滅せず。前記の危惧に基づき、main.cを修正しました。
 
 操作するGPIOを変更
   bFM3_GPIO_DDR3_PC  => bFM3_GPIO_DDRF_P3
   bFM3_GPIO_PDOR3_PC => bFM3_GPIO_PDORF_P3  

 再度、プログラムをビルド、付属基板書き込み、ようやく LED1の点滅を実現

7.その他 GPIO
 今回、作成した自作ボードはモノクロLCD(SG12864)の表示を行うため GPIOでP2、P5、PBのポートを使用します。
 特にPBポートとP22は、ADC端子と共用で、GPIOとして使用するためADEレジスタの設定が必要になります。
  例 
    PB0の場合 bFM3_GPIO_ADE_AN16=0;

FM3はGPIOを使うための設定が、ポート単位ではなくピン単位で異なります。この点は結構マイナスに感じます。 GPIOのピンを変更する場合、ドキュメントを見て、共用となる端子を一々確認する必要がありそうです。 (慣れれば問題無いのかも知れませんが。)


2012年4月26日木曜日

Interface誌 付属FM3基板 追加部品について


 先日(4月23日)、定期購読のInterface誌 2012年6月号が届きました、早速、付属基板を開封、眺めてみると、未実装のパターンが目につきました、
 追加部品が必要??、今年は、追加部品を購入しなければいけないのかと、少々落胆しながら、本誌の関連記事をチェックしました。



気になった追加部品   インダクタ(L1 2.2μH)、水晶発振子(X2 4MHz)、リセットIC(IC4) 

これらの部品は、本誌の記事で必須でないことが解りました。


  インダクタ(L1): 300mAを超える電流が必要な場合必要 とりあえず不要

    FM3基板は、電源回路にDC-DCコンバータ(MB39C022G)を使用しています。このDC-DCコンバータ、本来のDC-DCコンバータのほか、LDOレギュレータを搭載しています。FM3基板はLDOレギュレータの機能を使っています。300mAを超える電流が必要な場合、DC-DCコンバータの機能に切り替える必要があり、インダクタ(L1)が必要になります。


  水晶発振子(X2)  とりあえず不要

    FM3基板上にすでにシリコン発振器(X1 外部クロック)があります。本誌の記事で最近のシリコン発振器は通常使うのに充分の精度があるとのこと。


  IC(IC4) リセットIC とりあえず不要


    FM3のINITX 端子に接続 リセットICのLow出力でFM3はリセットされます。リセットICは電源が安定するまでLowを出力します。複数のマイコンを組み合わせた場合など、リセットのタイミングを揃える必要がある場合に必要になります。


その他

  本誌、コネクタ・ピン配置 CN1-20のGPIO P20 は P90では??
  
  CN1~3への引き出しについて、GPIOのまとまりが若干悪いように思います。
    8ビット纏まって使えそうなポートは P7、PB、で P1、PC等は使い勝手が悪そう。
    FM3自体のピン配置自体の制約を受けるので仕方が無いように思います。
    万人受けのよい配置は至難の業と言うことでしょう。

 過去の付属SH2A基板のように、使い慣れるほど、使い勝手のよい基板になることを期待。



2012年3月13日火曜日

GNU GCC 開発環境整備 再び (for ARM Cortex-M3)

CQ出版 Interface誌 恒例の付属基板 本年(2012年)は 富士通「FM3マイコン」のようです。このマイコンはARM Cortex-M3マイコンで、今は亡きDesign Wave誌 2008年5月号付属の基板CQ-STARMと同じコアです。
  そこでほぼ4年前の基板CQ-STARMを引っ張り出し、電源ON、するとその当時組んだプログラムが動きだしました。「お久しぶり」といった感じでした。
  この基板に搭載されたMCUはSTM32F103で
   動作クロック72MHz、RAM 20KB、フラッシュROM 128KB 
 本年の「FM3マイコン基板」に搭載されるMCUはMB9BF618T(予定)で、
   動作クロック144MHz、RAM 128KB、フラッシュROM 1MB
 かなりのスペックです。 今年は本腰を入れていろいろ遊びたいと思います。

  さて、STM32基板ですが、若干物足りないスペック、開発環境はIARのWorkbench(使用制限)、追加部品の水晶発振子の入手性 等で、その当時、動作確認程度の開発にとどめていました。
 そのような扱いのSTM32基板、稼働したプログラムのプログラムソースをビルドすると、案の定、ビルドエラーが発生しました。他のARM基板(LPC2388、LM3S8962)での開発でGNU GCCの開発環境(GCC ver.3.4. => ver.4.3 )を組み直したのが原因だと思われます。
   今年のFM3基板の準備として、GNU GCCの開発環境の組み直しを行いました。   

 1.GNU GCC 開発環境について
  ◎GCCは、ARM対応版を整備する。
    ARM7TDMI、Cortex-M3、、、、各MCUコア共通
  ◎コードセットはThumb
    GNU GCC はThumb-2に非対応 GCC Vre4.6.3のインストールで Thumb-2のコードセットがインストールされることを秘かに期待していたのですが残念、、、、Thumb-2は2003年の発表で、そろそろGNU GCCでThumb-2の対応があっても良いのではと思います。
    Interface編集部、ARM社、富士通、、、、どこでも良いから、GNU GCCのThumb-2対応版をリリースしてほしいものです。  

  ◎FPU (Floating Poing Unit; 浮動小数点演算ユニット)無しで整備する。
    GNU GCCでビルドすると。「…m-elf/4.6.3/thumb/lib**.a(_******.o) uses hardware FP, whereas main uses software FP」のビルドエラー発生 安直にコンパイルオプション -mhard-float を付加、これはCortex-M3ではNG。
    そこで、binutils、gcc、newlibでconfigureオプション --with-float=soft を指定して再インストールしました。    

2.GNU GCC(Vre4.6.3) 開発環境整備 手順
  1)Cygwinのインストール
     gccに加え、binutils、(libiconv)等のパッケージをインストールする。
     ※出来るだけGNU GCCの開発環境(Cygwin上で動くソフトウエアを開発する環境)を整えてしまう。
  2)gccビルド準備( 1)の補足 )
    gccビルド用に以下のパッケージをインストールする。
   ①gmpのインストール
   ②mpfrのインストール
   ③mpcのインストール
   ④libiconvのインストール
    ※今回はCygwinのインストールでは組み込まず、ここでインストール
  3)gccビルド
   ここでビルドするgccは、Cygwin上で稼働し、ARM MCUで動くソフトウエアを出力する。
   ①binutilsのインストール
    binutils ver.2.22ではインストール失敗(初回)、ver.2.21.1で成功
    一旦GNU GCCをインストール後再度 ver.2.22をインストールで成功
   ②gccのインストール
   ③newlibのインストール
        newlib ver.1.20.0ではインストール失敗(初回)、ver.1.18.0で成功
    その後、ver.1.19.0をインストール 成功
    その後、ver.1.20.0をインストール 成功
   ③gccのインストール
     configureでオプション --with-newlib を追加して再インストール         

※ST32F103 LCD出力プログラム


メモ
 ※configureオプション --with-float=
    --with-float=soft 浮動小数点演算をライブラリを使って実行
    --with-float=hard 浮動小数点演算をFPUを使って実行
 ※Cortex-M3では Thumb の一部の命令がサポートされていない。コンパイル オプション -mcpu=cortex-m3 指定がこの問題に対応してくれると良いのですが。後々手こずることになりそうです。

2012年3月3日土曜日

MSP430 温度計

Texas Instruments MSP430 を使って温度計を作成しました。


LaunchPadで実装されているデモプログラムに手を入ただけのものですが、結構よい暇潰しになりました。
1年前は、デモプログラムの通信機能を中心に色々試してみましたが、今回はADCについて機能を検証しました。

1.ADC10コンフィグレーション
 1)入力レンジの設定
   ・GND~Vcc  0V~3.3V
   ・GND~Vref  0V~(1.5V or 2.5V) ※デモプログラム設定 
   ・その他
 2)チャネル 選択 
   ・A0~A7
   ・Temperature Sensor    ※デモプログラム設定
 3)参照電圧(Vref)選択 Reference-generator voltage
   ・1.5V           ※デフォルト
   ・2.5V
 4)参照電圧生成 Reference-generator
 5)サンプリング周期設定 Sample and hold time
   64xADC10CLKs 
 6)割り込み許可 Interrupt enable
 7)ADC ON

2.ADC分解能
 ADC分解能 = 1500mv ÷ 1024(10bit) = 1.4648mv/div

3.温度計算(内蔵温度センサ)
   MSP430G2x52に内蔵された温度センサを利用した温度計
   (ADC10 チャネル選択で温度センサ指定)
   ・温度センサ仕様  3.55mV/℃

   ADC値(1単位)あたりの温度= 1.4648mv/div ÷ 3.55mV/℃ = 0.41263℃

   0℃でのADC値 = 673

   計測温度 = (ADC値 - 673) × 0.41263

4.温度計算(外装温度センサ LM61BIZ)
  ADC10のチャネル A0に 温度センサを繋げた温度計
   ・温度センサ仕様 0℃での出力電圧 600mV、  10mV/℃

   ADC値(1単位)あたりの温度. = 0.14648 ℃/div.

   0℃でのADC値 = 600mV÷1.46484375mv/div = 409.6

   計測温度(℃)=(ADC10の出力値 - 409.6)×0.14648

5.その他

 ADCの出力値はサンプリング毎に結構ぶれるので、サンプルプログラムでは8回のサンプリングの移動平均をとり、この値から温度計算を行っています。

 今回の温度表示は、MSP430内蔵温度センサと外装温度センサでは、最大で1.5℃のずれがありました。また、部屋にあった寒暖計とも2~5℃ずれていました。

2011年3月21日月曜日

MSP430 LaunchPad デモプロジェクト(温度センサー)の検証 その2



1.解析
 Processingソース:LaunchPad_Temp_GUI.pdeより
 1)シリアル通信の仕様
  ①Baud Rateは 2400
  ②LaunchPad => PC 1バイト アスキーコード送信
    ”A”:65°”B”:66°  :華氏の温度表示
  ちょっと修正(デモプロジェクト改修 その1)
   ・Processing(GUI)ソースの修正
   dataRead = (dataRead-32)*5/9; 華氏=>摂氏変換コード追加
2)シリアル通信の構成
  タイマ割り込み、タイマ出力を使い1ビットづつの送信を実現しているようです。
  ①システムクロック設定
   ・ベースクロック(DCO):1MHz  1048576Hz 訂正(3/26) => 1,000,000Hz
   ・サブシステムマスタクロック(SMCLK) : ベースクロック1/8 : 128KHz 131072Hz
                          訂正(3/26) =>125KHz 125,000Hz

  ②タイマカウンタ
   ・クロックにSMCLK選択
   ・タイマカウンタCompare設定値(TACCR0)に13*4を設定
     1/131072*13*4 = 0.0003967285  ・・・ タイマ周期 0.3967285mS ==> 2520bps ≒2400bps 
訂正(3/26) => 1/125000*13*4 = 0.000416  ・・・ タイマ周期 0.416mS ==> 2403.846bps ≒2400bps 

      (2400bpsとの誤差5%は少々気になります。20ビット送信で1ビットのずれが発生。)
訂正(3/26) => 2400bpsとの誤差0.16%は、624ビットで1ビットのずれ。30バイト程度の文字列の送受信は問題ないと思います。

  ちょっと修正(デモプロジェクト改修 その2)
   ・CCSプロジェクトの修正   
   データ送信用のバッファを設け、そのデータを1バイトづつ、スタートビット、ストップビットを付加して送信
   温度センサに関する機能は削除

2.課題
 ①現状でなんとかMSP430からPCへのデータ送信(TX)は実現できました。あとは、PCからMSPへのコマンドの送信(RX)の実現を考慮中です。
 ②現在、デジキーに発注したMSP430G2452IN20(20ピン)の到着を待っています。たしか、リードタイムは3/31だったような記憶があるのですが、現在、未定となってしまいました。到着しだい、LCD(キャラクタ)の表示に挑戦してみたいと思います。

MSP430はとにかく使い勝手が良いのが魅力です。
(ユニバーサル基板上に、3端子レギュレータを使った電源回路+MSP430+その他電子パーツで自作のマイコン基板が手軽に組めてしまいます。)
MSP430の能力をフルに使った場合、どこまでプログラムが組めるのか。その限界を試してみたいと思います。

そろそろ、インターフェース誌の付属基板が発売されます。今度はRXマイコンで、昨年のSHマイコン程の期待は無いものの、使い勝手が良いものであってほしいと思います。今年は、TIのMSP430と並行していじっていきたいと思います。

2011年3月3日木曜日

MSP430 LaunchPad デモプロジェクト(温度センサー)の検証 その1



TIが提供している MSP430 LaunchPad のデモプロジェクトについて、最初単にLEDの点滅のみの簡単なデモプロジェクトと思っていました。しかし、Webサイトや、展示会等でこのデモプロジェクトが温度センサで結構機能豊富なものであることがわかりました。
そこで、このデモプロジェクトに興味を持ち検証を行います。まず、以下に動作検証までを記します。

1.デモプロジェクトのダウンロード
 MSP430 LaunchPad のWebサイト(http://processors.wiki.ti.com/index.php/MSP430_LaunchPad_%28MSP-EXP430G2%29_JP)からデモプロジェクトのファイル(slac435.zip)をダウンロードし解凍する。
2.デモプロジェクト開発
 1)CCSワークスペースフォルダを作成する。
 2)slac435.zipを解凍して得られる フォルダMSP-EXP430G2-Launchpadを1)のフォルダに移動する。
 3)CCSを起動し 1)のフォルダを指定する。
 ・Welcomeウインドを閉じる。
 4)デモプロジェクトを取り込む。
  ・Flie/Import => Import ダイアログボックス
   ①Selectで Import typeは General/Existing Project into Workspase を選択
   ②Imort Projectで Select root directory に フォルダMSP-EXP430G2-Launchpadを指定
 5)デモプロジェクトのビルドを試す。
  ・Project/Build Active Project を実行 =>成功
 6)MSP430にデモプログラムを書き込む。
  ・Target/Debug Active Project を実行 =>成功
  ・Target/Runを実行 => LaunchPadのLED1、LED2の交互点滅が始まる。

3.デモプログラムの動作
 1)LaunchPadの SW1(S1)を押すと、LED1,LED2の点滅がとまる。(消灯)
 2)LaunchPadの SW1(S1)を数度押すと、LED1がうす暗く点滅する。
 3)PCターミナルでLaunchPadにシリアル接続する。シリアル接続の設定はデフォルト
  シリアル接続 ”COM4:MSP Application UART(COM4)”
  ・MSP430 起動時/リセット時、PCターミナルは沈黙
  ・SW1(S1)を押すと、PCターミナルは文字化けを起こしながらカーソルが進む。

  一応の動作は確認できました。

4.Processingのインストール
    ※Processing:GUIに特化したプログラミング言語
 1)ProcessingのWebサイト(http://processing.org/)より processing-1.2.1.zip をダウンロードし、解凍する。
  Download Processing / ↓Windows
 2)解凍したファイル Processing.exe で Processingが起動する。


5.GUI source filesのダウンロード
 1) MSP430 LaunchPad のWebサイト(英文)で GUI source files (LaunchPad_Temp_GUI.zip)をダウンロードし、解凍する。
   ・LaunchPad はPCに接続、LED1,LED2が交互点滅した状態   
 2)解凍したファイル LaunchPad_Temp_GUI.pde を Processingで開き、RUN。
   ・Processing表示 Please,select the COM port that your LaunchPad is connected to,
[0] COM4
 3)ProcessingでEnterキー入力、LauchPadのSW1(S1)を押すと Processingは温度表示を始める。
   ・Processing表示 Current Temperature: 63°

   ・MSP430を指で触って暖めると 温度表示の上昇が確認できました。また温度によるLED1,LED2の輝度の変化も確認できました。

2011年2月28日月曜日

TI MSP430開発メモ


昨日、ルネサス エレクトロニクスより、ルネサスRX62Nプロモーションボードプレゼントキャンペーン「落選」のメールが届きました。
恒例のCQ出版Interface誌付属基板の下調べ用に、密かに期待していたのですが、残念な結果になりました。
さて、気を取り直して
同誌5月号の発売までの暇つぶしとして しばらくの間 昨年購入した、テキサス・インスツルメンツ MSP430 LaunchPad および、MSP430の使い勝手を試してみたいと思います。

まず、

以下に、開発環境の整備について書き留めます。

1.MSP430 LaunchPad バリュー・ライン開発キット
 ・MSP430 LaunchPad開発ボード本体
 ・MSP430(Flush 2K RAM 128B MSP430G2231:ADC,SPI,I2C、MSP430G2211:-,-,-)
 ・10 ピン コネクタ(オス x 2、メス x 2)
 ・水晶発振子 32.768kHz ・・・ 他

2.ソフトウェア・デバッガとコンパイラをダウンロード
 1)My.TI アカウント登録
  ・TEXAS INSTRUMENTS ホームページ => my.TIログイン => 新規登録
 2)Quick Start Guide記載の http://www.ti.com/launchpadwikiにアクセス
   (日本語サイトへ移動 「MSP430 LaunchPad (MSP-EXP430G2) JP」)
 3)Code Composer Studio (CCS)を ダウンロード
  ・Code Composer Studio (CCS)」 今すぐダウンロード (TI へのログインが必要)」をクリック
  ・U.S. Government export approval(米国輸出承認)ページでプロフィールを入力
   (Webサイトは N/A を入力 以前はブログのURLを入力)
   =>「I CERTIFY ALL THE ABOVE IS TRUE:」で Yes 選択 「Submit」ボタンをクリック
  ・TI Softwareページ  「Download」ボタンをクリック
  ・メール「TI SOFTWARE DOWNLOAD: APPROVED - setup_CCS_MC_Core.zip」が届く
  ・同メールのリンクをクリック=>setup_CCS_MC_Core.zipをダウンロード(保存)
  ・setup_CCS_MC_Core.zipを解凍する。
  ・解凍されたファイルのうち setup_CCS_MC_Core_4.2.1.00004を起動
 4)Code Composer Studio (CCS)をセットアップ
  ・Choose Installation Locationはデフォルトのまま
  ・Product Configurationで MSP430-only Core Toolsを選択
 5)Code Composer Studio (CCS)を起動
  ・すべてのプログラム/Texas Instruments/Code Composer Studio v4 Core Editionで起動確認

2.サンプルコードの入手
 ・Code Composer Studio (CCS)のダウンロードを開始したWebサイト 「MSP430 LaunchPad (MSP-EXP430G2) JP」の MSP430G2xx サンプル・コードを全てダウンロード クリック
 ・ファイル slac080i.zipをダウンロード、解凍

3.MSP430ワークスペース、プロジェクトの作成
 1)ワークスペースの作成
  ・Code Composer Studio (CCS) 起動後のWorkspace Launcher で 「Browse...」をクリック
  ・Select Workspace Directoryで ワークスペースを置くディレクトリを選び 「新しいフォルダの作成」でワークスペースを作成する。
   ※ワークスペースの新規作成時に、Welcome to Code Composer Studio v4 ウインドウが表示される。
     [Getting Start][Examples][What's New & Updates][Device Information]の画面展開がある。
 2)プロジェクトの作成 MSP430G2231用
  ・File/New/CCS Project =>[New CCS Project]が表示
  ・CCS Project でプロジェクト名を入力する。
  ・Select a type of project で MSP430を選択(今回はそのまま)
  ・Project Setting で
    Device Variant: MSP430Gxxx Family MSP430G2231
  ・Project Templates で Empty Projectを選び 「Finish」ボタンをクリック
 3)プログラムソースの追加
  ・プロジェクトを選択した状態で右クリック New/Source File で ソースファイルを作成する。ファイル名は main.c にしました。
  ・main.cをにプログラムをコーディングする。
 4)プロジェクトのビルド 
  ・Project / Build Active Project

4.MSP430への書き込み
  ・Target / Debug Active Projectで書き込む
  ・Target / Load Program... で書き込む の2つの手法で書き込める。
    Debug/プロジェクト名.out Release/プロジェクト名.outを指定
    ※Debug中 Load Program は失敗する。Target / Resetを実行する必要がある。
    ※Debug、Releaseの切り替えは Project / Active Build Configration で行う。
    ※Targetのプルダウンメニューに Load Program.. の表示がない場合がある。一旦 Debug Active Project を行うと、メニューに Load Programが復帰表示される。
     (Releaseでビルドしたのに、Debug Active Project を行うことには若干の矛盾を感じます。)

5.MSP430搭載ボードの作成
  LaunchPad開発ボードで書き込んだMSP430を動作させるために、ユニバーサル基板に3端子レギュレーターを使用した電源回路、表示用に3LED、操作用に3タクトスイッチを搭載した、簡単なボードを作成しました。
  このボード用テストプログラムとして、スイッチや、タイマの割り込みでカウンタのカウントUPをし、その値を3つのLED で表現するプログラムを作成しました。

最近 MSP430G2xxバリュー・シリーズに新たに20ピンのMCUが加わりました。早速 MSP430G2452(20PDIP) をDigiKeyで発注しましたが現在在庫なしで納期未定です。届き次第、「Hello World」のキャラクタLCD表示に挑戦したいと思います。

2010年12月3日金曜日

ET2010散歩


今年も12/1から開かれた、パシフィコ横浜で開かれている。Embedded Technology 2010に行ってきました。
過去のETでは、より高性能なマイコンに興味が向かっていたのですが、最近、8ビット、16ビットの小さなマイコン(SHやARMなどに比べ)を使っているせいか、自然とローエンドのマイコンが目に留まりました。

以下に訪れたブースの内容を記します。

◎アーム
◎STマイクロエレクトロニクス
 STM8Lの説明を受けた。さらに「STM8L-Discovery」をいただきました。
◎富士通セミコンダクター
◎横川ディジタルコンピュータ
 昨年の横川ブースとは一変、計測器の展示は無かった。
◎アジレントテクノロジー
 ローエンドのオシロスコープを見る。多彩な機能を見る。
◎インテル
 ・・・・
◎NEC
 ・年齢判断システムで、若干老けて判定され、少々ガックリ。。。10歳区切りで判定されるので、49歳の私が50~59歳と判定されると。。。
 ・C言語によるFPGAの開発環境が紹介
◎マイクロソフト
 ほかの多くのブースで、.NET Micro Framework による開発が扱われていました。マイクロソフトのブースでこのことにあまりふれられていないようでした。
◎NXPセミコンダクター
 今回、最も興味を覚えたブースです。開発環境「mbed」のデモは特にクラウド利用の、組込み開発の新しい形を提案しているようです。
 Internet Explorerで mbed のWebサイトにアクセスし、提供されるアプレットでコンパイル・リンクを行い。作成されたバイナリファイルをダウンロードし。
 このファイルをPCでUSBメモリと認識される「mbed NXP LPC1768」等に移すだけで、プログラムの書き込みが出来てしまいます。
 PC側に開発環境を整える必要がなく。開発環境のアップデート等のメンテナンスも不要です。
 サンプルプログラムにはHTTPサーバーやTwitterに直接書き込むプログラムもあり、NXPのサポートも充実しているようです。
 ・開発のプログラムソース群はmbedで保有されます。
  (ローカルでプログラムソースを管理しようとすると、結構面倒なことになりそうです。)
 ・常に現行バージョンのコンパイラ・リンカーでバイナリ(プログラム)が作成されます。
  (コンパイラのバージョンアップ等で、プログラムソースのビルドが通らなくなる可能性があるのでは。。)
◎ザイリンクス
 RCカー(?)搭載の4方向カメラの画像で上空からの映像を合成して、駐車場の枠を表示したデモが行われていました。
 PALTEKブースで同社のWebサイトで技術資料が公開されていて、FPGAの開発に役立つとのこと、私のような個人でも利用できるそうです。
◎タタ・エレクシー・リミッテッド
 エンジニアリングの一般論を語り合いました。インド企業の自信を感じさせられました。
◎東芝
 車載用のマイコンCoretex-M3、通常のタイマとはべつに独立したPWMのユニットが用意されている、車載用に特化されたマイコンを実感。
◎THOHOKUものづくりコリドー
◎日本アルテラ
 20数年運用されている、MS-DOSやCPM上に構築されたシステムの維持に、FPGAで代替機のハードウエアを組み上げる事例が紹介されていました。
 今までこのようなケースは、PC上に Virtual Machine を組み上げ対応するものと思っていました。この際問題になるのは周辺機器とのIFが実現できないことですが。
 FPGAを使えばこれらのIFも実現できそうです。
◎日本テキサス・インスツルメンツ
 今回 MSP430 Value Line LaunchPad Dev. を目当てにブースを訪れました。そこでいくつかの質問をしました。
 ・同包の注意書きの 電波法による使用制限について。
  ==>単なるミスプリント、RFデバイス製品の注意書きと混同したそうで 今後この注意書きはなくなるそうです。
 ・Value Line以外のMSP430の対応は?
  ==>JTAG系のピンアサインを変えて配線すれば使用可能
  ==>LaunchPadのJTAGによるプログラミングはSpy-Bi-Wireという二線式を使っているそうです。
     Spy-Bi-Wireは SBWTCK(TEST)というクロック信号とSBWTDIO(RST)というInput/Output信号で構成
     したがって、MSP430のうちLaunchPadでプログラムの書き込みが出来るのは MSP430G2xx バリューシリーズ と MSP430F5xx シリーズに限られそうです。
 ・デモプログラム(温度表示)について。
  PCとのシリアル通信はどのように行っているのか質問したが、いまひとつ理解できなかった。
  LaunchPad では MSP430G2231 の P1.1にTXD P1.2にRXDが割り当てられているように思うが、MSP430G2231にはUARTの機能が無いはず、なぜ、プログラムダウンロード用やシリアル通信用に P1.1、P1.2がつかわれているのか不明。
  ==>プログラムのダウンロードにはTXD、RXDは使われていないとのこと(前述のSpy-Bi-Wire方式)
  ==>デモプログラムはソフトUARTを使ってP1.1をTXD P1.2をRXDして使用してPCとのシリアル通信を実現しているそうです。
◎パナソニック
 3Dの展示がありました。
◎ルネサスエレクトロニクス
 NECエレクトロニクスとの経営統合で期待していたのですが、肩透かしを食った感がありました。例年楽しみしていた78Kのミニ実習コーナーが無く少々がっかり。



NXPセミコンダクターブースのmbedのデモで、キューブ(立方体)状にLEDを組み上げ、多彩な表現を実現したものがありました。思わず見入ってしまいました。
自分なりに考えると、XYZ毎に4本のIOを割り当て(汎用ポートの12ビットを使用)、各LEDはXYZ該当ビットのANDをとり点滅させているのでしょうか。
私が作るとすると大量のロジックICを使うか、FPGAを使うか結構大掛かりなものになってしまいそうです。

2010年8月1日日曜日

付属SH-2A基板 SD/MMCカード対応ブート・ローダを試す。(その2)



 CQ出版Interface誌付属SH-2A基板「SD/MMCカード対応ブート・ローダ」がようやく実現できました。
 弊ブログで以前に述べたように、I誌の「SD/MMCカード対応ブート・ローダ」で使われるSDメモリカード端子の一部(CS,WP,CD)を変更しました。
 最初、今回のブートローダーは、SH7262の起動時に直ちに実行されるローダープログラムとして扱われものと思いシリアルフラッシュROMの先頭に書き込みました。試行錯誤のたび、本来のローダープログラムとHEWモニタプログラムの復旧を繰り返しました。これが結構な手間で、このブートローダーの実現がほど遠い困難なものと思えました。
 I誌9月号で今回のブートローダーは単に1ユーザープログラムにすぎず、SDカード上のプログラムを従来のローダープログラムと同様な機能で起動させることを知りました。
 そこで、「SDカード対応ブート・ローダ」をユーザープログラムとしてシリアルフラッシュROMに書き込み試したのですが、以前沈黙したままでした。

 今回のブートローダー用に作成したドータボード(SDメモリカード(SPI0)用)の検証するため、同プログラムソースをテスト(デバッグ)プログラムに流用し、SDメモリカード関連の動作を確認しました。
 その際、起こった不具合は、割り込み CMT、関数 memcpy の動作でした。この対処に代替関数を考えたのですが、その前に、「SDカード対応ブート・ローダ」を試しました。
 すると、付属SH-2A基板上のLEDが点滅しているではありませんか。そこで、SDメモリーカードに以前 シリアルフラッシュROMの書き込み用に作成したプログラムをapp.binにリネームし書き込みました。
 このSDメモリカードをコネクタにセットすると、書き込まれたプログラムが起動しました。
今回は、「SDカード対応ブート・ローダ」HEW版で行いました。なぜ、今まで稼動しなかったのか、なぜ今稼動しているのか、不明。
 稼動していないときは、CMT割り込みや、関数memcpyが不調であったと考えられます。HEWに遊ばれてしまった感があります。

 ※SDメモリカードに書き込むプログラムapp.binは、シリアルフラッシュROMに書き込むプログラムと同じ。




 今回のハードウエア構成は、本体(LCD等搭載)+ シリアル通信ドータボード +SDメモリカードドータボード(SPI0)です。
 シリアル通信ドータボードは、デバッグ用に準備しました。ほかのドータボードが追加搭載出来ます。
 SDメモリカードドータボードは、2つのシリアルフラッシュROMをSPI0、SPI1にそれぞれ接続し、ローダープログラムとHEWモニタプログラムの復旧に備えました。またSDメモリカードコネクタはSPI0に併設しました。
 以前作成した SDメモリカードドータボードは、SDメモリカードコネクタをシリアルフラッシュROMとの競合をさけて、SPI1に接続しました。最初「SDカード対応ブート・ローダ」はSPI0でなくてはならないと思い、今回のSDメモリカードドータボード(SPI0)を作成したのですが、今思えば、以前のSDメモリカードドータボード(SPI1)でも可能でした。
*****************************************
関連動画(YouTube)
http://www.youtube.com/watch?v=2EyEyyvyArw
*****************************************

2010年7月21日水曜日

付属SH-2A基板 SD/MMCカード対応ブート・ローダを試す。(その1:失敗の顛末)

SQ出版 Interface誌 Webサイト「付属SH-2A基板特設ページ」で SD/MMCカード対応ブート・ローダが先行公開されました。
 私、安直に、「これは、良い、今まで、外付けシリアルフラッシュで64(32)KByteオーバープログラムに対応していたのが、SDカードで置き換えられる。」と思い、早速試してみました。
 結論から言えば、現時点でまだ、この素晴らしい、ブート方式の検証は出来ていません。失敗事例とし今回、投稿します。ご容赦願います。

[概要]
1.SD/MMCカード対応ブート・ローダ ”ff_loader” 改造ポイント
 1)SDカードの端子変更
  CS: PG20(33)=> PG16(24)
  WP: PJ3(32) => PC6(27)
  CD: PJ1(31) => PC7(28)
 2)ff_loader.binの(ブート・ローダー)の扱い
  外付けシリアルフラッシュROMの先頭(0x00000000)に書き込む。
  =>外付けシリアルフラッシュROMの32KB以降(0x00008000)に書き込む。(訂正7/25)
2.稼動させたい、プログラム。
 過去に、シリアルフラッシュROMに書き込んだプログラム。「付属SH-2A基板 2Chオシロスコープ(弊ブログ)」を、PCでSDカードに、”app.bin”というファイル名で書き込む。
3.試行
  失敗
4.試行後
  既存のブート・ローダーおよびHEWモニターが潰れたため、付属基盤は不能に。
5.リカバリー
  「SH-2A基板用HEWモニタプログラムを外付けシリアル・フラッシュROMに書き込む。(弊ブログ)」で、元のブート・ローダーおよびHEWモニターを書き込み、復旧。


 以降、今回の失敗の詳細を述べます。


1.SD/MMCカード対応ブート・ローダ ”ff_loader” 改造
 1)SDカードの端子変更
  ①CS端子
   CN3 33はSPI Ch1のMISOで使いたいので、CN3 24 (PG16)に変更
   ・ソース:mmc.c のCS制御を
    #define CS_LOW() PORT.PGDR1.BIT.PG16DR = 0 /* MMC CS = L */
    #define CS_HIGH() PORT.PGDR1.BIT.PG16DR = 1 /* MMC CS = H */   
   に変更。
   ・ソース:mmc.c のpower_on()内のCS 設定を
    PORT.PGIOR1.WORD |= 0x0001; PORT.PGCR4.WORD &= 0xFFF0; /* MMC_CS */
   に変更。(7/23追記)
   


  ②WP端子、CD端子
   CN3 31,32は、LCD(モノクログラフィック)で使用のため、CN3 27,28 (PC6,PC7)に変更

   ・ソース:mmc.c のWP,CDのGPIOポート設定を
    #define SOCKPORT PORT.PCPR0.WORD /* ソケット状態入力(PC) */
    #define SOCKWP 0x0040 /* ライトプロテクト接点 (PC6) */
    #define SOCKINS 0x0080 /* カード検出接点 (PC7) */
   に変更
   ・ソース:mmc.c のpower_on()内のWP/CD 設定を
    if (_USE_CD) {PORT.PCIOR0.WORD &= 0xFF7F; PORT.PCCR0.WORD &= 0x0FFF;} /* MMC_CD */
    if (_USE_WP) {PORT.PCIOR0.WORD &= 0xFFBF; PORT.PCCR0.WORD &= 0xF0FF;} /* MMC_WP */
   に変更。(7/23追記)

 2)ff_loader.binの(ブート・ローダー)の扱い
  現在、シリアルフラッシュROM(SPI Ch0)に、プログラムを書き込むプログラムを改造し、シリアルフラッシュROMの先頭(0x00000000)にブート・ローダーのみを書き込みプログラムを作成し、改造後の”ff_loader.bin”を書き込みました。
 =>このブート・ローダーは、ユーザープログラムとして扱うようです。ユーザー・プログラムがさらに、別のユーザープログラムをロードすることで、SDカード上のプログラムを実行するようです。したがって、プログラム書き込み位置は、従来のユーザープログラムと同じ、シリアルフラッシュROMの32KB(0x00008000)以降になります。(7/25追記)


3.試行~5.リカバリー 上記のとおり、

6.疑問点
 SH7262のローダープログラムのサイズは8KBだった記憶があります。今回のブート・ローダーのプログラムサイズは12KB、少々疑問を持っています。=>この疑問無効(7/25追記)

※今回の失敗で、SDカードコネクタ周りの配線チェックを予定しています。チェックの方法として、以前試していた、SDカード関連のプログラムを元のSPI Ch0に戻し再度動作確認を行いたいと思います。

SDカードからのブートが実現できれば、結構快適に、付属SH-2A基板のプログラム開発が行えると期待してます。

7.状況
 7/23 I誌7月号第3章 「メモリカードとFATファイル・システムの実装」のプログラムの動作を実現し、SPI Ch0によるSDカードコネクタ周りの回路構成(配線等)を確認しました。
 7/25 I誌9月号を読みながら、GCC版、HEW版いずれも試すが、SDカードプログラムの稼動は確認出来ず。

2010年7月11日日曜日

SH-2A GNU GCC 4.5.0のインストール

CQ出版Interface誌付属SH-2A基盤にについて、色々と試行錯誤を繰り返してきました。
 HEWのライセンス切れで256KByteの制限が課せられ、TFTカラー液晶表示でのフォント表示、ファイルシステム(FAT)を利用したプログラムの開発が頓挫してしまいました。
 そこで、昨年同様GNU GCCでの開発に切り替えようと悪あがきを続けています。
 過去に述べたように、Interface誌Webサイト(GCC 4.4.0)、KPIT Webサイト(GCC 4.5.0)から入手したGNU GCCの開発環境でなかなか思い通りの動作が得られず独自にGNU GCCの環境の構築に挑戦しました。

[概要]
○パッケージ 
  GCC     4.5.0
  binutils  2.20.1(失敗)=> 2.19.1
  gmp     5.0.1
  mpfr     3.0.0
  mpc     0.8.2(GCC4.5.0から必須パッケージ)
  newlib   1.18.0
○インストール後の動作
  現時点で、Interface、KPIT 提供のGCC環境でのビルドと同じ動作。
  今まで発生したビルドエラーは、Makefileの記述ミスに起因したものでした。
○割り込み
  SH-2A基板特設ページ「SD/MMCカード対応ブート・ローダ」をダウンロードし、その asmfunc.s を参考にすると割り込み動作が初めて確認できました。 


※これ以降の記述は、Interface誌Webサイト等で公開されているGNU GCC開発環境を使えば不要です。当初 Makefile等の不備でGNU開発環境の構築を始めたのですが、結果的に不要な苦労をしたようです。(結構時間をとられてしまいました。)

1.インストール
 1)Cygwin 1.7.5 のインストール
  ・Archive Unzip
  ・Devel すべてインストール
  ・Libs すべてインストール
   今回GNUの一連のインストールでは ビルド時にプログラム”XXX”が無い、ライブラリ”libXXX”が無いといったビルドエラーが多発しました。手っ取り早く、CygwinのDevel、Libsのパッケージをすべてインストールすることでこの種のビルドエラーは回避できました。
   

 2)binutilsのインストール
  (1) 2.20.1では tc-arm.c のコンパイルエラー
   (メモ)binutils-2.20-2.20.1-patch ファイルの適用
     binutilsのインストール失敗に対応しようとし、パッチファイルを適用しようとしたが失敗。どうも、このパッチファイルは、binutils-2.20をbinutils-2.20.1にバージョンアップを行うものと思われる。
     (パッチの当て方 binutils-2.20.tar.gz を展開したディレクトリで「patch -p0 -d . < binutils-2.20-2.20.1-patch」を実行 )
  (2) 2.19.1をインストール
    ・mkdir build_binutils
    ・cd build_binutils
    ・../binutils-2.19.1/configure --target=sh-elf --prefix=/usr/local/sh-tools --with-gmp=/usr/local/sh-tools --with-mpfr=/usr/local/sh-tools --with-mpc=/usr/local/sh-tools
    ・make
    ・make check
    ・make install
  (3)CygwinのDevelの binutils をアンインストール
 3)gmp、mpfrのインストール 過去の記述を参照
 4)mpcのインストール
  ・mkdir  build_mpc
  ・cd build_mpc
  ・../mpc-0.8.2/configure --target=sh-elf --prefix=/usr/local/sh-tools --with-gmp=/usr/local/sh-tools --with-mpfr=/usr/local/sh-tools
  ・make 
  ・make check
  ・make install
 5)GCCのインストール
  ・mkdir build_gcc
  ・cd build_gcc
  ・../gcc-4.5.0/configure --target=sh-elf --prefix=/usr/local/sh-tools --with-gmp=/usr/local/sh-tools --with-mpfr=/usr/local/sh-tools --with-mpc=/usr/local/sh-tools --enable-interwork --enable-multilib --enable-languages=c --disable-libssp
  ・make
    (メモ)Cygwinのbinutillsパッケージでmakeすると「cannot compute suffix of object files」のエラー ==> 2)のbinutilsインストールで成功
  ・make check
     「autogen: Command not found」のエラー
    (メモ)autogen-5.10.2を入手しインストールを試みると、Configureで「Cannot find libguile」のエラー発生(CygwinのLibsはインストールはデフォルト(このときはすべてではなかった)=> 1)Cygwinのインストールに反映)
  ・make install(make chekuエラーは無視)
 6)newlibのインストール
  ・mkdir build_newlib
  ・cd build_newlib
  ・../newlib-1.18.0/configure --target=sh-elf --prefix=/usr/local/sh-tools --with-gmp=/usr/local/sh-tools --with-mpfr=/usr/local/sh-tools --with-mpc=/usr/local/sh-tools
  ・make 
  ・make check
  ・make install
 7)GCCのインストール その2
  ・cd build_gcc
  ・make all
  ・make install

※GNUの各パッケージのインストールは、ARM7TDMIとSH-2Aを並行して行いました。パッケージのビルドでtarget=arm-elf/target=sh-elfの差異がわからなかったので、各パッケージのインストール先はarm-tools/sh-toolsにしました。
また、各パッケージのインストール作業はビルドエラーを頻発しながら、繰り返しインストール作業を重ねました。

2.サンプルプログラム 動作確認
 1)gccのサンプルプログラム
   「第3章 メモリ・カードとFATファイル・システムの実装」の gcc用サンプル・プログラムを使用
 2)サンプルプログラムのビルド
  (1)asmfunc.sのエラー
    SH-2A基板特設ページ「SD/MMCカード対応ブート・ローダ」をダウンロードし、その asmfunc.s を参考に修正する。
   ・asmfunc.sの修正
    「メモリ・カード...」と「SD/MMCカード...」差異を調べSetImask()の後半に
      .global _set_sp
      _set_sp:
        MOV R4, R15
        RTS
        NOP
      を追加。
    (「メモリ・カード...」のasmfunc.sではコンパイルエラーが発生。)
  (2)main.cの修正
   ・割り込みハンドラー関数 Isr_CMI0() はLEDの点滅のみの動作に修正
   ・delay_ms()、SetCCR1(x)、IoInit()、 main ()以外の関数は削除
   ・main()は、
     int main (void)
     {
       IoInit();   /* 内蔵周辺モジュールの初期化 */

       /* 起動メッセージ */
       delay_ms(10);
       while(1) {}
     }
     に削り込みました。
  (3)Makefileの修正
   ・TARGET = cmt0_test
   ・CSRC = main.c
     ファイルシステム関連のソースファイルを削りました。
   ・LIBDIR = /usr/local/sh-tools/lib/gcc/sh-elf/4.5.0/m2a
     ライブラリ参照を m2 => m2a に変更
   ・CFLAGS = -Wall -g$(DEBUG) -m2a $(OPTIMIZE) $(DEFS)
     コンパイルオプション -m2 => -m2aに変更

※m2では割り込みは動作せず、m2aに変更して、割り込み動作を確認できました。
(偶然、m2aにしたタイミングで、割り込みが機能しただけかも知れません。)

※今回構築したGNU GCCの開発環境ですが、ビルド時(make check)のエラーを無視しています。作成したプログラムの動作が確認出来た状況です。
 感想として、GNU GCCの開発環境の構築は私にとって、かなり困難になってきたように思います。
GNUの各パッケージについて、リリース毎にインストール手順の説明があったらと思いました。(私が、その情報に辿り着けなかっただけかも知れません。)

※やはり、SHの開発はHEWを使うべきとの感が強くなりました。こうなると、出来るだけコンパクトなプログラムを作成するかが今後のテーマになりそうです。

2010年6月30日水曜日

SH-2A(SH72620) 開発用 GNU GCC 環境整備中

今回は、GNU GCCによる環境整備の途中経過をメモ的に記述します。
7/1追記

 付属SH-2A基板(CQ出版Interface誌)で、SHマイコンデビューを果たしたと思いきや、HEWのライセンス切れ(試供)で、約半数のテストプログラムのビルドが不可となりました。
 ◎ビルド不可となったプログラム 
  ・ビデオディスプレイコントローラを使ったプログラム、特にフォントを組み込んだプログラム
  ・ファイルシステム(FAT)を組み込んだプログラム
 ◎HEWの制限(256KB)内でビルド可能なプログラム。
  ・簡易オシロスコープほか、V850、ARM7、Cortex-M3で組んだプログラムをSH用に修正したプログラム。
 結局、SH72620の特色を十分に活かそうとしたプログラムが制限にかかってしまったと言う感じでしょうか。

 以前、「GCC対応シリアル・ダウンローダ(TinyMON)」でGNU GCCによるビルドを行っているので、ビルド不可となったプログラムをGCCでビルドしてみました。
 なお、GNU GCCの環境は、KPITから入手したものと、Interface誌Webサイトから入手したものを試しました。特に、大きな違いは無いようです。(組み込まれているパッケージの数はKPITの方が多いようです、現時点で、ビルドエラーの発生状況は同じです。)

1.開発環境について(ビルド時のエラー)
  CMT割り込みのハンドリングが比較的理解しやすいと思い、I誌7月号3章「メモリ・カードとFATファイル・システムの実装」のサンプルコードcq_sh7262_gccを雛形に、HEWの制限に引っ掛かったプログラムプロジェクトをGCC対応をおこないました。
 ◎発生したビルドエラー その1
  ・asmfunc.s: Assembler messages:
   asmfunc.s:425: Error: misaligned data
   asmfunc.s:412: Error: offset to unaligned destination
   make: *** [asmfunc.o] Error 1
    asmfunc.sのSet interrupt mask level のコードを削除(もう少し検証)
 ◎発生したビルドエラー その2(その1での修正後)
  ・undefined reference to `end'
    過去に、このエラーで悩んだ記憶があるような。。。
    リンクスクリプトファイル Tsh72620_ram.ld を修正。
  ・undefined reference to `__fpscr_values'
  ・undefined reference to `log10'
  ・undefined reference to `pow'
    GNU GCCの開発環境に、mpfr、gmpパッケージを追加する必要があると思われる。
   ==>mpfr、gmpパッケージのインストール成功後も解決できず。7/1現在

2.開発環境について(mpfr、gmpパッケージの追加)
 I誌7月号6章「SH-2A対応GCCによるクロス開発環境の構築と使い方」のMPFRライブラリ、GMPライブラリのインストールを参考に、同パッケージのインストールを行いました。
 しかし、mpfrパッケージのインストールは失敗しました。
 (昨年はARMで成功していたが今回失敗)
 ●対処  7/1追記
  ・両パッケージのインストール先を /usr/local/sh-tools にする。
    Interface誌提供のGNU GCC環境は /usr/local/sh-tools
  ・gmpパッケージを先にインストールする。
    ①./configure --prefix=/usr/local/sh-tools
    ②make / make check / make install
  ・mpfrパッケージをgmpライブラリ、インクルードファイル指定でインストールする。
    ①/configure --prefix=/usr/local/sh-tools --with-gmp-include=/usr/local/sh-tools/include --with-gmp-lib=/usr/local/sh-tools/lib
    ②make / make check / make install


3.GNU GCCにより作成したプログラムについて。
 前述のプログラムについて、数値演算関数、浮動小数点関連のコードを削除し、とりあえずビルドを通しました。
 そのプログラムの動作は以下の通りでした。
 1)割り込みは不調
   CMTおよびMTU2による割り込み処理を試しましたが、いづれも不調でした。ただし、一部のプログラムについては、割り込みによるLEDの数回の点滅を確認できましたが、割り込みを使いこなすにはほど遠い状況です。
 2)空のforループの回りが遅い。
   Wait用に使用した、空のforループ HEWで1秒であったものがGCCでは4秒弱かかりました。結構気になります。
 3)割り込み処理なし、main()内のwhile(1)ループで処理をこなすプログラムは安定動作。
   (高機能のマイコンを使う意味がなさそう。)

以下に今後の課題をまとめます。
○GNU GCCの開発環境に、mpfr、gmpパッケージを追加
 =>成功 7/1
○割り込み処理の安定動作
○処理速度の改善、オプティマイズの検討

2010年6月19日土曜日

SH-2A SDカード(SPIモード)を試す。


CQ出版 Interface誌 2010/7号でFATファイルシステムの実装記事があり、同誌Webサイトでソースコード等が公開されました。記事を斜読しながら、SDカードの読み込みを試しました。


(モノクロLCD表示 左半分は表示不全)








概要
  [SDカード][SPIモード]==(SPI)==[付属SH-2A基板][モノクロLCD表示]

 ソースファイル
  (mmc.c/cc932.c)(ff.c)(main.c)
    mmc.c   SDカード制御(SPIモードコマンド送信、SPI設定)
    cc932.c  Unicode/SJIS変換
    ff.c    FATファイルシステム
    main.c   プログラムメイン
    他

 改造点
  ・SCIF(UART)による出力を液晶表示に(機能検証が出来る程度)
  ・SPIチャネルをCh0からCh1に(SPI1使用)
  ・MMC_CD/MMC_WPのポートアサインを変更 (PC6、PC7)使用


1.SDカード・ドータボードの作成
 ・シリアルフラッシュROM(M25P40)
   ブート用 SPI0接続・・・このため、SDカードはSPI1接続に変更
 ・SDカードコネクタ
   I誌 記事を参考に配線 付属SH-2A基板 CN3のピンアサインは以下の通り。

  [SDカード]   [付属SH-2A基板 CN3]    
   9       (100KΩ)--- 3.3V
   1 CD/DAT3   22 SSL10(CS) PG18(GPOIOのHi/Low出力でCS信号を代替)
   2 CMD     21 MOSI1(DI)         ---(100KΩ)--- 3.3V
   3 Vss      GND
   4 Vcc      3.3V              ---(0.1uF)--- GND
   5 CLK     23 RSPCK1(SCK)
   6 Vss      GND
   7 DAT0     33 MISO1(DO)        ---(100KΩ)--- 3.3V   
   8 DAT1    (100KΩ)--- 3.3V
   CD       28 PC7             ---(100KΩ)--- 3.3V
   WP       27 PC6             ---(100KΩ)--- 3.3V
   ※SDカード 1ピンのプルアップ(100KΩ---3.3V)は無し。
  最初、SDカード 1ピン(CS)信号はSPIのSSL信号を使うものだと思っていました。ソースコードにCS_HIGH/CL_LOWの操作があるのを、SH7262のSPI機能で賄えないかと思い色々調べるのですが不明、結局、ソースコードどおりにGPIOのHi/Low出力で行いました。

2.ソースの改造
 1)mmc.c
   ・使用する、SPIチャネル0をチャネル1に  (RSPI0=>RSPI1)
   ・CS、CD、WP のポートアサインを変更
 2)cc932.c  そのまま使用
 3)ff.c    そのまま使用
 4)main.c
   main()のfor(;;)ループ内のSDカード操作機能を切り出し、ディレクトリのファイルリスト表示、選択ファイルのテキスト表示を行う。
  ・di ディスク初期化(SPI、GPIOの初期設定) ディスクのフォーマットは行わないようです。
     disk_initialize()
  ・fi 論理ドライブ初期化 f_mount()
  ・fl ディレクトリ情報取得 f_opnedir(), f_readdir()
  ・fo ファイルOpen f_open()
  ・fr ファイルRead f_read()
  ・fc ファイルClose f_close()
  
 ※セクションの設定の試行錯誤に合せ #pragma section文の追加・削除を行っています。
 ※dhisk_initialize()の前にf_chdrive(0)を実行(メモ)


3.不具合対応(試行錯誤)
 1)モノクロLCD表示不全
  現象 モノクロLCD(SG12864)の左半分の表示が不能、プログラムの表示領域のデータも不全
  対処 FATファイルシステム(SDカード関連含め)、LCD表示を 個別のセクションに配置
  結果 プログラムの表示領域のデータは正常に設定されるようになるが、依然表示は不全

以前、V850 で SDカードの読み書きに挑戦したのですが、挫折、今回、ある程度の動作が確認できたことで、なんとか、SDカードの利用に目処がついたと思っています。後は、もう少し、公開されたソースを解析し、安定動作を実現したいと思います。

2010年6月12日土曜日

SH-2A ビデオディスプレイコントローラを試す。


(6/13 訂正)

CQ出版 Interface誌 付属SH-2A基板で、TFT-LCD の表示に挑戦しました。TFT-LCD は、OPTREX T-55343GD035...を使用しました。一部、前日、弊ブログで掲載した内容と重複している点もありますが、ご容赦願います。

1.準備
 1)コネクタ探し
  OPTREX 指定の以下の3種のFPC/FFCコネクタを秋葉原で探しました、ラジオデパートなどの数軒のコネクタ専門店を探すのですがいずれも、メーカーに発注になり、2000個単位でしか扱わないとの事、秋葉原ではどこも5個や10個程度は扱わないと言われました。そういわれながらも諦めきれず、秋葉原を放浪しました、すると、秋月電子通商近くの「鈴商」というパーツ屋で、メーカー不明ながらも0.5mmピッチ40極のFPCコネクタを1個50円で購入出来ました。また、17号線沿いの「スーパージャンク?」で0.5mmピッチ6極のFPCコネクタを1個16円で購入しました。
 ・表示側回路部FPC用コネクタ 0.5mmピッチ40極 (Kyocera Elco 6240)
   ==>前述の 0.5mmピッチ40極 コネクタを使用
 ・照明側回路部FPC用コネクタ 0.5mmピッチ3極 (Kyocera Elco 6298)
   ==>前述の 0.5mmピッチ6極 コネクタを使用 余り3極分のスペースを埋める。
 ・タッチパネルFPC用コネクタ 0.65mmピッチ4極(Kyocera Elco 6227)
   ==>自作コネクタ まだ試さず。
 2)FPC変換基板作成
  1)で入手した、FPC用コネクタ40極をサンハヤト SMTコネクタ変換基板CK-4にハンダ付けしました。配置を考え、11~50ピンを使用
 3)0.5mmピッチ6極FPC用コネクタの改造
  LCDバックライト白色LEDの電源として、1,3極を使用、リード線をハンダ付け、4~6極はプラスチックフィルム(0.2mm厚)を挿入固定
 4)拡張基板作成。
  付属SH-2A基板のCN3に接続し、シリアルフラッシュROM(M25P40)搭載、CN3のLCD_XXX..端子を、FPC用コネクタ40極に引き出す基板を作成。OPTREX T-55343GD035 にはSPIによる制御機能があるので、SPI0が使用できるように、M25P40と、T-55343GD035 の接続を切り替える回路を試しに搭載。(今だSPIは試していません。)

 5)カラーバー表示プログラムを試す。
  Interface誌のLCD表示サンプル(2010.6 6章)およびルネサスからダウンロードした、TFT-LCDパネル表示のサンプルコード(an_rjj06b1002_sh_lcd)を参考にして作成したプログラムを試す。
  T-55343GD035 は暗いまま、変化なし。
  (実は、かすかながら、左端、1cmに幅5mmの縦帯が見えた。後でこの縦帯が表示領域だったことを知りました。)
 6)LCDバックライト白色LEDの電源回路の作成
  今まで、使用のモノクログラフィックLCDを使った感覚で、OPTREX T-55343GD035 は3.3Vで全てまかなえると思っていたのですが、(OPTREXの仕様書 7.Electrical Specifications(電気特性)だけを見て判断し、T-55343GD035の購入を決めました。)
 OPTREXの仕様書の後ろの方、7.7.Lighting Specifications(照明仕様)に19.2Vの表記あり、さらに後日入手した T-55343GD035 アプリケーションノートよると、リニアテクノロジーのLEDコントローラLT3591が必要と知り、これを購入、ここからは以前、投稿した「ハンダ付けの。。。。」の内容どおりの試行錯誤をおこないました。
 とにもかくにも、T-55343GD035のバックライトの点灯に成功しました。ちなみに前述の5)を試すと、白地に縦の黒帯表示となりました。

2.TFT-LCDの表示
 1)SH-2AのLCD(T-55343GD035)コントロールの確認
  この時点で、LCDの表示は白地に黒帯(左端から1cmの位置に5mm幅)、T-55343GD035がかってに表示しているのか、SH-2Aが何らかの制御を行った結果なのか不明。
  そこで、SH-2Aのビデオディスプレイコントローラ3(VDC3)の表示領域外の色指定を試しました。
  グラフィックス画像外の色設定レジスタ(GROPBASERGB1)に赤、青、緑と順次設定し、これを試すと
LCDの表示は赤、青、緑と順次変化するのが確かめられました。
 ==>SH-2AのVDC3機能が稼動しているのを、初めて確認。

 2)表示調整
  この時点で、SH-2A側の設定は、マニュアルどおりの設定で、後は T-55343GD035 側の設定が必要と思われました。しかし、T-55343GD035 の初期設定は、SPI通信で行う必要があり、この設定法が今一つわかりません、CLKの周波数、各コマンド、各パラメータ等はドキュメントで確認できるのですが実際にどのようにすればよいのかわかりません、たとえば、コマンドとパラメータは繋げて送ればよいのか、一定の間隔を空けて送ればよいのか、はたまた、セパレータ等が必要なのか不明です。
   ・・・T-55343GD035のSPIによる設定はここで一旦諦める。
 そうこうしているうちに、DE の水平方向開始設定(DE_START_H)を適当にいじると、1)の表示の縦の黒帯が広がりました。さらにその黒帯の下半分に本来表示されるべきカラーバー画像の下部グレーのグラディエーション表示らしきものが見えるのに気付きました。そこで、カラーバー画像を横縞に変更すると(上掲の画像)、設定した全ての色表示が確認出来ました。
 後は、マニュアル無視のVDC3の設定を試すだけです。色々試すうちにDE の水平方向開始設定(DE_START_H)を320にすることで9割がたの表示になることがわかりました。(カラーバーの表示、上掲画像参照)
  *後は、SPIによる T-55343GD035 の設定で、SH-2A VDC3の設定を本来の値に戻すことが今後の課題となります。    (6/13訂正)

3.TFT-LCDの表示で遊ぶ。
 ここまでTFT-LCD(T-55343GD035)の表示が出来たら、何か、画像を表示したくなりました。
 1)RGB565形式の画像データファイル作成プログラム。
  以前、LUMINARY MICRO社 LM3S8962 の OLED(グラフィクディスプレイ128 x 96)の表示データを作成するために作成したアプリケーション(MakeRIT_Image)を修正し、画像ファイル(ビットマップ等)から、RGB565形式のデータを生成するアプリケーションを作成しました。
 最初はテキストファイル出力で、ヘッダーファイルで定義する画像データの配列の初期化データとして使用しました。プログラムサイズは256KBを超え、近い将来使えなくなるので、バイナリファイルを出力し、HEWのSH-2Aへのダウンロードファイルとして扱うようにしました。
 試しに、OPRTEX社のホームページをハードコピーしたビットマップファイルを320×240のRGB565形式の画像ファイルにして、T-55343GD035に表示しました。(上掲画像参照)

4.文字表示
 ここまでTFT-LCD(T-55343GD035)の表示が出来たら、何か、文字を表示したくなりました。
 1)自作フォント Font6×8
  いままでモノクロLCDで使用している自作フォントを使いました。ここで、SH-2AのVDC3の機能の便利さが実感されました。いままで、RAM上に個別にVideoRAMを組み、LCD内のVRAMと同期をとっていたのですが。今回の場合、直接LCD内のVRAMを操作する感覚で、表示が扱えます。
 2)STMicroのフォント
  以前、STMicroelectronics の STM32F のマイクロコントローラを試した際に使用したフォント 16×24 を組み込みました。
 フォントデータとしては、 "(SP)"以降でしたので、アスキーコードより、0x20(SP)を引く等工夫が必要でした。フォントデータだけ拝借、ライセンス的に多少の問題があるとは思いつつ、、
 3)IPA_FONTについて、
  ARMコンテスト優勝作品 「MP3プレーヤー。。。」2010.6掲載 を参考にIPAフォントを試したいと思いました。まずは、必要なサイズのフォントイメージを作成する必要があるようですが、今一つ不明、結構ハードルが高めかなと思います。ぼちぼちと試したいと思います。

※今回のTFT-LCD表示で気付いた点
 ・表示を試すカラーバーは、縦縞、横縞を準備するべき。
 ・表示を試すカラーバーは、左端、上端、下端、右端には、白、黒は避けるべき。
 ・まずは、表示外の色設定を行うこと。

※HEWのライセンス切れまであと、10日余り。256KBの壁がどの様なものか、GNU GCCに切り替えるべきか、、、、悩ましいことです。




2010年6月7日月曜日

付属SH-2A基板 2Chオシロスコープ


 CQ出版 Interface誌 付属SH-2A基板に 昨年NXP LPC2388基板 で作成した、簡易オシロスコープを移植しました。
 今回は、内蔵ADCを使いました。インターバルタイマ(MTU2使用)で最高で10uSの間隔でサンプリングします。(100KSPS)
 ハードウエア構成は、拡張基板を従来より、コンパクトにしました。

1.内蔵ADCについて、
 1)サンプリング周期の上限決定
   ルネサスSH7262ハードウエアマニュアルの「24.A/D変換器」 レジスタ:ADCSRのクロックセレクト:CKSの設定で変換時間 212~548tcycの記載が目に付き、ダメモトで10uSのサンプリング周期を試しました。多少の波形の乱れはあるものの一応サンプリングが成功しているようなので、この値を最高値としました。
 (tcycは Iφ:144MHzをさすのか、Pφ:24MHzをさすのかいまいち不明ながら、10uSのサンプリングが成功する可能性があると思い試しました。)

 2)ADCモードについて
  マルチモードと、スキャンモードを試しました。どちらもまだ深くマニュアルを読まず、とりあえずの設定でためしたら、それなりの動作をしたので、、、見直しの必要を感じています。

2.ハードウエア
 1)拡張基板
  昨年のARMマイコンコンテスト、「コイセ君」(小伊勢、井上 両氏 作成)の実機を拝見し、そのコンパクトさに魅力を感じ、今回それを見習い、95x72mmのユニバーサル基板に纏めました。
  上端にタクトスイッチを置くために、アクリル板で補強した事が工夫のポイントです。
 2)サブ(ドータ)基板
  現在、サブ基板上には、シリアルフラッシュROM(M25P40)を搭載し、アプリケーション毎に、サブ基板を使い分けることにしました、ファミコンのゲームカートリッジを交換するイメージです。
 現在 AN0、AN1の端子のみのもの(上記) と、 RS232Cドライバを搭載し、PCとのシリアル通信を行うものを組みました。
 将来、オシロスコープの電圧レンジ対応でリレー、オペアンプ、etcを搭載したものを作成したいと思っています。

2010年6月5日土曜日

ハンダ付けの限界に挑戦してみました。



今回は、SH-2A基板でカラーLCDの表示に挑戦したことから始まります。
使用した、カラーLCDは OPTREX T-55343GD035JU-LW-AEN で、少々手こずっています。

まず、Interface誌(2010/6)の液晶表示制御を参考に、プログラムを作成して実行しました。しかし、LCDは真っ暗のまま、砂嵐、ノイズぐらいは表示されると思っていたのですが、

OPTREX のドキュメントを調べ直すうちに、バックライトLEDの順電圧:19.2Vに気付きました、ここで初めて、LEDのコントローラ回路が必要であることがわかりました。

さらに、同LCDのアプリケーションノートが入手でき、そこには、LEDコントローラの動作例(回路例)が記載されています。LEDコントローラには LEDリニアテクノロジーのLT3591 が使われています。

 LT3591を購入し、実際に手にすると、3mm×2mmのパッケージ、各端子が0.5mmmピッチその小ささがかなりのハードルになったことを改めて実感しました。

 ハンダ付けに、四苦八苦した経緯を以下に述べます。

◎異常発熱。
 1個目のLT3591 出力の電圧(A-K間)は6.0V、普段使う3端子レギュレータ並みの発熱。LCDは依然真っ暗、6.0Vの出力では、、、
◎白煙が上がる。
 2個目のLT3591 CTRL端子をGND にすると、白煙が上がった、さらに、22uHのインダクタからも白煙が、、、
◎42.5Vの安定出力
 3個目のLT3591 CTRL端子を3.3Vに接続、出力の電圧(A-K間)は42.5Vで安定出力(無負荷)
 4個目のも同様に、42.5Vの安定出力

  ・・・42.5Vは危ないと思いながら、出力電圧が安定していたので、勇気を奮ってLCDに接続

◎LCDのバックライトLED点灯
 3、4個目のLT3591のコントロール回路をLCD(AK端子)に接続、ようやくバックライトLEDが点灯、この時の出力電圧は17.7Vで、発熱なし。
 

※ハンダ付け手順
 ①サンハヤトのエクステンション基板(0.5mmピッチ)を5mm(4線)切り分け、ハンダメッキする。
 ②LT3591の1~4端子に①の基板切片をつけ、裏面の接着状況を確かめて、5~8端子を着ける。
  *裏面の接着が、LT3591の裏面の中央のGNDに及ぶと、異常発熱、等の不具合に繋がる。
 ③SOP8ピン=>DIP変換基板を加工
   変換基板のハンダポイントを適宜に削り取る。(1~2mm程度残す程度)
 ④変換基板に、②を両面テープで固定する。 エナメル線のハンダ付けで、変換基板と②を繋げる。

2010年5月27日木曜日

付属SH-2A基板 開発メモ

一旦、これまでの付属SH-2A基板の開発手順および、注意点をまとめます。

履歴
 6/6変更                
 6/7変更、追記
 6/12、追記
6/23、追記
 8/1  追記


Ⅰプログラム開発
 1.HEW 新規プロジェクトワークスペースの作成
  1)「ようこそ」で「新規プロジェクトワークスペースの作成」を選択
   ・「ワークスペース名」を入力    "sh2a_wksp"
    (プロジェクト名はワークスペース名と同じ)
   ・「ディレクトリ」を入力(参照)
   ==> 参照で指定したディレクトリが "c:\sh2a_home" とすると "c:\sh2a_home\sh2a_wksp" となる。
   ・CPU種別 "SuperH RISC engine"  そのまま
   ・ツールチェイン "Renesas SuperH Standard"  そのまま
  2)CPU設定
   ・ツールチェインバージョン "9.3.2.0" そのまま
   ・CPUシリーズ "SH2A-FPU" を選択
   ・CPUタイプ "SH72620" を選択
  3)グローバルオプション設定
   ・浮動小数点演算モード "MIX" そのまま
   ・丸め方式 "Zero" そのまま     ・・・・ 要 検討
  4)自動生成 設定
   ・ヒープメモリ "使用" で サイズ H'400
   ・main()関数生成 "C source file"  そのまま  
   ・I/Oレジスタ定義ファイル "使用"
  5)ライブラリ設定
   ・ctype.h math.h を "使用"
   ・stdarg.h を 試しに 使用 ひょっとして printf() sprintf()で必要かも?
  6)スタック設定
   ・スタックポインタアドレス H'1C100000 に変更
   ・スタックサイズ H'FA00 に変更
  7)ベクタ設定
   ・ベクタテーブル定義 "使用"
    "PowerON_Reset_PC" "Manual_Reset_PC" のベクタハンドラがエントリされている。
  8)ターゲット設定
   ・ターゲット 
    "SH2A-FPU Cycle Base Simulator"
    "SH2A-FPU Functonal Simulator" 両方使わず。
   ・ターゲットタイプ/ターゲットCPU 1)CPU設定の通りの内容が表示 そのまま

    「完了」


 2.ユーザーライブラリ使用設定
  1)インクルードファイルディレクトリの指定
   「SuperH RISC engine Standard Toolchain」のコンパイラ/ソース/インクルードディレクトリで「追加」
   ・相対パスはCustom directoryを選択
   ・ブラウズでユーザーライブラリのインクルードディレクトリを選択
  2)ユーザーライブラリの設定
    「SuperH RISC engine Standard Toolchain」の最適化リンカ/入力/ライブラリファイルで「追加」
   ・相対パスはCustom directoryを選択
   ・ブラウズで ユーザーライブラリ.libを選択
         

 3.テストプログラムの作成
  1)main()の編集
   プロジェクト名.cのファイルにmain()がある。
   ・インクルードファイルの追加
    "iodefine.h","" に加え ユーザー定義インクルードファイルを追加。
   ・while(1)ループを追加
   ・プログラムコードを追加
  2)割り込み設定 intprg.c の編集
  インターバルタイマを MTU2 の TGInA で実現した 場合  
   ・179:MTU0_TGI0A (Timer0 で使用)
   ・186:MTU1_TGI1A (Timer1 で使用)
   ・190:MTU2_TGI2A (Timer2 で使用)
   ・194:MTU3_TGI3A (Timer3 で使用)
   ・199:MTU4_TGI4A (Timer4 で使用) で 割り込みでCallされるハンドラ関数を記述する。
    ※例
    // 179 MTU2 MTU0 TGI0A
    #pragma ifunc INT_MTU2_MTU0_TGI0A,int_mtu_tgi0a
    void INT_MTU2_MTU0_TGI0A(void){
      extern void int_mtu_tgi0a(void);
      int_mtu_tgi0a();
    }

  3)割り込みベクタの設定 vecttbl.cの編集
   HEWモニタプログラムでのプログラムの設定 
    #pragma section INTTBL
    void *INT_Vectors[] = {
    // 8 Reserved
     (void*) RESET_Vectors,// Dummy, Used by SPI-Flash boot

  4)割り込みベクタの設定 vecttbl.hの編集
    レジスタバンクの指定
    // 179 MTU2 MTU0 TGI0A
    #pragma interrupt INT_MTU2_MTU0_TGI0A
     を
    #pragma interrupt INT_MTU2_MTU0_TGI0A(resbank)
     に

 4.ROM化の設定
  1) resetprg.cの修正
    インクルードファイル "iodefine.h" を追加
    インクルードファイル "typedefine.h"の削除

    プログラムコード INTC.IBNR.WORD = 0x4000; を追加( _INITSCT();の前 )
  2)出力ファイル形式の設定
   「SuperH RISC engine Standard Toolchain」の最適化リンカ/出力
    の出力形式をバイナリへ変更

 5.セクションの設定
  ・DVECTTBL,DINTTBL: 0x1C000000
  ・PResetPRG,PinPRG: 0x1C000500
  ・P,C,C$BSCE,C$DSEC,D: 0x1C001000
  ・B,R: 0x1C061000
  ・S: 0x1C0F0600
 
 6.新規セッションの作成
  1)新規セッション
   ・セッション名 適宜
   ・ターゲット SH-2A Serial Monitor を選択
   ・使用するプロジェクトジェネレータ Renesas SH Project Generator そのまま
  2)CPU選択
   ・CPUシリーズ "SH2A-FPU" を選択
   ・CPUタイプ "SH72620" を選択
 
Ⅱ工夫
 1.割り込みハンドラ設定  例)MTU2 Ch0-a
   割り込みハンドラ関数の設定を関数ポインタで行うことで、割り込み時にCallされる関数をプログラムで切り替えるように修正(割り込み発生時に分岐(if文、 switch文)させるのではなく、割り込み発生前にすでに、割り込みハンドラ関数を切り替えられるように修正)

  1)割り込みプログラム"intprg.c"での割り込みハンドラ関数の設定を変更
    #pragma ifunc INT_MTU2_MTU0_TGI0A,int_mtu_tgi0a
    void INT_MTU2_MTU0_TGI0A(void){
      extern void (*int_mtu_tgi0a)(void);
      (*int_mtu_tgi0a)();
    }
  2)割り込みハンドラ関数の宣言 main.c
    void (*int_mtu_tgi0a)(void);
  3)割り込みハンドラ関数の宣言 その他のソース
    extern void (*int_mtu_tgi0a)(void);
  4)割り込みハンドラ関数の実装 ユーザーソース
   ①割り込みハンドラー関数 設定関数  ユーザーソース1
    void TIMER_Set_Intrrupt(TIMER_TypeDef* TIMERx,void *pfunc,int intpri)
    {
        switch(TIMERx->Timer_ID)
        {
        case TIMER_ID_0:
            INTC.IPR11.BIT._MTU00 = (u8)intpri;
            INTC.IPR11.BIT._MTU01 = (u8)intpri;
            int_mtu_tgi0a = pfunc;
           break;
        case TIMER_ID_1:
   ②割り込みハンドラー関数 設定 ユーザーソース2
    #define APP_INTRPT_PRIORITY 6
    extern void (*int_mtu_tgi0a)(void);

    void APP_TM2_IRQInterrupt(void) ・・この関数を割り込み時にCallされるように設定。
    {
      ・・・・・・・・・・
      TIMER_InterruptReset(&TIMER_2); ・タイマスタートレジスタ(TMSTSR)で割り込みフラグクリア、タイマインタラプトイネーブルレジスタ(TMIER)で割り込み許可を行う。
    }  

    void App_examplefunc()
    {
      ・・・・・・・・・・
      TIMER_Set_Intrrupt(&TIMER_2,APP_TM2_IRQInterrupt,APP_INTRPT_PRIORITY);
      ・・・・・・・・・・
      return;
    }

 2.大きな初期化データの扱い。 6/12追記
  画像データの表示に、ヘッダーファイルで定義された配列の初期化データを使った場合、プログラムファイルは、その分大きくなる。HEWのライセンス制限を考えると、画像データをバイナリファイルにし、HEWのダウンロードファイルとして扱う、プログラムでは、ダウンロード先のアドレス指定でデータを扱う。

 3.セクションの利用 (大きな初期化データの扱い。)6/23追記
  データ領域に設定したデータが、原因不明(たぶん私のバグが原因と思う)で潰れていた、その分析、対処で、そのデータ領域を任意のアドレスに配置するために セクションを利用しました。
  1)コーディング ソースファイル(*.c)
   ユーザー関数の前に #pragma section SECTION_NAME を記述    
  2)コーディング ヘッダーファイル(*.h)
   ヘッダー定義の先頭に #pragma section SECTION_NAME を記述    
   ヘッダー定義の末尾に #pragma section を記述・・・セクション指定を解除
  3)セクションの設定(作成)
   ①セクションアドレスの設定
    シンボル表示で空きアドレスを確認する。

   以降 [SuperH RISC engine Standard Toolchain] の作業
   ②セクション PSECTION_NAMEを設定 プログラム領域 
   ③セクション CSECTION_NAMEを設定 定数領域 
     const unsigned char CnstXxT[128] =
       {0,3,1,4,1,5,9,2,6,5,3,5,,,,,,,};
   ④セクション DSECTION_NAMEを設定 初期化データ領域 
     unsigned char XxT[128] =
       {0,3,1,4,1,5,9,2,6,5,3,5,,,,,,,};
   ⑤セクション BSECTION_NAMEを設定 未初期化データ領域 
     unsigned char WkXxT[128];
   ※設定(作成)したセクションに、メンバーとなる関数、定数、変数の定義が無い場合、ビルドでワーニングが出る。ワーニング表示されたセクションは削除します。

Ⅲビルドエラー対応
 1.HEW
  1)コンパイルエラー 8/1追記
   現象
    #pragma inline_asm set_sp
    static void set_sp(int a){MOV R4, R15} で
    Illegal Option for #pragma inline_asm エラー
   対処
    「ビルド」/「SuperH RISC engine standerd tool chain」の コンパイラ/カテゴリ:オブジェクトで出力ファイル形式 「アセンブリプログラム(*.src)」に変更

  2)コンパイルエラー 8/1追記
   現象
    #indef HEW でエラー発生
   対処
    「ビルド」/「SuperH RISC engine Standard Toolchain」の コンパイラ/カテゴリ:ソース/マクロ定義でHEW(値なし)を追加



Ⅳ不具合(問題点)対処
 1.HEW関連
  1)関数 sprintf() でハングする。    6/6追記
   現象:プログラムがsprintf()で止まる。
   原因:標準ヘッダー 指定忘れ #include 
   対処:このヘッダーを指定 で 正常に

  2)関数 pow() を使った演算結果不具合   6/6追記
   現象:pow()を使った計算結果が 4、8、16、で扱われるはずが、、3、7、15で扱われた計算結果になっている。
   原因: 例 pow(2.0,2.0)の演算結果は4.0となっているが、どうも 3.9999....で扱われているようで、整数値との計算で3への切り捨てが行われているようです。
   対処:「SuperH RISC engine Standard Toolchain」のCPU設定、標準ライブラリ設定 等のオプション設定などで対処すべきとは思いますが、自作のpow()関数で逃げました。
 自作pow()関数 ループで乗算を繰り返す簡単なものですが、昔、MSCの初期バージョンを使っていた頃にも同じようなことをしていたと思い出しました。

 2.付属SH-2A基板およびSH72620関連
  1)内蔵ADC               6/6追記
   現象:AN0入力の出力値がAN1入力の影響を受ける。
    AN0の出力値のノイズ値を調べると、AN1の入力のタイミングであることがわかりました。
   対処;未定

  2)内蔵ADC               6/7追記
   現象:AN0入力、シングルモード、でループでデータ収集すると、ハングする。
      ループ回数は不定で、数万回のADCのデータ変換でハングするようです。
   原因:ADCの終了フラグ待ちでハング、。。。終了フラグが立たないようです。
   対処:ADCをスキャンモード、マルチモードで使う。なんとか所定の動作が達成できました。

  3)ルネサスシリアルペリフェラルインターフェース(SPI) 6/23追記
   現象:コマンドレジスタ(SPCMD0-3)設定内容がメモリ表示で確認出来ない。SPCMD0の場合、アドレス0xFFFF8810に設定した値が表示されると思うが、00 00の表示、(インスタントウォッチでは設定値が確認できるのですが)、これが原因かどうかしれませんがSPCMD0-3の設定がコーディングの手法により上手くいかないことがあるようです。
 成功したコーディング RSPIn.SPCMDm.WORD = 0xXXXX;
   対処: 未

2010年5月23日日曜日

SH-2A基板 32KB超プログラムのROM化を試しました。



先日、Interface誌 付属SH-2A基板特設ページ でリリースされた 「シリアル・フラッシュROM用ブート・ローダのプロジェクト・ファイル一式をアップロードしました(SPIbootloader1)」を参考にし、ブートローダープログラムを改造し、また、以前使用した「ROM化ユーザ・プログラム書き込み用プログラム(SPIwreterUserDI)」再度改造して、32KBを超えるサイズのプログラムをシリアル・フラッシュROM(M25P40)に書き込み、その動作を確認しました。


概要

1.プログラムの改造
 1)ブートローダープログラム(SPIbootloader1)のシリアル・フラッシュROMからの読み出しサイズを
448KB に拡張した。
 2)ROM化ユーザ・プログラム書き込み用プログラム(SPIwreterUserDI)で
  ・ブートローダープログラム
  ・HEWモニタプログラム
  ・ユーザープログラム
    の3つのプログラムを個別に書き込むように改造した。
2.ROM化プログラムの動作確認
  ・プログラムサイズ 42,364バイト のプログラムを書き込む
  ・リセット、USBケーブル 抜き差し(電源) での 稼動を確認
  ・HEWモニタの動作を確認  NMIピン High (JPP2 Open)

以下に今回の作業を述べます。

1.ブートローダープログラム(SPIbootloader1)の改造
 1)入手したブートローダープロジェクトの解析
 以前 Renesas サイトから入手した「シリアルフラッシュ・シリアルフラッシュメモリからのブート例」サンプルコード を参考にしながら、ソースコードを解析しました。
 気付いた点
  ・ロードするプログラムのサイズが実質固定で32KBであった。
   本来、0x00002000にあるプログラム情報(APPINFO)を取得し、プログラム開始・終了アドレスの差分をプログラムのロードサイズとしているが、今まで作成したプログラムの開始アドレスが0x1C000000(0x1C000500)であることを考えると、32KB固定と考えられる。
  ・プログラム情報(APPINFO)のアドレスの扱いが、ユーザープログラムの場合、0x00008020、HEWもにたの場合 0x00002020 ・・・・この 0x20(32バイト)のズレが不明 (このズレを無視して、0x00008000、0x00002000 で ローダプログラムを組むと不調 )
      
      32バイトのズレは、RESET_Vector のポインタが格納されている位置、

      Renesasのサンプル(sh7264_sflash_loader_prog)は、ブート開始時に PowerON_Reset_PC [0x1C000500] に跳び、
      SPIbootloader1の場合、RESET_Vector [0x1C000000]に跳ぶ、この違いがよく解らない。
 
      RESET_Vectorの最初のエントリはPowerON_Reset_PC 
      直接PowerON_Reset_PCに跳ぶか、
      一旦RESET_Vectorに跳ぶが、実はPowerON_Reset_PCに跳んでいた、同じようで同じでない、、、、

      何か苦肉の策で リザーブ8に RESET_Vector のポインタをセットして、このようなスキームを実現したのか、、、、 よく解らない。  

 2)ソース main.c の修正
   個々の疑問には、目をつぶり、
     /* アプリケーションプログラムを内蔵RAMにロード */
     sf_byte_read_long(0x00002000, (unsigned long *)app_top, app_len);
   の直前に、app_len = 0x00070000; //(448KB)を置く

    (app_len の算出等で改造の余地あり。)
  
2.ROM化ユーザ・プログラム書き込み用プログラム(SPIwreterUserDI)の再改造
 1)ブートローダープログラムのROM書き込み
  1.で作成したブートローダープログラムを 0x1C080000 に置いて、シリアルフラッシュROMのセクタ0の消しこみ後、先頭8KBに書き込む。

     /* SPI-ROMの書き込み処理 for HEW Loader Program */
     if( write_prog_data( (unsigned char *)0x1C080000, 0x00000000, 0x00002000) < 0 ){
        error();
     }

 2)HEWモニタプログラムのROM書き込み
   以前使用した「SPIシリアル接続フラッシュROM アップデート・ファイル」(SPIROM.BIN)のHEWモニタプログラムの部分をシリアルフラッシュROMの 8KB~32KB に書き込む。
   (HEWでは、SPIROM.BIN は 0x1C092000 に置く)   6/4追記

     /* SPI-ROMの書き込み処理 for HEW Monitor */
     if( write_prog_data_user( (unsigned char *)0x1C092000, 0x00002000, 0x00006000) < 0 ){
        error();
     }

 3)ユーザープログラムのROM書き込み
   作成した、ユーザープログラムをシリアルフラッシュROMの 32KB以降 に書き込む。書き込みが次セクタに及ぶ場合、先に、次セクタの消しこみを行う。
   (HEWでは、USERROM.BIN は 0x1C0A0000 に置く)   6/4追記
     app_prog_size = SECTOR_SIZE * SECTOR_NUM - 0x00008000;

     /* SPI-ROMの書き込み処理 for UserProgram */
     if( write_prog_data_user( (unsigned char *)0x1C0A0000, 0x00008000, app_prog_size) < 0 ){
        error();
     }

3.ROM化プログラムの動作確認
 今回の検証用に32KBを超えるプログラムを作成した、半ば強引に、動作が不十分なグラフィックモジュールを組み込んだ。現時点で動作確認できているモジュールについては、正常の動作が確認できました。
 後は、1MBを超えるプログラムサイズをどうするか、、まあ、不要なことかも知れません。


*write_prog_data_userのコード
  int write_prog_data_user(unsigned char *program_data, unsigned long sflash_addr, unsigned long size)
  {
    unsigned long sector_no;
    unsigned long saddr;
    unsigned long sz;
    unsigned char read_data;
    unsigned char *w_p;

    /* ==== 引数から値をローカル変数にコピー ==== */
    saddr = sflash_addr;
    sz = size;
    w_p = program_data;

    /* ==== シリアルフラッシュメモリへの書き込み ==== */
    while( sz > 0){
      sector_no = saddr / SECTOR_SIZE;

      /*セクタ消去を調整 No.0 セクタの消去除外 */
      if(sector_no > 0)
      {
        if( Is_erased_sector(sector_no) == 0 ){ /* 未消去であれば */
          sf_sector_erase(sector_no);  /* 消去する */
          set_erase_flag(sector_no);  /* 消去したら、消去済みフラグを立てる */
        }
      }
      sf_byte_program(saddr, w_p, 1 );  /* 1バイトずつ書き込む */
      w_p++;
      saddr++;
      sz--;
    }
    /* ==== ベリファイ処理(書き込みの検証)==== */
    saddr = sflash_addr;
    sz = size;
    w_p = program_data;

    while( sz > 0){
      sf_byte_read(saddr,&read_data, 1);  /* 書き込みしたデータを読み出し */

      if( *w_p != read_data ){
        return -1;    /* データが一致しない場合エラーとする */
      }
      w_p++;
      saddr++;
      sz--;
    }
    return 0;
  }
※5/24 訂正 0x1C090000 ==> 0x1C0A0000 ユーザープログラムROM書き込み

2010年5月22日土曜日

SH-2A基板 「GCC対応シリアル・ダウンローダ(TinyMON)」を試す。



CQ出版 Interface誌 付属SH-2A基板特設ページ から「GCC対応シリアル・ダウンローダ(TinyMON)」を入手し、その動作を検証しました。

「GCC対応シリアル・ダウンローダ(TinyMON)」の検証では、GNU GCC 開発環境の検証、この環境で作成したプログラムのROM化の検証が併せて行えたようです。

[概要]
・TinyMONのシリアル通信チャネルをSCIF2からSCIF3に変更
・GNU GCCによる開発環境の検証 (TinyMONのビルド)
・TinyMONの動作確認

1.TinyMONの改造
 シリアル通信チャネルをSCIF2からSCIF3に変更するにあたり、以下の修正をTinyMONに行いました。
 1)cpu_uart.cの修正
  ・UARTコントローラの設定変更
    #define USE_UART_CH 2  => #define USE_UART_CH 3
  ・ポート設定
   付属SH-2A基板のCN3のNo.18(RxD3)No.24(TxD3)を使用するための設定。
    /* ポートコントローラ制御レジスタ */
    #define PGCR3 ((volatile unsigned short int *)(0xFFFE38C8))
    #define PGCR4 ((volatile unsigned short int *)(0xFFFE38C6))
     を追加

    /* ポート設定(RXD3(PG15))*/
    *PGCR3 = (*PGCR3&0x0FFF)|0x3000;
    /* ポート設定(TXD3(PG16))*/
    *PGCR4 = (*PGCR4&0xFFF0)|0x0003;
     を追加

    ※2010.7.18追加
    シリアル通信チャネル3 BaseAddress の設定
    /* FIFO付きシリアルコントローラSCIF(SCIF3) */
    #define BaseAddr (0xFFFE9800)
     を追加
 

    シリアル通信チャネル3 スタンバイ解除
    /* SCIF3スタンバイ解除 */
    *STBCR4 = (*STBCR4 & 0xEF); /* SCIF3動作 */
     を追加

2.TinyMONのビルド
 GNU GCCの開発環境は KPITカミンズ・インフォシステムズ・リミテッド より入手した環境で行いました。
 1)Makefileの修正
  ・各ツールの指定
    GCC = /usr/local/sh-tools/bin/sh-elf-gcc
    LD = /usr/local/sh-tools/bin/sh-elf-ld
    AS = /usr/local/sh-tools/bin/sh-elf-as
    OBJCOPY = /usr/local/sh-tools/bin/sh-elf-objcopy
    =>
    GCC = sh-elf-gcc
    LD = sh-elf-ld
    AS = sh-elf-as
    OBJCOPY = sh-elf-objcopy
    (/cygdrive/c/KPIT_Cummins/GNUSHv10.01-ELF/sh-elf/bin/sh-elf-gcc.exe ..)
    (環境設定で既にPATHが通っているので)
  ・ライブラリの参照指定を変更
    GCCLIB = /usr/local/sh-tools/lib/gcc/sh-elf/3.4.5/m2
    $(LD) -Map $(TARGET).map -T $(LDSCRIPT) $(OBJS) -L$(GCCLIB) -lgcc -o $(TARGET).elf
    =>
    LIBRARY_DIRS = -L ../../../../KPIT_Cummins/GNUSHv10.01-ELF/sh-elf/lib/gcc/sh-elf/4.4-GNUSH_v10.01/m2a -L ../../../../KPIT_Cummins/GNUSHv10.01-ELF/sh-elf/sh-elf/lib/m2a
     $(LD) -Map $(TARGET).map -T $(LDSCRIPT) $(OBJS) $(LIBRARY_DIRS) -lgcc -o $(TARGET).elf
    ※修正前のライブラリディレクトリ指定が m2 で 気休めに m2a に変更しました。

 2)ビルドの実行
   色々、試行錯誤(後述)の結果、無事成功。
 3)シリアルフラッシュROMへの書き込み。
   SPIwreterUserDI(改)により TinyMON を シリアルフラッシュROMに書き込みました。

3.TinyMONの動作検証
 幸か不幸か、HEWをインストールしたPCにシリアル(RS232c)のポートが残っていたので、付属SH-2A基板にRS232CドライバIC(ADM3202)を繋ぐだけでPCとのシリアル通信が実現できました。
 とりあえず、ハイバーターミナルでTinyMONの動作が検証できました。
 ・SH7262リセットで ハイバーターミナルに”Tiny Dump Monitor” が 表示
 ・ヘルプ表示
 ・メモリダンプ
   ためしに、SH7262レジスタ 周波数制御レジスタ(FRQCR)を確認しようと 
   DB FFFE0010 を 実行したが、0x1104 の設定は確認出来なかった。????
   (00 00 であった)
   ・・・課題点

※開発メモ
1.GNU GCCの開発環境(KPIT版)/(付属SH-2A基板特設ページ版)
 今回GNU GCCの開発環境はKPITでリリースされている環境を使用しました、付属SH-2A基板特設ページ(Interface誌)で提供される sh-tools20100424.tar.bz2 で GNU GCCの開発環境を整えた場合、上記のようなMakefileの修正の必要は無く容易にGNU GCCによる開発が出来るようです。

2.GNU GCCの開発環境(KPIT版)での注意点
 1)インストール先について。
 私の場合 WindowsVISTA 64bit版にインストールしました。すると、インストール先が Program Files(x86) になりました。これが Cygwin で結構、厄介なことになります。しかたなく、別ディレクトリ(C:\KPIT_Cummins)にインストールし直しました。

 2)Makeファイルのライブラリ設定。
 ・ビルドエラー ”cannot find -lgcc make: *** [all] Error 1 ”が発生。 最初、libgcc.a の所在を確認し、Makefileでのライブラリ設定に反映させました。しかし、エラーは解消されず、sh-elf-ld が libgcc.a を見つけられないのか不明でした。
 試しに、-lc や -lm 等でも ビルドを行うと、これも同様のエラー libc.a、libm.c が 有るのに見つけられないと言うエラーが起きました。いろいろもがくうちに、ライブラリフォルダの位置が問題と考えるようになりました。
 Windows上で C:\KPIT_Cummins\GNUSHv10.01-ELF配下のライブラリファイルは、Cygwinでは、/cygdrive/c/KPIT Cummins/GNUSHv10.01-ELF配下と表現します。
 Windows上で C:\Cygwin\usr\local\sh-tools等の配下のライブラリファイルは、Cygwinでは/usr/local/sh-tools等の配下と表現します。
 どうも、sh-elf-ld が /cygdrive/c/....の 表記を受け付けないようです。この推測を実証するために、次の対処を行ったところ、ようやくビルドが成功しました。

 (対処) 
  ライブラリ指定を
    LIBRARY_DIRS = -L /cygdrive/c/KPIT_Cummins/GNUSHv10.01-ELF/sh-elf/....
  から
    LIBRARY_DIRS = -L ../../../../KPIT_Cummins/GNUSHv10.01-ELF/sh-elf/....
  に修正

2010年5月16日日曜日

SH-2A基板 「ROM化ユーザ・プログラム書き込み用プログラム」を試しました。 (その2)

「ROM化ユーザ・プログラム書き込み用プログラム(以降 SPIwreterUserDI)」により、いままで作成した、付属SH-2A基板 自作テストプログラムの書き込みを行いました。

◎自作テストプログラムのROM化対応について。
 ○ SPIwreterUserDIのドキュメント(README.TXT)で指示されているROM化作業
  (「付属SH-2A基板特設ページ」
   /「付属SH-2A基板関連のダウンロード・データ」
    /「ROM化ユーザ・プログラム書き込み用プログラムをアップロードしました」
   から入手した SPIwriteUser.zip >> CQ Connect) 

  ・出力ファイルをバイナリに変更
   [ビルド]/[SuperH RISC engine Standard toolchain]
    [最適化リンカ]/[出力]で  「バイナリ」を選択
  ・vecttbl.cの修正
   割り込みベクタテーブル(INT_Vectors[])
    // 8 Reserved
   (void*) Dummy, を (void*) RESET_Vectors, に修正

 ○ Interface_Sample2のドキュメント(README.TXT)で指示されているROM化作業
  (「付属SH-2A基板特設ページ」
   /「付属SH-2A基板関連のダウンロード・データ」
    /「タイマ割り込みLED点滅制御サンプル・プログラムの改定版を用意しました」
   から入手した Interface_Sample2.zip) 

  ・resetprg.c で レジスタバンクの初期化処理を追加
    #include  "typedefine.h" を #include  "iodefine.h" に置き換える。

   INTC.IBNR.WORD = 0x4000; を set_fpscr(FPSCR_Init); と  _INITSCT();の間に追加する。


◎自作テストプログラムのROM化 結果
 ・GPIOテストプログラム(ほぼサンプルプログラム)
   動作:  4つのLEDを交互に点滅
   サイズ: 6912バイト
   ==> 成功
 ・モノクロLCDテストプログラム
   動作: LCD SG12864 の 表示 (自作フォント表示)
   サイズ: 33260バイト
   ==> 成功/失敗 (単純にROM書き込みを繰り返すのですが。成功したり、失敗したり。稼動までに異常に時間がかかったり。。。。)
 ・キー入力+モノクロLCD テストプログラム
   動作: LCD SG12864 の 表示 (自作フォント表示)
       キー入力により、表示文字を変化させる。
   サイズ: 33988バイト
   ==> ほとんど失敗 10回の試行中 成功2回、成功の場合も一旦USBケーブルを外すと動作せ
ず。


まだ、Interface誌の付属SH-2A基板関連の公開情報(本誌、およびダウンロードファイル)の読み落としがあるのでしょう。あとは、暇をみて、ぼちぼちと。。。。。


******************

最後に jujurouさんのコメントに感謝します。

2010年5月15日土曜日

SH-2A基板 「ROM化ユーザ・プログラム書き込み用プログラム」を試しました。



 先日、Interface誌 付属SH-2A基板特設ページ でリリースされた 「ROM化ユーザ・プログラム書き込み用プログラム(以降 SPIwreterUserDI)」を試しました。



 早速、”だめもと”で、外付けシリアルフラッシュROM(M25P40)搭載の付属SH-2A基板で試しました。結果は、当然のことですが失敗しました。SPIwreterUserDI実行後は、HEWモニタプログラム等が消去されたようで、リセット後、SH-2A基板は沈黙。。。



 以下に、SPIwreterUserDI の改造および、その際の顛末について述べます。


※改造後のプログラム概要
  ・M25P40 セクタ0 のクリア後、以前使った。「SPIシリアル接続フラッシュROM アップデート・ファイル」(SPIROM.BIN)の前半 32KB分 を書き込む。
  ・M25P40 セクタ0 の後半32KBから、ユーザープログラムを書き込む。
   (セクタの消去は、セクタ1以降に行う。)


1.SPIwreterUserDIを外付けシリアルフラッシュROM(M25P40)に使う上での問題点。
 ・付属基板上のM25P05-Aの場合、ユーザープログラムはセクタ1に書き込まれるが、M25P40では、HEWモニタプログラムと同じ、セクタ0に書き込まれる。この時、セクタ0の消去が行われ、HEWモニタプログラム等が消去されてしまいます。


2.SPIwreterUserDIの改造
 ①SPIwreterUserDIの改造 その1
   serial_flash.hのセクタサイズ、セクタ数を書き換える。(M25P40用に) 
   ※プログラム書き込みサイズはまだそのまま。
 ②ビルド
 ③書き込み実行 ==>失敗
   書き込み実行し、LEDの点滅までたどりつくが、付属基板リセットすると、HEWモニタ、およびLED点滅プログラムは作動しなくった。
 ④M25P40の復旧
   モニタプログラムを書き込み、MP25P40を復旧させる。
 ⑤SPIwreterUserDIの改造 その2
   a.SH-2Aマイコン基板実装SPIシリアル接続フラッシュROM アップデート・ファイル(2010年4月24日版)の 「SPIROM.BIN」をSPIwreterUserDIのフォルダに組み込み、Download modulesに追加する。
     USERROM.BINのオフセットを 1C090000に変更
     SPIROM.BINのオフセットを 1C080000で追加する。
   b.main.cを修正
    ・SPIROM.BINを シリアルフラッシュROMのアドレス0x00000000 サイズ0x00008000で write_prog_dataを使って書き込む。
    ・write_prog_data_userをwrite_prog_dataを元に作成する。(セクタNo.0の場合 セクタの消去は行わないように改造)
    ・USERROM.BINを シリアルフラッシュROMのアドレス0x00008000 サイズ0x00008000で write_prog_data_userを使って書き込む。
   c.ビルド/ダウンロード SPIwriterUser.abs、SPIROM.BIN、USERROM.BIN
   d.実行
   ==>成功
 ⑥SPIwreterUserDIの改造 その3
   ・write_prog_data_userでの書き込みプログラムサイズを セクタサイズ(SECTOR_SIZE)× セクタ数(SECTOR_NUM) - 0x00008000 に変更

3.今後、
 現時点で、SPIwreterUserDIでROM化するユーザープログラムの作成に失敗しています。付属SH-2A基板特設ページでダウンロードした、LED点滅プログラム(Interface_Sample/SH7262_LED)でも試すのですが、上手くいきません。SPIwreterUserDIに付随した LED点滅プログラム(USERROM.BIN)だけROM可できている状況です。

 その辺の所は、Intarface次号を期待して、。。。。

2010年5月9日日曜日

SH-2A基板でモノクロLCDを使う。



今年のGWも、CQ出版 Interface誌の付録基板と格闘していました。なんだか、年中行事化しているようです。3日も有れば出来ると思っていたモノクログラフィカルLCD(SG12864)の表示に、連休いっぱいかかってしまいました。
特に今年は、気持ちよい晴天が続き。部屋にこもりっきりで付属SH-2A基板をいじるのはどうかと思いながら....







付属SH-2A基板でLCDの表示に辿り着くまでにHEWで起きたエラーと対処を記します。

1.数値演算用関数(math.h)log10、pow等が使えない。
エラー: L2310 (E) Undefined external symbol "_log10" referenced in "C:\....
対処 : <HEW> [ビルド]/[SuperH RISC engine Standard Toolchain...]
          [標準ライブラリ]
            カテゴリで標準ライブラリを選択
              math.hにチェック
              string.hもついでに
ドキュメントを見ると、標準ライブラリ関数として、これらの数値演算関数は使えると書かれています。当然デフォルトの環境で使えると思っていたので最初は、開発環境が壊れたと思いました。しかし、調べていくうちに、”SuperH RISC engine Standard Toolchain...”での設定が必要と知りました。

2.セクションの設定エラー
エラー: L2321 (E) Section "B" overlaps section "P"
     L2321 (E) Seciton "R" overlaps section "P"
対処 : <HEW> [ビルド]/[SuperH RISC engine Standard Toolchain...]
          [最適化リンカ]
            カテゴリでセクションを選択

   セッションP~Dに384KB(0x60000)を確保することにして、セッションB,Rの設定 1C005000~ => 1C061000~に変更

(セッション情報 ビルド時に作成されたマップファイル(*.map)で確認した内容 )
セッション P~Dまでが 1C001000~1C008437 で サイズ 7436(29750)
セッション B,Rが   1C005000~1C005D33 で サイズ d34(3380) ※確かにかぶっている。
セッション Sが    1C0F0600~1C0FFFFF で サイズ fa00(64000)

I誌(2010.6)の第3章の記事(P107)で、セクションの設定例(表6)があり、その設定を鵜呑みにして、セクション設定を行ったことが原因、設定例では、プログラムサイズが16KB未満に限定されてしまいます。
HEWの無償版の制限サイズ256KBに合わせた設定であってほしかった。


次に、今年の基板で手こずった点を以下に述べます。

○マルチファンクションタイマパルスユニット2(MTU2)
 I誌の記事には、コンペアマッチタイマ(CMT)の使い方があったのですが、2Chしかないので、MTU2を使いたいと考え、MTU2を試すのですが、なかなか思うように使えません。特にタイマカウンタが16ビットで、他のマイコンの32ビットのタイマカウンタに慣れいた自分にとって結構不便を感じました。
また、CMTとMTU2の使い勝手が大きく異なることも....

○レジスタのサイズがまちまち。
 レジスタのサイズは、8,16,32ビットがあり、同じようなタイプのレジスタで異なるサイズがある場合があり、ケアレスミスで、サイズを誤ってアクセスし、それに気付くまで結構時間がかかったりしました。
また、レジストリ等のネーミングルールがいまいち整備されていないようで、これも意外と手こずる原因になりました。
 SH系のソースのヘッダーファイル”iodefine.h”を工夫すれば、ほとんどのレジストリを32ビットで扱えるのではないと思うのですが、なにせこのヘッダーファイル、9000行を超える巨大ファイル、手が出せずにいます。

○割り込み
intprg.c、vecttbl.c、vect.h等を編集する必要あり、
・vect.hのエントリに(resbank)を付加、
  割り込み時にレジスタバンクを使うと言う意味か?
・vectbl.cはそのまま
・intprg.cに#pragma文と、割り込みでCallする関数を記述する。
いまいち、しっくりこない。


○汎用入出力ポート(GPIO)
・ポートEはオープンドレイン出力
 Vcc+抵抗で電圧を印加する。”1”出力はハイインピーダンスで電圧を保持し(High電圧)、”0”出力でこのポートを通しGNDに電荷を流し、Low電圧となる。
・ポートHは入力専用
GPIOの各ポートは、GPIOとしての機能と端子数を揃えてもらいたいものです。ポートHにLCDの端子を繋げてしまい、ハンダをやり直すはめになりました。I誌(2010.6)のP76-77を見ながら拡張ボードを作成したので、ビルドエラーで初めて、ポートの選択を誤ったことに気付きました。