Hello all. I am new to all of this, CNC, electronics, programming. You name it, I'm a newb!
What i am looking for is an example or snippet of code that allows the Arduino to "read" the mach3 charge pump signal.
I just want to arm or disarm 2 outputs based off the presence or lack their of of the mach3 charge pump signal.
I will post the code i was given, however i have not had any luck with it. Trying to troubleshoot the code myself at this time is proving daunting.
Also any external circuitry required to make it work would be appreciated!
I have of course searched this topic, quite a bit. And have gotten nowhere. Any pointing in the right direction would be much appreciated.
typedef enum
{
sInitialize,
sMonitor,
sDead
}
state_t;
static uint8_t state;
static unsigned long PreviousMicros;
static bool PreviousClock;
static unsigned short Clocks;
const float WAVELENGTH = (1.0 / 10000.0) * 1000000.0;
const unsigned long WINDOW = 2.5 * WAVELENGTH;
void setup( void )
{
state = sInitialize;
// Make A1 and A0 outputs
bitSet( DDRC, DDC1 );
bitSet( DDRC, DDC0 );
// Ensure they start LOW (not necessary but documents our intent)
bitClear( PORTC, PORTC1 );
bitClear( PORTC, PORTC0 );
// Make digital pin 8 (PB0) and input (not necessary but documents our intent)
bitClear( DDRB, DDB0 );
}
void loop( void )
{
unsigned long CurrentMicros;
CurrentMicros = micros();
// Count toggles of digital pin 8 (PB0)
if ( bitRead( DDRB, DDB0 ) )
{
if ( ! PreviousClock )
{
++Clocks;
PreviousClock = true;
}
}
else
{
if ( PreviousClock )
{
++Clocks;
PreviousClock = false;
}
}
switch ( state )
{
// Wait for the first toggle
case sInitialize:
if ( Clocks > 0 )
{
// Go live
bitSet( PORTC, PORTC1 );
bitSet( PORTC, PORTC0 );
// Monitor the clock signal
state = sMonitor;
Clocks = 0;
PreviousMicros = CurrentMicros;
}
else
{
// Light an LED to indicate waiting?
}
break;
case sMonitor:
// Check each window for...
if ( CurrentMicros - PreviousMicros >= WINDOW )
{
// No clock signal?
if ( Clocks == 0 )
{
// Go dead
bitClear( PORTC, PORTC1 );
bitClear( PORTC, PORTC0 );
state = sDead;
}
else
{
// Reset for another window
Clocks = 0;
PreviousMicros = CurrentMicros;
}
}
break;
case sDead:
// Light an LED? Sound an alarm? Cry in your beer?
break;
}
}