2009年12月20日

PIC12F629 & Hi-Tech-C でエレキー

PIC12F629 & Hi-Tech-C でエレキー

今回は小規模PICも MPLAB IDE上でコンパイルできる
無料の「HI-TECH C Compiler for PIC10/12/16 MCUs」を使って
以前「SDCC環境」で作成したソースを修正してみました。

 以前の記事: 「PIC12F629でエレキー」

違う点はわずかです。

1: #include を変更

2: __CONFIG を変更

3: OPTION = ・・・ を変更

PIC12F629 & Hi-Tech-C でエレキー

PIC12F629 & Hi-Tech-C でエレキー



//------------------------------------------------------------------------------------------------------
//
// Simple Elekey Program
//
// DESCRIPTION:
// Hardware: Microchip PIC 12F629
// C-Compoler: HI-TECH C PRO for the PIC10/12/16 MCU family (Lite)
// Editer: M.Utsunomiya
// Date: 2009/12/20
//
//------------------------------------------------------------------------------------------------------

//----I/O DESCRIPTION ------------------------------------------------
// 実機レイアウト・配線
// LED出力 → GP5(負論理)
// Buzzer出力 → GP4(Trバッファ)
// Dot入力 → GP0(内部プルアップ抵抗)
// Dash入力 → GP2(内部プルアップ抵抗)
// 速度調整 → GP1(コンパレータ入力)
//--------------------------------------------------------------------

#include "htc.h"

//----------------------------------------------------------------------------
// Define Code Parameter
//----------------------------------------------------------------------------
#define PARA_ALL_OFF 0x00
#define PARA_DOT_ON 0x01
#define PARA_DOT_OFF 0x02
#define PARA_DASH_ON 0x03
#define PARA_DASH_OFF 0x04

#define LIMIT_VALUE 0x03 // チャタリングフィルタ用

#define MAX_SPEED 5
#define MIN_SPEED 15

//----------------------------------------------------------------------------
// Define User Memory
//----------------------------------------------------------------------------
unsigned int ParaTime;
unsigned int ADCData;

unsigned char ParaCode;
unsigned char CntDotOn;
unsigned char CntDashOn;

unsigned char CntComp;

//--------------------------------------------------------------------
// Configuration Bits (pic12f629.h 内で定義)
//--------------------------------------------------------------------
// _CPD_ON / _CPD_OFF : Data Code Protection
// _CP_ON / _CP_OFF : Code Protection
// _BODEN_ON / _BODEN_OFF : Brown-out(低電圧) Detect Enable
// _MCLRE_ON / _MCLRE_OFF : GP3/MCLR pin function select
// _PWRTE_OFF / _PWRTE_ON : Power-up Timer Enable
// _WDT_ON / _WDT_OFF : WatchDogタイマ設定
// _LP_OSC / _XT_OSC / _HS_OSC / _EC_OSC : 200kHz以下外部/4MHz以下外部/4MHz以上外部/内部RC
// _INTRC_OSC_NOCLKOUT / _INTRC_OSC_CLKOUT : INTOSC oscillator: CLKOUT function
// _EXTRC_OSC_NOCLKOUT / _EXTRC_OSC_CLKOUT : EC: I/O function
//--------------------------------------------------------------------
// Configuration Bits (MPASM --> Hi-Tech C)
//--------------------------------------------------------------------
// _CPD_ON CPD
// _CPD_OFF UNPROTECT
// _CP_ON PROTECT
// _CP_OFF UNPROTECT
// _BODEN_ON BOREN
// _BODEN_OFF BORDIS
// _MCLRE_ON MCLREN
// _MCLRE_OFF MCLRDIS
// _PWRTE_OFF PWRTDIS
// _PWRTE_ON PWRTEN
// _WDT_ON WDTEN
// _WDT_OFF WDTDIS
// _LP_OSC LP
// _XT_OSC XT
// _HS_OSC HS
// _EC_OSC EC
// _INTRC_OSC_NOCLKOUT INTIO
// _INTRC_OSC_CLKOUT INTCLK
// _EXTRC_OSC_NOCLKOUT RCIO
// _EXTRC_OSC_CLKOUT RCCLK
//--------------------------------------------------------------------

//int at 0x2007 __config = _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT;
__CONFIG(UNPROTECT & BORDIS & MCLRDIS & PWRTEN & WDTDIS & INTIO);

//----------------------------------------------------------------------------
// 初期化
//----------------------------------------------------------------------------
void Init() {
CMCON = 0x04; // コンパレータ使用
VRCON = 0xA0; // powered on / Low range

TRISIO = 0x0F; // GP0~3:Input ,GP4~5:Output
WPU = 0x0D; // GP0/2/3 キー入力端子はプルアップ抵抗
GPIO = 0x00;

OPTION = 0x03; // プルアップ許可、プリスケーラ:TMR0/16(0.256*16msec)
TMR0 = 0x00;
T0IE = 1; // TMR0割り込み許可
}

