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月7日水曜日
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」が 出る。
モード変更周りのコードを再確認しました。
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等の情報を得るコードが変なのかもしれない。
これも後回し!
以上
やることリスト:
来週中にすること:
モード変更周りのコードを再確認すること。
レポートの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等の情報を得るコードが変なのかもしれない。
これも後回し!
以上
ラベル:
EZ-USB,
firmware実験,
FX2,
KEIL,
変なキーボード
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;
ただし、この方式では、どこかのタイミングで増やしたホストへの報告用の移動量を初期化(ゼロに戻す)する必要があり、今はホストが値を読み取ったら初期化しようと考えています。
しかし、考えられるのは、マウスカーソルの移動スピードがガクン、ガクン、と落ちて一定せずに、きっと気持ち悪いんだろうな、ということ。
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
ただ、べき乗が使いたかっただけなんですけど、float が使えない。。。。。
展開するか。。。?
しかし、floatが使えないとなると、割り算もできない。
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];
しかし、コンパイラなどのツール名と一緒にエラーコードをググれば、いろんな情報を得ることができます。
今日はちょっとした、自分用のメモ(いつも、いつでも自分用ですが)。
ご自身でファームウェアを書いていらっしゃる方は、こんな記事を読まなくても検索するなどしてエラーコードの意味を調べていらっしゃると思いますが、日曜大工ならぬ日曜プログラマの方は、エラーコードの意味を調べてみるといいと思います。
さてさて
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
となると、個々のソースファイルではもんだいなくても、なんか大きすぎるみたいですね。
*** 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).
ということで成功裏に終了。
ラベル:
EZ-USB,
firmware実験,
FX2,
KEIL
2013年7月31日水曜日
ハンダ付け、仮組み 先週末の変なキーボード3
さてさて、もう水曜日になってしまいましたが、先週末の変なキーボード 第3弾です
前回、USBコントローラーからの配線用の基板を作り替えたいというところで終わったと思います。
左手用モジュールとUSBモジュールをつなぐ線を作ってなかったことに気づいたので、急遽作成
前回、USBコントローラーからの配線用の基板を作り替えたいというところで終わったと思います。
次の週末には、基盤に対して平行方向に線が出るようにデザインしたUSB 本体モジュールへの結線用基盤を作成することになるでしょう。。。
この写真では見えないのですが、裏側にも同様にコネクタが出ています。
L字型に見えるのが、コネクタを刺すピンです。
左手用モジュールとUSBモジュールをつなぐ線を作ってなかったことに気づいたので、急遽作成
仮組みしました。
箱に入れれば… 会社で昼休みにデバッグできますかねぇ
登録:
コメント (Atom)

