It is currently Sun May 19, 2013 4:03 pm

All times are UTC + 10 hours




Post new topic Reply to topic  [ 3 posts ] 
Author Message
 Post subject: PWM to control 8 LEDS using SF Basic
PostPosted: Sun Aug 15, 2010 8:17 pm 
Offline
Moderator
Moderator
User avatar

Joined: Sun Mar 28, 2010 9:03 pm
Posts: 699
Location: United Kingdom
Heres a way of controlling 8 LEDs connected to one PORT, some of this code was from digital-diy.com but I made it so it controlled 8 leds and added more functions, the code might not be very efficient but its works and it would make a great lighting effect if you was to make Led arrays from it. :)

Code:
Device = 18F4550    // this is what microchip we are using
Clock = 48          // makes the micro work at 12 million instructions per sec (using a 20mhz crystal)

Config  PLLDIV = 5,         // configure PPL and our OSC settings   
        CPUDIV = OSC1_PLL2,
        USBDIV = 2,       
        FOSC = HSPLL_HS
       
Include "RandGen.bas"     // this module will give us a random numbers between 0 - 255     

// Our Variables       
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 PORTD.0           // Signal output to frequency meter (debugging)

Dim one_Pin As PORTB.0,         // Out control pins...
    two_Pin As PORTB.1,   
    three_Pin As PORTB.2,
    four_Pin As PORTB.3,
    five_Pin As PORTB.4,
    six_Pin As PORTB.5,
    seven_Pin As PORTB.6,
    eight_Pin As PORTB.7
           
       
Dim one_Duty As Byte,           // user pwm control
    two_Duty As Byte,   
    three_Duty As Byte,
    four_Duty As Byte,
    five_Duty As Byte,
    six_Duty As Byte,
    seven_Duty As Byte,
    eight_Duty As Byte,
   
    all_Duty As Byte,
       
    one_DutyVal As Byte,   
    two_DutyVal As Byte,   
    three_DutyVal As Byte,
    four_DutyVal As Byte,
    five_DutyVal As Byte,
    six_DutyVal As Byte,
    seven_DutyVal As Byte,
    eight_DutyVal As Byte,
   
    all_DutyVal As Byte,
       
    RandomVal As Byte           // used to store the random number
   
Dim uS As Word,   
    mS As Word           

// Our Interrupt Routine   
Interrupt TMR2_Interrupt()   
    High(Signal_Pin)            // used for debugging 
    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(one_DutyVal)       
            Inc(two_DutyVal)       
            Inc(three_DutyVal)
            Inc(four_DutyVal)
            Inc(five_DutyVal)
            Inc(six_DutyVal)
            Inc(seven_DutyVal)
            Inc(eight_DutyVal)
           
            Inc(all_DutyVal)
                     
    If one_DutyVal > one_Duty Or one_Duty = 0 Then           
        one_Pin = 0       
        Else           
        one_Pin = 1       
    EndIf       

    If two_DutyVal > two_Duty Or two_Duty = 0 Then           
        two_Pin = 0       
        Else           
        two_Pin = 1       
    EndIf       

    If three_DutyVal > three_Duty Or three_Duty = 0 Then           
        three_Pin = 0       
        Else           
        three_Pin = 1       
    EndIf
   
    If four_DutyVal > four_Duty Or four_Duty = 0 Then           
        four_Pin = 0       
        Else           
        four_Pin = 1       
    EndIf
   
    If five_DutyVal > five_Duty Or five_Duty = 0 Then           
        five_Pin = 0       
        Else           
        five_Pin = 1       
    EndIf
   
    If six_DutyVal > six_Duty Or six_Duty = 0 Then           
        six_Pin = 0       
        Else           
        six_Pin = 1       
    EndIf
   
    If seven_DutyVal > seven_Duty Or seven_Duty = 0 Then           
        seven_Pin = 0       
        Else           
        seven_Pin = 1       
    EndIf
   
    If eight_DutyVal > eight_Duty Or eight_Duty = 0 Then           
        eight_Pin = 0       
        Else           
        eight_Pin = 1       
    EndIf
   
    If all_DutyVal > all_Duty Or all_Duty = 0 Then           
       Toggle (Signal_Pin)  // used for debugging or can be
        Else
        one_Pin = 1
        two_Pin = 1
        three_Pin = 1
        four_Pin = 1
        five_Pin = 1
        six_Pin = 1
        seven_Pin = 1
        eight_Pin = 1             
       
    EndIf
                       
    EndIf                       
        Restore             // Restore system variables   
        Low(Signal_Pin)     // used for debugging
End Interrupt

// Our Timer2 setup
Private Sub TMR2_Initialize()       // setting up TMR2 for a 15micro-sec interrupt
        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

// Our Initializations
Low(one_Pin)
Low(two_Pin)
Low(three_Pin)
Low(four_Pin)
Low(five_Pin)
Low(six_Pin)
Low(seven_Pin)
Low(eight_Pin)

one_Duty = 0
two_Duty = 0
three_Duty = 0
four_Duty = 0
five_Duty = 0
six_Duty = 0
seven_Duty = 0
eight_Duty = 0

all_Duty = 0

one_DutyVal = 0
two_DutyVal = 0
three_DutyVal = 0
four_DutyVal = 0
five_DutyVal = 0
six_DutyVal = 0
seven_DutyVal = 0
eight_DutyVal = 0

all_DutyVal = 0

uS = 0
mS = 0

RandGen.Initialize(128)             // Initialize the Random Number generator (set to 128 but can be changed)
TMR2_Initialize                     // Setup and enable TMR2


