PDA

View Full Version : Multi Slow speed PWM and Instant Interrupts



DaveC3
- 7th December 2009, 21:59
I am using a 18F14K50 with Instant Interrupts to refresh USB service. I want to use the slow speed PWM code Darrel Taylor has posted way back when.

I am using PBP 2.6 MPLAB 8.33.

The program excluding Slow Speed PWM compiles and works fine.

When I add (Include "Multi_SPWM.pbp" ) I get these errors
ERROR Line 23: Redefinition of VAR. (DT_INTS-18.bas)
ERROR Line 24: Redefinition of VAR. (DT_INTS-18.bas)
ERROR Line 25: Redefinition of VAR. (DT_INTS-18.bas)


If I comment the wsave, ssave and bsave in Multi_SPWM.pbp I get these errors

Duplicate macro name (int_return)
Unmatched ENDM

I assume it is a conflict between the multi slow speed PWM and the instant interrupt codes. I do not know if it is possible to run both at the same time.

Thanks

Dave

Darrel Taylor
- 7th December 2009, 22:50
Hi Dave,

You can use the SPWM_INT version with DT_INTS-18.

http://www.darreltaylor.com/DT_INTS-14/SPWM.html
<br>

DaveC3
- 7th December 2009, 23:57
Thanks Darrel

I will give it a try.

Dave

DaveC3
- 8th December 2009, 02:44
Darrel

It worked great

Thanks again

Dave

aberco
- 2nd November 2010, 02:28
Trying to get that setup working too, PIC18F14K50 and these:



INCLUDE "cdc_desc.bas"
INCLUDE "DT_INTS-18.bas"
INCLUDE "ReEnterPBP-18.bas"
INCLUDE "SPWM_INT.bas"
INCLUDE "USB_ASM_Service.pbp"

ASM
;----[High Priority Interrupts]-------------------------
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler INT0_INT, _ButtonPressed, PBP, Yes
INT_Handler TMR1_INT, SPWMhandler, ASM, yes
INT_Handler USB_INT, _DoUSBSERVICE, PBP, yes
endm
INT_CREATE ; Creates the High Priority interrupt processor
ENDASM


However I'm having a hard time to get a smooth PWM output that is not perturbed by the DoUSBSERVICE routine... So far the best results I got is by inserting INT_DISABLE USB_INT / INT_ENABLE USB_INT into the SPWMhandler, however the output still flicker quite a bit. I also tried to turn USB_INT into a lower priority interrupt but that doesn't work (the PIC does crash).

Is there a particular solution to make them work together? any hint on this would be greatly appreciated.

Darrel Taylor
- 2nd November 2010, 02:47
USB_INT should be an ASM "type" interrupt. I think we talked about that before.
Make it low priority.

How many SPWMints, what freq, what resolution.
Not enough information, and I'd guess you are maxed out.

Remember ... 25,600 interrupts per second for SPWM_RES 256 @ 100hz.

aberco
- 2nd November 2010, 11:10
Yes I understand that it is very CPU intensive... Here's the settings for the PWM:

CPU @ 48Mhz 3 PWM channels with
DEFINE SPWM_FREQ 100 'SPWM Frequency
DEFINE SPWM_RES 256 'SPWM Resolution

I tried dropping SPWM_FREQ to 40 and SPWM_RES 100 but it is still very irregular. It works well when de D+/D- lines are disconnected, so there's good chances the USB interrupt does takes too much time.

USB INT does contains much more than just USBSERVICE. There's about a dozen PBP instructions to update de status of "Plugged, RX_READY and TX_READY" and this is why I have it as a PBP interrupt. Tried turning it into an ASM interrupt and it does work too, but that's very confusing to me??!

Darrel Taylor
- 2nd November 2010, 12:34
It's called "USB_ASM_Service" for a reason. ;)
It's ASM compatible, even though it uses some PBP syntax.

Those PBP statements don't use any of PBP's system registers.

When you made it ASM, was it also Low Priority?

aberco
- 2nd November 2010, 12:50
Hey Darrel, ok I understand "ASM" better.

I have everything as high priority interrupt and deleted all my little tweaking attempt. I got it to work nicely now, even with SPWM_FREQ 200. I however don't understand why at first it was not working as is, must have done something wrong :confused:

Anyway thanks for your help! this is a great routine!