2013年8月31日土曜日

active-highかどうか、ちゃんと確認しませう  今日(これから)のfirmware実験 USB (funny keyboard v2b)

なんか、タイトルがいつもと違いますが(笑)。


結論から言うと、トラックボールモジュールからのパルスをUSBモジュールに取り込むときに、
NORゲートを使うことにしました。



トラックボールモジュールからのパルスをUSBモジュール(56ピンFX2LP)に取り込むところで
うまく行ってません。
ORゲートのロジックICを使ってダメで、ANDゲートのロジックICを使ってもダメで。


上図はORゲートロジックICの7432を使った図
7432の出力をUSBコントローラー(FX2LP)の外部割り込みピン(INT0)に接続し、
up と down はUSBコントローラーにも接続してある。

上図の矢印の位置は、実験中は7432の山の左側にあると思っていました。
でも想定通り動作しないので、図にあるように山の右裾で外部割り込みが発生しているようです。

FX2LPには、エッジではなく high または low で外部割り込みが起きるモードもあるのですが、そのモードでの実験結果も外部割り込みが起きるタイミングは上図の矢印の位置であることを示していました。
つまり、FX2LP の INT0  と INT1 の外部割り込みは、active low (high → low)だったわけです。
説明書というか、Cypress社の資料をよく読むと、そう書いてある。あちゃ
そして、active high で外部割り込みを起こすことはできなさそう。


なので、NORを使うことにしました。


これなら、 active low の外部割り込みが欲しいタイミングで起きるはず。


OR(7432)やAND(7408)と違って、NOR(7402)はピンの配置(inputとoutput)が異なっているので、親指モジュールを作り直しです。




新しい親指モジュールができたら、firmwre の external interupt は negative ORからの信号なので active low の edge sensitive で検出可能で、トラックボールモジュールからの信号を直接読み取るピンがhighになっているときにマウスカーソルを動かすようにすればいいでしょう。


今日は、ともかく、ハンダ付けに没頭したい。。。。


2013年8月18日日曜日

今日のfirmware実験 USB (funny keyboard v2b)  ゴールが見えてきたのだろうか、と疑う編(笑)

2013-08-18

ハンダ付けの間違っていたところ、修正しました。

前回お手上げだったキーコードの入れ替わりは、なんだかんだコードを整理しているうちに、勝手に直ってました…
なんだったんだらうか。

トラックボールモジュールからのパルスの検出については、もうちょっと研究します。
元のパルスの出てくる速さとか、どのくらいの長さHをキープしているのか、とか、
さらにORのロジックICの反応の速度とか、も、大事なはずだけど、今は無視してプログラムしちゃってるので。


とりあえずは…
ハンダ付けができていることが確認できたので、グルーガンで配線を保護します。

2013年8月7日水曜日

今日のfirmware実験 USB (funny keyboard v2b) お手上げにわからんぞ編

2013-08-07

今日もちょっとコードを見ていました。

普通のキーをマウスのボタンとして取り扱うところのコードに、昔のコードが混じっていて
早い話が、間違ってたので、修正しました。


モードが2になるとハチャメチャなコードがレポートされる件については、
ほとんどお手上げです。

変数keytableの1つ目の次元がモードで、2つ目の次元がcolumn、3つ目がrowです。

key  designed keycode          -->  output keycode
 g3  0x34 = keytable[2][3][6]  -->  0x31 = keytable[2][4][3]
 c5  0xE7 = keytable[2][5][2]  -->  0x04 = keytable[0][4][5]
 c4  0xE6 = keytable[2][4][2]  -->  0x05 = keytable[0][1][6]
 a3  0xE5 = keytable[2][3][0]  -->  0x21 = keytable[1][4][5]

かならずモード「0」になるわけじゃなくて、「2」のままのもあるし、「1」になってるのもあるし。


きっと見る人はいないでしょうけど…置いておきます。。。

変数keytableの設計に使っている、スプレッドシート

2013年8月5日月曜日

今日のfirmware実験 USB (funny keyboard v2b) なんだかおかしいひとりごと編

2013-08-05

モード変更周りのコードを再確認しました。

ColumnとRowの使い方がごちゃごちゃになってました。
ColumnもRowも、自分で決めた設定なのですが、ピンのHigh、Lowの設定を行うのがどちらで、キーの押し下げ具合の結果として読み取るのがどちらなのか、混乱してました。
電子回路の本当の意味を理解せずに見よう見真似でやってたからですね。

「R」のキーを押すと、モードが「1」になってしまっていたのは、このせいでした。
モードを調べるところでだけ、ColumnとRowを逆にしていたので、「R」のキーがモード変更用のキーとして働いてしまっていたのでした。

この修正により、「R」キーがレポートされるようになりました。

モード「0」では、全キーが正しく作動中。


