Page 1 of 1

Controlling a RGB with PWM

Posted: Sun Sep 08, 2013 11:18 pm
by bitfogav
Simple programme to control a single RGB led using Swordfish.

Code: Select all

Device = 18F4550
Clock = 48

Config  PLLDIV = 5,      
        CPUDIV = OSC1_PLL2,
        USBDIV = 2,       
        FOSC = HSPLL_HS 
        
Include "RandGen.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 PORTC.0,    
    Green_Pin As PORTC.1,    
    Blue_Pin As PORTC.2,    
    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            
    
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 = 0
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            
                    While Red_Duty < 255                
                        mS = 0                
                        Repeat                
                        Until mS = 19                
                        Inc(Red_Duty)            
                    Wend        
                Case 43 To 84            
                    While Red_Duty > 0                
                        mS = 0                
                        Repeat                
                        Until mS = 19                
                        Dec(Red_Duty)            
                    Wend        
                Case 84 To 127            
                    While Green_Duty < 255                
                        mS = 0                
                        Repeat                
                        Until mS = 19                
                        Inc(Green_Duty)            
                    Wend        
                Case 128 To 170            
                    While Green_Duty > 0                
                        mS = 0                
                        Repeat                
                        Until mS = 19                
                        Dec(Green_Duty)            
                    Wend        
                Case 170 To 212            
                    While Blue_Duty < 255                
                        mS = 0                
                        Repeat                
                        Until mS = 19                
                        Inc(Blue_Duty)            
                    Wend        
                Case 212 To 255            
                    While Blue_Duty > 0                
                        mS = 0                
                        Repeat                
                        Until mS = 19                
                        Dec(Blue_Duty)            
                    Wend     
    End Select           
Wend
You may need to download the random gen module and include it into your user library folder.
RandGen.zip
(970 Bytes) Downloaded 941 times

Re: Controlling a RGB with PWM

Posted: Mon Sep 09, 2013 10:06 pm
by brad
Thanks for that Gav, I'll have to put a little something together also.

Anything you'd like to see here Stacy?