以前、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円で入手できますので、非常に安価にエレキーを製作することができます。