大実験その4
サーボモータの回転角をはかり、それをカウントするカウンタ回路からの情報を取ってきて、それをコンソール上に表示するプログラムだ。
それがなかなかうまくいかなかった。入ってくる情報が12bitで、最上位桁が符号桁。
正方向の回転角を処理するのは、そんなに難しくなかった。
8bit*2portで入ってくるうち、上位8桁を入れるポートからは上の4bitにはLSBから数えて4bit目と同じ値が入っているだけなので、上の4bitの値は取らないようにマスク処理。
正方向の回転角を処理するのは、そんなに難しくなかった。
8bit*2portで入ってくるうち、上位8桁を入れるポートからは上の4bitにはLSBから数えて4bit目と同じ値が入っているだけなので、上の4bitの値は取らないようにマスク処理。
で、その値をint型の変数にぶち込んで、8bitシフト処理して、下位8桁を加える。それによって16bitのうちきちんと12bitを使えるようにはなった。
しかし、このままだと上にも書いたとおり、負方向の回転がうまく表示できない。カウンタが0から減っていくと、例えば、5,4,3,2,1,0,…のように減っていくとすると、期待したいのは、0,-1,-2のように続いていくことであるが、上で書いたような処理だけだと、0,4095,4094,…のようになってしまい、アンダーフローしているように見えてしまう。
しかし、このままだと上にも書いたとおり、負方向の回転がうまく表示できない。カウンタが0から減っていくと、例えば、5,4,3,2,1,0,…のように減っていくとすると、期待したいのは、0,-1,-2のように続いていくことであるが、上で書いたような処理だけだと、0,4095,4094,…のようになってしまい、アンダーフローしているように見えてしまう。
激しく格好が悪いので、C言語でハードウェア関係の物を使用するときに便利な、論理和・論理積・ビット反転などを使って、やっと完成した。時間がかかりすぎた。改めて、プログラミング能力の大切さ、必要性を感じた。
こんな感じで、これから電気系としてやっていく自信がなくなってきた。