Leonardo, try this for your RPM counter. It should be accurate enough for your purposes. Use a PIC running at 8MHz and set up an Interrupt, it for a duration of 100uS. A 16F84 - 10P will be ok for this project with some external drivers for a multiplexed display. Use the circuit I sent you to let the PIC detect the ignition pulses from the coil. 100uS loop time 8MHz clock = 2MHz cycle time = 1/2MHz = 500nS 100uS/500nS = 200 prescaler set to divide by 4 preset tmr0 = 206 when = 0 = 100uS Increment a COUNTER on each 100uS loop. This will need to be a two byte counter. Each time the points open (or close) save the count data in RAM. Then reset the counter. A loop outside the interrupt can be set, to say 0.5 seconds, to get the RPM data for the display. Use this formula to calculate the current RPM. 124F80h divided by (Cylinders X Loops) A 16 bit multiply routine for Cyls X Loops, and a 24 bit routine to divide 124F80h by the result works well. You will have to change the binary result into BCD then to a 7 segment format to drive the multiplexed LED displays. Store the result into 4 RAM registers for the display update routines to use. Using multiplexed displays will require a third timing loop to control. All this is going to be tricky for a beginner. When the RPM value gets too low, the Loop counter may overflow. You will have to decide on a maximum value to allow this counter to get to and then stop it incrementing. At 30 RPM for a single cylinder engine the count will be 40,000 (9C40h). Debounce the points input for 8 loops. This works well for an average engine. Take care with the power supply for your cct. The automotive environment is not too friendly. Don't use the PIC with copper cored spark plug leads or you will have problems. Use suppressed ones. The above should read reasonably well to around 7500 RPM for a V8 which is not too bad. My old Henry the 8 will have a heart attack at this RPM:-) You may also need to average the RPM readings or just display '0' on the units and/or tens digit to avoid jitter. IRQ Loop Ignore points change when debounce counter active. Update 100uS Loop counter. Update main loop counter Update counters for display refresh. Refresh display from display RAM when ready Update Debounce counter Main Loop Wait until IRQ has set a timing value to update the RPM display Calculate and convert RPM data for display data Update display RAM Hope this helps Regards Tony PicNPoke Multimedia 16F84 Beginners PIC Tools. **PLUS** - PicNPlay - PicNPlan - PicNPrep - PicNPost PicNPort - DT Type Saver - *new* PicNQuiz. Recent addition - DogBoneZ Component. http://www.dontronics.com/picnpoke.html