Hi srigopal,
There are quite a few ways to do this. Here's one. This version just stops your PWM change.
Code:
Stop_Switch VAR PORTC.0 ' Whatever pin you prefer
Go_Switch VAR PORTC.1 ' Whatever pin you prefer
Duty VAR WORD ' Duty cycle
LowCycle VAR WORD ' Low cycle
HighCycle VAR WORD ' High cycle
Period VAR WORD ' Frequency period
Cycles VAR WORD '
Active VAR BIT ' Active/Inactive flag bit
YEP CON 1 ' PWM will be Active
NOPE CON 0 ' PWM will not be Active
End_Cycles CON 500 ' Increase value to slow PWM duty cycle change
Active = YEP ' PWM defaults to Active
TRISC = %00000011 ' Make em inputs
TRISB = 0 ' All outs
Period = 500 ' Set frequency here. 500 = ~1.983kHz
' 250 = ~3.825kHz, etc,
Duty = 250 ' Set whatever you prefer here to start with
' 250 = ~50% (1/2 of period)
Main:
IF Go_Switch = 0 THEN ' Go_Switch pressed?
Active = YEP ' Yes, toggle flag bit
ENDIF
IF Stop_Switch = 0 THEN ' Stop_Switch pressed?
Active = NOPE ' Yes. toggle flag bit
ENDIF
IF Active = YEP THEN
IF Duty < Period THEN
Duty = Duty + 1
ELSE
Duty = 0 ' Limit Duty from 0 to 100%
ENDIF
ENDIF
' Compute high & low cycles of Period
LowCycle = Period - Duty
HighCycle = Period - LowCycle
For Cycles = 0 to End_Cycles
Portb = %00000000
Pauseus LowCycle
Portb = %00000001
Pauseus HighCycle
Next Cycles
GOTO Main
And if you want to stop PWM altogether, then a slight change in this routine would do it for you.
Code:
IF Active = YEP THEN
For Cycles = 0 to End_Cycles
Portb = %00000000
Pauseus LowCycle
Portb = %00000001
Pauseus HighCycle
Next Cycles
ENDIF
Of course there are many other ways to do this, but this gives you a good idea of at least 1 way.
Bookmarks