registers
By thirtytwobitsPlay 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;
}
}