« 2007年8月 | トップページ | 2007年11月 »

2007年10月28日 (日)

ノウハウ

趣味でロボットを作っている話ではなくて、仕事上あった話です。

先日、あるチップをマイコンから扱うためのプログラムを書いていたところ、JTAG-ICEでそのチップに割り当てられているアドレスの中身を表示させながらステップ実行させると動作が狙い通りに行かず、表示させなければ狙い通りに動く、という現象に遭遇しました。しかも、たまにそうなる、ではなくて、100%そうなる。最初は表示させた場合とさせない場合で動きが違うということに気付かず、仕様書を何度も読み返したりしました。

一日かかっても解決できなかったので一緒に仕事をしている協力会社の方(斜め前の机で仕事している)に聞いてみたところ、「デバッガでそのアドレスにアクセスすると(チップの)ステータスがクリアされちゃうから、安易に見ちゃダメですよ。どうしても見たければ、一時的に変数を作って、値を退避させてください。」ということで、あっさり解決しました。

こういうことは一度経験しないと覚えない、そして教科書には書かれる事の無いノウハウなんだなぁと感じました。

教訓1:自力で解決できそうに無いと思ったら、早めに詳しい人に助力を仰げ。

教訓2:デバッガでチップのステータスポートに割り当てられたアドレスに安易にアクセスするな。

2007年10月19日 (金)

仕事のスイッチ (-_-)

最近は早寝早起きを心がけているわけでもないのですが、24時過ぎにはどうにも眠くて早く寝て、朝は8時までに自宅を出るようになりつつあります。

で、仕事のほうにスイッチが入ってしまっていて、ロボット作りや勉強、運動にまで気持ちが及びません。今日は21:45に仕事を切り上げて帰宅したのは23:15くらい。仕事で他人が書いたソースコード見ながら頭を悩ませて、返ってきてからまたプログラム組む気にはなれません。もう寝るだけ。

明日(10/20)はつくばチャレンジの第3回試走会があって、6:00三島駅前発の予定なので、今日はもう寝ます。じゃないと体が持たない。

2007年10月15日 (月)

食欲の秋 VS 運動の秋 (^-^)

ここのところ、そこそこ運動するよう心がけていて心地よい筋肉痛が続いております。特にスポーツジムで運動した後のジャグジー(水流強め)は、カラダに日々蓄積したいや~な疲れを解し出してくれるような感じがしてかなりお勧めです。ついでに、今期はまた大仁(伊豆半島の真ん中、修善寺の手前くらい)で仕事をするので、お昼休みは狩野川沿いを散歩するの楽しみにしています。今日も散歩してきました。

さて、運動していい汗かくとおなかがすいてしまい、季節の果物なども出回っているのが加勢してついつい食べ過ぎてしまいます。大分涼しくなってきて梨の季節はそろそろ終わり、柿や栗、キノコの季節になりました。まだ栗が残ってるから、栗ご飯作ろうかな?

2007年10月10日 (水)

調子のよい日悪い日 (^-^)

バイオリズムか星の配置か知りませんが、調子のよい日と悪い日が周期的にやってくるような気がします。で、今日はどちらかと問われると、体の調子はすこぶる良し。仕事も集中して出来ていたので、悪いわけじゃない、けど。ロボット作りに関しては気持ちが行かず。そういう日でした。

大体私は一度に一つのことしか考えられないので、ロボットのことを考え始めたら寝ても覚めてもロボットのことだけ、仕事のことを考え始めたら寝ても覚めても仕事のこと。一つのことだけ考え続けられると言う意味では研究者向けの性格なのですが、マルチタスクができないので集中すべき内容がずれた場合には非常にパフォーマンスが低下しやすい損な性格です。

気が乗らないときは雑用をこなしたり、掃除したり、本を読んだりするのが吉かもしれません。

ちなみに、今日の晩御飯は「栗ご飯」と「まいたけと野菜の具沢山味噌汁」でした。味噌汁はいつもどおり鍋いっぱいできてしまったので、きっと今週は朝晩この味噌汁を味わうことになるでしょう。栗ご飯まいう~(^-^)  柿もおいしいので食べ過ぎ注意です。

2007年10月 7日 (日)

AP-SH2F-9A ROMデバッグメモ

これまでJTAG-ICE (XrossFinder )を使ってRAM上でプログラムを動かしながらつくばチャレンジ向けのファームウェアを開発してきましたが、第1段階の機能を一通り盛り込んだのでROMに書き込んでテストすることにしました。

しかし、いざROMに転送してみるとプログラムが動きません。そこでJTAG-ICEをつかってROMで動くプログラムを1行ずつ追ってみようとしたところ、キーコードが違うとか何とか言われてROMの中身を消されてしまう。そんな感じでいろいろ困りましたが、解決できたので、その過程でいろいろ調べたことを資料にまとめておきました。間違っている部分があったらご指摘ください。

