- /*****************************************************************************
- | RGB Light |
- | |
- | Made by: "B.T. Postma" |
- | Release date: "30-01-2009" |
- | Revision: " -none- " |
- | Description: "Rood/Groen/Blauw licht, welke continue van kleur |
- | veranderd. Met instellingen voor het aanpassen van |
- | de de felheid van kleuren, en gemakkelijk veranderen |
- | van de kleurveranderingen" |
- | |
- *****************************************************************************/
- #define RED (2) // Poort B1
- #define GREEN (1) // Poort B0
- #define BLUE (16) // Poort B4
- #define SIZE_OF_PROGRAM 6 // Aantal kleurveranderingen
- #define CONFIG_RED 85 // Kleur-correctie rood
- #define CONFIG_GREEN 93 // Kleur-correctie groen
- #define CONFIG_BLUE 100 // Kleur-correctie blauw
- #define OUTPUT 0x00 // TRIS(A/B) registers, output
- #define INPUT 0xFF // TRIS(A/B) registers, input
- #define CONFIG_OPTIONREG 0b11011000 /* 7 : Port-B Pull-up disabled
- 6 : Interrupt rising edge RB0/INT
- (Interrupt is not enabled!)
- 5 : TMR0 source internal clock
- 4 : TMR0 increment on high-to-low
- transition RA4. (Not used,
- TMR0 source is not pin RA4)
- 3 : Prescaler assigned to WDT
- 2-0: WDT-rate = 1:1
- */
- #define CONFIG_INTCONREG 0b10100000 /* 7 : Global interrupt enabled
- 5 : TMR0 interrupt enabled
- others: Interrupt disabled
- */
- #define TMR0_FLAG 0b00000100 // Interrupt flag van TMR0
- signed char red = 0; // Weergegeven kleur rood
- signed char blue = 0; // Weergegeven kleur blauw
- signed char green = 0; // Weergegeven kleur groen
- signed char counter = 0; // Teller voor de duty-cycle kleuren
- typedef struct clr_struct{ // Structure voor de nieuwe kleur
- signed char red;
- signed char green;
- signed char blue;
- unsigned long time;} colourstruct;
- colourstruct new_collor[SIZE_OF_PROGRAM]; // benodigde aantal structures voor
- // de kleurveranderingen
- // Veranderd naar een bepaalde kleur in een bepaalde tijd.
- void changecolour(signed char, signed char, signed char, unsigned long int);
- // Het uit te voeren kleurwisselings schema
- void program_init(void);
- /*****************************************************************************
- | MAIN |
- *****************************************************************************/
- void main(void)
- {
- char i;
- OPTION_REG = CONFIG_OPTIONREG; // Zet TMR0 functies
- INTCON = CONFIG_INTCONREG; // Enable TRM0 interrupt
- TRISB = OUTPUT; // Zet PORTB op output
- PORTB = 0; // Maak PORTB leeg
- program_init(); // laad het door te lopen programma
- while(1)
- {
- for(i = 0; i < SIZE_OF_PROGRAM ; i++) // Loop alle kleurwisselings
- { // schema's af.
- changecolour( new_collor[i].red ,
- new_collor[i].green ,
- new_collor[i].blue ,
- new_collor[i].time );
- }
- }
- }
- /*
- Laat een teller van 0-100 lopen, hiermee wordt een duty-cycle gemaakt voor
- de kleuren. De duty cycle van groen is omgedraaid. Hiermee wordt het
- vermogen versprijd over de tijd.
- */
- void interrupt(void)
- {
- INTCON &= ~TMR0_FLAG; // Reset van TMR0 interrupt-flag
- TMR0 = 0x80; // timer0 op 64
- if(++counter > 100) // Teller van 1-100
- counter = 1;
- if(red >= counter) // rode led aan/uit
- PORTB |= RED;
- else
- PORTB &= ~RED;
- if((100 - green) <= counter) // groene led aan/uit duty cycle is
- PORTB |= GREEN; // omgedraaid voor het versprijden
- else // van het vermogen
- PORTB &= ~GREEN;
- if(blue >= counter) // blauwe led aan/uit
- PORTB |= BLUE;
- else
- PORTB &= ~BLUE;
- }
- /*****************************************************************************
- | FUNCTIONS |
- *****************************************************************************/
- /*
- Stelt de maximale felheid per kleur in. Zo is rood meestal feller dan blauw,
- en zal deze gedimt moeten worden. Instellingen in CONFIG_RED/GREEN/BLUE
- */
- void clr_adjust(colourstruct *structure)
- {
- unsigned long temp;
- temp = (structure->red * CONFIG_RED) / 100; // bereken nieuwe waarde
- structure->red = (signed char)temp; // schrijf deze terug
- temp = (structure->green * CONFIG_GREEN) / 100;
- structure->green = (signed char)temp;
- temp = (structure->blue * CONFIG_BLUE) / 100;
- structure->blue = (signed char)temp;
- }
- /*
- Het door te lopen kleurwisselings-schema. red, green, blue in % | time in mS
- */
- void program_init(void)
- {
- new_collor[0].red = 100; // verander naar 100% rood in 1S
- new_collor[0].green = 0;
- new_collor[0].blue = 0;
- new_collor[0].time = 1000;
- clr_adjust(&new_collor[0]); // laat gedimde waarden berekenen
- new_collor[1].red = 0;
- new_collor[1].green = 100; // verander naar 100% groen in 1S
- new_collor[1].blue = 0;
- new_collor[1].time = 1000;
- clr_adjust(&new_collor[1]);
- new_collor[2].red = 0;
- new_collor[2].green = 0;
- new_collor[2].blue = 100;
- new_collor[2].time = 1000;
- clr_adjust(&new_collor[2]);
- new_collor[3].red = 100; // verander naar 100% rood in 0.1S
- new_collor[3].green = 0;
- new_collor[3].blue = 0;
- new_collor[3].time = 100;
- clr_adjust(&new_collor[3]);
- new_collor[4].red = 0;
- new_collor[4].green = 100;
- new_collor[4].blue = 0;
- new_collor[4].time = 100;
- clr_adjust(&new_collor[4]);
- new_collor[5].red = 0;
- new_collor[5].green = 0;
- new_collor[5].blue = 100;
- new_collor[5].time = 100;
- clr_adjust(&new_collor[5]);
- }
- /*
- Berekend de nieuwe waarde wanneer een kleur (minder)feller moet gaan branden
- */
- signed char newchange( signed char cycle_rest, signed char newcolour,
- signed char oldcolour)
- {
- if(newcolour == oldcolour)
- return 0; // Bij geen verschil, niet meer veranderen
- else if(newcolour > oldcolour)
- return cycle_rest - ((cycle_rest - 1) / (newcolour - oldcolour));
- else // feller branden bij de stap ...
- return -(cycle_rest + ((cycle_rest - 1) / (newcolour - oldcolour)));
- // zelfde waarde als feller branden, maar
- // negatief (aan geven minder fel branden)
- }
- /*
- Veranderd naar een meegegeven kleur in een meegegeven tijd.
- nieuwe kleur in %, tijd voor de verandering in mS.
- */
- void changecolour( signed char newred , signed char newgreen,
- signed char newblue, unsigned long int tottime)
- {
- signed char j;
- signed long int i;
- signed char tempred, tempgreen, tempblue;
- tempred = newchange(101, newred, red); // bereken wanneer de eerste
- tempgreen = newchange(101, newgreen, green); // verandering is
- tempblue = newchange(101, newblue, blue);
- for(j=100 ; j > 0 ; j--) // teller van 100 naar 1
- {
- for(i=0 ; i < (tottime / 100); i++) // Delay voor het timen van de
- Delay_us(100); // kleur wissel.
- if((j == tempred) || (j == -tempred)) // als teller gelijk aan de
- { // de volgende verandering.
- if(tempred > 0) // tempred is negatief als het
- red++; // licht minder wordt.
- else
- red--;
- tempred = newchange(j, newred, red); // opnieuw berekenen volgende
- } // verandering
- if((j == tempgreen) || (j == -tempgreen))
- {
- if(tempgreen > 0)
- green++;
- else
- green--;
- tempgreen = newchange(j, newgreen, green);
- }
- if((j == tempblue) || (j == -tempblue))
- {
- if(tempblue > 0)
- blue++;
- else
- blue--;
- tempblue = newchange(j, newblue, blue);
- }
- }
- }
RGB-light (final)
By: Short | Date: Jan 30 2009 23:19 | Format: None | Expires: never | Size: 9.79 KB | Hits: 1414
Latest pastes
1 hours ago
11 hours ago
1 days ago
2 days ago
2 days ago