この分析の目的は、最終的にはコントローラを自作することですが、まずはデコーダーをワンコインの材料費で作ることを目標に取り組んで行こうと思います。既に、試作部品を調達済で、実験が進み次第報告していきます。
まずは、メルクリンの線路信号の種類を取り上げていきます。

MS2が出力する信号は、大きく分けて3種類のプロトコルに分けられます。
信号名 | 用途 | 信号長 | パルス幅 | 備考 |
機関車信号(Loc) | 機関車の運転とファンクション操作 | 18bit | 208us/pulse | |
アクセサリ信号 | ポイント・信号の操作 | 18bit | 104us/pulse | 機関車信号の拡張信号も兼ねる |
MFX信号 | MFX対応デコーダの操作 | 85bit? | 100us/pulse | コマンド・データ・CRCなどを含む。応答機能も有り。 |
信号のパルス幅がそれぞれ異なるのが困りものですが、立ち上がりエッジ検出の外部割込みと、タイマを工夫することで、1つの実装でそれぞれを自動で判別することができます。立ち上がりエッジの間隔を対まで測定してあげれば、3種類は容易に分けられます。
具体的に、デコーダの実装方法について記載していきます。

パルスの幅が大きいものが"1(High)"で、短いものが"0(Low)"です。パルスの立ち上がりは常に一定間隔ですので、この間隔を対まで測定すれば、上記の信号の種類を特定できます。
次に、パルスが1なのか0なのかの判別ですが、立ち上がりのタイミングでタイマをリセットし、コンペアマッチタイマを使ってたとえば50us程度経過したらデジタル入力(DI)ポートで信号値を確認する処理を入れます。このとき、1のときはパルス幅が長いのでHighが取得でき、0のときはパルス幅が十分短いのでLowが取得できます。この値をバッファにセットする処理を立ち上がりエッジのタイミング等で入れる処理を実装すれば良い訳です。
信号の終端の判別は、タイマのオーバーフロー割り込みを使うことで容易に判別できます。タイマがオーバーフローするということは、立ち上がりエッジの信号が来ない=データ列が終わり、ということを示しているからです。
通常のマイコンであれば、上記のタイマ機能は当然のように対応しています。