mchip-cdc

mcc18 PIC18F2550 PIC18F4550 HIDmon-2550 HIDmon-14K50 sdcc

USB-CDCシリアル変換ファームウェアの改良

  • mcc18のインストール方法についてはこちらを参照してください。
  • mcc18にあるmchip-cdc14k2のアーカイブを少し変更して、18F2550/18F4550にも対応させてみました。

ダウンロード


ついでに、Linux環境でビルド出来るようにもしてあります。

  • ただし、ビルドするためにはwine(とmcc18)を入れる必要があります。
    # apt-get install wine
  • 動作確認はubuntu-9.10を使用しました。
  • mcc18はwindowsにインストールしたものからコピーする必要があります。


逆アセンブルリストを見やすくしてみました。

$ make dumplst

すると、cdc-18F2550.src という逆アセンブルリストが作れます。


Todo:

  • 割り込み受信したい。
  • ボーレート上げたい。
    • Cソース中にアセンブラを書くには?
    • 割り込み処理をアセンブラで書くには?

Cソース中にアセンブラを書くには?

答え:

_asm  と  _endasm でアセンブラ記述を挟む。

1行に書いてもいいし、

_asm
  アセンブラ記述
  ・・・
_endasm

としても良い。

  • _endasm の後ろにセミコロン不要。
  • アセンブラ記述にも行末セミコロン不要。
  • 引数無しのvoidな関数内にいきなり _asm と書き始めるもOK。
    • C言語的にはプロローグコード、エピローグコードは無いので気にしなくて良い。
  • return 命令はC言語側が挿入するので _endasmの手前のreturn は不要。

書き方の見本は?

  • mcc18をインストールしたディレクトリにある。
    C:/mcc18/src/traditional/*/*.c

ここは見ておけ。

  • asmでのマクロの書き方。
    C:\mcc18\src\traditional\stdclib\p18macro.inc
  • strcpyのソース。
    C:\mcc18\src\traditional\stdclib\strcpy.asm
  • mcc18の引数渡しは、FSR1を引数スタックポインタとして使用する。
  • つまり、引数リストを後ろから順にFSR1にpushして、関数をcallする。
  • char引数はshortに引き伸ばさずに、byte単位でスタックに積む。
    • すなわち関数を呼ぶ度にchar引数の符号拡張を入れなくて済む。


  • 関数内で使用する(破壊する)レジスタの退避もFSR1をスタックにして使う。
  • なので、関数内で引数を取り出したい場合のFSR1相対オフセット値は、退避サイズを加算して決めている。
  • FSR1のpopは呼び出し側の責任。
  • 戻り値はPRODL,PRODH(乗算結果レジスタ)に返すようになっている。(WREGは使わない)
  • アセンブラ記述内から引数を取得するマクロはこんな感じ。
    Stk1CpyToReg macro Offset,Reg  <=== 1byte取得。
    Stk2CpyToReg macro Offset,Reg  <=== 2byte取得。
  • Offsetが[SP+Offset]のFSR1相対オフセット。
  • Regは取り出した引数を保存するメモリー領域。
  • このマクロはFSR1を変化させない。
    • PLUSW1という[FSR1+WREG]のメモリーをフェッチしてくれるという変な(?)窓から、取り出し先[Reg]に
    • movff命令で転送を掛けている。


  • 実際のところ、関数の中身を全部 _asm 〜 _endasmで記述するのであれば、
  • 引数はスタックに積むよりも呼び出される側の関数に属するarg変数のようなものを固定的に用意したほうが少し効率が良い。
  • FSR1は、破壊すると困るレジスタをpush,popするだけに使用する。

8080や6800の時代に逆戻りだな。

ワークエリアに A, B,C, D,E, H,L とかを定義しておいたらまるで8080だ。

  • そんな感じで使えば、8080程度のコーディングは可能だ。
  • FSRは12bitしかないので、値を保持するレジスタとして使う場合は注意する必要がある。