From: Peter Gober Newsgroups: comp.os.msdos.djgpp Subject: Parallel port/Interrupt handling - please help me Date: Sun, 19 Jan 1997 15:57:03 +0100 Organization: University of Essen, Digital Communications Group Lines: 60 Message-ID: <32E2363F.41C6@exp-math.uni-essen.de> NNTP-Posting-Host: 132.252.150.40 Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Hello everybody, I want to implement a serial interface with an external clock using a standard parallel interface. I want to do that with interrupts and used DJGPP and a protected mode handler written in C. But it doesn't work. After working for more than two days now, I hope that maybe someone can give me a hint. I have enclosed a reduced version of my program. I would expect it to count my clocks, which it doesn't. I use MS-DOS 6.22 with HIMEM and EMM386. The clock is about 2 kHz and on the ACK-Line of the parallel interface. I use IRQ5 and port address 0x3bc. With an oscilloscope I checked that the IRQ5 line oscillates. Some software things happen too, because if I increase the clock frequency very much, my program becomes slower. I know I used the correct port address, because if I read the ACK input it oscillates too. I have a network card in the computer, but no sound card (these shouldn't be the problem, should they?) Obviously my handler isn't called. I would be really very thankful if someone could give me a hint. Peter ------------------------------------------------------------------------ #include #include #include static const short lptBaseAddr = 0x3bc; static const short lptIRQ = 5; int _crt0_startup_flags = _CRT0_FLAG_LOCK_MEMORY; /* no paging */ static unsigned int counter = 0; static void intHandler(void) { counter++; } static _go32_dpmi_seginfo info; main() { /* don't generate interrupts */ outportb(lptBaseAddr+2, 0); /* change handler */ info.pm_offset = (int) intHandler; info.pm_selector = _go32_my_cs(); _go32_dpmi_allocate_iret_wrapper(&info); _go32_dpmi_set_protected_mode_interrupt_vector(lptIRQ, &info); /* enable interrupt in interrupt controller */ outportb(0x21, inportb(0x21) & (~(1 << lptIRQ))); /* generate interrupts */ outportb(lptBaseAddr+2, 0x10); for(;;) { printf("counter: %d\n", counter); } }