795us over 45ms is 1.76%, not 17.6% as I wrote earlier.
Anyway, here's a piece of code that may do what you want. It uses TMR1 and CCP1 to measure the input signal, calculates the dutycycle and displays it with .1% resolution. It compiles for a 16F88 but I have not tested it./Henrik.Code:' Program expects 4MHz oscillator. ' CCP1 inputpin is either RB0 or RB3 depending on the CCPMX bit in CONFIG. CapRise CON %00000101 ' Value to configure CCP1 for capturing every rising edge CapFall CON %00000100 ' Value to configure CCP1 for capturing every falling edge CCP1IF VAR PIR1.2 ' Alias to CCP1 Interrupt flag Period VAR WORD Width VAR WORD Duty VAR WORD Dummy VAR WORD T1 VAR WORD T2 VAR WORD T3 VAR WORD T1CON = %00100001 ' TMR1 clock from FOsc/4, Prescaler 1:4 Main: ' Capture the the time where the pulse starts CCP1CON = CapRise CCP1IF = 0 WHILE !CCP1IF : WEND T1.HIGHBYTE = CCPR1H : T1.LOWBYTE = CCPR1L ' Capture the time where the pulse ends CCP1CON = CapFall CCP1IF = 0 WHILE !CCP1IF : WEND T2.HIGHBYTE = CCPR1H : T2.LOWBYTE = CCPR1L ' Capture the time where the period ends (which is when the next pulse starts) CCP1CON = CapRise CCP1IF = 0 WHILE !CCP1IF : WEND T3.HIGHBYTE = CCPR1H : T3.LOWBYTE = CCPR1L Width = T2 - T1 Period = T3 - T1 Dummy = Width * 1000 Duty = DIV32 Period ' Duty is now in units of .1% (111 = 11.1%) LCDOUT $FE, 1, "W:", DEC Width, " P:", DEC Period LCDOUT $FE, $C0, "Duty:", DEC Duty/10, ".", DEC Duty//10, "%" Goto Main




Bookmarks