X-Git-Url: https://oss.titaniummirror.com/gitweb?a=blobdiff_plain;f=main.c;h=abf109814c0e2d93a2fb47f12806bd34f8c2976e;hb=5c74e1a22c444b8769e0ce82975414f1c72b7b0e;hp=7fa14f2fab32eb238dd7f46eefd16f91731e43d6;hpb=e9763e77e5192ca658d54f346d1a046ec227be2c;p=rgblamp.git diff --git a/main.c b/main.c index 7fa14f2..abf1098 100644 --- a/main.c +++ b/main.c @@ -4,156 +4,98 @@ * Created on August 16, 2010, 12:09 PM */ - -#include -//#include - #define RUNAT32MHZ /* else 16 MHz */ -#define LEDBIT 0x01 /* Port RB0 */ -#define RED_CHAN 1 -#define GRN_CHAN 2 -#define BLU_CHAN 4 -#define WHT_CHAN 8 -#define ALL_CHAN 15 - -#if defined(RUNAT32MHZ) -__CONFIG(WDTE_OFF & FOSC_INTOSC); -__CONFIG(LVP_OFF & PLLEN_ON); -#else -__CONFIG(WDTE_OFF); -__CONFIG(LVP_OFF); -#endif - -void pic_init() -{ -#if defined(RUNAT32MHZ) - OSCCON = 0b11110000; -#else /* 16 MHz */ - OSCCON = 0b01111010; -#endif - - /* OSCSTAT.HFIOFL is set when oscillator is locked (accurate within 2%) */ - while (!HFIOFL); -} - -void pwm_init() -{ - /* Initialize PWM - * CCP1 on RB3, CCP2 on RA7, CCP3 on RA3, CCP4 on RA4 - * - Fosc = 32MHz - * - Prescale = 16 - * - PRx value = 0xff - * = f(pwm) = 1.95 kHz - */ - - /* Disable output on PWM Rxn pins */ - TRISA |= 0b10011000; - TRISB |= 0b00001000; - - /* Configure ECCP1 */ - CCP1CON = 0b00001100; - CCPR1L = 0; /* Initial PWM value; only using 8 LSBs */ - - /* Configure ECCP2 */ - APFCON0 |= 0b00001000; /* Use alternate output pin RA7 */ - CCP2CON = 0b00001100; - CCPR2L = 0; /* Initial PWM value; only using 8 LSBs */ - - /* Configure CCP3 */ - CCP3CON = 0b00001100; - CCPR3L = 0; /* Initial PWM value; only using 8 LSBs */ - - /* Configure CCP4 */ - CCP4CON = 0b00001100; - CCPR4L = 0; /* Initial PWM value; only using 8 LSBs */ - - /* Configure Timer2 */ - CCPTMRS = 0; /* All CCPx use Timer 2 */ - TMR2IF = 0; - PR2 = 0xff; - T2CON = 0b00000111; - - /* Enable PWM outputs after Timer 2 overflows */ - while (!TMR2IF); - TRISA &= ~0b10011000; - TRISB &= ~0b00001000; -} - -void led_init() -{ - PORTB &= ~LEDBIT; /* Led is RB0 */ - TRISB &= ~LEDBIT; -} -void led_set(unsigned char led) -{ - if (led) - PORTB |= LEDBIT; - else - PORTB &= ~LEDBIT; -} - -void pwm_set(unsigned char channels, unsigned char step) -{ - if (channels & RED_CHAN) - CCPR1L = step; - if (channels & GRN_CHAN) - CCPR2L = step; - if (channels & BLU_CHAN) - CCPR3L = step; - if (channels & WHT_CHAN) - CCPR4L = step; -} - -void delay() -{ - for (unsigned counter = 0; counter < 10000; counter++); -} - -void ramp_up(unsigned char channels) -{ - unsigned char step = 0; - - do { - pwm_set(channels, step++); - delay(); - } while (step != 0); -} - -void ramp_down(unsigned char channels) -{ - unsigned char step = 255; - - do { - pwm_set(channels, step--); - delay(); - } while (step != 255); -} +#include +#include +#include "picinit.h" +#include "buttons.h" +#include "rgb.h" -void ramp_up_down(unsigned char channels) -{ - ramp_up(channels); - ramp_down(channels); -} +#define random_rgb() (rand() >> 7) /* 0...255 */ +#define random_time() (rand() >> 5) /* 0...1024 */ +#define min_incolor_time() 512 +#define min_fade_time() 512 int main(void) { - unsigned char fwd = 1; - unsigned char step = 0; + unsigned char red = 0, grn = 0, blu = 0; //, wht = 0; + char fadestep_red, fadestep_grn, fadestep_blu; //, fadestep_wht; + unsigned char incolor_time = 0; + unsigned char fade_time = 0; + unsigned char fast = 0; pic_init(); - led_init(); - pwm_init(); + buttons_init(); + rgb_init(); + + if (buttons_on()) { + rgb_on(); + red = random_rgb(); + grn = random_rgb(); + blu = random_rgb(); + //wht = random_rgb(); + rgb_set(red, grn, blu, 0); //wht); + } + while (1) { - ramp_up(RED_CHAN); - ramp_up(GRN_CHAN); - ramp_down(RED_CHAN); - ramp_up(BLU_CHAN); - ramp_down(GRN_CHAN); - ramp_up(RED_CHAN); - ramp_up(GRN_CHAN + BLU_CHAN); - ramp_down(ALL_CHAN); - ramp_up_down(WHT_CHAN); + unsigned char buttons = buttons_read(); + + if ((buttons & (IN_ROCKERA | IN_ROCKERB))) { + if (buttons & IN_PUSHBTN) { + if (!fast) { + incolor_time = 0; + fade_time = 0; + fast = 1; + } else + fast = 0; + } + + if (fade_time) { + red += fadestep_red; + grn += fadestep_grn; + blu += fadestep_blu; + //wht += fadestep_wht; + rgb_set(red, grn, blu, 0); // wht); + fade_time--; + } else if (incolor_time) + incolor_time--; + else /* fade_time == 0 && incolor_time == 0 */ { + unsigned char newr, newg, newb, neww; + + /* Determine next color state */ + newr = random_rgb(); + newg = random_rgb(); + newb = random_rgb(); + //neww = random_rgb(); + + /* Calculate new incolor_time and fade_time */ + if (buttons & IN_ROCKERA) { + incolor_time = 1 + random_time(); + fade_time = 1; + } else /* (buttons & IN_ROCKERB) */ { + incolor_time = min_incolor_time() + random_time() / 2; + fade_time = min_fade_time() + random_time() / 2; + } + + if (fast) { + incolor_time = 1 + incolor_time / 8; + fade_time = 1 + fade_time / 8; + } + + fadestep_red = ((int)newr - red) / fade_time; + fadestep_grn = ((int)newg - red) / fade_time; + fadestep_blu = ((int)newb - red) / fade_time; + //fadestep_wht = ((int)neww - red) / fade_time; + } + __delay_ms(10); + } else { + rgb_off(); + buttons_sleep(); + incolor_time = 0; + fade_time = 0; + rgb_on(); + } } return 0; }