« 2006年6月 | トップページ | 2006年8月 »

2006年7月31日 (月)

AVRのためのPIC再入門

PICでAVRライタを作る8

ブレッドボード上のPICのプログラムの作成が終わったので、
ユニバーサル基板に移し変えようと思う。

PCBEで実際の配線を考える。部品は8ピンのPIC、Dsub9ピン
コネクタ、ISPコネクタ、2本の抵抗とコンデンサ。この程度
楽勝、と良く考えずに配線を決め、小さく切った基板にハンダ
付けをする。一応ICソケットにPICを差し込む前に配線確認

をぉ?MISOとMOSIの接続が逆になってる。

GP3にMOSIが繋がっている。これはマズイ。GP3は入力専用で
出力に設定出来ない。一番近いコネクタとI/Oピンを接続して、
プログラム側でピンアサインを変更すればいいと思い、適当に
配線を決めたのがいけなかった。

以前も同じミスをやってたなぁ>自分

もう一度PCBEを起動して、最小の配線替えで出来る修正法を
考える。AVRならどのピンも入出力を切り替える事が出来るので、
この程度の失敗ソフト側でリカバー出来るんだが。

PICってやつぁ

と自分の失敗を棚に上げて思う、悪いのは自分だけれども。
基板を修正しMega48に書き込めるかテスト。無事動作を確認した
ので、PICで動くAVRISP互換ライタは完成とする。

Picavr04  

 

 

 

 

 

ソースとHEXファイル ダウンロード

| | コメント (0) | トラックバック (0)

2006年7月28日 (金)

AVRのためのPIC再入門

PICでAVRライタを作る7

一通りAVRISPもどきとしての機能を実装したので、前々から
やってみたかった抵抗2本のレベル変換をやってみる。

PIC-AVRライタを作るに当たって、PCとPIC間でシリアル通信を
行うのに ADM3203 を介してレベル変換を行っていたのだが、
PICの保護用クランプダイオード頼りの、抵抗のみのレベル
変換を試そうと思う。

取り敢えず、正論理で行っていたシリアル通信部のコードを
正/負論理が切り替えられるような、マクロを書き修正する。
抵抗値をどうしようかと考えたが、TADさんのでんし研DUAL
ライタを作ったときに買った100本100円の47KΩと330Ωを
使う事にした。

早速ブレッドボード上に抵抗を配置、DSub9ピンのコネクタを
接続してみた。8ピンのPIC1個と抵抗2本だけの冗談の様な
回路だが、AVRISP(互換)としてちゃんと動いている。

Picavr03  

 

 

 

 

 

 

秋月電子のUSB変換ケーブルで動作中のAVRISP互換
PICで動くAVRライタ図

| | コメント (0) | トラックバック (0)

2006年7月27日 (木)

AVRのためのPIC再入門

PICでAVRライタを作る6

AVRISP互換PIC-AVRライタで実装しなければいけないのは
残るところフラッシュメモリ/EEPROMの読み出しだけになった。

つくり始めの頃は「よぐわがんね」だったAVR068も、何度も読ん
だり、コマンド処理ルーチンを書いたりしている内に、大分理解
出来るようになったので、チャチャッとフラッシュメモリ/EEPROM
読み出し部書いてみよう。

AVRISPの場合、PCから送られてくるメッセージを受信して、
このメッセージに含まれるコマンドを実行し、成否を返答
メッセージとしてPCに送信する事で、コミュニケーションが
成り立っている。なので、必然的にプログラムは

メッセージをバッファに受信する
         ↓
コマンドを実行し、結果をバッファに書き出す
         ↓
バッファの内容を応答メッセージに整え送信する

という構造を成していて、いままで所はこれでうまくいっている。
しかし、フラッシュメモリ/EEPROM読み出し命令では、最大
256バイト分の読み出しデータをいっぺんに送らなければいけ
ないので、12F683で確保した80バイトのバッファ容量では不足
する。

なので、この命令に対する処理だけ、バッファリングしないで、
AVRから読み出したデータをいきなりPCに送信する事にした。
プログラム的に統一感が損なわれるので、なんか美しくない。

それでも、コードをゴリゴリと書き上げる。

一応完成。テストもうまく行っているみたい。
あと、作成中気になっていた部分を修正し、書き込み部を
チューニングして少しだけ書き込みスピードを上げた。

| | コメント (0) | トラックバック (0)

2006年7月25日 (火)

AVRのためのPIC再入門

PICでAVRライタを作る5

いよいよ、フラッシュメモリ書き込み部を作る。

