10月02日(土) 10月03日(日) 10月04日(月) 10月05日(火) 10月06日(水) 10月07日(木)
マイコンプログラムを本格的にやるにあたって、 気になるいくつかのことを確認することにしました。
GDLでやったときには問題が無かったのですが、 Cygwinでgccとなるとシリアルのスピード的に問題は無いのか疑問が残ります。 そこで、himitsu soft(©平沢氏)を使って 確認してみることにしました。
himitsu soft(©平沢氏)では、 1モータをスライダで動かす場合の転送データは、
となっているので、これにあわせてプログラムします。
himitsu soft(©平沢氏)に対応するパソコン側のプログラムもあるのですが、 ここでは後のことを考えて、Little Burning Core(©宮田耕自氏)で用意されている 関数を使ってみることにしました。
関数のあるファイル | 関数 | 説明 |
---|---|---|
sci.c | SCI_init(void) | シリアル初期化 |
sci.c | SCI_read(s32 *c) | 1バイト受信 |
srv.c | SRV_init(void) | サーボ制御モジュール初期化 |
srv.c | SRV_start(void) | サーボ制御信号出力開始 |
srv.c | SRV_setDuty(u16 ch, u16 duty) | パルス幅設定(duty:4799-18399) |
1バイトで受け取る角度情報:duty_byte
duty=5000+53*duty_byte
SCI_readを使って、データを受信するまで待つ(受信したデータは変更しない)関数SCI_getByteを付け足す。
特に問題なく、ぐりぐり動かせている様子。
スライダーのサンプルソフト(©平沢氏)があるので、 リハビリを兼ねて、これをもとに自分でプログラムをしてみます。
Little Burning Core(©宮田耕自氏)のプログラムが なんとなく分かった気になったので、通信の仕様を決めて自分なりに変更してみたいと思います。
(制御符号?) | 数値 | 意味 |
---|---|---|
0-200 | 数値データ | |
VD | 240 | 次の1バイトは、電圧のデータ(マイコン側から)。 |
SMD | 241 | 以下通信終了まで、モーションデータ |
DIV | 242 | 次の1バイトは、分割数(前のポーズからの時間) |
SLO | 243 | ループ開始(次の1バイトはループ回数) |
ELO | 244 | ループ終了 |
CSM | 245 | 次の1バイトは、チェックサム(保存データからは削除) |
MEX | 246 | マイコン上にあるモーションを実行 |
RTM | 247 | EEPROMのモーションをマイコンへ読み出し |
MTR | 248 | マイコン上にあるモーションをEEPROMへ書き込み |
SSD | 249 | 以下通信終了まで、1箇所のモータを駆動するためのデータ(モータ番号,角度のみ) |
SPWM | 250 | PWM開始 |
EPWM | 251 | PWM停止 |
ACK | 252 | 肯定応答(マイコン側から) |
NAK | 253 | 再送信要求(マイコン側から) |
SOH | 254 | 通信開始 |
EOT | 255 | 通信終了 |
ASCIIコードを送るなどということは考えず、全てを1バイトのデータとして送ることにします。 制御コードも自分勝手に決めます(笑)。
0-200までをデータとし、201-255までを制御コードに割り振ります。
今回は、モータの角度データも、0-200までで指定することにしておきます (複数バイトへの拡張は、それほど難しくは無いと思います。たぶん・・・)。
現時点では、マイコン側のデータをパソコンに取り込むことは考えていません (マイコン側のデータとの比較や整合性を考えだすと、頭が痛くなってくるので・・・)。
マイコン起動時のポーズは、EEPROMの最初のページから読み出すことにします。
ループは、1モーションに1回のみ利用可能とします。
1モーションはできるだけ小さくてすむように努力してみたいと思います。
1モータをスライダで動かす場合は、チェックサムなどは送らない。
最初の「全モータのデータ」は、モータ番号無しで角度データをモータ番号順に送る。
「変更のあるモータのデータ」は、 モータ番号と角度データを送る(全データを送ったほうがよいか迷い中・・・)。
チェックサムには、データ部をすべて加算して256で割った余りを入れる。
アドレスは、128X4(?)で指定。
とりあえずこれで、マイコンプログラムを書いてみよう・・・ 動作確認はどうやってすればよいのやら・・・
XMODEMはネット黎明期に急速に広まった通信プロトコル。 バイナリデータを転送。 YMODEM,ZMODEMなど多くの改良版も存在。
SOH(Start of Heading)(0x01):ヘッダ開始
シーケンス番号:1からブロックを送信するごとに1ずつ増やしていく。 255の次は0になり、その後1から再度1ずつ増やしていくことになる。
シーケンス番号の補数:シーケンス番号のチェックのために、 足して0xFFになるような値を入れる。
データ:128バイト(8ビットのバイナリを128)のデータ。 128バイトにならない場合には、残りをControl-Z(SUB:Substitute Charactor)(0x1A)で埋める。
チェックサム:データ部をすべて加算して256で割った余りを入れる。
ロボットを作る前に、プログラムを進めておきたい。 LBCでの電圧監視は後回しにして、モーションクリエータを進めていこう。 しかし、すっかり忘れてしまったなぁ・・・
まずは、通信の仕様を決めておこうかな・・・
AT24C1024のメモリは1,048,576 bits で、書き込み時に、8 bits(1 byte)を131,072wordsという使い方と、 256 bytes(256 X 8 bits)を512ページという使い方ができるようです。 ロボットの1モーションを256 bytes以内に収めれば、 512モーションが保存できることになります。
読み書きは、byte(word)単位で行われるようなので、 位置を指定するのに、17bits必要になるようです (131,072=2^17)。
書き込む8bitsデータのアドレスは、P0とDEVICE ADDRESSに続く2bytesの17bitsで指定するようです。 データを転送し、ACKNOWLEDGE(0)が帰ってきたら、STOP CONDITIONを送信して終了する必要があるようです。
書き込み中は、他の命令は受け付けなくなるようです。 書き込み時間Twr(Write Cycle Time)は、Maxで10msのようです。
AT24C1024では、256bytes(1page)の書き込みも可能なようです。
データの送り方は、「BYTE 書き込み」とほぼ同じようです。 違うのは、1byte送った時点でSTOP CONDITIONを送信せずに、 続けてデータを送信することみたいです。 256bytesまで送信したら、ACKNOWLEDGE(0)を受け取り、 STOP CONDITIONを送信して終了するようです。
書き込みのアドレスは、データを受け取るたびに1ずつ増えるようになっているようです。 このとき、下位の1byte分は増えますが、上位byteは変化しないようです。 ページの最後まで行った場合には、最初に戻るようです。 256bytes以上書き込むと、最初のほうのデータは上書きされることになるようです。
最後に読み書きした次のデータを読み出すのに利用するようです。
メモリの最後のアドレスまで行くと、 最初に戻ることになるようです。
STOP CONDITIONを送信して終了するようです。
ランダム読み出しには、ダミーの「BYTE 書き込み」が必要なようです。 ダミーの「BYTE 書き込み」をおこなった後に、 ACKNOWLEDGE(0)を受け取ったら、 再度START CONDITIONとDevice Addressを送るようです。 このようにすると、データが送られてくるようです。 マイコン側からはACKNOWLEDGE(0)を返さず、STOP CONDITIONを送信して終了するようです。
現在のアドレスから1byte読み出しもしくは ランダム読み出しを行い、 データが送られてきた後で、ACKNOWLEDGE(0)を返すと、 連続的にデータが呼び出せるようです。 読み出しを止めるときには、 ACKNOWLEDGE(0)を返さず、STOP CONDITIONを送信して終了するようです。
XMODEMだぁ・・・
今日は、EEPROM AT24C1024のデータ転送の仕様をまとめたいと思います。
EEPROM AT24C1024のデータ読み書きには、 START CONDITIONに続いて、8bitsのDevice Addressを指定するようです。
最初の5bitsは、10100という値を入れることになっているようです。
次の1bit(6bit目)は、A1を指定します。 2-pin(A1)をGNDに結線したEEPROMにデータを送る場合には、 0を指定することになるようです。
次の1bit(7bit目)はP0で、 これは、指定するメモリのアドレス17bits中の1bit目(most fignificant bit)を指定するようです。 残りの16bitsはDevice Addressの後に指定するようです。
最後の8bit目は、書き込みか読み出しかを指定するようです。 読み出しはhigh(1)を、書き込みはlow(0)を指定するようです。
Device Address転送後は、AT24C1024から、 ACKNOWLEDGE(0)が帰ってくるようです。
やっとマイコンプログラムに戻れました。 Little Burning CoreはEEPROMから再開。 しかし、EEPROMとかXMODEMとか、全く知らないので調べることに・・・ よく分からないけれど、まとめながら作業をすることにしました。 間違ってたら、教えてももらえると助かります。
VCC | 電源へ。 2.7 Vから 5.5 Vの範囲で利用可能なようです。 LBCでは 5V につないでいます。 |
GND(Ground) | グランドへ。 |
NC(No Connect) | どこにもつながない。 |
A1(Address Input) | 1個目はGND、2個目はVCCにつなぐと2個利用できるようです。 データ読み書きの際には、この値で指定します。 1個だけならGNDにつなぐのが良いようです (つながなくてもGNDになるようです)。 |
WP(Write Protect) | 0(GND)で書き込み可能、1(VCC)にすると書き込みできなくなるようです。 マイコンなどから切り替えることも考えられます。 LBCではつないでないのでGND(書き込み可能)になるようです。 |
SDA(Serial Data) | データを書き込んだり、読み出したりするのに使うようです。 |
SCL(Serial Clock Input) | データ転送の際などのタイミングを決めているようです。 low(0)でデータを変更し、 high(1)でデータを確定する感じでしょうか・・・ たとえば、8bits転送するためには、lowとhighを8回繰り返すということをやるようです。 |
Serial EEPROM AT24C1024 にデータを読み書きする場合、SDA と SCL の2本の線で行うようです。
通信開始は、SCL が high のときに、 SDA を high から low に変化させることで知らせるようです。
通信終了は、SCL が high のときに、 SDA を low から high に変化させることで知らせるようです。
データ送信は、SCL が low のときに、 SDA を変化させるようです。
データは8-bit単位で送られ、 9番目のクロック時にはEEPROMから0が送られてくるようです。
続きはまた・・・
SEO | [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送 | ||