モード「1」(右手親指のモードシフトキー)は正しく動いている模様。
しかし、モード「2」になるはずの左手親指のモードシフトキーを押すと、まったく意図しないキーコードがレポートされてしまっている。
右手「Windows」キーでなぜか「a」が 出る。
右手「Alt」キーでなぜか「b」が 出る。
右手「Shift」キーでなぜか「4」が 出る。
右手「Jキーでなぜか「5」が 出る。
右手「:」キーでなぜか「]」が 出る。
なんか、ずれてる?

うわーーーーーーーーーーーーーーーー!!!!
明日やることが増えました。
どんなふうにずれているのか。
そしてそれはなぜなのか。

2013年8月4日日曜日

今日のfirmware実験 USB (funny keyboard v2b) 後半 問題点の整理

今日後半の実験は~

やることリスト:

来週中にすること:
モード変更周りのコードを再確認すること。
レポートの1バイト目を作るところのコードを再確認すること。

来週末にすること:
左手モジュールの親指のキーの半田付けやり直し。一番上のキースイッチはなんだか働きが悪いので取替えること。

これらの次にやること:
1:ホスト(PC)からCapsLock等の情報を得るコードを見直す。
2:ロジックICの選択。


今日わかったこと:

よかった点1:
トラックボールの押し込みによるマウスのメインボタン(左クリック)が生きている。

よかった点2:
同時に問題点6でもあるのだが、トラックボールモジュールのLEDが光っている。
青と白。

よかった点3:
右手モジュールも働いている。

よかった点4:
floatを使わないハードコーディングが成功した。



問題1:
どうやら、左手モジュールの親指で使うキーの配線を間違えている。
位置を逆にしてしまった。 1、2、3、4 と並べるべきところを、3、4、1、2と並べたような感じ。

問題2:
「R」 のキーが押されたことを報告しなければならないのに、「F2」(ファンクション2)が報告される…

問題3:
「Windows」キーが報告されず、「Ctrl」キーが変わりに出てくる。これは左右共通。

問題4:
モード変更が起こらない。

問題5:
トラックボールが、なぜか上下は動くが、左右に動かない。
かってに動き続ける。
動きが前半で予想したような滑らかさではなく、瞬間移動になっている。

問題6:
トラックボールモジュールのLEDが光っていることを確認できたが、
写真のように半透明のボールを通して光が出てこない。なにかに遮られているのだろうか。
また、LEDの点灯が制御されていない(偶然点くか?)ような…


問題1への対応:
仮組みをばらして配線を変更。半田鏝。
だがしかし、今日はもう、なぜか眠くて集中力がないので、半田鏝作業は危険で、面倒くさいし、また来週!

問題2への対応:
「R」キーはモード”0”のときに報告される。同じキーがモード”1”なら「F2」を報告する。
つまり、「R」のキーは同時にモード”1”に入らせるような結線になっているかもしれない。
回路をテスターで見た限りは混線も短絡もないようなので、プログラムのモード判定部分が壊れている可能性もある。
まずはプログラムをじっくり見直す。

問題3への対応:
「Windows」キーは、モード変更の次に特殊な「Shift」「Ctrl」「Alt」と共に、キーボードレポートの1バイト目に入れるべく読み取りしなければならないキーのひとつである。
回路をテスターで見た感じでは問題なさそうなので、プログラムをじっくり見直す。

問題4への対応:
問題2への対応と同じく、まずはプログラムをじっくり見直す。

問題5への対応:
これはよくわからない。
前から動きが変だし。なんか、動くときと動かないときがあるし、勝手に進み続けたりするし。
ロジックICはTC74AC32Pを使ったのだが、ORではなくて違うやつなのかな。
この対応は、後回し。

問題6への対応:
遮られているかも、というのは、来週明るいところでよく見てみる。今はもう暗くなってきたし、疲れたから、やめ!
ホスト(PC)からCapsLock等の情報を得るコードが変なのかもしれない。
これも後回し!


以上


floatが使えないので計算結果を整数化して配列に入れて使う 今日のfirmware実験 USB (funny keyboard v2b) 前半

トラックボールモジュールが回転のパルスを出したら発生する外部割り込み関数内で、

Xp += 1;  のように
普通に考えれば、トラックボールモジュールが回転のパルスを出したらその回数を素直にホスト(PC)へのマウスカーソルの移動量として報告(Xp)するのだと思うのですが、

どうにも移動がゆっくりすぎて、とてもじゃないけど広い画面では実用に耐えそうにありません。

そこで、

Xp = (NCfm*(pow((xcip*1.0),2.0)+(xcip))+0.5);
ホスト(PC)から、マウスカーソルの移動量の報告依頼があるまでの間に、トラックボールモジュールが回転のパルスを何回出したか(xcip)によって指数関数的に、ホスト(PC)への報告量(Xp)を決める、ということを考えたのですが(NCfmは定数)、
Keil uVision2 試供版では、なんとfloatが使えない=pow()も使えないということが、昨日判明しました。

