Exemplo n.º 1
0
void Encoder::attachInterrupt(void (*callback)(int)) {
	if(mode == MODE_NOSET) return;
	
	if(mode == MODE_CAPTURE && callback != NULL)
	{
		if(_pcapfunc[mcn][0] != NULL || _pcapfunc[mcn][1] != NULL || _pcapfunc[mcn][2] != NULL)	return;
		if(interrupt_init(mcn) == false) return;
		
		mcsif_Disable(mcn, mdn);
	
		io_DisableINT();
		_pcapfunc[mcn][0] = callback;
		_pcapfunc[mcn][1] = callback;
		_pcapfunc[mcn][2] = callback;
		io_RestoreINT();

		clear_INTSTATUS(mcn);
		enable_MCINT(mcn, SIFB_CAP1INTBIT);
		enable_MCINT(mcn, SIFB_CAP2INTBIT);
		enable_MCINT(mcn, SIFB_CAP3INTBIT);
		
		// Enable interrupt option
		for(int i=0; i<3; i++)
		{
			sifIntMode[i](mcn, mdn, MCPFAU_CAP_BOTH_CLEAR);
			sifSetInt[i](mcn, mdn, 1L);
	    }

		mcsif_Enable(mcn, mdn);
		_pcapAttchINT = true;
		return;
	}
	
	if(callback != NULL)
	{
		if(_encfunc[mcn] != NULL) return;
		if(interrupt_init(mcn) == false) return;
		
		mcsif_Disable(mcn, mdn);
		
		io_DisableINT();
		_encfunc[mcn] = callback;
		io_RestoreINT();

		clear_INTSTATUS(mcn);
		enable_MCINT(mcn, SIFB_TRIGRESETBIT);
		enable_MCINT(mcn, SIFB_USEREVTBIT);
		enable_MCINT(mcn, SIFB_PCNT_OV);
		enable_MCINT(mcn, SIFB_PCNT_UV);
		
		// Enable interrupt option
		mcenc_SetCapInterval(mcn, mdn, 1L);
		mcsif_Enable(mcn, mdn);
	}
}
Exemplo n.º 2
0
// only for COMPAREMATCH and INDEXRESET condition
void Encoder::detachInterrupt() {
    int i;

	if(mode == MODE_CAPTURE)
	{
		if(_pcapfunc[mcn][0] == NULL || _pcapfunc[mcn][1] == NULL || _pcapfunc[mcn][2] == NULL)	return;
		mcsif_Disable(mcn, mdn);
		
		// Disable interrupt option
		for(int i=0; i<3; i++)
		{
			sifIntMode[i](mcn, mdn, MCPFAU_CAP_DISABLE);
			sifSetInt[i](mcn, mdn, 0L);
	    }
		
		io_DisableINT();
		_pcapfunc[mcn][0] = NULL;
		_pcapfunc[mcn][1] = NULL;
		_pcapfunc[mcn][2] = NULL;
		io_RestoreINT();
		
		_pcapAttchINT = false;
		// not enable sif
		return;
	}
	
	
	if(_encfunc[mcn] == NULL) return;
	
	mcsif_Disable(mcn, mdn);
	
	// Disable interrupt option
	mcenc_SetCapInterval(mcn, mdn, 0L);
	
	io_DisableINT();
	_encfunc[mcn] = NULL;
	_encmode[mcn] &= ~(INTR_COMPARE);
	_encmode[mcn] &= ~(INTR_INDEX);
	io_RestoreINT();
	
	// re-enable sif
	mcsif_Enable(mcn, mdn);
}