This is part of some code that I posted a long time ago in the "code examples" section of this forum.

Writing directly to the hardware registers offers much more flexibility than using the PBP HPWM command.

It was written for use with an 18F872x chip running either at 20Mhz or 40Mzh

It was written for use with HYPERTERMINAL, and recognizes the ESC codes for the VT-xxx type terminals. Once you select the PWM frequency, you can use the UP and DOWN arrows on the keyboard to change the duty cycle.

You might have to change a few things, since this is only a segment of a larger program, but it should show you what is going on.




Code:
PWMTester:
           
           HSEROUT [13,10,10,"Test PWM ",13,10]
           
           HSERin [Char]
          HSEROUT [13,REP 10\4]

           IF Char !=13  THEN
                   GOTO PWMTester
           ENDIF
   
                HSEROUT ["Pick PWM Frequency 1 = 312Khz,2 = 156Khz, 3 = 78Khz, 4 = 39Khz "] 
                HSERin [Char]
                IF Char < "1" or Char > "4" THEN
                   HSEROUT [13,10,10]
                   GOTO PWMTester
                ENDIF
                
                IF Mhz40 = 1 THEN            ; Set MHz = 1 if running 40 Mhz, to "0" if running 20Mhz
                    Select CASE Char
                       CASE "1"
                          PWMFREQ = $1F
                           NumBits = 7
                           MaxPWM = 127
                        CASE "2"
                           PWMFREQ = $3F
                           NumBits = 8
                           MaxPWM = 255 
                        CASE "3"
                           PWMFREQ = $7F
                           NumBits = 9
                           MaxPWM = 511 
                        CASE "4"
                           PWMFREQ = $FF
                           NumBits = 10
                           MaxPWM = 1023
                      END SELECT       
                  ELSE
                      Select CASE Char
                       CASE "1"
                          PWMFREQ = $F
                           NumBits = 6
                           MaxPWM = 63
                        CASE "2"
                           PWMFREQ = $1F
                           NumBits = 7
                           MaxPWM = 127 
                        CASE "3"
                           PWMFREQ = $3F
                           NumBits = 8
                           MaxPWM = 255 
                        CASE "4"
                           PWMFREQ = $7F
                           NumBits = 9
                           maxPWM = 511
                      END SELECT       
                    ENDIF
                    
                    
                    CCP1CON = %00001100
                    CCPR1L = %00010000
                    CCPR1H = %00000000              ' Initialize to 0, PWM register
                    PR2    = PWMFREQ               
                    T2CON  = %00000100              ' Prescale 1, Timer2 ON - Needed for PWM
                    PORTC.2 = 0
                    TRISC.2 = 0 
                    PWMVal = 0
                    Gosub WritePWMreg
                    HSEROUT [13,10,10]
                    
                    HSEROUT ["PWM Value  (",#MaxPWM," Max)",13,10]
                    HSEROUT ["0",8]
NewChar:                   
                    HSERIN [Char]
                      If Char = 27 THEN
                        HSERIN 50,NoArrow,[Char2,Char3]
                                 IF Char3 = 65 AND PWMVal < MaxPWM tHEN
                                   PwmVal = PWMVal + 1
                                 ENDIF
                                 IF Char3 = 66 AND PWMVal > 0 tHEN
                                       PwmVal = PWMVal - 1
                                 ENDIF
                            HSEROUT [#PWMVal,"   ",REP 8\7]
                            GOSUB WritePWMReg
                     ENDIF
                      
                     goto NewChar
NoArrow:
                     Break = 1
                     PWMVal = 0
                     Gosub WritePWMReg
                     CCP1CON = 0            ; Shut off the PWM controller
                     GOTO PWMTester                     
                      
                 
            
WritePWMReg:       
                      CCPR1L = PWMVal >> 2                        
                      CCP1CON.5=PWMVal.1
                      CCP1CON.4=PWMVal.0
                     RETURN