I am trying to do 16 bit PWM as per Tip#10 16 bit Resolution PWM page 40 (3-10) Microchip Tips 'n Tricks

Basically when TM1 value equals the CCP1 (PWM duty) setting the CCP1 interrupt sets PORTC.2 low (works OK).
When the free running TM1 interrupts it is supposed to set PORTC.2 high (doesn't).

As a test CCP1 can be configured to toggle (this works OK as see in ISIS) but if configured
to set low for PWM the pin cannot be set high again even though CCP1 int is cleared.

The following code tries to set pin high in TM1 interrupt.

Norm

Code:
    'FL PIC18F4520 
    ; @ __CONFIG _CONFIG1H, _OSC_XT_1H 
     @ __CONFIG _CONFIG1H, _OSC_HSPLL_1H
     @ __CONFIG _CONFIG2L, _BOREN_ON_2L
     @ __CONFIG _CONFIG2H, _WDT_ON_2H
     @ __CONFIG _CONFIG3H, _MCLRE_ON_3H & _PBADEN_OFF_3H
     @ __CONFIG _CONFIG4L, _LVP_OFF_4L & _XINST_OFF_4L  

 
    DEFINE OSC 40  

    Clear 

    sSEROUT_PIN VAR PORTA.2
    sBAUD CON 16416  '16416 = 19200 BAUD 

    wsave VAR BYTE bankA system    ' Saves W
    ssave VAR BYTE bankA system    ' Saves STATUS 
    yTEMP VAR Byte 
    wDUTY VAR Word  
    wDUTY = 32768 '32768 = 50% DUTY PWM

    '********************
    '16 BIT CCP1 PWM
    Input PORTC.2       ' Disable the HPWM output while things are being setup 
    RCON.7 = 0          ' 0 DISABLES PRIORITY LEVELS ON INTERRUPTS (16F COMPATABILITY) 
    T1CON = %10110000   ' Turn off Timer1 with a Prescaler value of 1:8
    PIE1 = %00000101    ' enable CCP1,  TMR1 overflow interrupt 
    INTCON = %11000000  ' enable global and peripheral interrupts 
    Output PORTC.2      ' Set PORTC.2 (CCP1) to output

'    CCP1CON = %00000010   'TOGGLE PORTC.2 ON MATCH TM1 WITH DUTY ********** OK ************  
    CCP1CON = %00001001   'LOW PORTC.2 ON MATCH TM1 WITH DUTY ?????????? NOT OK ???????????????  

    T3CON = %00000000

'    CCPR1L = wDUTY.LOWBYTE
    CCPR1H = wDUTY.HighByte
    CCPR1L = wDUTY.LowByte


    DEFINE  INTHAND myint 

    Goto START    'Jump over the subroutines

 
  '**** ASSEMBLY INTURRUPT ROUTINE ****  
  Asm
myint    ;KEEP LEFT
  ; Save the state of critical registers 
      movwf    wsave            ; Save W
      swapf    STATUS, W        ; Swap STATUS To W (swap avoids changing STATUS)
      clrf    STATUS            ; Clear STATUS
      movwf    ssave            ; Save swapped STATUS
  EndAsm

'     yTEMP = yTEMP +1 
'     SerOut2 sSEROUT_PIN,sBAUD,["INT ",DEC yTEMP,13]  

    PIR1.2 = 0 ' CLEAR THE CCP1 INT FLAG
    High PORTC.2          '???????????????? DOES NOT SET HIGH ?????????????????

  Asm
        bcf     PIR1, 0            ; Clear interrupt flag

      swapf    ssave, W        ; Retrieve the swapped STATUS value (swap To avoid changing STATUS)
      movwf    STATUS            ; Restore it To STATUS
      swapf    wsave, F        ; Swap the stored W value
      swapf    wsave, W        ; Restore it To W (swap To avoid changing STATUS)
      retfie                   ; Return from interrupt
  EndAsm
  '**** END ASSEMBLY INTURRUPT ROUTINE **** 
 
 
  
    '***********************************************
    '***********************************************
    START:

    PAUSE 800 
    SerOut2 sSEROUT_PIN,sBAUD,["START",13] 

    T1CON.0 = 1   'TMR1 ON

    MAIN:

    yTEMP = yTEMP +1 
    SerOut2 sSEROUT_PIN,sBAUD,["LOOP ",Dec yTEMP,13] 
    PAUSE 500

    Goto MAIN

    End