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

お問い合わせメールフォームが開きます。
2013年09月03日
PIC10F222(米粒マイコン)でエレキー
マイクロチップ社のPIC10F222でエレキーを作ってみました。
これは、ROMサイズ:512ワード、RAMサイズ:23バイト、外形寸法:3mmX3mm の極小マイコンです。
参考: http://akizukidenshi.com/catalog/g/gI-01980/

基板の中ほどに黒い米粒大のマイコンが乗っています。
右の青い部品は速度調整用の半固定ボリュームです。


サイズが小さいので電鍵の下に両面テープで貼り付けて使用することも可能です。
基板の他にボタン電池ホルダーと圧電ブザーも両面テープで貼り付けてあります。
【回路図】

マイコン内部のプルアップ抵抗を使用するため、基板上はマイコンと電源のコンデンサのみです。
基板外に電池とブザーを付けました。
Dot、Dash端子、およびGND端子を電鍵に接続します。
【注意点】
ポートのI/O設定(TRIS)は、HI-Tech-C(Ver9.81)が未対応らしく、下記のようにインラインアセンブラで記述してあります。
スタックのネスティングは2です。その範囲で関数コールを収めます。
乗算記述はROMを大量消費します。 下記の例では42バイトほど節約になります。
タイマ割込がないのでメインループでタイマレジスタを監視して約1msec毎に処理を行うようにしました。
スリープ命令(SLEEP)を使用することで待機電流が0.7μA程度になりました。今回使用のCR2032ボタン電池は210mAhほどですので単純計算で待機可能時間は30年以上になります。
スリープ状態からの復帰はDotまたはDashキー入力です。予めOption命令で設定しておきます。
キーOn時の消費電流は320μA程度ですので計算上連続動作1ヶ月ほど可能です。
消費電流を抑えるためボリュームの電源はブザーと共用しました。(ブザーOn時にA/D変換可)
出力はブザー用に約500Hzのパルスを出します。通常のエレキー出力として使用する場合はプログラム変更が必要です。
Pickit3での書込には供給電圧4V程度必要のようです。そうでないと今回のプログラムの場合だと下記のエラーが出ました。
【動作の様子・YouTube】
【Configration Bits】
MPLAB IDEのメニュで下記のようにConfigurationBitsを設定します。

【ソースコード】
【ROM/RAMサイズ】

基本機能を全て組み込んで512ワードに収まりました。
新たに全部品を一体にした基板を製作しました。
下記URLをご覧ください。
http://micom.hamazo.tv/e5025906.html


これは、ROMサイズ:512ワード、RAMサイズ:23バイト、外形寸法:3mmX3mm の極小マイコンです。
参考: http://akizukidenshi.com/catalog/g/gI-01980/
基板の中ほどに黒い米粒大のマイコンが乗っています。
右の青い部品は速度調整用の半固定ボリュームです。
サイズが小さいので電鍵の下に両面テープで貼り付けて使用することも可能です。
基板の他にボタン電池ホルダーと圧電ブザーも両面テープで貼り付けてあります。
【回路図】

マイコン内部のプルアップ抵抗を使用するため、基板上はマイコンと電源のコンデンサのみです。
基板外に電池とブザーを付けました。
Dot、Dash端子、およびGND端子を電鍵に接続します。
【注意点】

asm("movlw 0x0B"); // GP2のみOutputs
asm("TRIS 6");


//ParaTime = (ADCData * 3); 下記に置換え
ParaTime = ADCData;
ParaTime <<= 1;
ParaTime += ADCData;







The following memory regions failed to program correctly:
Program Memory
Address: 00000000 Expected Value: 00000025 Received Value: 00000000
Programming failed
【動作の様子・YouTube】
【Configration Bits】
MPLAB IDEのメニュで下記のようにConfigurationBitsを設定します。