「apsh2f9a_rom_20071005.ppt」をダウンロード

こういうこと説明している本、少ないですよね?

2007年10月 5日 (金)

SH7149のMTU2でPWM波形出力

メモついでに先日あったことを一つ。書いておかないと忘れてしまいそうなので。blogに書いておけば、あとでgoogleで検索したときにヒットするでしょ。

9/28のメールから抜粋。

さて、水曜日に解決できなかったMTU2によるPWM波形生成プログラ
ムの件、原因が判り、解決できましたのでお知らせします。

 原因は2つありました。ソースコードで書くと、

(1) PFC.PEIORL.BIT.B12 = 1; // TIOC4Aを出力に設定
(2) MTU2.TOER.BIT.OE4A = 1; // TIOC4AのMTU2出力許可

という2行が足りなかったことにより、PWM波形を生成できていま
せんでした。他の設定はそのまま正しくできていました。

(1) はハードウェアマニュアルの page 614 を、
(2) はハードウェアマニュアルの page 290 を参照してください。

 修正したプログラムを走らせ、デジタルオシロで 20ms周期、ON
時間が1500us の矩形波がでていることを確認できました。

ラジコンサーボを制御するために、MTU2を使ってPWM波形を生成したかったのですが、SH7149のハードウェアマニュアル図10.25 にあるフローチャートのとおり設定してもPWM出力が出来ませんでした。いろいろ試行錯誤してみたところ、このフローチャートに描かれていない設定がいくつかあることがわかりました。

最初に MTU2 にクロックを供給すること。最近のSH2は消費電力を抑えるためにデフォルトではモジュールスタンバイがかかっており、周辺回路に対してクロックが供給されていません。ですから、MTU2関連のレジスタを設定する前にスタンバイを解除する必要があります。これは、ハードウェアマニュアルの「使用上の注意」に書いてありますし、SH7125を使ったときにも同じことを経験していたので早めにクリアできました。

次に、PFC(ピンファンクションコントローラ)からPWM出力に使用するポートを「出力ポート」に設定すること。ポートE IOレジスタだけではなく、ポートEコントロールレジスタも合わせて設定するところがミソです。これはなかなか気付きませんでした。

最後にMTU2に出力許可をあたえること。これは気付かなかった。

参考までに、周期 20ms、デューティ 1500us で動作を確認したプログラムのMTU2設定部分を抜き出して載せておきます。

// MTU2のPWMモードでは、TGRAとTGRB、TGRCとTGRDをペアで使用して
// TIOCA、TIOCC端子からPWM出力を生成することができる。
//
// PWMモードの設定手順は次のとおり。
// (SH7149ハードウェアマニュアルRev.3.00 図10.25参照)
//
// [0] MTU2のスタンバイモードを解除する。(※1)
// [1] カウンタクロックを選択する。
// [2] カウンタクリア要因を選択する。
// [3] 波形出力レベルを選択する。(※2)
// [4] TGRに周期、デューティを設定する。
// [5] PWMモードを選択する。
// [6] カウント動作を開始する。
//
// 本プログラムでは、MTU2のチャンネル4をPMWモード1で使用して、
// TIOC4A端子からPWM出力を生成する。
//
// (※1) 図10.25のフローチャートには記載されておらず、見逃しやすいので注意が必要。
//  また、MTU2のスタンバイ解除はMTU2関連の設定を始める前に実行すること。
//  (MTU2にクロックが供給されないと、MTU2に対する一切の処理が無効になる。)
//
// (※2) タイマアウトプットマスタイネーブルレジスタ(TOER)の操作も図10.25のフローチャート
//  に記載されておらず、見逃しやすいので注意が必要。

unsigned short puls_width = 1875;  // 1500us/0.8us 動作確認用
unsigned short pwmFreq = 25000;   // PWMの信号周期を作るTGRAの値
  // MTU2クロックMpφ=20MHz, プリスケーラP=16 のとき周期 T = 20ms作る為に必要なTGRAの値は
     // TGRA = t・MPφ/p
  //  = (20 * 10^-3) * (20 * 10^6) / 16
  //  = 25000

 
CPG.FRQCR.BIT.MPFC = 3;  // MTU2に供給されるクロックを 20MHzに設定 (内部80Mhz/4)
PFC.PEIORL.BIT.B12   = 1; // TIOC4Aを出力に設定
PFC.PECRL4.BIT.PE12MD = 1; // PE12をTIOC4A入出力に設定

STB.CR4.BIT._MTU2 = 0;  // [0] MTU2のスタンバイモードを解除する。

        // [1] カウンタクロックを選択する。
