メニュー
▼ アクセス(地図)
▼ Windowsアプリ開発 ▼ マイコン開発 ▼ CGI・PHP制作 |
▼ サイトマップ(全投稿記事)
▼ タイトル(画像一覧) ▼ 事業内容 |

お問い合わせメールフォームが開きます。
2013年02月17日
PIC12F1822でエレキー
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)します。
【主要なソースコード】
・ポート初期化(割り込み設定)
・スリープモード移行
サンプルは下記URLよりダウンロードできます。
http://hmmk.co.jp/sample/12F1822_Elekey.zip
追加機能あり・12F1822・エレキー(送信モニタ版)もご覧ください。
http://micom.hamazo.tv/e4271414.html
不明点やご質問はお気軽に、コメント欄、またはお問合せフォームにてご連絡ください。
エレキープロジェクト第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
不明点やご質問はお気軽に、コメント欄、またはお問合せフォームにてご連絡ください。