【ソースコード】
#include <htc.h>
//----------------------------------------------------------------------------
// マクロ定義
//----------------------------------------------------------------------------
// ブザー出力状態を設定
#define OUTPUT_ON() (FlgBuzz = 1)
#define OUTPUT_OFF() (FlgBuzz = 0)
// ブザー出力ポートOn/Off
#define BUZZ_ON() (GP2 = 1)
#define BUZZ_OFF() (GP2 = 0)
// Dotポートチェック(負論理)
#define ChkDotPort() (GP3 == 0)
// Dashポートチェック(負論理)
#define ChkDashPort() (GP1 == 0)
// A/D電源ポートOn/Off
#define AD_PWR_ON() (GP2 = 1)
#define AD_PWR_OFF() (GP2 = 0)
//----------------------------------------------------------------------------
// 定数定義
//----------------------------------------------------------------------------
typedef enum
{
PARA_ALL_OFF = 0x00,
PARA_DOT_ON,
PARA_DOT_OFF,
PARA_DASH_ON,
PARA_DASH_OFF
} PARA; // Dot/Dash状態遷移
#define LIMIT_VALUE (0x03) // チャタリングフィルタ用
#define MAX_SPEED (20) // 最大速度
#define MIN_SPEED (255) // 最小速度
//----------------------------------------------------------------------------
// ユーザメモリと初期化
//----------------------------------------------------------------------------
unsigned int ParaTime = 0x0000;
unsigned int ADCData= MIN_SPEED;
unsigned char ParaCode = PARA_ALL_OFF;
unsigned char CntDotOn = 0x00;
unsigned char CntDashOn = 0x00;
unsigned char FlgBuzz = 0;
//----------------------------------------------------------------------------
// システムレジスタ初期化
//----------------------------------------------------------------------------
void Init(void)
{ // 内部発振 ConfigBitで4MHz設定
OPTION = 0b00000011; // WakeUp PullUp許可、TimerOSC:1MHz
//TRISGPIO = 0x0B; // この命令はコンパイルエラー・下記に書換え
asm("movlw 0x0B"); // GP2のみOutputs
asm("TRIS 6");
ADCON0 = 0x40; // AN0:Analog Input
}
//----------------------------------------------------------------------------
// ボリューム電圧値
//----------------------------------------------------------------------------
void GetVolume(void)
{
AD_PWR_ON();
NOP();
NOP();
ADON = 1; // A/D On
GO_nDONE = 1; // 開始
while(GO_nDONE == 1); // 変換終了待ち
ADCData = (unsigned int)ADRES;
ADCData += MAX_SPEED;
ADON = 0; // A/D Off
}
//----------------------------------------------------------------------------
// ブザーポートOn/Off
//----------------------------------------------------------------------------
void SetBuzzer(void)
{
static char cyc = 0;
if(FlgBuzz)
{
cyc = !cyc;
if(cyc) BUZZ_ON();
else BUZZ_OFF();
}
else
BUZZ_OFF();
}
//----------------------------------------------------------------------------
// パラメータセット: Dash
//----------------------------------------------------------------------------
char SetParaDash(void)
{
if(CntDashOn >= LIMIT_VALUE)
{
GetVolume(); // ボリューム電圧値
CntDashOn = 0;
ParaCode = PARA_DASH_ON;
//ParaTime = (ADCData * 3); // 下記の計算にすると大幅ROM削減
ParaTime = ADCData;
ParaTime <<= 1;
ParaTime += ADCData;
return 1;
}
return 0;
}
//----------------------------------------------------------------------------
// パラメータセット: Dot
//----------------------------------------------------------------------------
char SetParaDot(void)
{
if(CntDotOn >= LIMIT_VALUE)
{
GetVolume(); // ボリューム電圧値
CntDotOn = 0;
ParaCode = PARA_DOT_ON;
ParaTime = ADCData;
return 1;
}
return 0;
}
//----------------------------------------------------------------------------
// 入力ポートチャタリング処理
//----------------------------------------------------------------------------
void ChkInputPort( void )
{
// for Dot
if(ParaCode != PARA_DOT_ON)
{
if(ParaCode == PARA_DOT_OFF && ParaTime >= (ADCData >>3))
CntDotOn = 0;
else if(ParaCode == PARA_DASH_ON && ParaTime >= ADCData)
CntDotOn = 0;
else if(CntDotOn < LIMIT_VALUE)
{
if(ChkDotPort() )
CntDotOn ++;
else
CntDotOn = 0;
}
}
// for Dash
if(ParaCode != PARA_DASH_ON )
{
if(ParaCode == PARA_DASH_OFF && ParaTime >= ADCData>>3)
CntDashOn = 0;
else if(ParaCode == PARA_DOT_ON && ParaTime >= (ADCData >>1))
CntDashOn = 0;
else if(CntDashOn < LIMIT_VALUE)
{
if( ChkDashPort() )
CntDashOn ++;
else
CntDashOn = 0;
}
}
}
//----------------------------------------------------------------------------
// 出力ポート設定
//----------------------------------------------------------------------------
void SetOutput(void)
{
if((ParaCode == PARA_DASH_ON) || (ParaCode == PARA_DOT_ON))
OUTPUT_ON();
else
OUTPUT_OFF();
}
//----------------------------------------------------------------------------
// メイン関数
//----------------------------------------------------------------------------
main()
{
Init(); // システムレジスタ初期化
while( 1 )
{
if( TMR0 > 52 ) // 1msec周期で処理
{
TMR0 = 0x00; // タイマレジスタクリア
ChkInputPort(); // 入力ポートチャタリング処理
if(ParaTime > 0)
{
ParaTime --;
if(ParaTime == 0)
{
switch(ParaCode) // Dot/Dash状態遷移処理
{
case PARA_DOT_ON:
ParaCode = PARA_DOT_OFF;
ParaTime = ADCData;
break;
case PARA_DASH_ON:
ParaCode = PARA_DASH_OFF;
ParaTime = ADCData;
break;
case PARA_DOT_OFF:
if(!SetParaDash()) // スクイズのためDashを見る
ParaCode = PARA_ALL_OFF;
break;
case PARA_DASH_OFF:
if(!SetParaDot()) // スクイズのためDotを見る
ParaCode = PARA_ALL_OFF;
}
}
}
if(ParaCode == PARA_ALL_OFF)
{
if(!SetParaDot())
{
if(!SetParaDash())
{
if(CntDotOn == 0 && CntDashOn == 0)
{
SLEEP(); // 全てOffしたらスリープ
}
}
}
}
SetOutput(); // 出力ポート設定
SetBuzzer(); // ブザー処理
}
}
}
【ROM/RAMサイズ】

基本機能を全て組み込んで512ワードに収まりました。
新たに全部品を一体にした基板を製作しました。
下記URLをご覧ください。
http://micom.hamazo.tv/e5025906.html