I changed the interrupt service routine type to be ASM to speed things up a bit. I had not realized that this could be done under certain conditions. As long as I am not multiplying or dividing in the service routine, it is ok to use PBP statements in an ASM type ISR. See Darrel's explanation here: http://www.picbasic.co.uk/forum/show...2454#post82454 for more info. For three phase Power Control PWM , check out http://www.scalerobotics.com/72-how-...nterrupts.html
;    Circuit Diagram: 
;    using PIC18F2431 RC2 pin
;   Filter Diagram
;        
;               2.7k            2.7k    
;    RC2  ___/\  /\  /\______/\  /\  /\________ Analog Output
;              \/  \/    |     \/  \/     |  
;                        |                |
;                      ----- 0.1uF      ----- 0.1uF
;                      -----            -----
;                        |                |
;                       GND              GND
;
;
 
define OSC 40
asm
    __CONFIG    _CONFIG1H, _OSC_HSPLL_1H
    __CONFIG    _CONFIG2H, _WDTEN_OFF_2H & _WDPS_512_2H
    __CONFIG    _CONFIG4L, _LVP_OFF_4L
endasm
 
ADCON0 = 000000
ADCON1 = 000000
trisb = 111111
trisc = 111011
trisa = 111111
TMR2 = 16
PR2 = 129       ;set for 19.2Khz HPWM        
CCP1CON.3 = 1        ' set to pwm mode
CCP1CON.2 = 1
T2CON.2=1
T2CON.0=1
STEPCOUNT var byte
stepcount = 32
; Set sine "table" in an array
sineval var byte[33]
sineval[1] = 128
sineval[2] = 148
sineval[3] = 167
sineval[4] = 185
sineval[5] = 200
sineval[6] = 213
sineval[7] = 222
sineval[8] = 228
sineval[9] = 230
sineval[10] = 228
sineval[11] = 222
sineval[12] = 213
sineval[13] = 200
sineval[14] = 185
sineval[15] = 167
sineval[16] = 148
sineval[17] = 128
sineval[18] = 108
sineval[19] = 89
sineval[20] = 71
sineval[21] = 56
sineval[22] = 43
sineval[23] = 34
sineval[24] = 28
sineval[25] = 26
sineval[26] = 28
sineval[27] = 34
sineval[28] = 43
sineval[29] = 56
sineval[30] = 71
sineval[31] = 89
sineval[32] = 108
 
timerone var word 
 
INCLUDE "DT_INTS-18.bas"     ; Base Interrupt System
;include "ReEnterPBP-18.bas"  ;not needed for ASM type interrupt service routines
 
ASM
 
INT_LIST  macro    ; IntSource,        Label,  Type, ResetFlag?
        INT_Handler   TMR1_INT,   _sine,   ASM,  yes
    endm
    INT_CREATE               ; Creates the interrupt processor
ENDASM
 
T1CON = $31                 ; Prescaler = 8, TMR1ON
TMR1L = 255
TMR1H = 254
@   INT_ENABLE  TMR1_INT     ; Enable Timer 1 Interrupts  
timerone = $FD85                ;gives about 60 htz sine 
Main:
        pause 5
        'timerone = timerone - 1      'uncomment to vary 60hz sine
        if timerone = $F9FF then timerone = $FF00
 
GOTO Main
 
'---[TMR1_INT - interrupt handler]------------------------------------------
 
sine:
    TMR1L = timerone.byte0
    TMR1H = timerone.byte1     
    CCPR1L = sineval[STEPCOUNT]>>1 
    stepcount = stepcount -1
    if stepcount = 0 then stepcount = 32
 
@    INT_RETURN
-Walter

And for dual phase sine:
I need to work on the filter for this one. Had to change the step range from 32 steps to 36 steps, so I could get 120 degrees separation from the two sines. Now the R/C filter needs to be adjusted.
;    Circuit Diagram: 
;    using PIC18F2431 RC2 pin (first sine) and RC1 pin (second sine wave)
;   Filter Diagram
;        
;               2.7k            2.7k    
;    RC2  ___/\  /\  /\______/\  /\  /\________ Analog Output
;              \/  \/    |     \/  \/     |  
;                        |                |
;                      ----- 0.1uF      ----- 0.1uF
;                      -----            -----
;                        |                |
;                       GND              GND
;
;
 
define OSC 40
asm
    __CONFIG    _CONFIG1H, _OSC_HSPLL_1H
    __CONFIG    _CONFIG2H, _WDTEN_OFF_2H & _WDPS_512_2H
    __CONFIG    _CONFIG4L, _LVP_OFF_4L
endasm
clear 
ADCON0 = 000000
ADCON1 = 000000
trisb = 111111
trisc = 111001
trisa = 111111
TMR2 = 16
PR2 = 115       ;set for 21.6Khz HPWM (=36 steps*10 times*60htz)       
CCP1CON.3 = 1        ' set to pwm mode
CCP1CON.2 = 1
CCP2CON.3 = 1        ' set to pwm mode
CCP2CON.2 = 1
T2CON.2=1
T2CON.0=1
STEPCOUNT var byte
stepcount = 36
stepcount2 var byte
duty var word
stepcount2 =24   'set start of 2nd sine wave 120 degrees off from first sine
; Set sine "table" in an array
; each step represents 10 degrees
sineval var byte[37]
sineval[1] = 128    ;0 degrees
sineval[2] = 146    ;10 degrees
sineval[3] = 163
sineval[4] = 179
sineval[5] = 194
sineval[6] = 206
sineval[7] = 216
sineval[8] = 224
sineval[9] = 228
sineval[10] = 230   ;90 degrees
sineval[11] = 228
sineval[12] = 224
sineval[13] = 216   ;120 degrees
sineval[14] = 206
sineval[15] = 194
sineval[16] = 179
sineval[17] = 163
sineval[18] = 146
sineval[19] = 128   ;180 degrees
sineval[20] = 110
sineval[21] = 93
sineval[22] = 77
sineval[23] = 62
sineval[24] = 50
sineval[25] = 40
sineval[26] = 32
sineval[27] = 28
sineval[28] = 26
sineval[29] = 28
sineval[30] = 32
sineval[31] = 40
sineval[32] = 50
sineval[33] = 62
sineval[34] = 77
sineval[35] = 93
sineval[36] = 110
 
timerone var word 
portc.0 = 1 
INCLUDE "DT_INTS-18.bas"     ; Base Interrupt System
 
 
ASM
 
INT_LIST  macro    ; IntSource,        Label,  Type, ResetFlag?
        INT_Handler   TMR1_INT,   _sine,   ASM,  yes
    endm
    INT_CREATE               ; Creates the interrupt processor
ENDASM
 
T1CON = $01                 ; Prescaler = 8, TMR1ON
TMR1L = 255
TMR1H = 254
@   INT_ENABLE  TMR1_INT     ; Enable Timer 1 Interrupts 
 
timerone = 60950   ;gives about 60 htz sine 
Main:
       @ NOP
 
GOTO Main
 
'---[TMR1_INT - interrupt handler]------------------------------------------
 
sine:
    TMR1L = timerone.byte0
    TMR1H = timerone.byte1
    duty = sineval[STEPCOUNT]
    CCPR1L = Duty >> 1     
    CCPR2L = sineval[stepcount2] >>1 
    stepcount = stepcount -1
    stepcount2 = stepcount2 - 1
    if stepcount2 = 0 then stepcount2 =36
    if stepcount = 0 then stepcount = 36
 
@    INT_RETURN
;    Circuit Diagram for triple phase sine wave 
;    using PIC18F2431 RB1, RB3 and RB5 pins
;   Filter Diagram (needs one for each pin, so times 3)
;        
;               2.7k            2.7k    
;    RC2  ___/\  /\  /\______/\  /\  /\________ Analog Output
;              \/  \/    |     \/  \/     |  
;                        |                |
;                      ----- 0.1uF      ----- 0.1uF
;                      -----            -----
;                        |                |
;                       GND              GND
;
;
 
define OSC 40
asm
    __CONFIG    _CONFIG1H, _OSC_HSPLL_1H
    __CONFIG    _CONFIG2H, _WDTEN_OFF_2H & _WDPS_512_2H
    __CONFIG    _CONFIG4L, _LVP_OFF_4L
endasm
clear 
ADCON0 = 000000
ADCON1 = 000000
portb=0
trisb = 000000
trisc = 000010
trisa = 000000
DTCON = 000101   'dead time for complimentary ouputs
PTCON0 = 000000  '1:1 postscale, Fosc/4 1:1 prescale, free running mode
PTPERL = 206        'for 21.6khz 
PTPERH = 1
PWMCON0 =010100  'PWM[5:0] ouputs enabled
PWMCON1 = 1         'updates enabled, overrides sync w/timebase
PTCON1 = 000000  'PWM timebase is on, counts up
FLTCONFIG = 000010 'disable fault A, cycle by cycle mode
 
STEPCOUNT1 var byte
stepcount2 var byte
stepcount3 var byte
stepcount1 = 36   'offset start steps for multiple sine waves
stepcount2 = 24   'set start of 2nd sine wave 120 degrees off from first sine
stepcount3 = 12
duty1 var word
duty2 var word
duty3 var word
 
; Set sine "table" in an array
; each step represents 10 degrees
sineval var byte[37]
sineval[1] = 128    ;0 degrees
sineval[2] = 146    ;10 degrees
sineval[3] = 163
sineval[4] = 179
sineval[5] = 194
sineval[6] = 206
sineval[7] = 216
sineval[8] = 224
sineval[9] = 228
sineval[10] = 230   ;90 degrees
sineval[11] = 228
sineval[12] = 224
sineval[13] = 216   ;120 degrees
sineval[14] = 206
sineval[15] = 194
sineval[16] = 179
sineval[17] = 163
sineval[18] = 146
sineval[19] = 128   ;180 degrees
sineval[20] = 110
sineval[21] = 93
sineval[22] = 77
sineval[23] = 62
sineval[24] = 50
sineval[25] = 40
sineval[26] = 32
sineval[27] = 28
sineval[28] = 26
sineval[29] = 28
sineval[30] = 32
sineval[31] = 40
sineval[32] = 50
sineval[33] = 62
sineval[34] = 77
sineval[35] = 93
sineval[36] = 110
 
timerone var word 
portc.0 = 0 
INCLUDE "DT_INTS-18.bas"     ; Base Interrupt System
 
ASM
 
INT_LIST  macro    ; IntSource,        Label,  Type, ResetFlag?
        INT_Handler   TMR1_INT,   _sine,   ASM,  yes
    endm
    INT_CREATE               ; Creates the interrupt processor
ENDASM
 
T1CON = $01                 ; Prescaler = 8, TMR1ON
timerone = 60950   ;gives about 60 htz sine 
@   INT_ENABLE  TMR1_INT     ; Enable Timer 1 Interrupts            
 
Main:
       @ NOP
 
GOTO Main
 
'---[TMR1_INT - interrupt handler]------------------------------------------
 
sine:
    TMR1L = timerone.byte0
    TMR1H = timerone.byte1
    duty1 = sineval[STEPCOUNT1]
    duty1 = duty1 <<2 
    PDC2L = duty1.lowbyte
    PDC2H = duty1.highbyte
    duty2 = sineval[STEPCOUNT2]
    duty2 = duty2 <<2 
    PDC0L = duty2.lowbyte
    PDC0H = duty2.highbyte
    duty3 = sineval[STEPCOUNT3]
    duty3 = duty3 <<2 
    PDC1L = duty3.lowbyte
    PDC1H = duty3.highbyte
    stepcount1 = stepcount1 - 1
    stepcount2 = stepcount2 - 1
    stepcount3 = stepcount3 - 1
    if stepcount1 = 0 then stepcount1 = 36
    if stepcount2 = 0 then stepcount2 = 36
    if stepcount3 = 0 then stepcount3 = 36
 
@    INT_RETURN


 Menu
 Menu 
			
			
 
			 
			 
			
Re: 16F690 MCLR as Input
many thanks Henrik to clarify this post.
jackberg1 - 27th October 2025, 20:42that make more sense to me now with further test, when the pin RA3
has nothing connected to it, the input is floating thus
when adding a pulldown it's...