From 6708da2661d693f855b6f56d69af1e2fb8502463 Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun Date: Tue, 23 Sep 2014 17:24:57 +0200 Subject: Add wakeup source mechanism Should reduce amount of cpu wakeups with expensive computations. --- gyro.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) (limited to 'gyro.c') diff --git a/gyro.c b/gyro.c index f31385d..fdf2d1f 100644 --- a/gyro.c +++ b/gyro.c @@ -31,7 +31,13 @@ static bool reading = false; /* data ready interrupt */ ISR(PCINT0_vect) { - /* empty */ + const bool interrupt = (PINB >> PINB1) & 0x1; + /* high-active */ + if (interrupt) { + enableWakeup (WAKE_GYRO); + } else { + disableWakeup (WAKE_GYRO); + } } void gyroInit () { @@ -60,6 +66,7 @@ void gyroStart () { } sleepwhile (twr.status == TWST_WAIT); puts ("gyroStart done"); + disableWakeup (WAKE_I2C); } /* calculate ticks for z rotation @@ -84,7 +91,9 @@ static void gyroProcessTicks () { /* process gyro sensor data, returns true if new data is available */ bool gyroProcess () { - if (reading) { + if (reading && shouldWakeup (WAKE_I2C)) { + disableWakeup (WAKE_I2C); + reading = false; if (twr.status == TWST_OK) { /* new data transfered, process it */ /* poor man's noise filter */ @@ -92,19 +101,18 @@ bool gyroProcess () { zaccum += zval; } gyroProcessTicks (); - reading = false; return true; } else if (twr.status == TWST_ERR) { puts ("gyro i2c error"); - reading = false; } } else { - if (((PINB >> PINB1) & 0x1) && twr.status == TWST_OK) { + if (shouldWakeup (WAKE_GYRO) && twr.status == TWST_OK) { /* new data available in device buffer and bus is free */ if (!twRequest (TWM_READ, L3GD20, L3GD20_OUTZ, (uint8_t *) &zval, sizeof (zval))) { puts ("cannot start read"); } else { + /* wakeup source is disabled by isr to prevent race condition */ reading = true; } } -- cgit v1.2.3