AVRシリアルプログラミング自体を良く理解しない内に作り始めてし
まったのたが、ここに来て問題発生。

一概にAVRISPといっても、フラッシュ/EEPROMの書き込み方法は、
各デバイスによって異なるらしい。どうも、最近のモデルはページ
書き込みといって、内部バッファにメモリイメージを設定しておいて、
ページ単位で一気に書き込むらしい。また、このページのサイズも
デバイスによって異なる。フラッシュメモリの大きい奴はページサイ
ズもでかい。

フラッシュメモリ書き込み時には、このページサイズ分のデータが
送られてくるのだが、12F683のメモリ容量ではページサイズが
大きい場合、収まり切らないかも知れない。
12F683は128バイトのSRAMを持っているのだが、リニアに繋
がっていない。96バイトと32バイトを2つのバンクに分けて実装
している。また、0バンク目の96バイト中最上位16バイトは
各バンクでシェア出来るちょいと特別な領域になっている。
実質的にリニアにアクセスできるバッファの最大サイズは
80バイト程しか確保できない。

Mega168は1つのページサイズが64ワード(128バイト)のサイズを
持っているので、80バイトのバッファでは受け取る事ができない。
もっとも、SRAMの全てをバッファに出来たとしても、全容量
128バイトでは結局足りないのだが。

幸い手持ちのMega88/48とTiny26は対応できそうなので、
このライタでMega168を使う事は、あきらめる事にする。

気を取り直して、フラッシュ/EEPROM書き込み部を書く。
各種様々な書き込み方法や検査方法、フラッシュ/EEPROMの
違いを網羅しながら、1つのエントリーポイントに収める。
さすがに、込み入ったコードになってしまったので、後々の為に
大量のコメント入れる。

ブレッドボード上に12F683と仲良く並ぶTiny26をターゲットに実験。
フラッシュメモリ、EEPROMともに無事書き込めている様だ。

| | コメント (0) | トラックバック (0)

2006年7月24日 (月)

PCサーポート係

今週は、いよいよAVRライタの中核、フラッシュメモリ
プログラミング部に取りかかろうとおもっていたのだが、

亡くなった友人の御両親から、PCがインターネットに接続
出来なくなったから見に来て、と電話を貰う。気は進まない
のだが急遽サポート係になる。
案の定「インターネット接続」のパスワード部が空欄に
なっているだけなので、PPPOEの再設定をすまし、接続を
確認して帰ろうと思ったら、「これも教えて」攻撃に遭う。

見た事も無いプリインストールソフトの使い方なんか知らない
ですよ、とも言えず付き合うはめになる。

まだ、PM9:00だが、疲れたので今夜は飲んで寝る事にする

| | コメント (0) | トラックバック (0)

2006年7月21日 (金)

AVRのためのPIC再入門

PICでAVRライタを作る4

なんとか、AVRStudioから認識させる事ができたので、
各種命令に対する実行部をゴリゴリと書く。

一般命令に対する処理を書き上げ、ISPプログラミング命令の動作
を書き始めたところ、ISPプログミング動作移行命令の処理で
ハマる。PCから該当命令を送信するプログラムを書いて、テストする
ときちんと動作する様に見えるのだが、AVRStudioから操作すると
なぜかフェイルするというバグに悩まされる。

答えはディレイルーチンのバグにあった。
ISPプログラミング動作移行命令には多くの引数があるのだが、
この中にbyteDelayという、SPIで送受信する各バイトデータ間の
時間的間隔を定義する引数がある。テストプログラムでは適当に
5msを与えていたのだが、AVRStudioからの呼び出しでは、この
値が0msになっていた。

実際に実装したディレイルーチンでは、桁を間違えていただけで
無く、入力値が0の場合256値として働いていた。つまり1バイトを
送受信した後、0ミリ秒待機する事を期待されていたのに、2.56秒も
待機していたのでタイムアウトを喰らっていたようだ。

早速、この部分を修正して無事動作を確認。
ついで、ヒューズ/ロックビットの読み書き、識票/発振校正値の読み
出し部分を書く。

ヒューズ/ロックビットを操作出来るようになった。

Picavr2

 

 

 

 

 

 

 

 
ブレッドボード上で健気にAVRISPのフリをする12F683と、
ターゲットのTiny26

| | コメント (0) | トラックバック (0)

2006年7月19日 (水)

AVRのためのPIC再入門

PICでAVRライタを作る3

AVRISPコミュニケーションプロトコルVer.2の実装を考える。
HEROさん訳のAVR068を読む。

んー、よぐわがんね。

