hi guys...
I've been trying to figure this out all weekend and I'm stumped...
I have a project that I'm doing for my sisters birthday. It uses all 5 hardware PWM on the 18F46K22.
However, i noticed the channels were 'bliping' and channels that were at 0% suddenly jumping to an on state and then back to off...
So, i set up some test hardware with two loop back fets to act as voltage regulators and LEDs to find the cause and it was still doing...
Still, no matter what i hang off the PWM's they blip randomly...
Even if i set them to a specific value and do not update the pwms', they still blip...
I have never seen this before and i have used the PWMs many time and not seen this. I tried all my other 46K22's and they do the same with the same firmware on.
So, I'll include the code from my last test setup... if someone would be so kind as to look over it to see if i have done something stupid...
Thanks
Be aware, the PWM outputs are in this case inverted due to direct drive of P channel fets. Tried with and without fets, transistors etc etc...Code:@ __config _CONFIG1H, _FOSC_INTIO67_1H & _PLLCFG_ON_1H & _PRICLKEN_ON_1H & _FCMEN_OFF_1H & _IESO_OFF_1H @ __config _CONFIG2L, _PWRTEN_ON_2L & _BOREN_SBORDIS_2L & _BORV_220_2L @ __config _CONFIG2H, _WDTEN_OFF_2H & _WDTPS_32768_2H & _CCP2MX_PORTC1_3H & _PBADEN_OFF_3H @ __config _CONFIG3H, _CCP3MX_PORTE0_3H & _HFOFST_OFF_3H & _T3CMX_PORTC0_3H & _P2BMX_PORTC0_3H & _MCLRE_INTMCLR_3H @ __config _CONFIG4L, _STVREN_ON_4L & _LVP_OFF_4L & _XINST_OFF_4L & _DEBUG_OFF_4L @ __config _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L @ __config _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H @ __config _CONFIG6L, _WRT0_OFF_6L @ __config _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H @ __config _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L @ __config _CONFIG7H, _EBTRB_OFF_7H Define OSC 64 ' Set clock speed OSCCON.7 = 0 OSCCON.6 = 1 OSCCON.5 = 1 OSCCON.4 = 1 OSCCON.1 = 0 OSCCON.0 = 0 OSCTUNE.6 = 1 ; PLL ;INCLUDE "18F46K22 unlock.pbp" ANSELA = %00000011 ANSELB = %00000000 ANSELC = %00000000 ANSELD = %00000000 ANSELE = %00000000 TRISB = 0 PORTB = 0 TRISC = %00000000 PORTC = 0 TRISD = %00000000 PORTD = 255 TRISE = 0 PORTE = 255 TRISA = %00000011 INCLUDE "DT_INTS-18.bas" ; Base Interrupt System INCLUDE "ReEnterPBP-18.bas" ; Include if using PBP interrupts ASM INT_LIST macro ; IntSource, Label, Type, ResetFlag? INT_Handler AD_INT, _ADC_HANDLER, PBP, yes ; INT_Handler HLVD_INT, _HLVD, PBP, yes endm INT_CREATE ; Creates the interrupt processor ENDASM VREFCON0 = %10100000 ADC0 VAR WORD REDLEDPWM VAR BYTE GREENLEDPWM VAR BYTE BLUELEDPWM VAR BYTE ADCCHAN VAR BIT LOWVOLTAGE VAR BIT ALOOP VAR WORD BLOOP VAR WORD CLOOP VAR WORD DLOOP VAR WORD TEMPBYTE VAR BYTE PAUSETIME VAR WORD CLEAR VREG1TGT CON 535 VREG2TGT CON 815 ADCCHAN = 0 ADCON2 = %10111111 ADCON1 = %00001000 ADCON0 = %00000011 ;HLVDCON = %00110111 REDVREGPWM VAR BYTE GBWVREGPWM VAR BYTE @ INT_ENABLE AD_INT ;@ INT_ENABLE HLVD_INT REDVREGPWM = 255 GBWVREGPWM = 255 REDLEDPWM = 0 GREENLEDPWM = 0 BLUELEDPWM = 0 GOSUB UPDATELEDPWM GOSUB UPDATEVREGPWM PAUSE 1000 MAIN: ;We do something here to make the LED's produce pretty colors, ramp them up, down, flash them... and then "GOSUB UPDATELEDPWM" to update the PWM's ;REDLEDPWM = 0 ;GREENLEDPWM = 0 ;BLUELEDPWM = 0 ;PAUSE 1000 ;GOSUB UPDATELEDPWM ;GOTO MAIN ;REDLEDPWM = 128 ;GREENLEDPWM = 255 ;BLUELEDPWM = 128 ;GOSUB UPDATELEDPWM ;Pause 1000 ;REDLEDPWM = 128 ;GREENLEDPWM = 128 ;BLUELEDPWM = 255 ;GOSUB UPDATELEDPWM ;Pause 1000 ;REDLEDPWM = 255 ;GREENLEDPWM = 128 ;BLUELEDPWM = 128 ;GOSUB UPDATELEDPWM ;Pause 1000 GOTO MAIN ADC_HANDLER: ADC0.LOWBYTE = ADRESL ADC0.HIGHBYTE = ADRESH IF ADCCHAN = 0 then IF ADC0 < VREG1TGT then IF REDVREGPWM > 0 then REDVREGPWM=REDVREGPWM - 1 ELSE IF REDVREGPWM < 255 then REDVREGPWM=REDVREGPWM + 1 ENDIF GOSUB UPDATEVREGPWM ADCCHAN = 1 ADCON0 = %00000111 ELSE IF ADC0 < VREG2TGT then IF GBWVREGpwm > 0 then GBWVREGpwm = GBWVREGpwm - 1 ELSE IF GBWVREGpwm < 255 then GBWVREGpwm = GBWVREGpwm + 1 ENDIF GOSUB UPDATEVREGPWM ADCCHAN = 0 ADCON0 = %0000011 ENDIF @ INT_RETURN UPDATEVREGPWM: HPWM 1,REDVREGPWM,3000 HPWM 2,GBWVREGpwm,3000 RETURN UPDATELEDPWM: TEMPBYTE = 255 - REDLEDPWM HPWM 3,TEMPBYTE,3000 TEMPBYTE = 255 - GREENLEDPWM HPWM 4,TEMPBYTE,3000 TEMPBYTE = 255 - BLUELEDPWM HPWM 5,TEMPBYTE,3000 RETURN
Also, actual PWM frequency is 12.9KHz due to the 4X PLL bug still present in PBP 2.60C
All help greatly appreciated...




Bookmarks