マイコン関連 |
戻る |
// ===========================================================================
// PIC : 12F629
// IDE : MPLAB IDE v8.63
// C Compiler: HI-TECH C Lite
// PROGRAM : WR250R 車速パルス間引きプログラム
// ===========================================================================
#define _LEGACY_HEADERS
#define _XTAL_FREQ 4000000 //内蔵オシロ 4MHz
#include <pic.h>
__CONFIG(INTIO & WDTDIS & PWRTEN & MCLRDIS & BOREN & UNPROTECT);
/*****************************************************************************
* define定義
*****************************************************************************/
#define _PULSE_INPUT_ON_ (GPIO & 0x20) // GP5がHigh-LEVEL
#define _PULSE_INPUT_OFF_ (!(GPIO & 0x20)) // GP5がLow-LEVEL
/*****************************************************************************
* ノイズ対策関数 パルス入力の程度による
*****************************************************************************/
void NoiseDelay(void)
{
__delay_us(500);
}
/*****************************************************************************
* メイン関数
*****************************************************************************/
void main(void)
{
// ----------------------------------------------------------------------
// 内部変数定義
// ----------------------------------------------------------------------
unsigned char iCnt = 0; // 出力カウンタ
const unsigned char iMax = 10; // 間引きカウント
const unsigned char iMid = 5; // 中間(反転の判断)
CMCON = 0b00000111;
// ----------------------------------------------------------------------
// 【GPIO入出力】
// bit5-0: TRISIO5-0 TRISIO<3>は常に入力(1)
// bit1(=GP1=6ピン)を車速パルスの出力として使用する。
// bit2(=GP2=5ピン)をパルス出力の確認用として出力する。
// bit4(=GP4=3ピン)をパルス入力の確認用として出力する。
// bit5(=GP5=2ピン)を車速パルスの入力として使用する。
// ----------------------------------------------------------------------
TRISIO = 0b00101000;
// ----------------------------------------------------------------------
// 【GPIOポート】
// bit5-0: GPIO I/Oピン
// ----------------------------------------------------------------------
GPIO = 0x00;
// ----------------------------------------------------------------------
// 電源ON確認3秒 GP4 : ON->OFF
// ----------------------------------------------------------------------
GPIO |= 0x10;
__delay_ms(2000);
GPIO &= 0xEF;
__delay_ms(1000);
while(1)
{
// 入力:プルアップでLow-LEVELの場合
// (つまり、センサー側はHigh-LEVELになっている)
if ( _PULSE_INPUT_OFF_ )
{
// 入力の確認用として、GP4=ON
GPIO |= 0x10;
// ノイズ対策
NoiseDelay();
if ( _PULSE_INPUT_ON_ )
continue;
// 出力High-LEVELカウント
iCnt++;
// パルス出力High-LEVEL (GP2,GP1)
// 途中で反転させる
GPIO = ( iCnt < iMid ) ? (GPIO | 0x06) : (GPIO & 0xF9);
// 間引きカウントMAXでリセット
if ( iCnt >= iMax )
iCnt = 0;
// 入力がHigh-LEVELになるのを待つ
while ( _PULSE_INPUT_OFF_ )
{
asm("nop");
}
}
else
{
// 入力の確認用として、GP4=OFF
GPIO &= 0xEF;
// ノイズ対策
NoiseDelay();
if ( _PULSE_INPUT_OFF_ )
continue;
// パルス出力Low-LEVEL (GP2,GP1)
// 途中で反転させる
GPIO = ( iCnt < iMid ) ? (GPIO & 0xF9) : (GPIO | 0x06);
// 入力がLow-LEVELになるのを待つ
while ( _PULSE_INPUT_ON_ )
{
asm("nop");
}
}
}
}
2011.6.4(土)
YAMAHA WR250R ノーマル フロントスプロケット:13T、リアスプロケット:43TFRONT(T) | REAR(T) | CHAIN(L) | 減速比 | スピード(%) | |
---|---|---|---|---|---|
12 | 42 | 3.50 | 0.94 | ||
12 | 43 | 3.58 | 0.92 | ||
12 | 44 | 3.67 | 0.9 | 1割引で釣り合う歯数 | |
12 | 45 | 3.75 | 0.88 | ||
12 | 46 | 3.83 | 0.86 | ||
12 | 47 | 3.92 | 0.84 | ||
12 | 48 | 4.00 | 0.82 | ||
12 | 49 | 4.08 | 0.81 | ||
12 | 50 | 4.17 | 0.79 | ||
12 | 51 | 4.25 | 0.77 | ||
12 | 52 | 4.33 | 0.76 | ||
13 | 42 | 3.23 | 1.02 | ||
13 | 43 | 108L | 3.31 | 1 | ノーマル |
13 | 44 | 3.38 | 0.97 | ||
13 | 45 | 3.46 | 0.95 | ||
13 | 46 | 3.54 | 0.93 | ||
13 | 47 | 3.62 | 0.91 | ||
13 | 48 | 3.69 | 0.89 | 1割引で釣り合う歯数 | |
13 | 49 | 3.77 | 0.87 | ||
13 | 50 | 3.85 | 0.86 | よくあるローギヤ | |
13 | 51 | 3.92 | 0.84 | ||
13 | 52 | 4.00 | 0.82 | ||
14 | 42 | 3.00 | 1.1 | ||
14 | 43 | 3.07 | 1.07 | ||
14 | 44 | 3.14 | 1.05 | ||
14 | 45 | 3.21 | 1.02 | ||
14 | 46 | 3.29 | 1 | ||
14 | 47 | 3.36 | 0.98 | ||
14 | 48 | 3.43 | 0.96 | ||
14 | 49 | 3.50 | 0.94 | ||
14 | 50 | 3.57 | 0.92 | ||
14 | 51 | 3.64 | 0.9 | ||
14 | 52 | 3.71 | 0.89 |
2011.6.4(土),2012.6.9(土)
■作成したプログラムVer.2
// ===========================================================================
// PIC : 12F629
// IDE : MPLAB IDE v8.63
// C Compiler: HI-TECH C Lite
// PROGRAM : WR250R 車速パルス間引きプログラム Ver.2
// ===========================================================================
#define _LEGACY_HEADERS
#define _XTAL_FREQ 4000000 //内蔵オシロ 4MHz
#include
__CONFIG(INTIO & WDTDIS & PWRTEN & MCLRDIS & BOREN & UNPROTECT);
/*****************************************************************************
* define定義
*****************************************************************************/
#define _PULSE_INPUT_ON_ (GPIO & 0x20) // GP5がHigh-LEVEL
#define _PULSE_INPUT_OFF_ (!(GPIO & 0x20)) // GP5がLow-LEVEL
void OutPulse(void);
/*****************************************************************************
* 外部変数定義
*****************************************************************************/
const unsigned short iInMax = 500; // 入力MAX
unsigned short iInCnt = 0; // 入力カウンタ
unsigned short iOutCnt = 0; // 出力カウンタ
unsigned short iRate = 89; // 比率 89%
/*****************************************************************************
* ノイズ対策関数 パルス入力の程度による
*****************************************************************************/
void NoiseDelay(void)
{
//__delay_ms(1);
//__delay_us(500);
__delay_us(100);
}
/*****************************************************************************
* メイン関数
*****************************************************************************/
void main(void)
{
// ----------------------------------------------------------------------
// 【コンパレータ・コントロール・レジスタ】
// bit6: COUT: コンパレータ出力
// bit4: CINV: コンパレータ出力反転 1 - 出力反転 / 0 - 出力非反転
// bit3: CIS: コンパレータ入力スイッチ
// bit2-0: CM2-0: コンパレータモード 111 - コンパレータOFF(GP2-0はデジタルIO)
// ----------------------------------------------------------------------
CMCON = 0b00000111;
// ----------------------------------------------------------------------
// 【GPIO入出力】
// bit5-0: TRISIO5-0 TRISIO<3>は常に入力(1)
// bit5(=GP5=2ピン)を車速パルスの入力として使用する。
// bit4(=GP4=3ピン)
// bit3(=GP3=4ピン)
// bit2(=GP2=5ピン)
// bit1(=GP1=6ピン)を車速パルスの出力として使用する。
// bit0(=GP0=7ピン)
// ----------------------------------------------------------------------
TRISIO = 0b00101000;
// ----------------------------------------------------------------------
// 【GPIOポート】
// bit5-0: GPIO I/Oピン
// ----------------------------------------------------------------------
GPIO = 0x00;
// ----------------------------------------------------------------------
// 電源ON確認3秒 GP4 : ON->OFF
// ----------------------------------------------------------------------
GPIO |= 0x10;
__delay_ms(2000);
GPIO &= 0xEF;
__delay_ms(1000);
// ----------------------------------------------------------------------
// 無限ループ
// ----------------------------------------------------------------------
while(1)
{
// 入力:Low-LEVELの場合
if ( _PULSE_INPUT_OFF_ )
{
// ノイズ対策
NoiseDelay();
if ( _PULSE_INPUT_ON_ )
continue;
OutPulse();
// 入力がHigh-LEVELになるのを待つ
while ( _PULSE_INPUT_OFF_ )
{
asm("nop");
asm("nop");
asm("nop");
}
}
else
{
// ノイズ対策
NoiseDelay();
if ( _PULSE_INPUT_OFF_ )
continue;
OutPulse();
// 入力がLow-LEVELになるのを待つ
while ( _PULSE_INPUT_ON_ )
{
asm("nop");
asm("nop");
asm("nop");
}
}
}
}
/*****************************************************************************
* パルス出力処理
*****************************************************************************/
void OutPulse(void)
{
unsigned short iRateVal; // 計算値
// 入力カウント
iInCnt++;
// 計算値(結果は小数部切捨ての整数)
iRateVal = iInCnt * iRate / 100;
// 計算値が変化したら
if ( iOutCnt != iRateVal )
{
// 出力カウンタを更新する
iOutCnt = iRateVal;
// パルス出力反転 (GP1)
if ( GPIO & 0x02 )
{
GPIO &= 0xFD;
}
else
{
GPIO |= 0x02;
}
}
// カウンタをリセット
if ( iInCnt >= iInMax )
{
iInCnt = 0;
iOutCnt = 0;
}
}
2011.6.4(土),2012.6.9(土),2012.6.15(金)
![]() |
PICのプログラムは初歩のLEDピカピカ。12F509の単価が安い(@60)ので、
以前作成した(ネットの回路を参考に作った)ICウインカーリレーをPICで作ったらどうなるか、
試してみました。 |
![]() |
![]() |
2012.1.29(日)