// Start Of Program...

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       

            // Led One
                Case 0 To 15           
                    While one_Duty <255> 0               
                        mS = 0               
                        Repeat               
                        Until mS = 19  // this it the time it takes for the led to get to full dim             
                        Dec(one_Duty)           
                    Wend
            // Led Two       
                Case 31 To 46           
                    While two_Duty <255> 0               
                        mS = 0               
                        Repeat               
                        Until mS = 19  // this it the time it takes for the led to get to full dim               
                        Dec(two_Duty)           
                    Wend
            // Led Three       
                Case 62 To 77           
                    While three_Duty <255> 0               
                        mS = 0               
                        Repeat               
                        Until mS = 19  // this it the time it takes for the led to get to full dim               
                        Dec(three_Duty)           
                    Wend   
            // Led Four     
                Case 93 To 108           
                    While four_Duty <255> 0               
                        mS = 0               
                        Repeat               
                        Until mS = 19  // this it the time it takes for the led to get to full dim               
                        Dec(four_Duty)           
                    Wend 
            // Led Five     
                Case 124 To 139           
                    While five_Duty <255> 0               
                        mS = 0               
                        Repeat               
                        Until mS = 19  // this it the time it takes for the led to get to full dim               
                        Dec(five_Duty)           
                    Wend 
            // Led Six     
                Case 155 To 170           
                    While six_Duty <255> 0               
                        mS = 0               
                        Repeat               
                        Until mS = 19  // this it the time it takes for the led to get to full dim               
                        Dec(six_Duty)           
                    Wend 
            // Led Seven       
                Case 186 To 202           
                    While seven_Duty <255> 0               
                        mS = 0               
                        Repeat               
                        Until mS = 19  // this it the time it takes for the led to get to full dim               
                        Dec(seven_Duty)           
                    Wend 
            // Led Eight       
                Case 218 To 233           
                    While eight_Duty <255> 0               
                        mS = 0               
                        Repeat               
                        Until mS = 19  // this it the time it takes for the led to get to full dim               
                        Dec(eight_Duty)           
                    Wend
            // All Leds
                Case 250 To 255         // if we come here then all leds slowly dim (one by one)
                    If (PORTB.0) = 1 Then
                        While one_Duty > 0               
                            mS = 0               
                            Repeat               
                            Until mS = 19  // this it the time it takes for the led to get to full dim               
                            Dec(one_Duty)           
                        Wend
                    EndIf
                    If (PORTB.1) = 1 Then
                        While two_Duty > 0               
                            mS = 0               
                            Repeat               
                            Until mS = 19  // this it the time it takes for the led to get to full dim               
                            Dec(two_Duty)           
                        Wend
                    EndIf
                    If (PORTB.2) = 1 Then       
                        While three_Duty > 0               
                            mS = 0               
                            Repeat               
                            Until mS = 19  // this it the time it takes for the led to get to full dim               
                            Dec(three_Duty)           
                        Wend
                    EndIf
                    If (PORTB.3) = 1 Then
                        While four_Duty > 0               
                            mS = 0               
                            Repeat               
                            Until mS = 19  // this it the time it takes for the led to get to full dim               
                            Dec(four_Duty)           
                        Wend
                    EndIf
                    If (PORTB.4) = 1 Then
                        While five_Duty > 0               
                            mS = 0               
                            Repeat               
                            Until mS = 19  // this it the time it takes for the led to get to full dim               
                            Dec(five_Duty)           
                        Wend
                    EndIf
                    If (PORTB.5) = 1 Then
                        While six_Duty > 0               
                            mS = 0               
                            Repeat               
                            Until mS = 19  // this it the time it takes for the led to get to full dim               
                            Dec(six_Duty)           
                        Wend
                    EndIf
                    If (PORTB.6) = 1 Then
                        While seven_Duty > 0               
                            mS = 0               
                            Repeat               
                            Until mS = 19  // this it the time it takes for the led to get to full dim               
                            Dec(seven_Duty)           
                        Wend
                    EndIf
                    If (PORTB.7) = 1 Then
                        While eight_Duty > 0               
                            mS = 0               
                            Repeat               
                            Until mS = 19  // this it the time it takes for the led to get to full dim               
                            Dec(eight_Duty)           
                        Wend
                    EndIf

                    // now we turn on all leds to full brightness and then dim them
                        DelayMS(100)
                    While all_Duty <255> 0               
                        mS = 0               
                        Repeat               
                        Until mS = 22  // this it the time it takes for the led to get to full dim               
                        Dec(all_Duty)
                    Wend           
                         
            End Select           
Wend


Top
 Profile  
 
 Post subject:
PostPosted: Sun Aug 15, 2010 9:36 pm 
Offline
Site Admin
Site Admin
User avatar

Joined: Fri Mar 26, 2010 10:30 pm
Posts: 1860
Nice piece of code, It looks like you are zooming ahead with SF basic programming :)

Actually one thing I didn't know you could do is use case statements in the way that you did. e.g.

Code:
Case 93 To 108


I thought you could only specify one case for each statement. Thanks for that!


Top
 Profile  
 
 Post subject:
PostPosted: Sun Aug 15, 2010 9:39 pm 
Offline
Moderator
Moderator
User avatar

Joined: Sun Mar 28, 2010 9:03 pm
Posts: 699
Location: United Kingdom
Yeah I found that you can use CASE in this way, rather than using something like this:

Code:
If counter >= 100 And counter <= 200 Then


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 3 posts ] 

All times are UTC + 10 hours


Who is online

Users browsing this forum: No registered users and 0 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Theme made by Keenen Wheeler