diff --git a/include/at91_tc1.h b/include/at91_tc1.h index c891417..315b448 100644 --- a/include/at91_tc1.h +++ b/include/at91_tc1.h @@ -5,6 +5,8 @@ #define RC_CAL_START 0 #define RC_CAL_END 1 +#define RC_CAL_LOAD 2 +#define RC_CAL_SAVE 3 struct rc_values { int16_t chan[MAX_CHANNELS]; diff --git a/include/at91_twi.h b/include/at91_twi.h index 27d4a3b..fa600bc 100644 --- a/include/at91_twi.h +++ b/include/at91_twi.h @@ -58,6 +58,19 @@ struct blmc_param { uint16_t crc16; } __attribute__ ((packed)); + +#define EE_PARAMETER_SET_START 0x0000 + +/* remote control calibration data */ +#define EE_RC_CAL_DATA (EE_PARAMETER_SET_START) +#define EE_RC_CAL_DATA_SIZE 48 + +/* ACC calibration data */ +#define EE_ACC_CAL_DATA (EE_RC_CAL_DATA + EE_RC_CAL_DATA_SIZE) +#define EE_ACC_CAL_DATA_SIZE 6 + +#define EE_PARAMETER_SET_END (EE_ACC_CAL_DATA + EE_ACC_CAL_DATA_SIZE) + struct twi_cmd { uint32_t cmd; /* cmd byte(s) */ uint8_t mode; /* read/write, cmdlen (1-3 bytes) */ diff --git a/main.c b/main.c index b93ce91..8e5e098 100644 --- a/main.c +++ b/main.c @@ -58,6 +58,7 @@ static uint32_t stick_timer_cb(struct pitc_timer *timer) stick_cal_count--; if (stick_cal_count == 0) { rcontrol_calibrate(RC_CAL_END); + rcontrol_calibrate(RC_CAL_SAVE); rcontrol_print_cal(); global_state &= ~STICK_CALIBRATION; } @@ -135,21 +136,23 @@ int main(void) /* timer */ at91_pitc_init(); at91_rttc_test_init(); - at91_tc1_init(); /* twi */ at91_twi_init(); at91_twi_test(); + /* remote control, needs twi */ + at91_tc1_init(); + /* usb */ at91_udp_init(); - printf("static alloc: %5ld bytes\n\r", static_alloc_used()); - - /* adc, need timer */ + /* adc, need timer, twi */ at91_adc_init(); pitc_schedule_timer(&stick_timer); + printf("static alloc: %5ld bytes\n\r", static_alloc_used()); + while (1); } diff --git a/src/at91_adc.c b/src/at91_adc.c index 6ee5fad..383b3b3 100644 --- a/src/at91_adc.c +++ b/src/at91_adc.c @@ -23,8 +23,7 @@ #include "board.h" #include "at91_adc.h" #include "at91_pitc.h" - -#include "fixed.h" +#include "at91_twi.h" #define ADC_CAL_COUNT 1024 @@ -32,6 +31,11 @@ static uint16_t adc_tmp[7]; static int16_t adc_result[7]; static uint16_t adc_offset[6]; +/* check eeprom parameter size (3x uint16_t) */ +#if ((3 * 2) != EE_ACC_CAL_DATA_SIZE) +#error "invalid EE_ACC_CAL_DATA_SIZE" +#endif + static uint32_t adc_cal_count; volatile static uint32_t adc_cal_mode; static uint32_t adc_cal_data[3]; @@ -82,7 +86,7 @@ static uint32_t adc_calibrate_cb(struct pitc_timer *timer) adc_offset[ADC_GYRO_NICK] = adc_cal_data[1]; adc_offset[ADC_GYRO_YAW] = adc_cal_data[2]; - // TODO: check for invalid values (not centered) -> return value? + // TODO: check for invalid values (not centered) printf("GYRO offsets: %4d/%4d/%4d\n\r", adc_offset[ADC_GYRO_ROLL], @@ -96,11 +100,12 @@ static uint32_t adc_calibrate_cb(struct pitc_timer *timer) // TODO: only 1/2 offset? adc_offset[ADC_ACC_YAW] = adc_cal_data[2]; - // TODO: save to eeprom printf("ACC offsets: %4d/%4d/%4d\n\r", adc_offset[ADC_ACC_ROLL], adc_offset[ADC_ACC_NICK], adc_offset[ADC_ACC_YAW]); + + twi_write_eeprom(EE_ACC_CAL_DATA, (uint8_t *)&(adc_offset[ADC_ACC_ROLL]), EE_ACC_CAL_DATA_SIZE); } adc_cal_mode = ADC_CAL_NONE; @@ -146,8 +151,6 @@ void at91_adc_init(void) /* enable ADC clock */ *AT91C_PMC_PCER = (1 << AT91C_ID_ADC); - // TODO: load calibration data from eeprom / use default values - /* ADC Software reset */ AT91S_ADC *adc = AT91C_BASE_ADC; adc->ADC_CR = AT91C_ADC_SWRST; @@ -181,4 +184,11 @@ void at91_adc_init(void) aic->AIC_SMR[AT91C_ID_ADC] = IRQPRIO_ADC | AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL; aic->AIC_SVR[AT91C_ID_ADC] = (uint32_t)at91_adc_isr; aic->AIC_IECR = (1<chan[i] = tmp; } return cnt; @@ -163,6 +169,8 @@ uint32_t rcontrol_getswitches(struct rc_values *rc) void rcontrol_calibrate(uint32_t mode) { uint32_t i; + uint8_t buf[EE_RC_CAL_DATA_SIZE]; + uint16_t *ptr = (uint16_t *)buf; switch (mode) { case RC_CAL_START: @@ -190,6 +198,24 @@ void rcontrol_calibrate(uint32_t mode) ch_data[i].mid = ch_data[i].max; } break; + + case RC_CAL_LOAD: + twi_read_eeprom(EE_RC_CAL_DATA, buf, EE_RC_CAL_DATA_SIZE); + for (i = 0; i < ARRAY_SIZE(ch_data); i++) { + ch_data[i].min = *ptr++; + ch_data[i].mid = *ptr++; + ch_data[i].min = *ptr++; + } + break; + + case RC_CAL_SAVE: + for (i = 0; i < ARRAY_SIZE(ch_data); i++) { + *ptr++ = ch_data[i].min; + *ptr++ = ch_data[i].mid; + *ptr++ = ch_data[i].min; + } + twi_write_eeprom(EE_RC_CAL_DATA, buf, EE_RC_CAL_DATA_SIZE); + break; } } @@ -228,4 +254,7 @@ void at91_tc1_init(void) aic->AIC_SMR[AT91C_ID_TC1] = IRQPRIO_TC1 | AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL; aic->AIC_SVR[AT91C_ID_TC1] = (uint32_t)ppm_isr; aic->AIC_IECR = (1 << AT91C_ID_TC1); + + rcontrol_calibrate(RC_CAL_LOAD); + rcontrol_print_cal(); }