Detect voltage levels *correctly*.

This commit is contained in:
David Given
2019-12-11 00:05:34 +01:00
parent f436d6b582
commit 32bb956710
7 changed files with 463 additions and 355 deletions

View File

@@ -147,25 +147,36 @@ static void cmd_get_version(struct any_frame* f)
static void step(int dir)
{
STEP_REG_Write(dir);
STEP_REG_Write(dir); /* step high */
CyDelayUs(6);
STEP_REG_Write(dir | 2);
STEP_REG_Write(dir | 2); /* step low */
CyDelayUs(6);
STEP_REG_Write(dir);
STEP_REG_Write(dir); /* step high again, drive moves now */
CyDelay(STEP_INTERVAL_TIME);
}
static void home(void)
{
for (int i=0; i<100; i++)
{
/* Don't keep stepping forever, because if a drive's
* not connected bad things happen. */
if (TRACK0_REG_Read())
break;
step(STEP_TOWARDS0);
}
/* Step to -1, which should be a nop, to reset the disk on disk change. */
step(STEP_TOWARDS0);
}
static void seek_to(int track)
{
start_motor();
if (!homed)
if (!homed || (track == 0))
{
print("homing");
while (!TRACK0_REG_Read())
step(STEP_TOWARDS0);
/* Step to -1, which should be a nop, to reset the disk on disk change. */
step(STEP_TOWARDS0);
home();
homed = true;
current_track = 0;
@@ -614,12 +625,11 @@ static void cmd_erase(struct erase_frame* f)
static void set_drive_flags(uint8_t flags)
{
if (current_drive_flags != flags)
{
current_drive_flags = flags;
DRIVE_REG_Write(current_drive_flags & 1);
DENSITY_REG_Write(current_drive_flags >> 1); /* density bit */
homed = false;
}
current_drive_flags = flags;
DRIVESELECT_REG_Write((flags & 1) ? 2 : 1); /* select drive 1 or 0 */
DENSITY_REG_Write(flags >> 1); /* density bit */
}
static void cmd_set_drive(struct set_drive_frame* f)
@@ -640,11 +650,11 @@ static uint16_t read_output_voltage_mv(void)
static void read_output_voltages(struct voltages* v)
{
DENSITY_REG_Write(1); /* set REDWC to low (remember it's inverted) */
SIDE_REG_Write(1); /* set DIR to low (remember this is inverted) */
CyDelay(100);
v->logic0_mv = read_output_voltage_mv();
DENSITY_REG_Write(0);
SIDE_REG_Write(0);
CyDelay(100);
v->logic1_mv = read_output_voltage_mv();
}
@@ -659,12 +669,12 @@ static uint16_t read_input_voltage_mv(void)
static void read_input_voltages(struct voltages* v)
{
seek_to(0);
CyDelay(200);
home();
CyDelay(50);
v->logic0_mv = read_input_voltage_mv();
seek_to(1);
CyDelay(200);
step(STEP_AWAYFROM0);
CyDelay(50);
v->logic1_mv = read_input_voltage_mv();
}
@@ -678,24 +688,42 @@ static void cmd_measure_voltages(void)
DECLARE_REPLY_FRAME(struct voltages_frame, F_FRAME_MEASURE_VOLTAGES_REPLY);
set_drive_flags(0);
CyDelay(500); /* wait for things to settle */
CyWdtClear();
MOTOR_REG_Write(0); /* should be ignored anyway */
DRIVESELECT_REG_Write(0); /* deselect both drives */
CyDelay(200); /* wait for things to settle */
read_output_voltages(&r.output_both_off);
read_input_voltages(&r.input_both_off);
CyWdtClear();
DRIVESELECT_REG_Write(1); /* select drive 0 */
CyDelay(50);
read_output_voltages(&r.output_drive_0_selected);
read_input_voltages(&r.input_drive_0_selected);
MOTOR_REG_Write(1);
CyDelay(300);
CyWdtClear();
read_output_voltages(&r.output_drive_0_running);
read_input_voltages(&r.input_drive_0_running);
MOTOR_REG_Write(0);
CyDelay(300);
set_drive_flags(0);
start_motor();
CyDelay(500);
read_output_voltages(&r.output_drive_0_on);
read_input_voltages(&r.input_drive_0_on);
set_drive_flags(1);
CyDelay(500);
read_output_voltages(&r.output_drive_1_on);
read_input_voltages(&r.input_drive_1_on);
stop_motor();
CyWdtClear();
DRIVESELECT_REG_Write(2); /* select drive 1 */
CyDelay(50);
read_output_voltages(&r.output_drive_1_selected);
read_input_voltages(&r.input_drive_1_selected);
MOTOR_REG_Write(1);
CyDelay(300);
CyWdtClear();
read_output_voltages(&r.output_drive_1_running);
read_input_voltages(&r.input_drive_1_running);
MOTOR_REG_Write(0);
CyDelay(300);
CyWdtClear();
DRIVESELECT_REG_Write(0);
homed = false;
INPUT_VOLTAGE_ADC_Stop();
OUTPUT_VOLTAGE_ADC_Stop();
send_reply((struct any_frame*) &r);
@@ -765,7 +793,7 @@ int main(void)
SEQUENCER_DMA_FINISHED_IRQ_StartEx(&replay_dma_finished_irq_cb);
INPUT_VOLTAGE_ADC_Stop();
OUTPUT_VOLTAGE_ADC_Stop();
DRIVE_REG_Write(0);
DRIVESELECT_REG_Write(0);
UART_Start();
USBFS_Start(0, USBFS_DWR_VDDD_OPERATION);
@@ -798,6 +826,7 @@ int main(void)
if (USBFS_GetEPState(FLUXENGINE_CMD_OUT_EP_NUM) == USBFS_OUT_BUFFER_FULL)
{
set_drive_flags(current_drive_flags);
handle_command();
USBFS_EnableOutEP(FLUXENGINE_CMD_OUT_EP_NUM);
print("idle");