registers

By thirtytwobits

Play with a 4-bit register based on https://youtu.be/-arYx_oVIj8



// Adjust this value to change the program
// speed.
static const unsigned long CLOCK_RATE_HZ = 10;

static const unsigned PIN_LOAD = 7;
static const unsigned PIN_LED = 13;
static const unsigned PIN_LATCH = 6;
static const unsigned PIN_REG_START = 2;
static const unsigned PIN_RUN = 0;
static const unsigned PIN_STEP = 1;
static const unsigned PIN_SIM_SPEED = A5;

static unsigned long quarter_cycle = 0;
static unsigned g_cv = 0;
static unsigned g_step_latch = 0;
static unsigned g_check_speed = 0;


void setRegister(unsigned value)
{
  digitalWrite(PIN_REG_START + 3, (value & 0x08));
  digitalWrite(PIN_REG_START + 2, (value & 0x04));
  digitalWrite(PIN_REG_START + 1, (value & 0x02));
  digitalWrite(PIN_REG_START, (value & 0x01));
}

void setup()
{
  pinMode(PIN_RUN, INPUT);
  pinMode(PIN_STEP, INPUT);
  pinMode(PIN_LOAD, OUTPUT);
  pinMode(PIN_LED, OUTPUT);
  pinMode(PIN_LATCH, OUTPUT);
  pinMode(PIN_REG_START, OUTPUT);
  pinMode(PIN_REG_START + 1, OUTPUT);
  pinMode(PIN_REG_START + 2, OUTPUT);
  pinMode(PIN_REG_START + 3, OUTPUT);
  
  digitalWrite(PIN_LED, 1);
  digitalWrite(PIN_LOAD, 0);
  digitalWrite(PIN_LATCH, 0);
  resetSpeed();
  setRegister(0xFF);
}


void stepRegisterValue()
{
  if (g_cv == 0xF)
  {
    g_cv = 0;
  }
  else
  {
    g_cv += 1;
  }
  setRegister(g_cv);
}


void step()
{
  stepRegisterValue();

  digitalWrite(PIN_LOAD, 1);

  delay(quarter_cycle);
  
  digitalWrite(PIN_LATCH, 1);

  delay(quarter_cycle);

  digitalWrite(PIN_LOAD, 0);

  delay(quarter_cycle);
  
  digitalWrite(PIN_LATCH, 0);
  
  delay(quarter_cycle);
}


void resetSpeed()
{
   const int value = analogRead(PIN_SIM_SPEED);
   const double adj_clock_rate_perc = 1023.00 / (double)value;
   const double adj_period_millis = adj_clock_rate_perc * (1000.00 / (double)CLOCK_RATE_HZ);
   const double half_cycle = adj_period_millis / 2.00;
   quarter_cycle = (unsigned long)(half_cycle / 2.0);
}

void loop()
{
  if(digitalRead(PIN_RUN))
  {
    step();
      if (g_check_speed == 4)
  {
    g_check_speed = 0;
    resetSpeed();
  }
  else
  {
    g_check_speed += 1;
  }
  }
  else if(digitalRead(PIN_STEP))
  {
    if (!g_step_latch)
    {
      g_step_latch = 1;
      step();
    }
  }
  else
  {
    g_step_latch = 0;
  }
}