なので、何度も読む。取り敢えずPCとのやり取りをパケットの送
受信で行うという事は解った。パケットの構造は、0x1Bを先頭に
シーケンス番号、ボディ部のサイズ(2バイト)、トークン(0x0E)、
ボディ部本体と続き、最後にすべてのデータとの排他論理和の
チェックサムが続く。
実際の操作命令や応答はボディ部に埋め込まれ送られる。

よくわからないが、作って見ないことには理解が進まないので、
パケットの送受信部を書いて見る。

MPLAB上のシミュレータで動作を確認。うまく動いているような
ので、CMD_SIGN_ONの応答と、いくつかのコマンドに対する処理を
書いて、AVRStudioから接続して見る。

Picavr1  

 

 

 

 

 

 

 

 
おお、認識した。

ファームやハード/ソフトのバージョン取得に対する応答を
まだ、書いていないので、
"Getting revisions.. FAILED!"
になっている。まだまだ先は長い。

| | コメント (0) | トラックバック (0)

2006年7月17日 (月)

AVRのためのPIC再入門

PICでAVRライタを作る2

AVRのISPはSPIというシリアル通信でプログラムやデータを
読み書きするらしい。正直、SPIというものを今まで知ら
なかった。ので、まずSPIそのものを理解するところから始める。

AVRのドキュメントやトラ技の記事やそのサンプルコードを読む。
どうやら、2つのデバイスの8ビットレジスタを繋げて、8回分
ローテーションすると、互いのレジスタの内容が入れ替わる。
つまり、1バイト分の送受信をいっぺんに行ってしまう方式
らしい。なるほど、なんか凄い。

実際にPIC上での実装を考える。当然、12F683はSPIモジュール
を持っていないので、すぺてソフトウェアで行う必要がある。
頭の中で、GPIOの操作やSCKの周期をどうするかを悩む。

ここまで、自分としては結構な作業量なのだが、
実際にコードにしてみると、

                                                                                        

transferByteSpi
        movlw   8
        movwf   SpiTransBit
        clrf    TMR2
        bcf     PIR1, TMR2IF
        bsf     T2CON, TMR2ON ;タイマ2スタート

tb_lp   bcf     STATUS, C 
        rlf     SpiArg, F
        btfsc   STATUS, C ;SpiArg MSB を MOSI に出力
        goto    $ + 3
        bcf     GPIO, MOSI_PORT
        goto    $ + 2
        bsf     GPIO, MOSI_PORT

        btfss   PIR1, TMR2IF ;ディレイ用タイマ2フラグチェック
        goto    $ - 1
        bcf     PIR1, TMR2IF

        btfsc  GPIO, MISO_PORT ;MISO からの入力を SpiArg LSB にセット
        incf    SpiArg, F
        bsf     GPIO, SCK_PORT ;SCK 立ち上げ
 
        btfss   PIR1, TMR2IF ;ディレイ用タイマ2フラグチェック
        goto    $ - 1
        bcf     PIR1, TMR2IF
        bcf     GPIO, SCK_PORT ;SCK 立ち下げ

        decfsz  SpiTransBit, F ;8ビット分繰り返す
        goto    tb_lp

        bcf     T2CON, TMR2ON ;タイマ2ストップ 
        return 

                                                                                        

たったこんだけ。

取り敢えず、PC側とAVR側のインターフェイスが出来たんで、
次はPC-AVRISP間のプロトコルの話し方を考える。

| | コメント (0) | トラックバック (0)

2006年7月15日 (土)

AVRのためのPIC再入門

PICでAVRライタを作る1

一概にPICといっても結構なバリエーションがある。
8ピンの小さいヤツから、パワフルな40ピンのデカイやつとか・・
で、どのPICを使おうか悩んだ結果、12F683を使うことにした。

必要なピン数は、PCとの通信用に2本、AVRとの通信に4本の
6本が最低限必要だと思う。12F683はI/Oピン6本なので、
かろうじて条件をクリアする。何より8ピンのちっぽけなPICで
AVRライタが動作している姿を想像すると楽しいじゃないか。

早速、部品箱から12F683を取り出し眺める。あまりの小ささに
若干不安になる。しかし、こんな小さいパッケージに8ビットとは
いえコンピュータが詰まっていて、アマチュアがプログラミング
出来る、まさにデスクトップデベロップメント。

すごい時代になったもんだ。

さて、実際の実装を考える。
まず、PCとの通信部を作る。AVRISPの場合115.2KHzの
ボーレートでPCと通信をしている様だ。12F683には
USARTユニットが無いので、ソフトでこのボーレートを
作り出すしかない。また、外部発振でクロックを供給する
ためのI/Oピンの余裕は無いので、内臓8MHzのクロック
で動作させる。

