PIC12F1822でエレキー

宇都宮

2013年02月17日 22:56

Microchip社の8Pinマイコン・PIC12F1822でエレキー(アマチュア無線用)を作ってみました。
エレキープロジェクト第14ステージです。

PIC12F1822は秋月電子さんにて80円で販売されているA/DコンバータやEEPROM内臓の高性能小型マイコンです。
 http://akizukidenshi.com/catalog/g/gI-04557/


【回路】



【ソフトウエア】
ソフトウエア機能としては下記を使用しています。
 ・Sleep機能
 ・A/D変換(開始時に供給電源Onとする)
 ・タイマ(0)割り込み
 ・ポートの入出力/内臓プルアップ機能
 ・ポートのエッジ割り込み機能(Wakeup用)
 ・ブザーはタイマ割り込み1msecでポートを反転


【今回の特徴】
今回は下記の内容を重点的に検討しました。
 ・スクイズ機能で不用意にキーがメモリされてしまい
  速度を上げると余計な符号が出ていた不具合を修正
  (以前公開しているソースコードも同様の不具合があります。)
 ・マイコンのスリープ機能を利用して電源スイッチを削除できるようにしました。
 ・速度調整ボリュームの電源とA/Dの電源を省電力化しました。



【スリープ機能】
 ・符号を出し終わり、かつキー入力がない場合に
  「Sleep」命令でスリープモードに入れ省電力とします。
 ・キー入力を立下りエッジ検出して、スリープモードからWakeupします。
 ・ポートRA2、RA3の立下りエッジ割り込みを許可します。
   IOCIE = 1;
   IOCAN2 = 1;
   IOCAN3 = 1;
 ・割り込み処理では「IOCIF」フラグをチェックし
  その後は、「IOCIF」フラグでなく下記の2つのフラグをクリアします。
   IOCAF2 = 0;
   IOCAF3 = 0;
 ・キー入力のチャタリングがあるため、上記割り込みでWakeupしても
  すぐにスリープに戻る場合があるため、20msec程度のウエイト時間を設けます。
 ・スリープ時の消費電流は電源電圧5Vにて23.4μA(実測)


【タイミングチャート】
符号の”A” (・-) を出力した場合の実測タイミングです。

波形は上から
 [1] Dotキー入力 (Low:キーOn チャタリングあり)
 [2] Dashキー入力 (Low:キーOn チャタリングあり)
 [3] ブザー出力 (500Hz方形波)
 [4] 速度調整A/D電源On (10msec周期に電源On)
 [5] パワーOn (Low:スリープ状態)


・Dotキー[1] 入力でパワーOn[5]します。
・Dotキー[1]のチャタリング処理後にブザー出力[3]が出始めます。
・速度調整A/D取得処理[4]はパワーOn中に10msec間隔で行います。
・Dash信号を出し終わり、Dot1つ分の時間+約20msec後にパワーOff(Sleep)します。


【主要なソースコード】

・ポート初期化(割り込み設定)
void init_port(void)
{
WPUA   = 0b00001100; // Pullup
TRISA  = 0b00001101; // 1:入力、0:出力設定
ANSELA = 0b00000001; // A/D AN0のみ
PORTA  = 0b00100000;

OPTION_REG &= 0b01111111;// Pullup許可
CLKOUT = 1; // CLKOUT function is disabled
IOCIE = 1; // Interrupt-on-Change Enable
IOCAN3 = 1; // RA3 NEGATIVE EDGE REGISTER
IOCAN2 = 1; // RA2 NEGATIVE EDGE REGISTER
}



・スリープモード移行
void Elekey_chk_sleep( void )
{
static unsigned char TimerSleep = 20;

if( ParaCode == PARA_ALL_OFF )
{
if( !ChkDotPort() && !ChkDashPort() )
{
if( TimerSleep == 0 )
{
asm("sleep");
asm("nop");
TimerSleep = 20;
}
else
{
TimerSleep --;
}
}
}
}


・A/D変換時の電源切換え
unsigned int read_a2d( void )
{
unsigned int tmpData;

PortAdPwr = PORT_HIGH;
ADON = 1; // A/D On
GODONE = 1; // initiate conversion
while(GODONE)
{
continue;
}
tmpData = ADRESL;
tmpData |= (ADRESH<<8)&0x0300;
ADON = 0; // A/D Off
PortAdPwr = PORT_LOW;
return(tmpData); // return 10bit result
}



サンプルは下記URLよりダウンロードできます。
 http://hmmk.co.jp/sample/12F1822_Elekey.zip

追加機能あり・12F1822・エレキー(送信モニタ版)もご覧ください。
 http://micom.hamazo.tv/e4271414.html

不明点やご質問はお気軽に、コメント欄、またはお問合せフォームにてご連絡ください。




関連記事