Unfortuntely, it doesn't works.
The problem is that TimerReload variable overwrites TimerReload EXT constant, defined later in DT routine.
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
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
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
Dummy VAR WORD
Dummy2 VAR WORD
Dummy3 VAR WORD
ReloadInstruction VAR BYTE
TimerReload VAR WORD
Frequency VAR WORD
ReloadInstruction = 0 'Number of instructioncycles it takes to actually reload the timer. I don't know how many it is in this case. Tune later.
'For 40Mhz operation and 1:1 prescaler the timer ticks at 10Mhz
Dummy2 = 10000 'These can not be constants because
Dummy3 = 10000 'constants doesn't work with DIV32
Frequency = 5000 'Lowest possible frequency is ~153Hz. Don't go below that.
Dummy = Dummy2 * Dummy3 'Intermediate result is now 10.000.000
TimerReload = DIV32 Frequency 'Divide 10.000.000 in Frequency (200 in this case)
TimerReload = 65535 - TimerReload + 1 + ReloadInstruction ' =15536 for 200Hz
' Interrupt processors
ASM
INT_LIST macro
INT_Handler TMR1_INT,ReloadTMR1,ASM,no
INT_Handler TMR1_INT,_pwmint,PBP,yes
endm
INT_CREATE
ENDASM
' Timers configuration
@Freq=4050
@Prescaler=1
T1CON=$00
' Interrupts enable
@INT_ENABLE TMR1_INT
GOSUB StartTimer
' Main program loop
mainlp:
' Debug display
if flag=0 then
LCDOUT $FE,$2,"Freq. adjust :"
LCDOUT $FE,$C0, DEC frequency
if PORTC.4=1 then frequency=frequency-1
if PORTC.5=1 then frequency=frequency+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
' PWM calculation and update interrupt (Timer 1)
pwmint:
' 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
' Timer1 interrupt handler
ASM
ReloadInst=8
MaxCount=65536+(ReloadInst/Prescaler)
TimerReload=MaxCount-(OSC*1000000/4/Prescaler/Freq)
ENDASM
' Timer1 variables
@Timer1=TMR1L
Timer1 VAR WORD EXT
'TimerReload VAR EXT
TMR1ON VAR T1CON.0
' Timer1 reload
ASM
ReloadTMR1
MOVE?CT 0,T1CON,TMR1ON
MOVLW LOW(TimerReload)
ADDWF TMR1L,F
BTFSC STATUS,C
INCF TMR1H,F
MOVLW HIGH(TimerReload)
ADDWF TMR1H,F
MOVE?CT 1,T1CON,TMR1ON
INT_RETURN
ENDASM
' Timer1 start/stop control
StartTimer:
Timer1=TimerReload
TMR1ON=1
RETURN
StopTimer:
TMR1ON=0
RETURN
Bookmarks