MTU24.TCR.BIT.TPSC = 2;  //   プリスケーラ 1/16
MTU24.TCR.BIT.CKEG = 0;  //  立ち上がりエッジでカウント    
      
MTU24.TCR.BIT.CCLR = 1;  // [2] カウンタクリア要因を選択する。
        //   TGRAコンペアマッチでTCNTカウンタクリア
       
        // [3] 波形出力レベルを選択する。
MTU2.TOER.BIT.OE4A = 1;  // TIOC4AのMTU2出力許可 (TIORを設定する前に実行すること)
MTU24.TIOR.BIT.IOB = 5;  // 初期出力1, TGRBコンペアマッチで 0 出力
MTU24.TIOR.BIT.IOA = 2;  // 初期出力0, TGRAコンペアマッチで 1 出力


        // [4] TGRに周期、デューティを設定する。
MTU24.TGRA = pwmFreq;  // 周期
MTU24.TGRB = puls_width; // デューティ

        // [5] PWMモードを選択する。
MTU24.TMDR.BYTE   = 0x02; // PWMモード1に設定

MTU2.TSTR.BIT.CST4 =1 ;  // [6] カウント動作を開始する。

職場でニコニコカレンダー (^-^)

ニコニコカレンダーって、これのことです。簡単に言うと「気持ちを見える化するツール」。mixiにも「ニコニコカレンダー愛好会」なるコミュニティがあります。

ここのblogでもタイトルの横にフェイスマークをつけて、こっそり「ひとりニコカレ」をやっていたのですが、先月半ばくらいから職場の自分の机でも「ひとりニコカレ」を始めました。「これなに?」と聞かれることを想定して、フェイスマークが書き込まれたカレンダーの横には大きな字で簡単な説明をつけました。私は「面白そうだからやってみた」程度で始めたのですが、これが管理部門の人からするとメンタルヘルスをモニタリングするのに都合がいいらしく、また、私の真後ろの席にいる新入社員にも受けがよかったので、ひそかに浸透するのではないかと期待しています。浸透したら、「ひとりニコカレ」からチームのニコカレに移行したいなぁ。

JTAG-ICEを使ったSH7149のROMデバッグ

久しぶりにblogを書きます。blogを書かないと何もしていないかのように見えますが、東海大の先生と組んで、つくばチャレンジに向けた準備を進めています。で、今日は判ったことを忘れないようにメモする意味で書き込んでおきます。

今、CPUボードにはアルファプロジェクトのAP-SH2F-9A (SH7149) を使用して、同社のJTAG-ICE (XrossFilder)を使用してデバッグを行っています。RAM上でデバッグをするときには気にしていなかったのですが、最近のSH2にはKey Codeなるものがあって、ROMデバッグをしようと思ったらこいつが邪魔してくれました。JTAG-ICEでCPUにリンクアップするとき、Key Codeが一致していないとフラッシュメモリが全消去される仕様なのだそうです。この話は、http://www.apnet.co.jp/support/an/AN801.pdf に説明があります。ですが、Key Codeに何を設定したらいいかまでは書いていません。これじゃROMデバッグができません。

ネット上でいろいろ探してみたところ、解決策は、http://www.tokudenkairo.co.jp/jtag/cq7144a.htmlの「ソフトウェアの準備」の項にありました。これでようやく話が見えてきました。SH7146F/SH7149Fの「キーコードアドレス」は0x00000040 と言う意味がやっとわかりました。SH7149(SH7146シリーズ)のハードウェアマニュアルを見ると例外処理ベクタテーブルの表にはH'00000034~H'0000007Fのアドレスが(システム予約)になっています。ここのH'00000040から4Byteがキーコード用の領域に使われているという意味だったようです。H'00000040 のベクタ番号は16番なので、ここに書き込まれた値とJTAG-ICEで設定するKey Codeの値が一致していればよいわけです。

そこで早速、http://www.tokudenkairo.co.jp/jtag/cq7144a.htmlに倣って、ソースコード中のハードウェアベクタのテーブルの16番のところに適当な値を書いてからビルド、ROMに転送して、JTAG-ICEにも同じ値を設定してリンクアップさせてみたところ、RAMデバッグ時と同様にデバッガが動作してくれました。試しにデバッガで00000040番地を覗いてみたところ、確かに先ほど設定した値が入っていました。これで一応の解決を見たと考えています。

今回の問題はCPUボードのRAM上でデバッガを動かしながら組んだプログラムに対してテストを行うためにROM化しようとして発覚しました。これで失敗したテストケースに対してデバッグが出来るようになったわけで。テストケースを作るのはこれからです。道のりはまだまだ遠い。

« 2007年8月 | トップページ | 2007年11月 »

最近の写真