if (wIrq<8)
{
irqmask=inportb(1);
outportb(1,irqmask & 0xff ^ (1<<wIrq));
setvect(wIrq+8,irq_service);
}
else
{
irqmask=inportb(1);
outportb(1,irqmask & 0xfb); /* IRQ2 */
irqmask=inportb(1);
outportb(1,irqmask & 0xff ^ (1<<(wIrq-8)));
setvect(wIrq-8+0x70,irq_service);
}
invert=0x05;
outportb(wBase+0x2a,invert); /* PC0 = non-inverte input */
/* PC1 = inverte input */
/* PC2 = non-inverte input */
/* PC3 = inverte input */
now_int_state=0x0a; /* PC0 = Low */
/* PC1 = High */
/* PC2 = Low */
/* PC3 = High */
CNT_L1=CNT_L2=CNT_L3=CNT_L4=0; /* Low_pulse counter */
CNT_H1=CNT_H2=CNT_H3=CNT_H4=0; /* High_pulse counter */
int_num=0;
outportb(wBase+5,0x0f); /* enable interrupt PC0,PC1 */
enable(); /* PC2,PC3 */
}
/* -------------------------------------------------------------- */
/* NOTE:1.The hold-time of INT_CHAN_0/1/2/3 must long enough */
/* 2.The ISR must read the interrupt status again to the */
/* active interrupt sources. */
/* 3.The INT_CHAN_0&INT_CHAN_1 can be active at the same time*/
/* -------------------------------------------------------------- */
void interrupt irq_service()
{
char c;
+;
new_int_state=inportb(wBase+7)&0x0f; /* read all interrupt state */
int_c=new_int_state^now_int_state; /* compare which interrupt */
/* signal be change */
if ((int_c&0x1)!=0) /* INT_CHAN_0 is active */
{
if ((new_int_state&0x1)!=0)/* now PC0 is change to high */
{
+;
}
else /* now PC0 is change to low */
{
+;
}
invert=invert^1; /* to generate a high pulse */
}
if ((int_c&0x2)!=0) /* INT_CHAN_1 is active */
{
if ((new_int_state&0x2)!=0)/* now PC1 is change to high */
{
+;
}
PIO-D56/PIO-D24 User Manual (Ver.2.1, Oct/2003, PPH-005-21)
---- 48