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); } }
// 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); }