DATA通信のその後ですが、外部に複数付けた時にやはり「激突の可能性」が出るのでI2Cと同じ様に「オープンドレイン」式にした方がいいかなーと思い試して見ました。
PICと同じようなAVRも混ざって来たので[PIC n]というタイトルでは変なので[MCU] と変更してみました。
多少の混乱は仕方ないということで、ご勘弁の程…。オープンドレイン・もどき
MCUはトランジスタに直結された出力になっていますから、完全にするには外部にトランジスタを追加しないとダメです。
でもそれらしい動作をさせればと思います、つまり「送信時だけポートを出力にする」というもので、他は入力状態にすればその時はプルアップされ出力は[1]となります。
出力形式 動作の説明 0 出力の場合 出力ポートにする。
この場合予め0出力に設定するととたんに[0]となる。1 出力の場合 入力ポートにする。
プルアップされているので自動的に[1]になる。受信側は両端子とも入力ですから意味がありません、コントロールは送信側だけです。
[ 結果は ]
この方式で試すと動作しました。念の為ポートに470Ωの抵抗を間に入れれば安心かも知れません。 「オープンドレイン」式でなくても通信出来るので前の方法でもまったく問題ありません、あくまでも参考程度にして下さい。
AVRへ移植する!
受信だけですがavr(アトメル社のMCU)で動作させて見ました、簡単なSoftなので作って直ぐ動きました。
古いICがあるので試しに動かした物です、I/Oの設定や少しの変更をしています。AT90S2313は設計が古く内部発振回路がありません。そこで4MHzのセラロックを付けています、本当は1MHzで良いのですがこれではスピードがあり過ぎ(4倍近く)ます。でもプログラムの方で吸収出来ている様で待ち時間は入れてません。
SoftはPICと同じ[mikro Elektronika社]のavr版(例のMax-2KBの無料版)です。
先日Ver 3.5をダウンロードして使っています。Cコンパイラも変えるとかなりSoftが異なるのですが、同じ会社なのでPICのC-Softを僅かな変更で移植出来ました。制限無しのSoft(C-コンパイラー)もあるavrは魅力ですが、その辺は後で研究する事にします。しばらくこれとお付き合いする事にしました。
AT90S2313はA/D変換が無いので少し使い難いのが欠点です、でも机の中にたくさんあるので…。サンプルプログラムです(オープンドレイン式とavr版を重ねています:混乱するかなー)。
2011/1/28 作成
移植のテクニック[pic から avr へ] avr1MHzでの動作で受信不能! avrのプログラム作りで良くするミスを防ぐには!
A.I/Oポートの設定で、picでは入力を[1]とし出力を[0]にしますが、avrでは入力を[0]とし出力を[1]にすることで、結構混乱します。
B.出力ポートと入力ポートはpicでは同じですが、avrは異なっており、出力は例えば[PORTD]としますが入力は[PinD]としないでPORTBなどとすると、出力ポートを呼んでいる事になります。これは入力ポートではなく直前の出力の状態を読んでいる事になり、エラーとはなりません。
これで結構プログラムが動かない!と悩む事が初心者には多い。
C.当然の事ですが構成が異なるので特別なレジスタがたくさん出て来ますが、これはICが変わるので仕方が無い。
という所でしようか。
D.PIC12Fや16F**と異なりavrは2バイトが1Wordで結構メモリーを使います、C言語・無料の2KBは直ぐ使っちゃう…感じです。
マルチコマンドが入っているので計算は速くプログラムは少ないのですが…
(^o^、:2011/2/4)。PICの受信が1MHzで動くのなら、avrでも動くだろうとTiny2313をクロック1MHzで動かし受信させたところ、作動しませんでした。
なぜエラーになるのか不明、仕方なくMCLを遅くして(パルス幅を広げる)見ました。結果は9mSecから20mSecしないと誤差が生じます、倍のパルス幅が何故か必要です(18mSecで動作するのですが余裕を見て20mSecにしました)。
今の所クロックを早く(4MHz)すれば問題なく動作するのでこの実験はここで止めました。
念の為10MHzのセラロックでコントロールするとやはり適当に待ち時間を取って正常に受信出来ます。(2011/2/12)