'Varying the output of a tri-color brightness using PWM 'Wright Hobbies, LLC 2004 'http://www.wrighthobbies.net 'Dim Variables Dim I As Byte , Tmp As Long Dim Timeslice As Long , Timebase As Long Dim Random1 As Word , Random2 As Word Dim Flashmode As Byte Dim Reddelay(5) As Long Dim Greendelay(5) As Long Dim Bluedelay(5) As Long Dim Redflag(5) As Byte Dim Greenflag(5) As Byte Dim Blueflag(5) As Byte 'Define Alias's Greenbrightness Alias Pwm1a Bluebrightness Alias Pwm1b Redbrightness Alias Ocr2 'LED Aliases Red Alias Portc Red1 Alias Portc.0 Red2 Alias Portc.1 Red3 Alias Portc.2 Red4 Alias Portc.3 Red5 Alias Portc.4 Green Alias Porta Green1 Alias Porta.0 Green2 Alias Porta.1 Green3 Alias Porta.2 Green4 Alias Porta.3 Green5 Alias Porta.4 Blue Alias Portb Blue1 Alias Portb.0 Blue2 Alias Portb.1 Blue3 Alias Portb.2 Blue4 Alias Portb.3 Blue5 Alias Portb.4 'Define Constants Const True = 1 Const False = 0 'Constants for Dazzle Mode Const Flash = 1 Const Dark = 1000 'Config statements Config Timer0 = Timer , Prescale = 64 Config Timer1 = Pwm , Pwm = 8 , Prescale = 64 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down Config Timer2 = Pwm , Prescale = 64 , Compare Pwm = Clear Up , Pwm = On 'Configure ports for Output or Input Config Portb = Output 'Set the Port B pins to output Config Porta = Output Config Portc = Output Config Portd = Output Config Pind.2 = Input Portd.2 = 1 On Timer0 T0_int Bluebrightness = 0 Greenbrightness = 0 Redbrightness = 0 Flashmode = 1 'Enable external interrupt Enable Int0 'Used for mode switch Enable Timer0 'Used as a general timer Enable Timer1 'Used for 2 PWM channels Enable Timer2 'Used for 3rd PWM channel Enable Interrupts On Int0 Buttonpushed 'Interrup routine triggered by the switch 'Start the timers Start Timer0 Start Timer1 Start Timer2 'Turn off all LEDs Red = 0 Green = 0 Blue = 0 'Set default brightness Redbrightness = 200 Bluebrightness = 200 Greenbrightness = 200 'Set startup mode to be off 'Start the light by pushing the button Flashmode = 0 'Main loop 'The flashmode variable is set in the Buttonpushed routine. 'Since that is interrupt driven, we don't need to poll the switch. Do Select Case Flashmode Case 0 'Power off 'Powerdown mode will reduce power consumption 'but can still be awakened by an external interrupt Blue = 0 Red = 0 Green = 0 Powerdown 'return from powerdown 'Disable the external interrupt while we do some housework Disable Int0 Red = 1 Blue = 1 Green = 1 Redbrightness = 200 Greenbrightness = 200 Bluebrightness = 200 'Debounce the switch Do If Pind.2 = 1 Then Exit Do Loop Enable Int0 'Default to mode 1 after powerdown Flashmode = 1 Case 1 'Color Cycling Random1 = Rnd(10) Select Case Random1 Case 1 Do 'cascade up and down Red = 0 Blue = 0 Green = 0 'red first Red = 1 For I = 1 To 5 If Flashmode <> 1 Then Exit For Waitms 50 Red = Red * 2 Next I Red = 0 'Blue Blue = 1 For I = 1 To 5 If Flashmode <> 1 Then Exit For Waitms 50 Blue = Blue * 2 Next I Blue = 0 'green Green = 1 For I = 1 To 5 If Flashmode <> 1 Then Exit For Waitms 50 Green = Green * 2 Next I Green = 0 Loop Until Flashmode <> 1 End Select Case 2 'All blue Bluebrightness = 0 Blue = 31 Green = 0 Red = 0 'ramp up blue For I = 1 To 200 Bluebrightness = I If Flashmode <> 2 Then Exit For Waitms 10 Next I Do Loop Until Flashmode <> 2 Blue = 0 Bluebrightness = 200 Case 3 'All Red Redbrightness = 0 Red = 31 Blue = 0 Green = 0 For I = 1 To 200 Redbrightness = I If Flashmode <> 3 Then Exit For Waitms 10 Next I Do Loop Until Flashmode <> 3 Red = 0 Redbrightness = 200 Case 4 'All Green Greenbrightness = 0 Green = 31 Blue = 0 Red = 0 For I = 1 To 200 Greenbrightness = I If Flashmode <> 4 Then Exit For Waitms 10 Next I Do Loop Until Flashmode <> 4 Green = 0 Greenbrightness = 200 Case 5 'All Colors Red = 31 Green = 31 Blue = 31 Greenbrightness = 0 Bluebrightness = 0 Redbrightness = 0 For I = 1 To 200 Bluebrightness = I Redbrightness = I Greenbrightness = I If Flashmode <> 5 Then Exit For Waitms 10 Next I Do Loop Until Flashmode <> 5 Case 6 'Twinkle mode 'Each LED/Color will randomly blink momentarily For I = 1 To 5 'Check Red If Timeslice > Reddelay(i) Then If Redflag(i) = False Then Redflag(i) = True Reddelay(i) = Reddelay(i) + Flash Select Case I Case 1 Red1 = True Case 2 Red2 = True Case 3 Red3 = True Case 4 Red4 = True Case 5 Red5 = True End Select Else If Timeslice > Reddelay(i) Then Redflag(i) = False Reddelay(i) = Rnd(dark) Reddelay(i) = Reddelay(i) + Timeslice Select Case I Case 1 Red1 = False Case 2 Red2 = False Case 3 Red3 = False Case 4 Red4 = False Case 5 Red5 = False End Select End If End If End If Next I For I = 1 To 5 'Check blue If Timeslice > Bluedelay(i) Then If Blueflag(i) = False Then Blueflag(i) = True Bluedelay(i) = Bluedelay(i) + Flash Select Case I Case 1 Blue1 = True Case 2 Blue2 = True Case 3 Blue3 = True Case 4 Blue4 = True Case 5 Blue5 = True End Select Else If Timeslice > Bluedelay(i) Then Blueflag(i) = False Bluedelay(i) = Rnd(dark) Bluedelay(i) = Bluedelay(i) + Timeslice Select Case I Case 1 Blue1 = False Case 2 Blue2 = False Case 3 Blue3 = False Case 4 Blue4 = False Case 5 Blue5 = False End Select End If End If End If Next I For I = 1 To 5 'Check Red If Timeslice > Greendelay(i) Then If Greenflag(i) = False Then Greenflag(i) = True Greendelay(i) = Greendelay(i) + Flash Select Case I Case 1 Green1 = True Case 2 Green2 = True Case 3 Green3 = True Case 4 Green4 = True Case 5 Green5 = True End Select Else If Timeslice > Greendelay(i) Then Greenflag(i) = False Greendelay(i) = Rnd(dark) Greendelay(i) = Greendelay(i) + Timeslice Select Case I Case 1 Green1 = False Case 2 Green2 = False Case 3 Green3 = False Case 4 Green4 = False Case 5 Green5 = False End Select End If End If End If Next I End Select Loop End Buttonpushed: 'Interrupt triggered Waitms 100 'Debounce the switch Do Waitms 100 If Pind.2 = 1 Then Exit Do 'Wait for person to release the switch Loop Incr Flashmode 'Change the flash mode variable If Flashmode > 6 Then Flashmode = 0 Return T0_int: 'Interrupt Routine for timer used in twinkle mode Incr Timeslice Timer0 = 100 Return