Controlling a RGB with PWM

Post here to discuss programming with swordfish basic

Moderators: Chuckt, Garth, bitfogav

Post Reply [phpBB Debug] PHP Warning: in file [ROOT]/vendor/twig/twig/lib/Twig/Extension/Core.php on line 1266: count(): Parameter must be an array or an object that implements Countable
User avatar
bitfogav
Moderator
Moderator
Posts: 915
Joined: Sun Mar 28, 2010 9:03 pm
Location: United Kingdom
Contact:

Controlling a RGB with PWM

Post by bitfogav » Sun Sep 08, 2013 11:18 pm

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 767 times
If you don't know what Voltage your country is using, you shouldn't be doing electronics ;-)

User avatar
brad
Site Admin
Site Admin
Posts: 2578
Joined: Fri Mar 26, 2010 10:30 pm
[phpBB Debug] PHP Warning: in file [ROOT]/vendor/twig/twig/lib/Twig/Extension/Core.php on line 1266: count(): Parameter must be an array or an object that implements Countable

Re: Controlling a RGB with PWM

Post by brad » Mon Sep 09, 2013 10:06 pm

Thanks for that Gav, I'll have to put a little something together also.

Anything you'd like to see here Stacy?

Post Reply
[phpBB Debug] PHP Warning: in file [ROOT]/vendor/twig/twig/lib/Twig/Extension/Core.php on line 1266: count(): Parameter must be an array or an object that implements Countable
[phpBB Debug] PHP Warning: in file [ROOT]/vendor/twig/twig/lib/Twig/Extension/Core.php on line 1266: count(): Parameter must be an array or an object that implements Countable

Who is online

Users browsing this forum: No registered users and 13 guests