//----------------------------------------------------------------------------
// ボリューム電圧値(コンパレータ使用)
//----------------------------------------------------------------------------
// bit 7 VREN: CVREF Enable bit
// 1 = CVREF circuit powered on
// 0 = CVREF circuit powered down, no IDD drain
// bit 6 Unimplemented: Read as '0'
// bit 5 VRR: CVREF Range Selection bit
// 1 = Low range
// 0 = High range
// bit 4 Unimplemented: Read as '0'
// bit 3-0 VR3:VR0: CVREF value selection 0 d" VR [3:0] d" 15
// When VRR = 1: CVREF = (VR3:VR0 / 24) * VDD
// When VRR = 0: CVREF = VDD/4 + (VR3:VR0 / 32) * VDD
// Settling Time 10μs(MAX)
//----------------------------------------------------------------------------
void volume() {
if ((CMCON & 0x40) == 0x00) {
ADCData = CntComp;
ADCData += MAX_SPEED;
CntComp = 0x0F;
}
else {
CntComp --;
if (CntComp == 0xFF) CntComp = 0x0F; // 0V~3.3V
}
VRCON &= ~0x0F;
VRCON |= CntComp;
}

//----------------------------------------------------------------------------
// LEDを点灯する処理
//----------------------------------------------------------------------------
void LED_ON() {
GPIO &= ~0x20;
}

//----------------------------------------------------------------------------
// LEDを消灯する処理
//----------------------------------------------------------------------------
void LED_OFF() {
GPIO |= 0x20;
}

//----------------------------------------------------------------------------
// Buzzer On する処理
//----------------------------------------------------------------------------
void BUZZER_ON() {
GPIO |= 0x10;
}

//----------------------------------------------------------------------------
// Buzzer Off する処理
//----------------------------------------------------------------------------
void BUZZER_OFF() {
GPIO &= ~0x10;
}

//----------------------------------------------------------------------------
// Dotポートチェック
//----------------------------------------------------------------------------
char ChkDotPort() {
if ((GPIO & 0x01) == 0) return 1;
return 0;
}

//----------------------------------------------------------------------------
// Dashポートチェック
//----------------------------------------------------------------------------
char ChkDashPort() {
if ((GPIO & 0x04) == 0) return 1;
return 0;
}

//----------------------------------------------------------------------------
// Set Output port
//----------------------------------------------------------------------------
void SetOutput()
{
if ((ParaCode == PARA_DASH_ON) || (ParaCode == PARA_DOT_ON)) {
LED_ON();
BUZZER_ON();
}
else {
LED_OFF();
BUZZER_OFF();
}
}

//----------------------------------------------------------------------------
// Check Input port
//----------------------------------------------------------------------------
void ChkInputPort()
{
// for Dot
if (ParaCode != PARA_DOT_ON) {
if (CntDotOn < LIMIT_VALUE) {
if (ChkDotPort()) // Dotポートチェック
CntDotOn ++;
else
CntDotOn = 0;
}
}

// for Dash
if (ParaCode != PARA_DASH_ON) {
if (CntDashOn < LIMIT_VALUE) {
if (ChkDashPort()) // Dashポートチェック
CntDashOn ++;
else
CntDashOn = 0;
}
}
}

//----------------------------------------------------------------------------
// Set Parameter Dash
//----------------------------------------------------------------------------
char SetParaDash()
{
if (CntDashOn >= LIMIT_VALUE) {
CntDashOn = 0;
ParaCode = PARA_DASH_ON;
ParaTime = (ADCData * 3);
return 1;
}
return 0;
}

//----------------------------------------------------------------------------
// Set Parameter Dot
//----------------------------------------------------------------------------
char SetParaDot()
{
if (CntDotOn >= LIMIT_VALUE) {
CntDotOn = 0;
ParaCode = PARA_DOT_ON;
ParaTime = ADCData;
return 1;
}
return 0;
}


//----------------------------------------------------------------------------
// キー処理メイン関数
//----------------------------------------------------------------------------
void key_sequence(void)
{
volume();

if (ParaTime != 0) {
ParaTime --;
if (ParaTime == 0) {
if (ParaCode == PARA_DOT_ON) {
ParaCode = PARA_DOT_OFF;
ParaTime = ADCData;
}
else if (ParaCode == PARA_DASH_ON) {
ParaCode = PARA_DASH_OFF;
ParaTime = ADCData;
}
else if (ParaCode == PARA_DOT_OFF) {
if (!SetParaDash())
ParaCode = PARA_ALL_OFF;
}
else if (ParaCode == PARA_DASH_OFF) {
if (!SetParaDot())
ParaCode = PARA_ALL_OFF;
}
else {
ParaCode = PARA_ALL_OFF;
}
SetOutput();
}
}

ChkInputPort();
if (ParaCode == PARA_ALL_OFF) {
if (!SetParaDot())
SetParaDash();
}
SetOutput();
}


//----------------------------------------------------------------------------
// 割り込み(タイマ割り込みのみ使用)
//----------------------------------------------------------------------------
static void Inntrpt(void) interrupt 0
{
if (T0IF) { // TMR0割り込み?
T0IF = 0; // 割り込みフラグクリア

key_sequence(); // キー処理メイン関数
}
}


//----------------------------------------------------------------------------
// Main関数
//----------------------------------------------------------------------------
main()
{
Init(); // システムレジスタ初期化

// ユーザメモリの初期化
CntDashOn = 0;
CntDotOn = 0;
ADCData = MIN_SPEED;
ParaTime = 0;
ParaCode = PARA_ALL_OFF;
LED_OFF();
BUZZER_OFF();

GIE = 1; // 全割り込み許可

while (1) {
;
}
}




スクイズ機能で不用意にキーがメモリされてしまい、速度を上げると余計な符号が出る不具合があります。


タグ :12F629Hi-Tech-C

同じカテゴリー(マイコン開発)の記事
Fusion PCBでエレキー
Fusion PCBでエレキー(2020-04-01 19:00)


上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。

削除
PIC12F629 & Hi-Tech-C でエレキー
    コメント(0)