From 1a40c835bc7e0f5304bb1c94dfb03c661221ff14 Mon Sep 17 00:00:00 2001 From: "Michael D. M. Dryden" Date: Wed, 22 Nov 2017 14:16:23 -0500 Subject: [PATCH 1/2] Add manual mode. --- src/experiment.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 73 insertions(+), 3 deletions(-) diff --git a/src/experiment.c b/src/experiment.c index d5d9330..a240e5b 100644 --- a/src/experiment.c +++ b/src/experiment.c @@ -51,6 +51,7 @@ static void portd_int0_ca(void); static uint8_t _swv_singledir(uint16_t dacindex, uint16_t dacindex_stop, uint16_t dacindex_pulse_height, uint16_t dacindex_step, uint8_t direction); static uint8_t _dpv_singledir(uint16_t dacindex, uint16_t dacindex_stop, uint16_t dacindex_pulse_height, uint16_t dacindex_step, uint8_t direction); static void pmt_idle(void); +static void manual_experiment(void); //interrupt callback setup typedef void (*port_callback_t) (void); @@ -170,6 +171,10 @@ void experiment_handler(char command[]){ pmt_idle(); break; + case 'N': // Manual mode + manual_experiment(); + break; + #if BOARD_VER_MAJOR == 1 && BOARD_VER_MINOR >= 2 case 'P': //potentiometry - time, OCP/poteniometry sscanf(command+1, "%u%hhu",&pct1, &o1); @@ -977,21 +982,86 @@ void ca_experiment(uint16_t steps, uint16_t step_dac[], uint16_t step_seconds[]) return; } +static void manual_experiment(void){ + uint16_t volt_dac = 0; + + while (RTC.STATUS & RTC_SYNCBUSY_bm); + RTC.PER = 999; + while (RTC.STATUS & RTC_SYNCBUSY_bm); + RTC.CTRL = RTC_PRESCALER_DIV1_gc; //1ms tick + RTC.CNT = 0; + + EVSYS.CH0MUX = EVSYS_CHMUX_RTC_OVF_gc; //EV CH0 -- RTC overflow 1s + + portd_int0_callback = portd_int0_ca; //ADC interrupt + + tc_enable(&EXP_TC0_0); + + ads1255_rdatac(); + ads1255_wakeup(); + + tc_write_period(&EXP_TC0_0,0xffff); + tc_write_clock_source(&EXP_TC0_0, TC_CLKSEL_EVCH0_gc); + tc_set_direction(&EXP_TC0_0, TC_UP); + + EXP_TC0_0.CNT = 0; + + while (1){ + if (udi_cdc_is_rx_ready()){ + PORTD.INTCTRL = PORT_INT0LVL_OFF_gc; + uint8_t input = getchar(); + switch (input) { + case 'a': + ca_cca_callback(); + printf("##ABORT\n"); + goto aborting; + break; + case 'g': // Change gain + scanf("%u",&g_gain); + pot_set_gain(); //uses global g_gain, so no params + printf("G %u\n", g_gain); + break; + case 'v': // Change voltage + scanf("%u", &volt_dac); + max5443_set_voltage1(volt_dac); + printf("V %u\n", volt_dac); + printf("S\n"); //signal end of scan + break; + default: + break; + } + PORTD.INTCTRL = PORT_INT0LVL_LO_gc; + } + } + +aborting: + tc_set_cca_interrupt_level(&EXP_TC0_0, TC_INT_LVL_OFF); + tc_write_clock_source(&EXP_TC0_0, TC_CLKSEL_OFF_gc); + tc_disable(&EXP_TC0_0); + volt_exp_stop(); + ads1255_standby(); + printf("D\n"); //signal end of experiment + return; +} + static void portd_int0_ca(void){ struct { + uint8_t com[2]; uint16_t time1; uint16_t time2; int32_t current; } data; + data.com[0] = 'B'; + data.com[1] = '\n'; data.time1 = EXP_TC0_0.CNT; data.time2 = RTC.CNT; data.current = ads1255_read_fast24(); - printf("B\n"); - udi_cdc_write_buf(&data, 8); - printf("\n"); +// printf("B\n"); + udi_cdc_write_buf(&data, 10); +// printf("\n"); } static void ca_cca_callback(void){ -- GitLab From 5ffa15ea5036623d024f4b45719e70d4e04a7968 Mon Sep 17 00:00:00 2001 From: "Michael D. M. Dryden" Date: Wed, 22 Nov 2017 19:01:55 -0500 Subject: [PATCH 2/2] Manual: Add experiment ready signal. --- src/experiment.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/experiment.c b/src/experiment.c index a240e5b..c6a7666 100644 --- a/src/experiment.c +++ b/src/experiment.c @@ -1005,6 +1005,7 @@ static void manual_experiment(void){ tc_set_direction(&EXP_TC0_0, TC_UP); EXP_TC0_0.CNT = 0; + printf("R\n"); // signal ready while (1){ if (udi_cdc_is_rx_ready()){ -- GitLab