
Originally Posted by
HenrikOlsson
Now you are mixing your original code with Darrels template and what I tried to tell you earlier into a complete mess....
Yes, and to do that you change the reload value which you load TMR1 with at each interrupt. In the timer1 intterupt stop the timer, add your reload value to the value of the timer and restart it. Then do whatever else needs to be done in the ISR. Did you try the code I posted in my first reply?
Of course I've readed your first reply, and it's how I integrated your routine into my code :
Code:
' PIC initialization
DEFINE OSC 40
DEFINE LCD_DREG PORTC
DEFINE LCD_EREG PORTD
DEFINE LCD_RSREG PORTD
DEFINE LCD_EBIT 0
DEFINE LCD_RSBIT 1
DEFINE LCD_COMMANDUS 4000
DEFINE LCD_DATAUS 1000
' BAS includes
INCLUDE "DT_INTS-18.bas"
INCLUDE "ReEnterPBP-18.bas"
INCLUDE "Sine_table.bas"
' Port registers configuration
TRISB=%11000000 ' PWM 0,1,2,3,4,5 outputs
TRISC=%00110000 ' +/- buttons
' PCPWM registers configuration
DTCON=%110 ' Deadtime (600ns)
PTCON0=%0 ' 1:1 postscale, Fosc/4 1:1 prescale, free running mode
PTCON1=%10000000 ' PWM time base is ON, counts up, 19.45kHz/4
PWMCON0=%1000000 ' PWM 0,1,2,3,4,5 set in pair mode
PWMCON1=%1 ' PWM timer sync configuration
' PWM calculation variables
ustep var byte
vstep var byte
wstep var byte
uduty var word
vduty var word
wduty var word
timer var word
amplitude var word
carrier VAR word
flag var bit
' Variables definition
ustep=90 ' 360 degrees phase angle
vstep=60 ' 240 degrees phase angle
wstep=30 ' 120 degrees phase angle
timer=64120 ' Timer adjust
amplitude=65535 ' Sinewave amplitude adjust (65535=max amplitude)
carrier=1023 ' Carrier frequency adjust (1023=13kHz)
flag=%0 ' Menu flag
' PWM carrier frequency register configuration
PTPERL=carrier.lowbyte
PTPERH=carrier.highbyte
' Interrupt processors
ASM
INT_LIST macro
INT_Handler TMR1_INT,_pwmint,PBP,yes
endm
INT_CREATE
ENDASM
' Timers configuration
T1CON=%1
' Interrupts enable
@INT_ENABLE TMR1_INT
' Main program loop
mainlp:
' Debug display
if flag=0 then
LCDOUT $FE,$2,"Freq. adjust :"
LCDOUT $FE,$C0,DEC timer
if PORTC.4=1 then timer=timer-1
if PORTC.5=1 then timer=timer+1
IF PORTC.4 AND PORTC.5=1 then flag=%1
else
LCDOUT $FE,$2,"Amp. adjust :"
LCDOUT $FE,$C0,DEC4 amplitude
if PORTC.4=1 then amplitude=amplitude-1
if PORTC.5=1 then amplitude=amplitude+1
endif
goto mainlp
TimerShadow VAR WORD
TimerReload VAR WORD
TimerReload=64000 'Test
' PWM calculation and update interrupt (Timer 1)
pwmint:
' Timer 1 update
TMR1L=timer.lowbyte
TMR1H=timer.highbyte
T1CON.0 = 0 'Stop TMR1
TimerShadow.HighByte = TMR1H
TimerShadow.LowByte = TMR1L
TimerShadow = TimerShadow + TimerReload
TMR1H = TimerShadow.HighByte
TMR1L = TimerShadow.LowByte
T1CON.0 = 1 'Restart TMR1
' PWM U phase calculation
uduty=sine[ustep]
uduty=uduty<<4**amplitude
' PWM V phase calculation
vduty=sine[vstep]
vduty=vduty<<4**amplitude
' PWM W phase calculation
wduty=sine[wstep]
wduty=wduty<<4**amplitude
' PWM U, V and W update
PDC0L=uduty.lowbyte
PDC0H=uduty.highbyte
PDC1L=vduty.lowbyte
PDC1H=vduty.highbyte
PDC2L=wduty.lowbyte
PDC2H=wduty.highbyte
' Phase angle calculation
ustep=ustep-1
vstep=vstep-1
wstep=wstep-1
' Phase angle reinitialization
if ustep=0 then ustep=90
if vstep=0 then vstep=90
if wstep=0 then wstep=90
@INT_RETURN
It doesnt work at all, but I think it's how I integrate your routine in the code, badly I think. 
And with this :
Code:
pwmint:
toggle PORTD.7
@INT_RETURN
I get a 100Hz output frequency on PORTD.7.
Bookmarks