/**************************************************************************** * * Copyright (c) 2021 Tokyo Seiden CO.,LTD. * All Right Reserved. * * System : RX210 * Create Date : 21/06/04 * *****************************************************************************/ /************************************************************ * エンコーダを割込みを使って動かす * ************************************************************/ typedef struct { INT ctr; /* UP/DOWN */ BYTE sts; /* NEXT STATUS */ }ENCTBLSTR; static ENCTBLSTR enctbl[16]={ /* status edge up/down next_status+1 */ /* 0 a→0 */ { 0, 0 }, /* a→1 */ { 1, 2 }, /* b→0 */ { 0, 0 }, /* b→1 */ { -1, 3 }, /* 1 a→0 */ { -1, 1 }, /* a→1 */ { 0, 0 }, /* b→0 */ { 0, 0 }, /* b→1 */ { 1, 4 }, /* 2 a→0 */ { 0, 0 }, /* a→1 */ { -1, 4 }, /* b→0 */ { 1, 1 }, /* b→1 */ { 0, 0 }, /* 3 a→0 */ { 1, 3 }, /* a→1 */ { 0, 0 }, /* b→0 */ { -1, 2 }, /* b→1 */ { 0, 0 }, }; /*------------------------------------------------------*/ /* 共通関数 */ /*------------------------------------------------------*/ static void encirq(BYTE ch, BYTE edge) { BYTE sts=Ensts[ch]; sts <<= 2; /* ×4 */ sts += edge; /* +エッジ */ Encoder[ch] += enctbl[sts].ctr; /* UP/DOWN */ sts = enctbl[sts].sts; /* next status */ if(sts){ /* 0は更新しないということ */ Ensts[ch] = sts-1; /* 0-3にする */ } } /*------------------------------------------------------*/ /* 各割込み毎 */ /*------------------------------------------------------*/ /* IRQMDは2bitで、01で立下りエッジ、10で立上りエッジです */ static void edge_chk(BYTE irqno) { BYTE edge; BYTE ch = irqno >> 1; /* chを0-3にする */ edge = ICU.IRQCR[irqno].BIT.IRQMD; /* 今のエッジ */ edge -= 1; /* 0:DOWN 1:UPにし */ edge += (irqno&0x01)? 2 : 0; /* B側は、+2する */ encirq(ch,edge); /* エンコーダ共通処理 */ ICU.IRQCR[irqno].BIT.IRQMD ^= 0x03; /* エッジ反転 */ } /*------------------------------------------------------*/ extern void Int_irq0(void) { edge_chk(0); /* CH0-A */ } /*------------------------------------------------------*/ extern void Int_irq1(void) { edge_chk(1); /* CH0-B */ } /*------------------------------------------------------*/ extern void Int_irq2(void) { edge_chk(2); /* CH1-A */ } /*------------------------------------------------------*/ extern void Int_irq3(void) { edge_chk(3); /* CH1-B */ } /*------------------------------------------------------*/ extern void Int_irq4(void) { edge_chk(4); /* CH2-A */ } /*------------------------------------------------------*/ extern void Int_irq5(void) { edge_chk(5); /* CH2-B */ } /*------------------------------------------------------*/ extern void Int_irq6(void) { edge_chk(6); /* CH3-A */ } /*------------------------------------------------------*/ extern void Int_irq7(void) { edge_chk(7); /* CH3-B */ }