忍者ブログ
ようこそ!JQ2RVNのブログです。 PICを使っていろいろな物を作ろうと画策中です。
[1] [2] [3]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

PICTNCのソースから、CRCアルゴリズムを解析しました。
わかりやすくするために16ビットの数値を8ビットで計算しているところなどは省略します。

以下、変数・定数
data: 受信 or 送信するデータ(8ビット)
CRC: CRCの値を格納(16ビット)
Poly: 生成多項式(16ビット定数)

PolyはAX.25では0x8408
CRCは計算前に0xFFFFで初期化します。


dataを右へ1ビットシフトします。このとき最下位のビットがCビットに出ます。

C=1ならば、CRC xor 0x0001 -> CRC

CRCを右1ビットシフト。同様に最下位ビットがCビットに出ます。

C=0ならば、計算終了
C=1ならば、CRC xor Poly  -> CRC


以上で計算は終了です。
アセンブラならおよそ10サイクルくらいで計算できると思います

PR
PICTNCの受信ルーチン。
次はrecv_one_bitです。

このルーチンは状態変化割り込みで判定したトーンを用いて
NRZI変換をしたり、タイミングを見たりします。






ここで変数・定数の説明します。

<変数>
R_TONE:状態変化割り込みで得られた現在のトーン
rotor:前回のトーン

<定数>
ONE_BIT:1200bpsでの1ビットの時間(833μsec)
ONE_5_BIT:1ビットの時間の1.5倍の時間
(↑ Timer2で使われるので、カウント数を計算する)





R_TONEとrotorの0ビット目が同じなら → no_change
R_TONEとrotorの0ビット目が違っていたら → bit_edge

というように、サブルーチンにジャンプします。


後で書きますがrotorはbit_edgeのときは+1されますので、
結果的に前回の値が入っている
ことになります。
(0ビット目が反転される)

8ビット変数なので、ちょっともったいない気もしますが、
1ビット変数にすると、反転が面倒なので、
このようなレトリックを使ってるみたいです。



bit_edgeサブルーチン

rotorを+1する。
Timer2の割り込み時間(PR2)をONE_5_BITにする。
TMR2IF(割り込みフラグ)とTMR2をクリアする。

Cビットを0にする


no_changeサブルーチン

TMR2IFが0の場合はrecv_one_bitに戻る。
(TMR2が規定時間過ぎていない状態)

TMR2IFが1の場合、以下続行
PR2=ONE_BIT
TMR2IF(割り込みフラグ)とTMR2をクリアする。

Cビットを1にする



<ポイント>

このルーチンから戻った時、
Cビットに受信した1ビットが入っています
PICのシフト演算はCビットの値が入ってきますから
変数を使わずとも、シフトするだけで受信した信号が入ります
(この辺は次回fine_start_flagにて)


Timer2は割り込みを発生させません(TMR2IE=0)
しかし、条件が一致すればフラグが立つ(TMR2IF=1になる)ので
これで既定の時間が経過したかどうかの判断ができます


忍者ブログ [PR]
カレンダー
02 2024/03 04
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
31
プロフィール
コールサイン:
JQ2RVN
性別:
男性
自己紹介:
PICの開発を勉強中です。
目標はPICTNCの高性能版を作ること。
まずは、本家を解析しています。
最新コメント
[04/23 Eolande]
[04/16 太田和巳(JF2UJG)]
[09/10 je7ifp]
[08/06 JQ2RVN]
[08/03 OVC]
最新トラックバック
バーコード
ブログ内検索
アクセス解析