Skip to content
Snippets Groups Projects
Commit 1a40c835 authored by Michael DM Dryden's avatar Michael DM Dryden
Browse files

Add manual mode.
parent d7815483
Branches
1 merge request!4WIP: Manual mode
Pipeline #127 passed with stage
......@@ -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){
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment