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