Public paste
RGB-light (final)
By: Short | Date: Jan 30 2009 23:19 | Format: None | Expires: never | Size: 9.79 KB | Hits: 1414

  1. /*****************************************************************************
  2. |                                RGB Light                                    |
  3. |                                                                             |
  4. |       Made by:       "B.T. Postma"                                          |
  5. |       Release date:  "30-01-2009"                                           |
  6. |       Revision:      " -none- "                                             |
  7. |       Description:   "Rood/Groen/Blauw licht, welke continue van kleur      |
  8. |                       veranderd. Met instellingen voor het aanpassen van    |
  9. |                       de de felheid van kleuren, en gemakkelijk veranderen  |
  10. |                       van de kleurveranderingen"                            |
  11. |                                                                             |
  12. *****************************************************************************/
  13.  
  14.  
  15. #define RED                     (2)        // Poort B1
  16. #define GREEN                   (1)        // Poort B0
  17. #define BLUE                    (16)       // Poort B4
  18. #define SIZE_OF_PROGRAM         6          // Aantal kleurveranderingen
  19. #define CONFIG_RED              85         // Kleur-correctie rood
  20. #define CONFIG_GREEN            93         // Kleur-correctie groen
  21. #define CONFIG_BLUE             100        // Kleur-correctie blauw
  22. #define OUTPUT                  0x00       // TRIS(A/B) registers, output
  23. #define INPUT                   0xFF       // TRIS(A/B) registers, input
  24. #define CONFIG_OPTIONREG        0b11011000 /* 7 : Port-B Pull-up disabled
  25.                                               6 : Interrupt rising edge RB0/INT
  26.                                                   (Interrupt is not enabled!)
  27.                                               5 : TMR0 source internal clock
  28.                                               4 : TMR0 increment on high-to-low
  29.                                                   transition RA4. (Not used,
  30.                                                   TMR0 source is not pin RA4)
  31.                                               3 : Prescaler assigned to WDT
  32.                                              2-0: WDT-rate = 1:1
  33.                                            */
  34. #define CONFIG_INTCONREG        0b10100000 /* 7 : Global interrupt enabled
  35.                                               5 : TMR0 interrupt enabled
  36.                                           others: Interrupt disabled
  37.                                            */
  38. #define TMR0_FLAG               0b00000100 // Interrupt flag van TMR0
  39.  
  40.  
  41. signed char red =      0;                  // Weergegeven kleur rood
  42. signed char blue =     0;                  // Weergegeven kleur blauw
  43. signed char green =    0;                  // Weergegeven kleur groen
  44. signed char counter =  0;                  // Teller voor de duty-cycle kleuren
  45. typedef struct clr_struct{                 // Structure voor de nieuwe kleur
  46.                     signed char red;
  47.                     signed char green;
  48.                     signed char blue;
  49.                     unsigned long time;} colourstruct;
  50.                    
  51. colourstruct new_collor[SIZE_OF_PROGRAM];  // benodigde aantal structures voor
  52.                                            // de kleurveranderingen
  53.  
  54.  
  55. // Veranderd naar een bepaalde kleur in een bepaalde tijd.
  56. void changecolour(signed char, signed char, signed char, unsigned long int);
  57.  
  58. // Het uit te voeren kleurwisselings schema
  59. void program_init(void);
  60.  
  61.  
  62.  
  63. /*****************************************************************************
  64. |                                  MAIN                                       |
  65. *****************************************************************************/
  66. void main(void)
  67. {
  68.     char i;
  69.  
  70.    OPTION_REG = CONFIG_OPTIONREG;          // Zet TMR0 functies
  71.    INTCON = CONFIG_INTCONREG;              // Enable TRM0 interrupt
  72.    TRISB = OUTPUT;                         // Zet PORTB op output
  73.    PORTB = 0;                              // Maak PORTB leeg
  74.    program_init();                         // laad het door te lopen programma
  75.  
  76.  
  77.    while(1)
  78.    {
  79.       for(i = 0; i < SIZE_OF_PROGRAM ; i++)        // Loop alle kleurwisselings
  80.       {                                            // schema's af.
  81.           changecolour( new_collor[i].red   ,
  82.                         new_collor[i].green ,
  83.                         new_collor[i].blue  ,
  84.                         new_collor[i].time  );
  85.       }
  86.    }
  87. }
  88.  
  89. /*
  90.    Laat een teller van 0-100 lopen, hiermee wordt een duty-cycle gemaakt voor
  91.    de kleuren. De duty cycle van groen is omgedraaid. Hiermee wordt het
  92.    vermogen versprijd over de tijd.
  93. */
  94. void interrupt(void)
  95. {
  96.    INTCON &= ~TMR0_FLAG;                   // Reset van TMR0 interrupt-flag
  97.    TMR0 = 0x80;                            // timer0 op 64
  98.    if(++counter > 100)                     // Teller van 1-100
  99.       counter = 1;
  100.  
  101.    if(red >= counter)                      // rode led aan/uit
  102.       PORTB |= RED;
  103.    else
  104.       PORTB &= ~RED;
  105.  
  106.    if((100 - green) <= counter)            // groene led aan/uit duty cycle is
  107.       PORTB |= GREEN;                      // omgedraaid voor het versprijden
  108.    else                                    // van het vermogen
  109.       PORTB &= ~GREEN;
  110.  
  111.    if(blue >= counter)                     // blauwe led aan/uit
  112.       PORTB |= BLUE;
  113.    else
  114.       PORTB &= ~BLUE;
  115. }
  116.  
  117.  
  118.  
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125. /*****************************************************************************
  126. |                                FUNCTIONS                                    |
  127. *****************************************************************************/
  128.  
  129. /*
  130.    Stelt de maximale felheid per kleur in. Zo is rood meestal feller dan blauw,
  131.    en zal deze gedimt moeten worden. Instellingen in CONFIG_RED/GREEN/BLUE
  132. */
  133. void clr_adjust(colourstruct *structure)
  134. {
  135.    unsigned long temp;
  136.  
  137.    temp = (structure->red * CONFIG_RED) / 100;       // bereken nieuwe waarde
  138.    structure->red = (signed char)temp;               // schrijf deze terug
  139.    temp = (structure->green * CONFIG_GREEN) / 100;
  140.    structure->green = (signed char)temp;
  141.    temp = (structure->blue * CONFIG_BLUE) / 100;
  142.    structure->blue = (signed char)temp;
  143. }
  144.  
  145. /*
  146.    Het door te lopen kleurwisselings-schema. red, green, blue in % | time in mS
  147. */
  148. void program_init(void)
  149. {
  150.    new_collor[0].red   = 100;              // verander naar 100% rood in 1S
  151.    new_collor[0].green = 0;
  152.    new_collor[0].blue  = 0;
  153.    new_collor[0].time  = 1000;
  154.    clr_adjust(&new_collor[0]);             // laat gedimde waarden berekenen
  155.  
  156.    new_collor[1].red   = 0;
  157.    new_collor[1].green = 100;              // verander naar 100% groen in 1S
  158.    new_collor[1].blue  = 0;
  159.    new_collor[1].time  = 1000;
  160.    clr_adjust(&new_collor[1]);
  161.  
  162.    new_collor[2].red   = 0;
  163.    new_collor[2].green = 0;
  164.    new_collor[2].blue  = 100;
  165.    new_collor[2].time  = 1000;
  166.    clr_adjust(&new_collor[2]);
  167.  
  168.    new_collor[3].red   = 100;             // verander naar 100% rood in 0.1S
  169.    new_collor[3].green = 0;
  170.    new_collor[3].blue  = 0;
  171.    new_collor[3].time  = 100;
  172.    clr_adjust(&new_collor[3]);
  173.  
  174.    new_collor[4].red   = 0;
  175.    new_collor[4].green = 100;
  176.    new_collor[4].blue  = 0;
  177.    new_collor[4].time  = 100;
  178.    clr_adjust(&new_collor[4]);
  179.  
  180.    new_collor[5].red   = 0;
  181.    new_collor[5].green = 0;
  182.    new_collor[5].blue  = 100;
  183.    new_collor[5].time  = 100;
  184.    clr_adjust(&new_collor[5]);
  185. }
  186.  
  187. /*
  188.    Berekend de nieuwe waarde wanneer een kleur (minder)feller moet gaan branden
  189. */
  190. signed char newchange( signed char cycle_rest, signed char newcolour,
  191.                        signed char oldcolour)
  192. {
  193.    if(newcolour == oldcolour)
  194.       return 0;                      // Bij geen verschil, niet meer veranderen
  195.    else if(newcolour > oldcolour)
  196.       return cycle_rest - ((cycle_rest - 1) / (newcolour - oldcolour));
  197.    else                              // feller branden bij de stap ...
  198.       return  -(cycle_rest + ((cycle_rest - 1) / (newcolour - oldcolour)));
  199.                                     // zelfde waarde als feller branden, maar
  200.                                     // negatief (aan geven minder fel branden)
  201. }
  202.  
  203. /*
  204.    Veranderd naar een meegegeven kleur in een meegegeven tijd.
  205.    nieuwe kleur in %, tijd voor de verandering in mS.
  206. */
  207. void changecolour( signed char newred , signed char newgreen,
  208.                    signed char newblue, unsigned long int tottime)
  209. {
  210.    signed char j;
  211.    signed long int i;
  212.    signed char tempred, tempgreen, tempblue;
  213.  
  214.    tempred = newchange(101, newred, red);        // bereken wanneer de eerste
  215.    tempgreen = newchange(101, newgreen, green);  // verandering is
  216.    tempblue = newchange(101, newblue, blue);
  217.  
  218.    for(j=100 ; j > 0 ; j--)                      // teller van 100 naar 1
  219.    {
  220.       for(i=0 ; i < (tottime / 100); i++)        // Delay voor het timen van de
  221.          Delay_us(100);                          // kleur wissel.
  222.  
  223.       if((j == tempred) || (j == -tempred))      // als teller gelijk aan de
  224.       {                                          // de volgende verandering.
  225.          if(tempred > 0)                         // tempred is negatief als het
  226.             red++;                               // licht minder wordt.
  227.          else
  228.             red--;
  229.          tempred = newchange(j, newred, red);    // opnieuw berekenen volgende
  230.       }                                          // verandering
  231.       if((j == tempgreen) || (j == -tempgreen))
  232.       {
  233.          if(tempgreen > 0)
  234.             green++;
  235.          else
  236.             green--;
  237.          tempgreen = newchange(j, newgreen, green);
  238.       }
  239.       if((j == tempblue) || (j == -tempblue))
  240.       {
  241.          if(tempblue > 0)
  242.             blue++;
  243.          else
  244.             blue--;
  245.          tempblue = newchange(j, newblue, blue);
  246.       }
  247.    }
  248. }