Device = 18F2420
Clock = 8
Include "InternalOscillator.bas"
Include "RandGen.bas"
Include "Utils.bas"
Dim TMR2IE As PIE1.1, // TMR2 interrupt enable
TMR2IF As PIR1.1, // TMR2 overflow flag
TMR2ON As T2CON.2, // Enables TMR2 to begin incrementing
Signal_Pin As PORTB.0 // Signal output to frequency meter
Dim Red_Pin As PORTA.2, //was b.0
Green_Pin As PORTA.0, //was b1
Blue_Pin As PORTA.1, //was b2
Red_Duty As Byte,
Green_Duty As Byte,
Blue_Duty As Byte,
Red_DutyVal As Byte,
Green_DutyVal As Byte,
Blue_DutyVal As Byte,
RandomVal As Byte
Dim uS As Word,
mS As Word,
ranval(1)As Word
Interrupt TMR2_Interrupt()
High(Signal_Pin)
Save(0) // Back up system variables
If TMR2IF = 1 Then // Check if the interrupt was from TMR2
TMR2IF = 0 // Clear the TMR2 interrupt flag
uS = uS + 50
If uS >= 1000 Then
uS = uS - 1000
Inc(mS)
EndIf
Inc(Red_DutyVal)
Inc(Green_DutyVal)
Inc(Blue_DutyVal)
If Red_DutyVal > Red_Duty Or Red_Duty = 0 Then
Red_Pin = 0
Else
Red_Pin = 1
EndIf
If Green_DutyVal > Green_Duty Or Green_Duty = 0 Then
Green_Pin = 0
Else
Green_Pin = 1
EndIf
If Blue_DutyVal > Blue_Duty Or Blue_Duty = 0 Then
Blue_Pin = 0
Else
Blue_Pin = 1
EndIf
EndIf //
Restore // Restore system variables
Low(Signal_Pin)
End Interrupt
Private Sub TMR2_Initialize()
TMR2ON = 0 // Disable TMR2
TMR2IE = 0 // Turn off TMR2 interrupts
PR2 = 149 // TMR2 Period register PR2
T2CON = %00000001 // T2CON 0:1 = Prescale
// 00 = Prescale is 1:1
// 01 = Prescale is 1:4
// 1x = Prescale is 1:16
// 3:6 = Postscale
// 0000 = 1:1 postscale
// 0001 = 1:2 postscale
// 0010 = 1:3 postscale...
// 1111 = 1:16 postscale
TMR2 = 0 // Reset TMR2 Value
TMR2IE = 1 // Enable TMR2 interrupts
TMR2ON = 1 // Enable TMR2 to increment
Enable(TMR2_Interrupt)
End Sub
// Start Of Program...
Low(Red_Pin)
Low(Green_Pin)
Low(Blue_Pin)
Red_Duty = 255
Green_Duty = 0
Blue_Duty = 0
Red_DutyVal = 0
Green_DutyVal = 0
Blue_DutyVal =0
uS = 0
mS = 0
RandGen.Initialize(128) // Initialize the Random Number generator
TMR2_Initialize // Setup and enable TMR2
While true // Create an infinite loop
RandomVal = RandGen.Rand // Grab a random number from 0 to 255
Select RandomVal // Find out what colour to increase/decrease
Case 0 To 42
If Red_Duty =RandomVal-5
Then mS = 0
Repeat
Until mS = 19
And Red_Duty>0
End If
' Case 43 To 83
If Red_Duty > 0
Then mS = 0
Repeat
Until mS = 20
Dec(Red_Duty)
EndIf
'Case 84 To 127
If Green_Duty =RandomVal-20
Then mS = 0
Repeat
Until mS = 19
Inc(Green_Duty)
End If
'Case 128 To 170
If Green_Duty > 0
Then mS = 0
Repeat
Until mS = 40
Inc(Green_Duty)
DelayMS(5000)
EndIf
'Case 171 To 212
If Blue_Duty = RandomVal-30
Then mS = 0
Repeat
Until mS = 19
Inc(Blue_Duty)
End If
'Case 213 To 255
If Blue_Duty > 0
Then mS = 0
Repeat
Until mS = 20
DelayMS(5000)
Inc(Blue_Duty)
EndIf
End Select
Wend
End
{
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Candle Code test using PWM
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
}
Device = 18F13K22
Clock = 8
Include "osc1322.bas"
Include "RandGen.bas"
Include "Util1322.bas"
// import PWM module...
Include "PWM2.bas"
Const color(10) As Byte = (100, 70,65, 90,75,95,85, 60, 80, 85)
// local duty variable...
Dim Duty As Byte
Dim x As Word
Dim blue As PORTB.6
Dim red As PORTB.5
Dim chA As PORTC.5
Dim chB As PORTC.4
Dim chC As PORTC.3
Dim chD As PORTC.2
// main program...
pwm.SetFreq(5000)
pwm.Start1
PSTRCON = $07
Output (blue)
Output (red)
Output (chA)
Output (chB)
Output (chC)
Output (chD)
While true
red = 1
blue = 1
For x = 0 To 10
red = 0
Duty = 0
Repeat
pwm.SetDuty1Percent(Duty)
Inc(Duty)
'red = PORTC.5
'blue = PORTC.5
DelayMS(5)
red = 0
Until Duty = color(x)
Repeat
pwm.SetDuty1Percent(Duty)
Dec(Duty)
red = 0
If Duty = 60 Then
blue = 0
DelayMS(500)
blue = 1
Else blue = 1
End If
DelayMS(30)
Until Duty=0
Next
Wend
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?