これらの事を踏まえると、シリアル通信で送受信する各ビットは、
PICの17個分の命令サイクル間隔で操作しないといけない。
これでは、ディレイルーチンを呼んだり、タイマ割込を使ったり
する際のオーバーヘッドも無視できない。
逆に言うと各ビットの操作間隔をきっちり17命令サイクルに
あわせれば、うまく115.2KHzで通信出来るかも。

実際に書いた送信ルーチンが、これ。

                                                                                       

putByteUsart
        bcf     GPIO, TXD_PORT      ;スタートビット出力 
        movlw   3
        movwf   Counter
        decfsz  Counter, F
        goto    $ - 1 

        movlw   8                          ;8ビットを順次出力
        movwf   Counter
pb_lp   rrf     UsartArg, F
        btfsc   STATUS, C
        goto    pb_ct0
        nop
        bcf     GPIO, TXD_PORT
        goto    pb_ct1
pb_ct0  bsf     GPIO, TXD_PORT
        goto    $ + 1
pb_ct1  nop
        goto    $ + 1
        goto    $ + 1
        goto    $ + 1
        decfsz  Counter, F
        goto    pb_lp

        goto    $ + 1
        goto    $ + 1
        nop
        bsf     GPIO, TXD_PORT      ;ストップビット出力
        movlw   5
        movwf   Counter
        decfsz  Counter, F
        goto    $ - 1

       return

                                                                                             

1個1個命令数を数えて書いた。ポート操作間隔をきっちり
17命令サイクルにする為、"nop"やら"goto $+1"を挟んである。
パズルを解く様な感覚で少し楽しくもあったが、めんどくさくて
美しくないコードだ。

同じように受信側も書いて実験。一応動作はOK。

| | コメント (0) | トラックバック (0)

2006年7月14日 (金)

AVRのためのPIC再入門

今年始めにPICの入門書と秋月のPICプログラマを買い
電子工作を始めた。いくらかPICの楽しさが解り始めた頃、
AVRを知りAVRに夢中になった。

ネット上の情報を探り、HEROさんの翻訳したデータシートを
読み耽り、TADさんの感動的なAVR-RS書込み方法に出会い、
使い勝手の素晴らしいライタを作った。

ここらで、AVRの理解を深める為にも、自分でライタを設計
して見たくなった。いろいろ構想を練るうちにPICを使って
AVRISP互換ライタを作る事を思い立った。
ここのとこAVRばっかりで、PICの使い方を忘れかけているし、
それなりの金額で秋月のPICライタを購入したのだから、
遊ばせているのはもったいない。

出来るかどうかは解らないが、とにかくやってみよう。

Picavr0

 

 

 

 

 

 

 

 

↑すぺてはここから始まった。

| | コメント (0) | トラックバック (0)

2006年7月10日 (月)

AVR入門

相変わらず、ココログの反応が悪い。
明日から2日間のメンテにはいるらしので、改善される事に期待しよう。

先週やっていた事を簡単に遺しておく

秋月電子で12.8MHzの超高精度クリスタルモジュールを買ったので、
Tiny26にクロック元として繋ぎ、時刻を刻むプログラムを書いた。
その時刻を取り出すために、ソフトでPCと非同期シリアルで通信する
コードを書いて見た。

Avttest01

| | コメント (0) | トラックバック (0)

更新

先週からココログの夜間レスポンスが悪い。
まともにログインすら出来ないという状況が続いている。

なので、昼間休憩時間に職場からログインして見る。
つまりログインと記事作成のテスト。

この時間だと(PM03:00)無事ログイン出来た。
この記事が無事書き込めたら、夜自宅で試して見よう。

| | コメント (0) | トラックバック (0)

2006年7月 6日 (木)

AVR入門

超高精度クリスタルモジュール

| | コメント (0) | トラックバック (0)

2006年7月 4日 (火)

AVR入門

ICクリップ

ISPケーブル用にICクリップ買って見ました。
キャップ(?)部分をはずして見ると、中に羽状の端子が・・・

Icclip0  

 

 

何処に、どーやってコードを繋げれば良いのかと、しばし悩む。
これは、あれだな、羽の部分をU字に折ってコードプライヤーで・・・
と、勝手に解釈。

Icclip1  

 

 

どう見ても使い物にならなくしてしまいました。
本当にありがとございました。orz

これ、どこにハンダ付けすればいいのだろう。

| | コメント (0) | トラックバック (0)

« 2006年6月 | トップページ | 2006年8月 »