2014年12月10日水曜日

JUMA TX-136/500ファームウエア改造第2弾発動

かねてから課題だったTX-136/500送信機単体のマルチモード化を少し始めることにしました。

今までは送信機のMCU(dsPIC)に微小シフト命令を追加しRS-232C(EIA-232-E)経由でコマンドを送信するコントローラを使ってQRSS, DFCW, WSPR, OPERAの多モード送信を実現してきました。PICによるWSPRシンボル生成が完成しコントローラーのプログラムを書き直そうと考えていましたが、JUMAフォーラムにフランスのアマチュア局が送信機単体でマルチモードを実現したプログラムを紹介したのに触発され、コントローラープログラムより前に送信機単体での送信対応をやってみようと考えました。

まず手始めに送信周波数調整と表示を10Hzから1Hz単位にする、CW速度調整をPC経由でなくても0.1WPMまで下げられるようにする、という改造です。

ソースファイルを眺めると、もともと1Hz表示は可能だけれどもLCD表示範囲の関係で1Hz桁だけはみ出して表示しきれないようだったので周波数表示の前のモード表示の文字数を6文字分から5文字分に1文字減らすように書き換えただけできちんと1Hz桁まで表示ができるようになりました。

また、周波数調整もUp、Downともにもともと1Hzずつ調整は可能ですがスイッチによって10ステップ(= 10Hz)ずつ変化させているのでこちらも1ステップずつ変化するように書き換えればOKです。しかし、1Hzずつの変化だけでは不便なので暫定的に長押しのときのみ10Hzずつ変化するようにして、PWRボタン押しながらで100Hzずつ変化するアクションも残しておきました。

組み立て当時(2年前?)
ファームウエア改造後 下のTX-500も同じものに書き換えました
 あっさり1Hz表示と調整が可能になりました。(もちろん周波数制限を加えてあります)ここら辺の融通が利くということはもともとのプログラムが優れているからなのだろうと感じました。

次のステップはQRSS/DFCW部分の作りこみですが、既存のビーコンシステムのプログラムを改変するよりもまったく別個に作ったほうが良さそうです。また通常のCW運用では1Hzまでの細かい調整が必要なさそうなので従来の10Hz単位の表示&調整に戻してQRSS/DFCWなどの狭帯域デジタル通信モードに入ったときに1Hz単位の表示&調整に変えるようにすることと、モードごとに運用周波数とメッセージをメモリできるようにする、といったところを中心にプログラムしていこうと考えています。

改造例1:周波数UPボタン処理(短く押すと1Hzずつ、長く押し続けると10Hzずつ連続可変)

(juma-tx500.c 1198行~ 赤文字部分を追加)

 // Freq +/- (PA100 Band buttons)
        static unsigned char sw_flag = 0;
        if(FREQ_UP == 0)                                         // Band + button
            {
            if(RFPWR == 0)
                eeprom.defval.txfreq[board_type] = eeprom.defval.txfreq[board_type] + 100;    // speed tune
            else if(sw_flag & 0x01)
                eeprom.defval.txfreq[board_type] = eeprom.defval.txfreq[board_type] + 10;    // normal tune

            else
                eeprom.defval.txfreq[board_type] = eeprom.defval.txfreq[board_type] + 1;    // fine tune
 
            if(eeprom.defval.txfreq[board_type] > hi_tx_freq[board_type])
                {
                eeprom.defval.txfreq[board_type] = hi_tx_freq[board_type];
//                beep(HZ587_31, cal.calval.beep_len);                // D tone over beep
                beep(TONE_A, cal.calval.beep_len);                    // A tone over beep
                }
            else
//                beep(HZ466_85, cal.calval.beep_len);                // Bp tone ok beep
                beep(TONE_D, cal.calval.beep_len);                    // D tone ok beep

            calc_tword();                                            // just calculate new DDS set value

            ms_delay(BUTTON_DEBOUNCE);

            if(FREQ_UP) sw_flag &= 0xFE;
            else sw_flag |= 0x01;

            }


改造例2:1Hz桁周波数表示処理

 (juma-tx500.c 1430行~ 赤文字部分" "内の6キャラクタを5キャラクタに削る)

