2014年12月14日日曜日

JUMA ファームウエア改造記 その2

JUMA TX-136/500用ファームウエアを徐々に改造中ですが、備忘録的に。

前回1Hz桁表示とチューニング、CW速度1WPM以下設定改造をしました。juma-tx500.cファイルのFREQ+ FREQ-ボタンにそれぞれ押しっぱなしフラグをたてて、短押しで1Hzステップ、押しっぱなしで10Hzステップ調整としました。もともとチャタリング対策で100ミリ秒ほどディレイを置いているものの時々短押しのつもりが10Hz動いてしまうことがあるので別途カウンタを設けて0.2秒以上の長押しで10Hzステップになるように追記しました。

int temp_time;                    // for save delay time  変数宣言追加)

 【juma-tx500.c メインループ始まり部分】

 // Main forever loop _____________________________________________________________________________________________________________

    for(;;)
        {
        MAIN_TEST = !MAIN_TEST;              // timing test
        static unsigned char sw_flag = 0;    

      // status flags bit0:UP button, bit1:DOWN button, bit2:setting change

FREQ+ボタン処理部分(FREQ-も同様の処理)

// Freq +/- (PA100 Band buttons)
//        static unsigned char sw_flag = 0;
        static unsigned char cnt = 0;
        if(FREQ_UP == 0)                    // Band + button
            {
            sw_flag &= 0xFB;                // clear frequency change end flag

            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;                // clear UP button pressing flag
                sw_flag |= 0x04;                // frequency change end flag
                temp_time = seconds;
                cnt = 0;
                }
            else if(cnt) sw_flag |= 0x01;
            else cnt++;


            }


また、475.5kHzの免許申請が厳しいため必要以上の電力が選択されないように、CONFIGメニューにMAX(60W...といっても実測54Wくらいなのですが^^;)を選択できなくするようなリミッタON・OFFメニューを追加して、電源ONの時にはMAXが選択できなくなる(メニューで解除できる)ようにしました。

【main関数内 select sub modeセクションに追加】 

int limit = 1;    // power limit(0:OFF for TX136, 1:ON for TX500) 変数宣言追加)

// MAX Power limitation for Mobile
                    case 11:
                    set_cur_lcd(LINE1);
                    lcd_putst("Mobile POW limit");

                    set_cur_lcd(LINE2);
                    limit = limit + encoder_get();   // power limit on /off

                    if(limit < 0)                    // keep within limits
                        limit = 0;
                    if(limit > 1)
                        limit = 1;

                    lcd_putst("Select = ");

                    if(limit == 0)
                        lcd_putst("OFF    ");
                    if(limit == 1)
                        lcd_putst("ON     ");
                    break;


【main関数内 RF powerセクションに追加】

// RF power
        if(RFPWR == 0 && FREQ_UP == 1 && FREQ_DN == 1)                // RF PWR - button alone
            {
            eeprom.defval.rfpwr++;
#if 0
            if(eeprom.defval.rfpwr > MAX_RFPWR)
                {
                eeprom.defval.rfpwr = 0;
                beep(HZ587_31, cal.calval.beep_len);            // D tone beep whe roll over
                }
            else
                beep(HZ466_85, cal.calval.beep_len);            // Bp tone beep
#endif
            if(limit)
                {
                if((eeprom.defval.rfpwr + 1)> MAX_RFPWR) eeprom.defval.rfpwr = 0;
                }
            else
if(eeprom.defval.rfpwr > MAX_RFPWR)                    // check roll over
                eeprom.defval.rfpwr = 0;

            switch(eeprom.defval.rfpwr)                            // sound different tone for each power level
                {
                case 0:
                    beep(TONE_A, cal.calval.beep_len);            // A tone beep
                break;

                case 1:
                    beep(TONE_B, cal.calval.beep_len);            // B tone beep
                break;

                case 2:
                    beep(TONE_C, cal.calval.beep_len);            // C tone beep
                break;

                case 3:
                    beep(TONE_D, cal.calval.beep_len);            // D tone beep
                break;
                }

            ms_delay(BUTTON_DEBOUNCE);
            while(RFPWR == 0)
                {
                }
            }


あと、オリジナルでは設定変更や周波数の変更が電源OFFのときにのみEEPROMに書き込むようになっており、不意の停電で設定変更が反映されないという事象に対して、CONFIGメニューの離脱5秒後、または周波数変更完了の5秒後にEEPROMに書き込むようなコードを追加しました。

【DISPLAY/CONFIGボタン長押し処理部分】

            if(long_push == 0)                 // major mode change
                {
                lcd_mode++;
                sw_flag &= 0xFB;
                if(lcd_mode > MAX_LCD_MODE)
                    {
                    sw_flag |= 0x04;           // setting change end flag
                    temp_time = seconds;

                    lcd_mode = 0;
                    }


【メインループ内に追加 5秒後に記憶する】

        if(sw_flag & 0x04)
            {
            if((seconds - temp_time) == 5)
                {
                save_defaults();

//             beep(TONE_C, cal.calval.beep_len);           // for debug
                sw_flag &= 0xFB;
                }
            }


改造中にコードを読むことでだいたいの処理の流れがおぼろげながら見えてきたところです。今後は必要な処理を考える上で、オリジナルプログラムでのEEPROM書き込み読み込み、タイマー処理(内部にフリーの秒カウンタがあるので活用するなど)の仕方を読み取っていこうと思います。

メッセージメモリ読み書き部分はKeyer Mini-V2のコード流用が出来そうです。


MAX制限のメニュー

0 件のコメント:

コメントを投稿