昨日の続き。
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の
寿命を縮めますとか、いろいろ書いてあるみたいなので、
ご興味のある方は読んでみてください。
|
|
|
|
|
|