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

Re: PIC16F1783: Erase algorithm incorrect
Hi,
HenrikOlsson Yesterday, 17:55No experience with the U2 here but according to the U2 supported device list (https://melabs.com/includes/compatibility/meprog.pics.htm) the 16F1783 is supported.
I don't know enough about...