Public paste
RGB-light2
By: Short | Date: Jan 30 2009 14:51 | Format: None | Expires: never | Size: 4.89 KB | Hits: 583

  1. /******************************************************************************
  2. |                                 RGB Light                                    |
  3. |                                                                              |
  4. |         Made by:       "B.T. Postma"                                         |
  5. |         Description:   "een Rood/Groen/Blauw licht, welke continue van kleur |
  6. |                         veranderd. Met instellingen voor het aanpassen van   |
  7. |                         de kleuren, en gemakkelijk veranderen van het door   |
  8. ******************************************************************************/
  9. #define RED                     (2)        // Poort B1
  10. #define GREEN                   (1)        // Poort B0
  11. #define BLUE                    (16)       // Poort B4
  12.  
  13. #define CONFIG_RED              100        // Kleur-correctie rood
  14. #define CONFIG_GREEN            100        // Kleur-correctie groen
  15. #define CONFIG_BLUE             100        // Kleur-correctie blauw
  16. #define OUTPUT                  0x00       // TRIS(A/B) registers, output
  17. #define INPUT                   0xFF       // TRIS(A/B) registers, input
  18. #define CONFIG_OPTIONREG        0b11011000 /* 7 : Port-B Pull-up disabled
  19.                                               6 : Interrupt rising edge RB0/INT
  20.                                                   (Interrupt is not enabled!)
  21.                                               5 : TMR0 source internal clock
  22.                                               4 : TMR0 increment on high-to-low
  23.                                                   transition RA4. (Not used,
  24.                                                   TMR0 source is not pin RA4)
  25.                                               3 : Prescaler assigned to WDT
  26.                                              2-0: WDT-rate = 1:1
  27.                                            */
  28. #define CONFIG_INTCONREG        0b10100000 /* 7 : Global interrupt enabled
  29.                                               5 : TMR0 interrupt enabled
  30.                                           others: Interrupt disabled      
  31.                                            */
  32.  
  33.  
  34. volatile signed char red =      0;         // Weergegeven kleur rood
  35. volatile signed char blue =     0;         // Weergegeven kleur blauw
  36. volatile signed char green =    0;         // Weergegeven kleur groen
  37. volatile signed char counter =  0;         // Teller voor de duty-cycle kleuren
  38.  
  39. void changecolour(signed char, signed char, signed char, unsigned long int);
  40.  
  41. /*
  42.    Hoofdprogramma
  43. /*
  44. void main(void)
  45. {
  46.    OPTION_REG = CONFIG_OPTIONREG;          // Zet TMR0 functies
  47.    INTCON = CONFIG_INTCONREG;              // Enable TRM0 interrupt
  48.    TRISB = OUTPUT;                         // Zet PORTB op output
  49.    PORTB = 0;                              // Maak PORTB leeg
  50.    
  51.    while(1)
  52.    {
  53.        changecolour(100,0,0,1000);         // Verander naar de kleur rood
  54.        changecolour(0,100,0,1000);         // Verander naar de kleur groen
  55.        changecolour(0,0,100,1000);         // Verander naar de kleur blauw
  56.    }
  57. }
  58.  
  59.  
  60. signed char calccolour(signed char counter, signed char newcolour, signed char oldcolour)
  61. {
  62.    return counter - ((counter - 1) / (newcolour - oldcolour));
  63. }
  64.  
  65. void changecolour(signed char newred, signed char newgreen, signed char newblue, unsigned long int tottime)
  66. {
  67.    signed char j;
  68.    signed long int i;
  69.    signed char tempred, tempgreen, tempblue;
  70.  
  71.    tempred = calccolour(101, newred, red);
  72.    tempgreen = calccolour(101, newgreen, green);
  73.    tempblue = calccolour(101, newblue, blue);
  74.  
  75.    for(j=100 ; j > 0 ; j--)
  76.    {
  77.       for(i=0 ; i < (tottime / 100); i++)
  78.          Delay_us(1);
  79.  
  80.       if((j == tempred) || (j == -tempred))
  81.       {
  82.          if(tempred > 0)
  83.             red++;
  84.          else
  85.             red--;
  86.          tempred = calccolour(j, newred, red);
  87.       }
  88.       if((j == tempgreen) || (j == -tempgreen))
  89.       {
  90.          if(tempgreen > 0)
  91.             green++;
  92.          else
  93.             green--;
  94.          tempgreen = calccolour(j, newgreen, green);
  95.       }
  96.       if((j == tempblue) || (j == -tempblue))
  97.       {
  98.          if(tempblue > 0)
  99.             blue++;
  100.          else
  101.             blue--;
  102.          tempblue = calccolour(j, newblue, blue);
  103.       }
  104.    }
  105. }
  106.  
  107. void interrupt(void)
  108. {
  109.    unsigned int temp;
  110.    INTCON &= ~0b00000100;
  111.    TMR0 = 0x20;
  112.    if(++counter > 100)
  113.       counter = 1;
  114.  
  115.    if(red > 100)  red = 100;
  116.    if(green > 100) green = 100;
  117.    if(blue > 100) blue = 100;
  118.  
  119.    temp = (red * CONFIG_RED) / 100;
  120.    if(temp >= counter)
  121.       PORTB |= RED;
  122.    else
  123.       PORTB &= ~RED;
  124.  
  125.    temp = (green * CONFIG_GREEN) / 100;
  126.    if(temp >= counter)
  127.       PORTB |= GREEN;
  128.    else
  129.       PORTB &= ~GREEN;
  130.  
  131.    temp = (blue * CONFIG_BLUE) / 100;
  132.    if(temp >= counter)
  133.       PORTB |= BLUE;
  134.    else
  135.       PORTB &= ~BLUE;
  136. }