// second line
                set_cur_lcd(LINE2);                                // second display line

                if(alarms !=0)                                    // alarm display
                    {
                    display_cw_speed();                            // display formatter for CW speed

                    display_alarms();

                    lcdoutch(' ');
                    disp_tx500_freq(eeprom.defval.txfreq[board_type]);
                    }

                else                                            // normal display
                    {
                    if(    key == 1)
                        {
                        display_cw_speed();
                        sprintf(lcdpbuff, "  TX  ");
                        lcd_putst(lcdpbuff);
                        disp_tx500_freq(eeprom.defval.txfreq[board_type]);    // display frequency
                        }
                    else
                        {
                        switch(eeprom.defval.pa_state)
                            {
                            case 0:
                                display_cw_speed();
                                sprintf(lcdpbuff, " STBY ",eeprom.defval.cwspeed);
                            break;

                            case 1:
                                display_cw_speed();
                                sprintf(lcdpbuff, " OPER ",eeprom.defval.cwspeed);
                            break;

                            case 2:
                                display_cw_speed();
                                sprintf(lcdpbuff, " TUNE ",eeprom.defval.cwspeed);
                            break;
                            }

                        lcd_putst(lcdpbuff);
                        disp_tx500_freq(eeprom.defval.txfreq[board_type]);    // display frequency
                        }
                    }


という具合に最小限の追加修正で実現できます。

このソースファイル群はC30コンパイラ用に記述されているのでC30でコンパイルするのが望ましいです。新しいXC16でも可能ですが、割り込み処理の記述が異なっておりこの辺の互換性が取られているのかは不明です。実際XC16でもそのままコンパイルできましたが、当局の環境では一部動かない部分が最近見つかったので現在C30でコンパイルしたものに入れ替えています。

年末は他の事でいっぱいいっぱいなので続きは落ち着いてからでどうかひとつ。

4 件のコメント:

  1. 日本人らしい細かな配慮の仕様をお考えのようで素晴らしいですね。
    出来上がったらJuma Forumに投稿するとF4GCBさんとも交流が出来そうですね。

    F4GCBさんのTX136/500のQRS/DFCW追加とWSPR追加の二件の投稿はForumの主催者を除いて、意外にも日本人以外からの返信が無いのは何故なのか不思議な所です。
    無線通信の伝統のあるヨーロッパではCW派が多い性なのかも知れない、、、、?
    JumaのユーザーはCW派が主流、、、、、?と思ったりしています。

    CONFIGページやその他もそうですが、電源ボタンでPower off しないと状態が保存されないのですが、これはやはりメモリー書換回数の寿命を考慮してなのでしょうか。 移動運用の時などバッテリ充電でエンジンスタートさせると一時的に電源電圧が低下してJumaがPower off になり自動復帰しない上に、設定が保存されていなくて困ります。

    返信削除
    返信
    1. GVYさんこんにちは。コメントありがとうございます。

      TX-136/500に使われているdsPICのプログラムメモリとRAM空間は比較的広くて、オリジナルの制御プログラムで全プログラムメモリの約3分の1弱、全RAM容量の2割しか消費されていません.ですのでいろいろと考えた仕様を試すことができそうです。

      フォーラムの件は仰るように、欧州ではCWが主流なのかもしれませんし狭帯域通信を行うのにわざわざJUMAを弄るよりも別の送信機を使うというのもあったりするのでしょうか。

      電源を落とすときだけに設定保存するというのはEEPROMの書き換え回数の問題や書き込み速度が遅いというのも理由として考えられますが、電源が必ずしも安定しないフィールドでの使用をあまり考慮されていないような気がします。CONFIGメニューを抜け出したときに変更分を保存するようなコードも入れてみようと思います。

      削除
    2. dsPIC30F6014Aのデータシートを見ると
      • Data EEPROM memory:
      100,000 erase/write cycle (min.) for industrial temperature range, 1M (typical)
      との事で、EEPROMの書替え寿命は最低でも10万回、標準的には100万回ですね。
      365日、毎日100回CONFIGを変更すると
      標準的寿命で27年以上、最低で2.7年以上の寿命
      がある計算なので普通はOKそうですね。

      削除
    3. プログラム的にはCONFIGに何か変更がかかったときにフラグをつけ、メニュー離脱時にフラグが立っている場合のみEEPROMに書き込むという方法が書き換え回数的により安心かなと思います。CWスピードや周波数の記憶は変更時だと書き換え回数がかなり増えてしまうので、一定時間間隔を開けるかオリジナルのように電源OFF時に記憶させるのが良いかもしれません。

      削除