2008年9月17日水曜日

29MHz FMトランシーバー(3)

PLLコントロール回路
 コントロールは、Atmel AVR(ATtiny2313-20PU)を使用

  • PLL TC9256のコントロール
  • 液晶表示
  • エンコーダ
  • MAIN切替スイッチ
を処理している。

  Z80アセンブラは20年前に卒業してしまっており、すっかり忘れている。PICアセンブラも挫折気味。そんなことから
言語はBASCOMーAVRを使用。JA9TTTさんのホームページで基本を勉強しどうにか完成。
 このデモ版は2Kワード(4KByte)までであり2313はフルにプログラミングできる。こんな言語が無料で使用できるのはありがたい。しかし生成されるコードはアセンブラに比べ大きいのは致し方ない。最近はmegaシリーズも秋月で販売されているので、この問題はそんなに大きな問題ではなくなってきた。やはり簡便にソフトが作れる方が良い。

最初にPLLコントロール
 TC9256はシリアル制御である。CLOCK、PERIOD、DATAの3線をAVRと繋ぐ。
   TC9256     ATiny2313
   DATA(5)--------RB0(12)
   CLOCK(4)-------RB1(13)
   PERIOD(3)------RB2(14)

コマンドは、以下のようにしている。

1)TC9256のレジスタ設定準備

  TC9256のモードは4種類ある
   LFモード  直接分周方式     0.5~20MHz
   HFモード  パルススワロー方式 1~40MHz
   FMLモード パルススワロー方式 30から150MHz
   FMHモード 1/2+パルススワロー方式 30~130MHz

   使用周波数 29.000MHz~29.7MHz
   受信第一IF 10.7MHz
   PLL出力   29.000+10.7=39.7MHz
            29.700+10.7=40.4MHz
            39.7~40.4Mhzとなる。 HFモードは40MHzまでであるが、これで設定することとした。
            レジスタは「FM=0 MODE=1」
   ステップ    10KHz
   分周数    39.7MHz÷10KHz=3970
           40.4MHz÷10KHz=4040となり 分周数=「3970~4040」分周

  リファレンスカウンタの設定
   使用水晶は入手しやすい4.5Mhz レジスタは「OSC1=1 OSC2=0」となる
   基準周波数 10KHz レジスタは「R0=0 R1=1 R2=0 R3=1」となる

2)レジスタの書き込み
   BASCOM-AVRでのシリアルOUT命令は「Shiftout」を使用
   関係部分を抜粋すると以下のようになる
   
   Config Portb.0 = Output    'clock出力
   Config Portb.1 = Output
   'data出力
   Config Portb.2 = Output
   'period出力

   Declare Sub Pllw            'PLL書き込みサブルーチン

   Dim Cm01 As Byte           'PLL書き込みコマンド(d0H)のアッパー格納 
   Dim Cm02 As Byte           'PLL書き込みコマンド(d0H)のロワー格納
   Dim Pll1 As Long            'PLLレジスタ1
 分周数格納3970~4040
   Dim Pll2 As Byte            'PLLレジスタ2 PLL設定レジスタ格納

   Cm01 = &B00001101 'd0H upper部分「d」の2進数
   Cm02 = &B00000000 'd0H lower部分「0」の2進数
   Pll2   = &B01101010   '
「OSC2=0 OSC1=1MODE=1 FM=0」「R3=1 R2=0 R1=1 R0=0」の順番に並べたもの
   Pll1   = 40000             '分周数 29.3MHz+10.7MHz=40MHz÷10KHz=40000

   Set Portb.2                          'PERIOD→H
   Set Portb.1                          'CLOCK→H
   Set Portb.0                          'DATA→H
   Reset Portb.2                        'PIREOD→L 転送開始
   Shiftout Portb.1 , Portb.0 , Cm02 , 2 , 4 , 1  'レジスタ書き込みモードL送出
   Set Portb.2                          'PERIOD→H
   Shiftout Portb.1 , Portb.0 , Cm01 , 2 , 4 , 1  'レジスタ書き込みモード送出
   Shiftout Portb.1 , Portb.0 , Pll1 , 2 , 16 , 1   'PLLデータ(分周数)送出
   Shiftout Portb.1 , Portb.0 , Pll2 , 2 , 8 , 1    'PLL各種設定レジスタ送出
   Set Portb.0                          'DATA→H
   Reset Portb.2                        'PERIOD→L 転送終了

PLL書き込みのワンポイント

   ・アイドル状態でPERIOD,CLOCK,DATAは(H)レベルとする
   ・データ転送開始後PERIOD信号がLの期間にクロック立下りが8回を超えてはいけない。
    ということでd0Hを2分割して送出している。
   ・ データはLSB(ゼロビットから)から送出でPLLデータは立ち上がりで検出(下の赤字部分)

    Shiftoout Portb.1 , Portb,0 , Cm01 , 2 , 4 , 1

これで一応PLLの設定完了。PLLがロックされた瞬間は感激!!

次回はその他のプログラムを説明する。

注意:プログラムは参考であり、責任は取れませんのでご了解願いたい。質問が有ればコメントに記載してください。



0 件のコメント: