(仮)釣りと電子工作 Microchip PIC 忍者ブログ
趣味の電子工作と釣りについて。電子工作は、おもに変換器作成。釣りはおもにトラウトの管釣り。
[1] [2] [3] [4] [5] [6]
どうやらpickit2からの5V給電に問題があるっぽい気がする。
PIC18F4550のVCCに5Vを直接与えて書き込めばハングしにくくなった。。。でも面倒だよ。。。
→(後日追記)pickit2ライターのプログラムを最新にしたらハングしなくなりました。

ということで、「仮称:Thinkpad X22キーボードをUSBキーボードに変えるよ君」を作ろうと
成人の日にがんばってみた。

要件をまとめると

1.USB keyboard機能だけでなくUSB mouseの機能も必要
2.トラックポイントの出力をUSB mouse出力する
3.キーマトリックスを読み取って、USB keyboard出力する。
4.USB mouseとUSB keyboardは1つのUSBポートへちゃんぽん出力する。

で、これをどう実現していくかだけど、

1.Microchip MCHPFSUSB Framework にサンプルがあるので、それを使えば簡単。ためしてみたけど、コンパイルしてPICに書き込んで、即キーボードとして動作した。(マウスのサンプルは未確認だが同じだろう)

2.最近(でもないか)のThinkpadキーボードのTrackpointはPhilips TPM754A(Microcontroller with TrackPoint microcode from IBM)というコントローラでアナログ抵抗値(というか電圧)を読み取っている。で、こいつはPS/2出力する。PCのPS/2ポートと直結(要プルアップ抵抗)すれば、マウスとして動く。これをUSBにするためには、PS/2のホスト機能が必要。デバイス側はいくらでも作ったけど、ホスト側はつくったことない。でもまあ、簡単だろう。

3.簡単。これ以上いうことなし。すぐできる。

4.こういうのをcomposite deviceというらしい。これってPIC18で簡単に実装できそうに見えるけど、じつはできないのだ。なぜか?それは、Microchip MCHPFSUSB Frameworkがkeyboardとmouseのcomposite出力に対応していないからだ。

これをどうしても実現したければ、それはもう力技しかない。USBフレームワークを自分で作るしなないのだ。

USBプロトコル超初心者の俺に作れるわけがない。ということで、だれか作っていないか探してみた。


あった。


http://forum.microchip.com/tm.aspx?m=346640&mpage=2
RE: HID boot-keyboard & mouse on same device?

ものすごく面倒だけど、フレームワークを手作りする方法が書いてある。

内容はまったく理解できないが、とりあえず書いてあるとおりやってみた。


さて、動け・・・。。。。


ぜんぜん動かん!


おれがUSBフレームワークを理解できるようになるか、だれかがこれに対応したUSBフレームワークを公開するまでペンディング。

「仮称:Thinkpad X22キーボードをPS/2キーボードに変えるよ君」に計画変更しようかな。。。
これならとっても安いPIC16F887で済むし。
でも、マウスとキーボードでケーブルが2本出るのはちょっとかっこ悪いなあ。

PR
正月明けからPIC18F4550でUSBキーボードを作り始めているのだが、書き込み時にハング(応答なし)したり不安定になったりする。USBポートから引き抜けばエラーでアベンドしてくれるんだが。。。。。

16F648Aのときも、ときどきハングしたが、18F4550では80%ハングする。

どうしたものか。。。。


6年に渡って秋月のライターを使ってきましたが、とうとうその役目も終わりを迎えつつあります。今後出てくる高性能なPICに対応していくためには、新しいライターが必要です。ということで、Pickit2買いました。PICを基板から外さず(外してもいい)に書き込みするようになっている。これが最初気持ち悪いと思ったけど、使い始めると便利!もう秋月ライターには戻れない。さーて、PIC18F4520で遊ぶとするか。


MikroCでPS/2-ADB変換器のロジックを追加しているときのメモリ使用率は、つねに99%。100%超えたらメモリ節約のためにプログラムを書き換え、空いたらまたロジックを追加する、の繰り返し。メモリ節約のためのロジック書き換えにかかる時間が10で、機能追加や改良のためのロジック追加にかかる時間は1くらい。2Kワードのメモリサイズは、Cで多機能変換器を作成するには非常に厳しい。

あと、コツかどうかわからないけど。。。。
これが正しいかどうかわからないけど。。。。

① 配列変数に絶対アドレスを指定するとバイナリのサイズがすごく小さくなることが多い
ちょっとロジックを追加しただけなのに、理不尽にメモリ使用量が増えた場合などに有効。
  例:unsigned short keybuf_fn_flg[32] absolute 0xA0;

② Delay_us(n)はメモリを大量に消費する。
これはDelay_us関数を呼び出すのではなくnの値に応じて動的にバイナリを生成しているから。
ということで、同じnの値でDelay_us(n)を呼び出すのなら、引数なしの関数化すべき。
またはアセンブラでDelay_us互換の関数を作るのもよし。

③ グローバル変数を多用すること
Cの教科書とは逆だが、関数は void  function(); が基本。
スマートに書こうとするとすぐメモリが足りなくなる。
可読性とメモリ使用量にはトレードオフの関係がある。
メモリに収まる範囲で戻り値や引数を使うこと。

④ アセンブラ内で使用できる変数はグローバル変数のみ。
     ちなみに下記は、(指定した引数+1) x 5us + 関数呼び出しの10us?程度遅延する関数の例
unsigned short g_delay1=0 ;
void Delay_us5(unsigned short i) {
  g_delay1 = i;
  asm {
  L_Delay_us5_0001:
    nop
    nop
    decfsz _g_delay1,F
    goto L_Delay_us5_0001
  }
}
高い金出してまでPICでC言語を使うつもりはなかったのだけど、とあるところでMikroCなるものを発見。
2Kワードまでなら、無料で使えるみたい。PIC12F683を使うかぎり、支障なし。

今まで作ったM0115-PS/2変換器、M0110-PS/2変換器、OASYS-PS/2変換器はすべてアセンブラで書いていて、もう自分でも内容がよくわからないようなスパゲッティ状態になって放置していたけど、これをCで書き直してみることにした。
カレンダー
10 2018/11 12
S M T W T F S
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30
リンク
最新CM
[03/12 NONAME]
[07/09 こいち]
[07/07 こいち]
[07/05 NONAME]
[07/04 NONAME]
最新TB
バーコード
ブログ内検索
カウンター
Powered by ニンジャブログ  Designed by 穂高
Copyright © (仮)釣りと電子工作 All Rights Reserved
忍者ブログ / [PR]