aboutsummaryrefslogtreecommitdiff
path: root/kernel/rgb.c
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2012-01-02 10:03:37 +0000
committerDimitri Sokolyuk <demon@dim13.org>2012-01-02 10:03:37 +0000
commit775ca7a6b283339019783af24c4c424cdb0cebd1 (patch)
tree8ccbd8d995db3c3774eab3e0d19250c71db7cca9 /kernel/rgb.c
parent4d04ef80160fe748e746549b022854d88e55e188 (diff)
time sharing
Diffstat (limited to 'kernel/rgb.c')
-rw-r--r--kernel/rgb.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/kernel/rgb.c b/kernel/rgb.c
index ae5e119..0cf9a96 100644
--- a/kernel/rgb.c
+++ b/kernel/rgb.c
@@ -16,6 +16,7 @@
*/
#include <stdint.h>
+#include <stdio.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include "kernel.h"
@@ -32,12 +33,21 @@ rgb(void *arg)
for (;;) {
i = (i + 1) % 360;
- hsv(&r, &g, &b, i, v, v);
+ //hsv(&r, &g, &b, i, v, v);
+ hsv(&r, &g, &b, i, 255, 255);
- //cli();
+ wait(1);
a->r = r;
+ signal(1);
+
+ wait(2);
a->g = g;
+ signal(2);
+
+ wait(3);
a->b = b;
+ signal(3);
+
v = *a->v >> 2; /* 10bit to 8bit */
//sei();
@@ -55,17 +65,21 @@ pwm(void *arg)
DDRB |= _BV(a->pin);
PORTB &= ~_BV(a->pin);
+#define DIV (UINT8_MAX >> 1)
+
for (;;) {
//cli();
+ wait(a->sema);
v = *a->value;
+ signal(a->sema);
//sei();
- if ((on = SEC2(v) / INT8_MAX)) {
+ if ((on = SEC2(v) / DIV)) {
PORTB |= _BV(a->pin);
sleep(on);
}
- if ((off = SEC2(UINT8_MAX - v) / INT8_MAX)) {
+ if ((off = SEC2(UINT8_MAX - v) / DIV)) {
PORTB &= ~_BV(a->pin);
sleep(off);
}