JH7UBCブログ

アマチュア無線 電子工作 家庭菜園など趣味のブログです

PIC12F1822 MCC エレキー

2022-04-08 22:07:27 | MPLAB X MCC
 以前、Raspberry Pi Picoでエレキーを作ってみました。今回、そのアルゴリズムを使って、MPLAB X + XC8 + MCC環境で、PIC12F1822でエレキーを作ってみます。

 回路図です。電源は、乾電池2本で3Vとします。パドル(dot Keyとdash Key)は、RA3,RA4に接続します。(デジタル入力でPIC内でPULL UPしておきます)速度調整用の電圧入力は、アナログ入力ポートAN0(RA0)にVRから与えます。送信インジケータ用のLEDと送信機用の出力(2SC1815オープンコレクタ出力)は、RA1に接続します。SIDE TONE用のPWM出力(700Hz)は、RA5に出力し、スピーカーを直接接続しています。


 プロジェクトを作成し、MCCを立ち上げます。
 System Moduleは、INTOSC,FOSC,4MHz
 LVPのチェックを外し、全てのPinを使えるようにします。

 TMR1.TMR2,ECCP,ADCの各モジュールを導入します。
 Pin Moduleの設定をします。
 RA3,RA4は、入力にし、WPUにチェックを入れます。更にResiatersタグを開き、nWPUENをenabledに設定します。
 他のPinは、下のように設定し、RA3は今回は使用しません。


 Interrupt Moduleの設定です。Timer1で、Timer割込みをかけますので、TMR1のEnabledにチェックを入れます。

 TMR1 Moduleの設定です。Prescalerを1:1にし、Timer Periodを1msに設定します。Enable Timer Interruptにチェックが入っていますので、1msごとにTimer割込みがかかります。


 TMR2とECCP moduleは、PWMのための設定です。
 TMR2 Moduleで、Prescalerを1:16、Timer Periodを1.42msに設定するとPWM Frequencyは、702.25Hzになります。(これは、好みの周波数に設定してください。例800Hz)
  ECCP Moduleを見ると、PWM Duty Cycle 50%の時、CCPR Value=177になっています。この値は、プログラムの中で利用します。
 PWM(P1S)は、RA5に出力します。



 ADC Moduleの設定です。
 Result Alignmentをright(右揃え)に設定します。

 プログラムです。
 Raspberry Pi Picoの記事のプログラムをPICに移植しました。アルゴリズムは同じです。
 PWM信号を出したり、止めたりするには、EPWM_LoadDutyValue()関数を使い、EPWM_LoadDutyValue(177);で、Duty Cycle 50%のPWM信号が出て、
EPWM_LoadDutyValue(0);でPWM信号が止まります。
---------------------------------------------------------------------
/*
 * PIC16F1822 MCC Elekey
 * 2022.4.8
 * JH7UBC Keiji Hata 
*/

#include "mcc_generated_files/mcc.h"

//各Pinの定義
#define TX LATA1
#define dot_Key RA3 
#define dash_Key RA4

//各変数の設定
bool dot_flag = 0;
bool dash_flag = 0;
bool gate_flag = 0;
uint8_t mode = 0;
volatile uint16_t count = 0;
uint16_t dot_time = 100;
uint16_t dash_time = 300;
uint16_t space_time = 100;

//割込みサービスルーチン
void ISR()
{
     if (gate_flag == 1){//gsteが開いていれば、カウントアップ
         count++;
    }
     if (mode == 1 & dash_Key == 0)//dot送出中にdashキーが押されればdash_flagを立てる
         dash_flag = 1;
     if (mode == 2 & dot_Key ==0)//dash送信中にdotキーが押されればdash_flagを立てる
         dot_flag = 1;
}

//dotとspaceを送出する
void dot_out()
{
    count = 0;
    mode = 1;
    gate_flag =1;
    TX = 1;
    EPWM_LoadDutyValue(177);
    while(count <= dot_time);
    count = 0;
    TX = 0;
    EPWM_LoadDutyValue(0);
    while(count <= space_time);
    gate_flag = 0;
    mode = 0;
}

//dashとspaceを送出する
void dash_out()
{
    count = 0;
    mode = 2;
    gate_flag =1;
    TX = 1;
    EPWM_LoadDutyValue(177);
    while(count <= dash_time);
    count = 0;
    TX = 0;
    EPWM_LoadDutyValue(0);
    while(count <= space_time);
    gate_flag = 0;
    mode = 0;
}

void main(void)
{
     // initialize the device
     SYSTEM_Initialize();

     // Enable the Global Interrupts
     INTERRUPT_GlobalInterruptEnable();

     // Enable the Peripheral Interrupts
     INTERRUPT_PeripheralInterruptEnable();

     TMR1_SetInterruptHandler(ISR);//TMR1 Timer割込みハンドラー
     EPWM_LoadDutyValue(0);

     while (1)
    {
         dot_time = ADC_GetConversion(0) >> 2;//AN0
         if (dot_time < 40)
             dot_time = 40;
         if (dot_time > 200)
             dot_time = 200;
         dash_time = (dot_time << 1) + dot_time;//dash_time=dot_time * 3
         space_time = dot_time;
         if (dot_Key == 0 | dot_flag ==1)
         {
             dot_out();
             dot_flag = 0;
         }
         if (dash_Key == 0 | dash_flag ==1)
         {
             dash_out();
             dash_flag = 0;
         }
    }
}
---------------------------------------------------------------------
 ブレッドボードです。


 実際にモールス符号を打ってテストをしています。

 Raspberry Pi Pico でPinにスピーカーを直付けしたので、PICでも、PWM信号出力RA5を直接スピーカーに接続してみました。ちょっと心配したのですが、ちょうど良い音量で聞こえます。

 エレキーの打ち心地は、たいへんFBです。プログラムが簡単ですので、各局の好みに合わせて、カスタマイズすることも可能でしょう。

 PIC12F1822は、秋月電子で140円で入手できますので、非常に安価にエレキーを製作することができます。