Example #1
0
void Encoder::setIndexReset(bool condition) {
	if(mode == MODE_NOSET || mode == MODE_CAPTURE || mode == MODE_SSI) return;
	
	mcsif_Disable(mcn, mdn);
	if(condition == true)
	{
		mcenc_SetResetMode(mcn, mdn, MCENC_RESET_INC_CNTMINIDX + MCENC_RESET_DEC_CNTMAXIDX);
		
		if(_setZPol == false) // if you use setInputPolarity() to set Z pin's pol to inverse before setIndexReset()
		{
			// In fact, below actions are same as mcenc_SetIdxCond(mcn, mdn, MCENC_PDIR_IDXCOND_Z, MCENC_ICZ1);
			if(mode == MODE_STEP_DIR || mode == MODE_STEP_DIR_x2)
				mcenc_SetIdxCond(mcn, mdn, MCENC_PDIR_IDXCOND_Z, MCENC_ICZ1);
			else if(mode == MODE_CWCCW || mode == MODE_CWCCW_x2)
				mcenc_SetIdxCond(mcn, mdn, MCENC_CWCCW_IDXCOND_Z, MCENC_ICZ1);
			else if(mode == MODE_AB_PHASE || mode == MODE_AB_PHASE_x2)
				mcenc_SetIdxCond(mcn, mdn, MCENC_PAB_IDXCOND_Z, MCENC_ICZ1);
		}
		
		io_DisableINT();
		_encmode[mcn] |= INTR_INDEX;
		io_RestoreINT();
	}
	else
	{
		mcenc_SetIdxCond(mcn, mdn, MCENC_PDIR_IDXCOND_DISABLE, 0L);
		mcenc_SetResetMode(mcn, mdn, MCENC_RESET_INC_CNTMIN + MCENC_RESET_DEC_CNTMAX);
		
		io_DisableINT();
		_encmode[mcn] &= ~(INTR_INDEX);
		io_RestoreINT();
	}
	mcsif_Enable(mcn, mdn);
}
Example #2
0
static void _defaultEncoderSetting(int mc, int md) {
    mcenc_SetIdxCond(mc, md, MCENC_PDIR_IDXCOND_DISABLE, 0L);
    mcenc_SetCapMode(mc, md, MCENC_CAP_PCNT_DISABLE + MCENC_CAP_EXTRIG_DISABLE + MCENC_CAP_IDXCOND_DISABLE);
    
	mcenc_SetCntMin(mc, md, 0L);
    mcenc_SetCntMax(mc, md, 0xffffffffL);
    mcenc_SetResetMode(mc, md, MCENC_RESET_INC_CNTMIN + MCENC_RESET_DEC_CNTMAX);
    mcenc_SetTrigResetMode(mc, md, MCENC_TRIGRESET_IDXCOND_0TO1);
    mcenc_SetPulCnt(mc, md, 0L);
}
Example #3
0
void Encoder::setIndexReset(bool condition) {
	if(mode == MODE_NOSET || mode == MODE_CAPTURE || mode == MODE_SSI) return;
	
	mcsif_Disable(mcn, mdn);
	
	if(condition == true)
	{
		mcenc_SetResetMode(mcn, mdn, MCENC_RESET_INC_CNTMINIDX + MCENC_RESET_DEC_CNTMAXIDX);
        mcenc_SetCapMode(mcn, mdn, MCENC_CAP_PCNT_DISABLE + MCENC_CAP_EXTRIG_DISABLE + MCENC_CAP_IDXCOND_ENABLE); // start to use FIFO (mean that capture event will occur)

		if(_setZPol == false) // if you use setInputPolarity() to set Z pin's pol to inverse before setIndexReset()
		{
			// In fact, below actions are same as mcenc_SetIdxCond(mcn, mdn, MCENC_PDIR_IDXCOND_Z, MCENC_ICZ1);
			if(mode == MODE_STEP_DIR || mode == MODE_STEP_DIR_x2)
				mcenc_SetIdxCond(mcn, mdn, MCENC_PDIR_IDXCOND_Z, MCENC_ICZ1);
			else if(mode == MODE_CWCCW || mode == MODE_CWCCW_x2)
				mcenc_SetIdxCond(mcn, mdn, MCENC_CWCCW_IDXCOND_Z, MCENC_ICZ1);
			else if(mode == MODE_AB_PHASE || mode == MODE_AB_PHASE_x2)
				mcenc_SetIdxCond(mcn, mdn, MCENC_PAB_IDXCOND_Z, MCENC_ICZ1);
		}
		
		io_DisableINT();
		_encmode[mcn] |= INTR_INDEX;
		io_RestoreINT();
	}
	else
	{
		if((_encmode[mcn] & (INTR_INDEX | INTR_OVERFLOW | INTR_UNDERFLOW)) == 0)
			mcenc_SetCapMode(mcn, mdn, MCENC_CAP_PCNT_DISABLE + MCENC_CAP_EXTRIG_DISABLE + MCENC_CAP_IDXCOND_DISABLE);
		mcenc_SetIdxCond(mcn, mdn, MCENC_PDIR_IDXCOND_DISABLE, 0L);
		mcenc_SetResetMode(mcn, mdn, MCENC_RESET_INC_CNTMIN + MCENC_RESET_DEC_CNTMAX);
		
		io_DisableINT();
		_encmode[mcn] &= ~(INTR_INDEX);
		io_RestoreINT();
	}
    
	mcsif_Enable(mcn, mdn);
}
Example #4
0
void Encoder::setInputPolarity(bool pinA, bool pinB, bool pinZ) {
	if(mode == MODE_NOSET || mode == MODE_CAPTURE || mode == MODE_SSI) return;
	
	mcsif_Disable(mcn, mdn);
	if(mode == MODE_STEP_DIR)
	{
		// 8 conditions
		if(pinA == LOW && pinB == HIGH)
		{
			mcenc_SetCntMode(mcn, mdn, MCENC_PDIR_DIR0_INC1TO0 + MCENC_PDIR_DIR1_DEC1TO0);
		}
		else if(pinA == HIGH && pinB == LOW)
		{
			mcenc_SetCntMode(mcn, mdn, MCENC_PDIR_DIR0_DEC0TO1 + MCENC_PDIR_DIR1_INC0TO1);
		}
		else if(pinA == LOW && pinB == LOW)
		{
			mcenc_SetCntMode(mcn, mdn, MCENC_PDIR_DIR0_DEC1TO0 + MCENC_PDIR_DIR1_INC1TO0);
		}
		else // all HIGH
		{
			mcenc_SetCntMode(mcn, mdn, MCENC_PDIR_DIR0_INC0TO1 + MCENC_PDIR_DIR1_DEC0TO1);
		}
		
		if(pinZ == LOW)
		{
			mcenc_SetIdxCond(mcn, mdn, MCENC_PDIR_IDXCOND_Z, MCENC_ICZ0);
			_setZPol = true;
		}
		else
			mcenc_SetIdxCond(mcn, mdn, MCENC_PDIR_IDXCOND_Z, MCENC_ICZ1);
	}
	else if(mode == MODE_CWCCW)
	{
		if(pinA == LOW && pinB == HIGH)
		{
			mcenc_SetCntMode(mcn, mdn, MCENC_CWCCW_CW_INC1TO0 + MCENC_CWCCW_CCW_DEC0TO1);
		}
		else if(pinA == HIGH && pinB == LOW)
		{
			mcenc_SetCntMode(mcn, mdn, MCENC_CWCCW_CW_INC0TO1 + MCENC_CWCCW_CCW_DEC1TO0);
		}
		else if(pinA == LOW && pinB == LOW)
		{
			mcenc_SetCntMode(mcn, mdn, MCENC_CWCCW_CW_INC1TO0 + MCENC_CWCCW_CCW_DEC1TO0);
		}
		else // all NORMAL
		{
			mcenc_SetCntMode(mcn, mdn, MCENC_CWCCW_CW_INC0TO1 + MCENC_CWCCW_CCW_DEC0TO1);
		}
		
		if(pinZ == LOW)
		{
			mcenc_SetIdxCond(mcn, mdn, MCENC_CWCCW_IDXCOND_Z, MCENC_ICZ0);
			_setZPol = true;
		}
		else
			mcenc_SetIdxCond(mcn, mdn, MCENC_CWCCW_IDXCOND_Z, MCENC_ICZ1);
	}
	else if(mode == MODE_AB_PHASE)
	{
		if((pinA == LOW && pinB == LOW) || (pinA == HIGH && pinB == HIGH))
			mcenc_SetCntMode(mcn, mdn, MCENC_PAB_DIR0_INCA + MCENC_PAB_DIR1_DECA);
		else
			mcenc_SetCntMode(mcn, mdn, MCENC_PAB_DIR0_DECA + MCENC_PAB_DIR1_INCA);
		
		if(pinZ == LOW)
		{
			mcenc_SetIdxCond(mcn, mdn, MCENC_PAB_IDXCOND_Z, MCENC_ICZ0);
			_setZPol = true;
		}
		else
			mcenc_SetIdxCond(mcn, mdn, MCENC_PAB_IDXCOND_Z, MCENC_ICZ1);
	}
	// 2X samplerate cases
	else if(mode == MODE_STEP_DIR_x2)
	{
		// 4 conditions
		if(pinB == LOW)
		{
			mcenc_SetCntMode(mcn, mdn, MCENC_PDIR_DIR0_DECBOTH + MCENC_PDIR_DIR1_INCBOTH);
		}
		else // all HIGH
		{
			mcenc_SetCntMode(mcn, mdn, MCENC_PDIR_DIR0_INCBOTH + MCENC_PDIR_DIR1_DECBOTH);
		}
		
		if(pinZ == LOW)
		{
			mcenc_SetIdxCond(mcn, mdn, MCENC_PDIR_IDXCOND_Z, MCENC_ICZ0);
			_setZPol = true;
		}
		else
			mcenc_SetIdxCond(mcn, mdn, MCENC_PDIR_IDXCOND_Z, MCENC_ICZ1);
	}
	else if(mode == MODE_CWCCW_x2)
	{
		if(pinZ == LOW)
		{
			mcenc_SetIdxCond(mcn, mdn, MCENC_CWCCW_IDXCOND_Z, MCENC_ICZ0);
			_setZPol = true;
		}
		else
			mcenc_SetIdxCond(mcn, mdn, MCENC_CWCCW_IDXCOND_Z, MCENC_ICZ1);
	}
	else if(mode == MODE_AB_PHASE_x2)
	{
		if((pinA == LOW && pinB == LOW) || (pinA == HIGH && pinB == HIGH))
			mcenc_SetCntMode(mcn, mdn, MCENC_PAB_DIR0_INCAB + MCENC_PAB_DIR1_DECAB);
		else
			mcenc_SetCntMode(mcn, mdn, MCENC_PAB_DIR0_DECAB + MCENC_PAB_DIR1_INCAB);
		
		if(pinZ == LOW)
		{
			mcenc_SetIdxCond(mcn, mdn, MCENC_PAB_IDXCOND_Z, MCENC_ICZ0);
			_setZPol = true;
		}
		else
			mcenc_SetIdxCond(mcn, mdn, MCENC_PAB_IDXCOND_Z, MCENC_ICZ1);
	}
	mcsif_Enable(mcn, mdn);
}