Frequency Measurement of a Square Wave in 8085 Assembly
Published by Arun Isaac on
This code snippet continuously reads a square wave from Port A of the 8255 (programmable peripheral interface) and thus measures its time period. The code is organized into four subroutines - counton (to measure the ON time), countoff (to measure the OFF time), initports (to initialize the 8255 with the appropriate control word), and the main subroutine.
Basically, this code continuously reads the square wave signal from Port A. As long as it is reading an ON state, it loops around in the 'counton' subroutine incrementing a counter for each iteration of the loop. As soon as it detects an OFF state, it stores the ON count value in memory and jumps to the 'countoff' subroutine. In the 'countoff' subroutine, the time in the OFF state is measured by incrementing a counter. As soon as an ON state is detected, the OFF count value is stored in memory and the execution jumps back to the 'counton' subroutine.
Based on delay calculations, one 'count' of this code corresponds to 33 T states or 11us (assuming 3 MHz clock). So, 11us can be thought of as the sampling period.
In the code below, PPICNT is the 8 bit address of the control port of the 8255. The input square wave must be connected to bit 0 of Port A.
main: CALL initports JMP counton initports: MVI A, 90h OUT PPICNT RET counton: LXI H, 0000h loopon: INX H IN PORTA CPI 00h JNZ loopon SHLD 4300h JMP countoff countoff: LXI H, 0000h loopoff: INX H IN PORTA CPI 01h JNZ loopoff SHLD 4302h JMP counton