やりたいことは、マウスカーソルの移動量を増やしてやること。
永遠に増やし続けるなんてことはありません。
ホスト(PC)からのマウスカーソルの移動量の報告依頼の時間間隔内に、トラックボールモジュールが回転のパルスを何回出すことができるのかは、分かりません。

とりあえず、今回は実験のために、上の式のxcipが1から24までの24個の計算を外部で行い(表計算ソフトで簡単にできます)、結果を配列にハードコーディングしてしまいましょう。

#define MAXxyi 24 
char RC[MAXxyi] = {1,2,3,5,7,9,12,16,20,24,28,34,39,45,51,58,65,73,81,89,98,108,117,127};

if (xcip <= 23){
     Xp = RC[xcip];
} else {
     Xp = 127;
}
xcip += 1;

ただし、この方式では、どこかのタイミングで増やしたホストへの報告用の移動量を初期化(ゼロに戻す)する必要があり、今はホストが値を読み取ったら初期化しようと考えています。
しかし、考えられるのは、マウスカーソルの移動スピードがガクン、ガクン、と落ちて一定せずに、きっと気持ち悪いんだろうな、ということ。


上向きの短い矢印のところでホストへの報告が出る、と、移動量が初期化されるので、マウスカーソルが移動するスピード(グラフの傾き)が、ガクンガクンするだろう。。。。

2013年8月3日土曜日

KEILコンパイラ評価版はfloatが使えません *** FATAL ERROR L210: I/O ERROR ON INPUT FILE:

*** FATAL ERROR L210: I/O ERROR ON INPUT FILE:
    EXCEPTION 0021H: PATH OR FILE NOT FOUND
    FILE: C:\KEIL\C51\LIB\C51FPS.LIB



こんなんでましたけど~ (懐かしすぎる)

Fatal Error L210↑ ここによると、


C:\KEIL\C51\LIB\C51FPS.LIB がありません。
だってさ。

探したけど。
確かに無いわ。

で、

µVISION: MEASURE EXAMPLE PROBLEMS IN EVALUATION SOFTWARE↑ ここによると、


ANSWER
The C51 Evaluation Software is limited to 2K and does not support floating-point. The error you receive indicates that C51FPS.LIB cannot be found. This file is the library for floating-point math for small model programs and it is only included with the licensed software.
なんと。 その機能はお金払ってないから使えません。ですと。
ただ、べき乗が使いたかっただけなんですけど、float が使えない。。。。。


展開するか。。。?
しかし、floatが使えないとなると、割り算もできない。
恐るべし、評価版!


2013年8月2日金曜日

error C249: 'DATA': SEGMENT TOO LARGE, *** ERROR L107: ADDRESS SPACE OVERFLOW

リンカやコンパイラが知らせてくれるエラーコードは、素人にはわかりにくいものです。
しかし、コンパイラなどのツール名と一緒にエラーコードをググれば、いろんな情報を得ることができます。

今日はちょっとした、自分用のメモ(いつも、いつでも自分用ですが)。

ご自身でファームウェアを書いていらっしゃる方は、こんな記事を読まなくても検索するなどしてエラーコードの意味を調べていらっしゃると思いますが、日曜大工ならぬ日曜プログラマの方は、エラーコードの意味を調べてみるといいと思います。

さてさて

CypressのUSBコントローラー、FX2をKeilのuV2でコンパイル。
評価版なので4Kbyteまでのファームウエアしか作れないのです。

で、その制限を超えたらどんな表示が出るのかなー と思って、ちょっとやってみました


output windowに
error C249: 'DATA': SEGMENT TOO LARGE
が出たら、そのソースファイルがでっかすぎる、ということのようです。

ちなみに、上のerror C249は、
#define MAXxyi 64  // iteration times
signed char Xi[MAXxyi];
signed char Yi[MAXxyi];
と書いた時に出たもので、


これを
#define MAXxyi 30  // iteration times
signed char Xi[MAXxyi];
signed char Yi[MAXxyi];

リンカがエラーを出すこともあるようで
*** ERROR L107: ADDRESS SPACE OVERFLOW
となると、個々のソースファイルではもんだいなくても、なんか大きすぎるみたいですね。

このとき、L107といっしょに
*** ERROR L118: REFERENCE MADE TO ERRONEOUS EXTERNAL
*** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT
も出ていました。

さらに
Program Size: data=139.5 xdata=4473 code=3362
Target not created
ということで停止。


で、
#define MAXxyi 24  // iteration times
signed char Xi[MAXxyi];
signed char Yi[MAXxyi];
とすると、

Program Size: data=127.5 xdata=4473 code=3362
と変わらないのに…
Total Code Bytes = 3362
Conversion completed successfully.
"funny-kbd_v2b" - 0 Error(s), 0 Warning(s).
ということで成功裏に終了。