「PIC AVR 工作室」サイトの日記的なブログです。
サイトに挙げなかった他愛ないことを日記的に書き残してます。
PIC AVR 工作室 ブログ



昨日の続き。
jtagice mk2互換を使ってtiny2313をdebugwireで
ICEする時のことについて調べてみました。

(前回までのお話)

PORTxレジスタにデータを出力すると、PC画面上では
その直後にPINxレジスタにもその内容が反映されちゃうん
だけど、内部回路的にはシンクロナイザを通る分だけ
PINxへの反映が遅れるはず。なぜ?


(調べてみた)

まずはデータシート。tiny2313のフルバージョンの
24ページの絵(figure11)を眺めてみました。
クロック源(外部発振にしても内蔵RCにしても)を
マルチプレクサで選択した後に、大きく3つのクロック
に分岐しているようです。
  (1)CLKi/o
  (2)CLKcpu
  (3)CLKflash
このうち、PINxのシンクロナイザに繋がっているのは
(1)で、ICEのブレークポイントとかで停止する
ためのCPUクロックは(2)という具合に分かれているん
ですね。

で、簡単に言うと(2)や(3)はブレークポイント
などで停止するんだけど、(1)を停止させちゃうと
それが原因となってイロイロ弊害も出るだろうから、
基本的にはクロックをカウントしつづける…と。

そのあたりを詳しく書いてあるページがこれとか、
http://support.atmel.no/knowledgebase/avrstudiohelp/mergedProjects/JTAGICEmkII/mkII/Html/JTAGICE_mkII_Special_Considerations.htm
これとか。
http://support.atmel.no/knowledgebase/avrstudiohelp/mergedProjects/JTAGICEmkII/mkII/Html/JTAGICE_mkII_Introduction.htm


要点だけ抜き出すとこんな感じ。

例えば、このページのサンプルコードとして載っている
Example:
 OUT PORTB, 0xAA
 IN TEMP, PINB
っていうのをシングルステップで実行すると、PORTBに
吐き出した0xAAは次の行のIN命令では読めないはずだけど、
ICEで1ステップ動作をさせると読めちゃう。
もしちゃんとしたいなら、間にNOP命令を入れなさいという
感じ?

それと、イロイロ読んでいくと、すべてのI/Oモジュール
が一律動きつづけるって言うわけでも無いみたい。

一つにはtimer/counter。もうひとつはウォッチドッグタイマー。

timer/counterはCPU停止時に動きつづけさせるのか
停止させるのかを選択できるとのこと。
ウォッチドッグタイマーはCPU停止中は一律停止する
とのこと。

そりゃそうだね。うん。よく配慮されたつくりだな。


それ以外にも、リセットピンはdebugwireで使っている
間は他のICなどから制御することはダメとか、
USARTは動きつづけるよとか、ブレークポイントを
設定するとflash ROMに都度書き込みするからflashの
寿命を縮めますとか、いろいろ書いてあるみたいなので、
ご興味のある方は読んでみてください。



コメント ( 0 )




例のKEE electronics製のjtagice mk2互換機。
ようやく接続確認ができました。(^O^)
情報頂いた皆さん、ありがとうございました!


先日ダメだった理由は、どうやらリセット周りの
配線の勘違いでした。アホですな。抵抗値以前の
問題です…(^_^;)

で、実験風景。


tiny2313を実験台にしました。リセット用のプルアップ
抵抗はひとまずatmel推奨の10kΩをチョイス。
この間と同じように配線を実施。

dwenビットを立てる前の状態から始めたので、
debugwire経由のICEに入ろうとすると警告画面が
出てきます。適当に弄ってdwenビットを立てます。
(多分、事前にISPモードで明示的に変更してもいいん
 だと思いますが、今回は手抜きをしてみました)

で、実行してみるとなんだかんだでシミュレータ画面
がいつものように開きます。一見何も変わりません。
(あたりまえ)
ここでステップ実行とか操作してみると実行結果が
坦々とPC画面に表示されるわけです。レジスタとか
メモリ内容とか。

でもこれだけだと普通のシミュレータと何も
変わらないので、tiny2313側にLEDを取り付けて、
実行しているコードにあわせてLEDがちゃんと
点滅/消灯するのか確かめてみます。

まぁ、疑うだけムダなんですが、予想通りちゃんと
点いたり消えたりしました。うーん、なんか気持ち
いいな。(^O^)


一つ気になることが…ピン入力用レジスタ(PIND
とかPINBとか)のシンクロナイザ回路のこと。

山根さん本の98ページによると、PINxレジスタが
変化するタイミングは、実際に変化したタイミング
に対しシンクロナイザを通過する時間の分(2I/O
クロック)遅れると書いてあります。

PORTBやPORTDの各レジスタに出力命令から
2クロック遅れてPINxレジスタに反映されるん
じゃないのかなぁ?

ところが、出力命令の実行直後にPINxレジスタ
の内容が変わっちゃってるんですよね。これって
なんでだろう?
CPUのクロックとI/O用のクロックって
別なの??? うーむ…。

というよりは、CPUは常時実時間で動いているから、
ICEで読み出しする時にはもうPINxレジスタ
に反映された後の状態ってことなのかな?

細かいところが気になるんですよ。私の悪い癖。
(注:右京さん風に)


debugwire経由でPCにデータを読み出すにも
それなりに時間がかかっているはずだから、
やっぱりその間にPINxに内容が反映されて
しまっているって考えるのが自然なのかな?

私の記憶では、ソフトウェアシミュレーションの時は
PINxへの反映は確かに遅れていた気がするんだ
けどなぁ…

ICE中は、ブレークポイントなどで中断中でも
I/Oクロックは動作しつづけるっていう理解を
すればいいのかな?それなら辻褄は合うなぁ。


おまけ。互換機のコネクタ部分のアップです。
atmelオリジナルとはちょっと違うみたい
なので…。ご参考まで。


白いのが本体から生えているコネクタで、JTAG
の配置になってます。(裏表逆に撮っちゃったな…)

手前側にあるのが付録の変換基板。10ピンJTAGを
10ピンISPに変換します。うーん。シルクにATMEL
って書いてあるなぁ。これって純正品?

シルクにイロイロ書いてあるので、迷うことはないでしょう。
親切、親切。

ただ、10ピンISPを6ピンISPに変換しないと
不便だな。これまで作ったCPUボードとかは6ピン
だもんなぁ…。


そういえば、これまで作ったボード類って、リセット周り
のプルアップ抵抗が大抵4.7kΩなんだよな…。
10kΩにしないといけないかな?

というわけで実験してみました。
リセット用のプルアップ抵抗を4.7kΩに変えて再度
接続!

結果:とりあえず普通に動きました。

ただし、ATMEL純正のjtagice mk2とは回路構成が
違うのかも知れませんし、そもそも推奨は10kΩなので、
無理して4.7kΩを使うことも無いと思います。
…既にあるボードはとりあえず今のままで鞭打って
使ってみようかな、なんて思ってますが。

ISPモードからdebugwireモードへの変更は4.7kΩ
で行ってないので、この変更がちゃんと効くのかは
良く判りません。
まぁ、そもそも無茶するより10kΩ使ったほうが賢いな。
絶対。



コメント ( 2 )