He checks for 36, shouldn't it be 35?
Robert
He checks for 36, shouldn't it be 35?
Robert
Right, I forgot to check when the step was incremented, argh, and that's basic debugging procedure too (must be going senile).
Could the length of PAUSE be an issue?
http://www.picbasic.co.uk/forum/showthread.php?t=1853
Would placing PAUSE 1 within a loop make a difference?
What about using microseconds instead of milliseconds?
There's a minimum delay in microseconds in the PBP manual, but I don't see oscillator setting in that last code.
Robert
No change even if the pause 1, what I want to ask is the values in the look table greater than 255 may affect the sinwave and cause the signal to be distorted?. Can any one simulates the code and see the effect. Why the output look like this because I have try to eliminate the problem of flat spot for almost 4days but the problem still exit even although I try to edit my look table as HenrikOlsson told me about the value 512 ).
Code:define OSC 4 Wsave var byte $70system Wsave1 var byte $A0system Wsave2 var byte $120system Wsave3 var byte $1A0system STEPCOUNT var byte STEPCOUNT1 var byte LED1 VAR PORTB.1 STEPCOUNT = 0 'pointer for phase one in sinearray STEPCOUNT1 = 12 'pointer for phase two in sine array ADCON0 = %00000000 ADCON1 = %00000000 TRISB = %11111101 TRISC = %11111001 'PMW output for CCP1 AND CCP2 TRISA = %11111111 TMR2 = 0 PR2 = 199 'generate 5khz 'set for 18Khz HPWM CCP1CON = %00001100 'set CCP1 for PWM OPERATION CCP2CON = %00001100 'set CCP2 for PWM OPERATION T2CON = %00000100 'TIMER2ON and prescale of 1:1 sineval var byte[36] sineval[0] = 512 sineval[1] = 583 sineval[2] = 652 sineval[3] = 717 sineval[4] = 775 sineval[5] = 825 sineval[6] = 866 sineval[7] = 896 sineval[8] = 915 sineval[9] = 921 sineval[10] =915 sineval[11] =896 sineval[12] =866 sineval[13] =825 sineval[14] =775 sineval[15] =716 sineval[16] =652 sineval[17] =583 sineval[18] =512 sineval[19] = 441 sineval[20] = 372 sineval[21] = 308 sineval[22] = 249 sineval[23] = 199 sineval[24] = 158 sineval[25] = 128 sineval[26] = 109 sineval[27] = 103 sineval[28] = 109 sineval[29] = 128 sineval[30] = 158 sineval[31] = 199 sineval[32] = 249 sineval[33] = 308 sineval[34] = 372 sineval[35] = 441 timerone var word Temp var byte Temp1 var byte INCLUDE "DT_INTS-14.bas" ; Base Interrupt System emp 'INCLUDE "ReEnterPBP.bas" ASM INT_LIST macro ; IntSource, Label, Type, ResetFlag? INT_Handler TMR1_INT, _sine, ASM, yes endm INT_CREATE ; Creates the interrupt processor ENDASM T1CON = 000001 ; Prescaler = 1;1, TMR1 ON @ INT_ENABLE TMR1_INT ; Enable Timer 1 Interrupts timerone = 65080' gives1818hz nterruptfrequency or about 50 htz sine Main: PAUSE 1 GOTO Main '---[TMR1_INT - interrupt handler]------------------------------------------ sine: T1CON = 000000 'stop the timer TMR1L = timerone.byte0 'reload the timer TMR1H = timerone.byte1 T1CON = 000001 ' start the timer TeMP = sineval[STEPCOUNT] CCP1CON.4 = Temp.0 ' bit 0 CCP1CON.5 = Temp.1 ' bit 1 CCPR1L = Temp >>2 'Bit 2-7 TeMP1 = sineval[STEPCOUNT1] CCP2CON.4 = Temp1.0 ' bit 0 CCP2CON.5 = Temp1.1 ' bit 1 CCPR2L = Temp1 >>2 'Bit 2-7 TOGGLE LED1 stepcount = stepcount +1 stepcount1 = stepcount1 +1 if stepcount =36 then stepcount =0 if stepcount1 =36 then stepcount1 =0 @ INT_RETURN
Hi,
Do not trust in Proteus/Isis ...
I sometimes have some VERY funny results when it perfectly works in real life ...![]()
" lots of examples available " ... especially when schemes are mixing analogic and digital !!!
Alain
************************************************** ***********************
Why insist on using 32 Bits when you're not even able to deal with the first 8 ones ??? ehhhhhh ...
************************************************** ***********************
IF there is the word "Problem" in your question ...
certainly the answer is " RTFM " or " RTFDataSheet " !!!
*****************************************
The array should be of WORDs if you want it to hold values greater than 255.Code:sineval var byte[36] sineval[0] = 512 sineval[1] = 583 ...
PROTEUS Rules!!
DT
What Darrel said.
AND
In a post made March 13th:You have several values larger than 796 (4*199 (which is what you have PR2 set to, remember we've been thru this)) in your lookuptable so you are "overdriving" the dutycycle register and "clipping" will occur.You answered your own question in (1) from the Midrange manual:
(1) " If the PWM duty cycle value is longer than the PWM period, the CCPx pin will not be cleared. This allows a duty cycle of 100%".
Any dutycycle value above 796 will result in 100% dutycycle. In other words your SIN-output will be distorted/clipped.
/Henrik.
Hi to all
I tried to modify the code according to Darrel Taylor and HenrikOlsson comments but the problem still exits, let me put in real hardware and see what happen.
And here is modified code but the output is still like that posted in the previous post.
Thanks.Code:define OSC 4 Wsave var byte $70system Wsave1 var byte $A0system Wsave2 var byte $120system Wsave3 var byte $1A0system STEPCOUNT var byte STEPCOUNT1 var byte LED1 VAR PORTB.1 STEPCOUNT = 0 'pointer for phase one in sinearray STEPCOUNT1 = 12 'pointer for phase two in sine array ADCON0 = %00000000 ADCON1 = %00000000 TRISB = %11111101 TRISC = %11111001 'PMW output for CCP1 AND CCP2 TRISA = %11111111 TMR2 = 0 PR2 = 199 'generate 5khz 'set for 18Khz HPWM CCP1CON = %00001100 'set CCP1 for PWM OPERATION CCP2CON = %00001100 'set CCP2 for PWM OPERATION T2CON = %00000100 'TIMER2ON and prescale of 1:1 sineval var word[36] sineval[0] = 512 sineval[1] = 556 sineval[2] = 599 sineval[3] = 640 sineval[4] = 676 sineval[5] = 707 sineval[6] = 733 sineval[7] = 752 sineval[8] = 763 sineval[9] = 767 sineval[10] =763 sineval[11] =752 sineval[12] =733 sineval[13] =707 sineval[14] =676 sineval[15] =640 sineval[16] =599 sineval[17] =556 sineval[18] =512 sineval[19] =468 sineval[20] =425 sineval[21] =385 sineval[22] =348 sineval[23] =317 sineval[24] =291 sineval[25] =272 sineval[26] =261 sineval[27] =257 sineval[28] =261 sineval[29] =272 sineval[30] = 291 sineval[31] = 317 sineval[32] = 348 sineval[33] = 385 sineval[34] = 425 sineval[35] = 468 timerone var word Temp var byte Temp1 var byte INCLUDE "DT_INTS-14.bas" ; Base Interrupt System emp 'INCLUDE "ReEnterPBP.bas" ASM INT_LIST macro ; IntSource, Label, Type, ResetFlag? INT_Handler TMR1_INT, _sine, PBP, yes endm INT_CREATE ; Creates the interrupt processor ENDASM T1CON = 000001 ; Prescaler = 1;1, TMR1 ON @ INT_ENABLE TMR1_INT ; Enable Timer 1 Interrupts timerone = 65080' gives1818hz nterruptfrequency or about 50 htz sine Main: PAUSE 5 GOTO Main '---[TMR1_INT - interrupt handler]------------------------------------------ sine: T1CON = 000000 'stop the timer TMR1L = timerone.byte0 'reload the timer TMR1H = timerone.byte1 T1CON = 000001 ' start the timer TeMP = sineval[STEPCOUNT] CCP1CON.4 = Temp.0 ' bit 0 CCP1CON.5 = Temp.1 ' bit 1 CCPR1L = Temp >>2 'Bit 2-7 TeMP1 = sineval[STEPCOUNT1] CCP2CON.4 = Temp1.0 ' bit 0 CCP2CON.5 = Temp1.1 ' bit 1 CCPR2L = Temp1 >>2 'Bit 2-7 TOGGLE LED1 stepcount = stepcount +1 stepcount1 = stepcount1 +1 if stepcount =36 then stepcount =0 if stepcount1 =36 then stepcount1 =0 @ INT_RETURN
Bookmarks