/*
* File: main.c
*
- * Created on August 16, 2010, 12:09 PM
+ * PWM test program
+ *
+ * PIC resources in use, 18-pin DIP, by pin:
+ * - ( 1) RA2 - unused
+ * - ( 2) RA3 - CCP3 PWM for blu LED
+ * - ( 3) RA4 - CCP4 PWM for wht LED. ICSP pin 6, PGM/LVP.
+ * - ( 4) RA5 - ICSP pin 1, MCLR#/Vpp
+ * - ( 5) Vss
+ * - ( 6) RB0 - pushbutton
+ * - ( 7) RB1 - unused
+ * - ( 8) RB2 - unused
+ * - ( 9) RB3 - CCP1 PWM for red LED
+ * - (10) RB4 - rocker switch position B (right)
+ * - (11) RB5 - rocker switch position A (left)
+ * - (12) RB6 - unused
+ * - (13) RB7 - unused
+ * - (14) Vdd
+ * - (15) RA6 - unused
+ * - (16) RA7 - CCP2 PWM for grn LED
+ * - (17) RA0 - unused
+ * - (18) RA1 - unused
+ *
*/
#define RUNAT32MHZ /* else 16 MHz */
#include "picinit.h"
#include "buttons.h"
#include "rgb.h"
+#include "unused.h"
#define STEP_SIZE 32 /* ms */
#define reset_steps() do { incolor_steps = 1; fade_steps = 0; } \
while (0)
#define rand_u8() (rand() & 0xff)
#define rand_u16() ((rand() << 8) + rand_u8())
-#define rand_incolor_steps(f) (min_incolor_steps[f] + \
- (rand() % range_incolor_steps[f]))
-#define rand_fade_steps(f) (min_fade_steps[f] + \
- (rand() % range_fade_steps[f]))
+#define rand_incolor_steps(s) (min_incolor_steps[s & 3] + \
+ (rand() % range_incolor_steps[s & 3]))
+#define rand_fade_steps(s) (min_fade_steps[s & 3] + \
+ (rand() % range_fade_steps[s & 3]))
#define leds_set(r,g,b,w) rgb_set((r).value >> 7, \
(g).value >> 7, \
- (b).value >> 7, 0)
-// (w).value >> 7)
+ (b).value >> 7, \
+ (w).value >> 7)
typedef struct {
int value;
} led_t;
#define INIT_LED { 0, 0, 0 }
-/* The index of all step arrays is the fast variable, 0=slow, 1=fast. */
-#if 0
-const static unsigned min_incolor_steps[2] = { 320, 32 };
-const static unsigned range_incolor_steps[2] = { 32768, 128 };
-const static int min_fade_steps[2] = { 64, 32 };
-const static int range_fade_steps[2] = { 416, 128 };
-#else
-const static unsigned min_incolor_steps[2] = { 64, 64 };
-const static unsigned range_incolor_steps[2] = { 1, 1 };
-const static int min_fade_steps[2] = { 32, 32 };
-const static int range_fade_steps[2] = { 1, 1 };
+/* The index of all step arrays is the speed variable */
+#if 1
+const static unsigned min_incolor_steps[4] = { 320, 32, 32, 1 };
+const static unsigned range_incolor_steps[4] = { 32768, 128, 32, 8 };
+const static int min_fade_steps[4] = { 64, 32, 32, 1 };
+const static int range_fade_steps[4] = { 416, 128, 32, 8 };
+#else /* for debugging */
+const static unsigned min_incolor_steps[4] = { 64, 32, 16, 8 };
+const static unsigned range_incolor_steps[4] = { 1, 1, 1, 1 };
+const static int min_fade_steps[4] = { 64, 32, 16, 8 };
+const static int range_fade_steps[4] = { 1, 1, 1, 1 };
#endif
int main(void)
led_t grn = INIT_LED;
led_t blu = INIT_LED;
led_t wht = INIT_LED;
- unsigned char fast = 0;
+ unsigned char speed = 0;
unsigned incolor_steps;
int fade_steps;
pic_init();
+ unused_init();
buttons_init();
rgb_init();
- reset_steps();
+ reset_steps();
if (buttons_on())
rgb_on();
unsigned char buttons = buttons_read();
if ((buttons & (IN_ROCKERA | IN_ROCKERB))) {
- if (buttons & IN_PUSHBTN) {
- if (!fast) {
- fast = 1;
+ /* Crappy way to detect rising edges to change state of speed var */
+ if (!(speed & 4) && (buttons & IN_PUSHBTN)) {
+ speed |= 4;
+ } else if ((speed & 4) && !(buttons & IN_PUSHBTN)) {
+ speed = (speed + 1) & ~4;
reset_steps();
- } else
- fast = 0;
}
if (fade_steps) {
} while (newr == 0 && newg == 0 && newb == 0 && neww == 0);
/* Next incolor and fade steps */
- incolor_steps = rand_incolor_steps(fast);
- fade_steps = (buttons & IN_ROCKERA) ? 1 : rand_fade_steps(fast);
+ incolor_steps = rand_incolor_steps(speed);
+ fade_steps = (buttons & IN_ROCKERA) ? 1 : rand_fade_steps(speed);
/* Compute increment and remainder for each led */
red.increment = (newr - red.value) / fade_steps;