aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2012-01-05 10:02:06 +0000
committerDimitri Sokolyuk <demon@dim13.org>2012-01-05 10:02:06 +0000
commit97bf1e88bfde9107f9aec66603ce48b0bdee4351 (patch)
tree4ef058be373546966b0a9952487b72401878105b
parent495bcb6f508f1da654795c7f3e0379ec1d63751e (diff)
lightwight blocking, change ADC from 10 to 8 bit resolution
-rw-r--r--kernel/adc.c8
-rw-r--r--kernel/rgb.c19
-rw-r--r--kernel/tasks.h2
3 files changed, 10 insertions, 19 deletions
diff --git a/kernel/adc.c b/kernel/adc.c
index ac28789..aa23ffb 100644
--- a/kernel/adc.c
+++ b/kernel/adc.c
@@ -35,12 +35,12 @@ adc(void *arg)
for (;;) {
for (i = 0; i < ADCCHANNELS; i++) {
- ADMUX = i & MUXMASK;
+ ADMUX = (i & MUXMASK) | _BV(ADLAR);
ADCSRA |= _BV(ADSC);
loop_until_bit_is_clear(ADCSRA, ADSC);
- wait(4);
- a->value[i] = ADCW;
- signal(4);
+ cli();
+ a->value[i] = ADCH; /* ADLAR: 8-bit */
+ sei();
}
wait(0);
fprintf(stderr, "\n%8lx%8x", now(), a->value[0]);
diff --git a/kernel/rgb.c b/kernel/rgb.c
index b3f4241..7532c10 100644
--- a/kernel/rgb.c
+++ b/kernel/rgb.c
@@ -32,24 +32,15 @@ rgb(void *arg)
uint8_t r, g, b, v = 0;
for (;;) {
- wait(4);
- v = *a->v >> 2; /* 10bit to 8bit */
- signal(4);
-
i = (i + 1) % 360;
hsv(&r, &g, &b, i, 255, v);
- wait(1);
+ cli();
a->r = r;
- signal(1);
-
- wait(2);
a->g = g;
- signal(2);
-
- wait(3);
a->b = b;
- signal(3);
+ v = *a->v; /* 10bit to 8bit */
+ sei();
sleep(MSEC(40));
}
@@ -68,9 +59,9 @@ pwm(void *arg)
#define DIV (UINT8_MAX >> 1)
for (;;) {
- wait(a->sema);
+ cli();
v = *a->value;
- signal(a->sema);
+ sei();
if ((on = SEC2(v) / DIV)) {
PORTB |= _BV(a->pin);
diff --git a/kernel/tasks.h b/kernel/tasks.h
index 98b637a..8343a3a 100644
--- a/kernel/tasks.h
+++ b/kernel/tasks.h
@@ -45,7 +45,7 @@ struct rgbarg {
uint8_t r;
uint8_t g;
uint8_t b;
- uint16_t *v;
+ uint8_t *v;
};
struct pwmarg {