Thanks Henrik, now I use TMR1L and TMR1H registers, I got a 40 Hz sine (it's better).
I've heavly modified the code, I didn't use the SIN function anymore, but a lookup table with 72 values (5 degrees/value).
Now, for debugging, I want to vary the timer value. For that, I use two buttons, one for increase (PORTC.4), one for decrease (PORTC.5), and then display the value to my LCD.
The LCD works fine, but not the inputs. If I push the buttons, nothing happens. No increase or decrease. Same thing in the simulator.
My code :
The faulty code is in bold.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 10000 DEFINE LCD_DATAUS 1000 ' BAS includes INCLUDE "DT_INTS-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 ' Variables definition ustep=72 ' 360 degrees phase angle vstep=48 ' 240 degrees phase angle wstep=24 ' 120 degrees phase angle timer=60950 ' Frequency adjust (60950=80Hz) amplitude=65535 ' Sinewave amplitude adjust (65535=max amplitude) carrier=1023 ' Carrier frequency adjust (1023=13kHz) ' PWM carrier frequency register configuration PTPERL=carrier.lowbyte PTPERH=carrier.highbyte ' Inverter startup pause 2000 Lcdout $FE,1 LCDOUT $FE,2,"Varidrive 1.0" LCDOUT $FE,$C0,"DR Electronique" pause 2000 ' Interrupt processor ASM INT_LIST macro INT_Handler TMR1_INT, _pwmint, ASM, yes endm INT_CREATE ENDASM ' Timer configuration T1CON=%1 @ INT_ENABLE TMR1_INT test var word test=1 ' Main program loop mainlp: ' Debug display LCDOUT $FE,1 LCDOUT $FE,2,"Timer var :" LCDOUT $FE,$C0,#test if PORTC.4=1 then test=test-1 if PORTC.5=1 then test=test+1 pause 100 goto mainlp ' PWM calculation and update interrupt pwmint: ' Sinewaves frequency TMR1L=timer.lowbyte TMR1H=timer.highbyte ' 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=72 if vstep=0 then vstep=72 if wstep=0 then wstep=72 @ INT_RETURN




Bookmarks