Omega Vehicle Security OME-PIO-D56 User Manual

Page 50

Advertising
background image

if (wIrq<8)

{

irqmask=inportb(A1_8259+1);

outportb(A1_8259+1,irqmask & 0xff ^ (1<<wIrq));

setvect(wIrq+8,irq_service);

}

else

{

irqmask=inportb(A1_8259+1);

outportb(A1_8259+1,irqmask & 0xfb); /* IRQ2 */

irqmask=inportb(A2_8259+1);

outportb(A2_8259+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;

int_num++;

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 */

{

CNT_H1++;

}

else /* now PC0 is change to low */

{

CNT_L1++;

}

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 */

{

CNT_H2++;

}

PIO-D56/PIO-D24 User Manual (Ver.2.1, Oct/2003, PPH-005-21)

---- 48

Advertising