diff options
| -rw-r--r-- | accel.c | 15 | ||||
| -rw-r--r-- | gyro.c | 16 | ||||
| -rw-r--r-- | i2c.c | 7 | ||||
| -rw-r--r-- | main.c | 4 | 
4 files changed, 20 insertions, 22 deletions
@@ -5,6 +5,7 @@  #include <avr/io.h>  #include <avr/interrupt.h>  #include <avr/sleep.h> +#include <util/atomic.h>  #include "i2c.h"  #include "accel.h" @@ -16,8 +17,6 @@  #define LIS302DL_CTRLREG1 0x20  #define LIS302DL_UNUSED1 0x28 -/* the first interrupt is lost */ -static volatile bool drdy = true;  /* 0, 2 and 4 are zero, as they contain the dummy register’s content */  static volatile int8_t val[6] = {0, 0, 0, 0, 0, 0};  /* currently reading from i2c */ @@ -26,13 +25,13 @@ static bool reading = false;  /* data ready interrupt   */  ISR(PCINT1_vect) { -	drdy = true; +	/* empty */  }  void accelInit () {  	/* set interrupt lines to input with pull-up */ -	DDRC = DDRC & ~((1 << PC0) | (1 << PC1)); -	PORTC = PORTC | (1 << PC0) | (1 << PC1); +	DDRC = DDRC & ~((1 << DDC0) | (1 << DDC1)); +	PORTC = PORTC | (1 << PORTC0) | (1 << PORTC1);  	/* enable interrupt PCI1 for PCINT8/9 */  	PCICR = PCICR | (1 << PCIE1);  	/* enable interrupts from port PC0/PC1 aka PCINT8/PCINT9 */ @@ -67,13 +66,13 @@ bool accelProcess () {  			reading = false;  		}  	} else { -		if (drdy && twr.status != TWST_WAIT) { +		if (!((PINC >> PINC1) & 0x1) && twr.status != TWST_WAIT) {  			/* new data available in device buffer and bus is free, we are  			 * reading the registers inbetween out_x/y/z and ignore them */ -			if (!twRequest (TWM_READ, LIS302DL, LIS302DL_UNUSED1, (uint8_t *) val, 6)) { +			if (!twRequest (TWM_READ, LIS302DL, LIS302DL_UNUSED1, +					(uint8_t *) val, 6)) {  				printf ("cannot start read\n");  			} else { -				drdy = false;  				reading = true;  			}  		} @@ -29,8 +29,7 @@  #define L3GD20_CTRLREG3 0x22  #define L3GD20_CTRLREG4 0x23 -/* the first interrupt is lost */ -static volatile bool drdy = true; +/* raw values */  static volatile int16_t val[3] = {0, 0, 0};  /* current (relative) angle, in millidegree */  static int16_t angle[3] = {0, 0, 0}; @@ -40,13 +39,13 @@ static bool reading = false;  /* data ready interrupt   */  ISR(PCINT0_vect) { -	drdy = true; +	/* empty */  }  void gyroInit () {  	/* set PB1 to input, with pull-up */ -	DDRB = (DDRB & ~((1 << PB1))); -	PORTB = (PORTB | (1 << PB1)); +	DDRB = DDRB & ~((1 << DDB1)); +	PORTB = PORTB | (1 << PORTB1);  	/* enable interrupt PCI0 */  	PCICR = PCICR | (1 << PCIE0);  	/* enable interrupts on PB1/PCINT1 */ @@ -58,10 +57,10 @@ void gyroStart () {  	/* configuration:  	 * disable power-down-mode  	 * defaults -	 * enable drdy interrupt +	 * low-active (does not work?), push-pull, drdy on int2  	 * select 500dps  	 */ -	uint8_t data[] = {0b00001111, 0b0, 0b00001000, 0b00010000}; +	uint8_t data[] = {0b00001111, 0b0, 0b00101000, 0b00010000};  	if (!twRequest (TWM_WRITE, L3GD20, L3GD20_CTRLREG1, data,  			sizeof (data)/sizeof (*data))) { @@ -87,12 +86,11 @@ bool gyroProcess () {  			reading = false;  		}  	} else { -		if (drdy && twr.status != TWST_WAIT) { +		if (((PINB >> PINB1) & 0x1) && twr.status != TWST_WAIT) {  			/* new data available in device buffer and bus is free */  			if (!twRequest (TWM_READ, L3GD20, 0x28, (uint8_t *) val, 6)) {  				printf ("cannot start read\n");  			} else { -				drdy = false;  				reading = true;  			}  		} @@ -1,6 +1,8 @@  #include <stdio.h>  #include <util/twi.h>  #include <avr/interrupt.h> +#include <stdlib.h> +#include <assert.h>  #include "i2c.h"  #include "common.h" @@ -67,10 +69,7 @@ void twInit () {   */  bool twRequest (const twMode mode, const uint8_t address,  		const uint8_t subaddress, uint8_t * const data, const uint8_t count) { -	/* do not start if request is pending */ -	if (twr.status == TWST_WAIT) { -		return false; -	} +	assert (twr.status != TWST_WAIT);  	twr.mode = mode;  	twr.address = address; @@ -66,7 +66,7 @@ int main () {  				gyroProcess ();  				accelProcess();  			} else { -				accelProcess(); +				accelProcess ();  				gyroProcess ();  			}  			checkGyro = !checkGyro; @@ -82,6 +82,8 @@ int main () {  	}  	timerStop (); +	printf ("stopped\n"); +  	/* global interrupt disable */  	cli ();  | 
