Can load Blink, but large program load times out, ERROR

Hi Knowledgeable ones,

I get this message:

avrdude: jtagmkII_initialize(): Cannot locate "flash" and "boot" memories in description
avrdude: jtagmkII_paged_load(): timeout/error communicating with programmer (status -1)

I was able to load blink and I saw that it worked. My program uses 72 percent of program memory.

“Sketch uses 35430 bytes (72%) of program storage space. Maximum is 49152 bytes.
Global variables use 1284 bytes (20%) of dynamic memory, leaving 4860 bytes for local variables. Maximum is 6144 bytes.

I am using 1.8.19 IDE, I could use some help in understanding how download the the every.

thanks in advance

Post all your source code so we can analyze it.

So here is the program code

[code]
#include <Adafruit_MCP23017.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
#include <SoftwareSerial.h>
//#include <Adafruit_MCP23X17.h>
#include <Adafruit_PCF8574.h>
#include <SPI.h>
#include <Wire.h>

byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 15, 220);

unsigned int localPort = 51000;      // local port to listen on

// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];  // buffer to hold incoming packet,
EthernetUDP udp;

Adafruit_MCP23017 mcp1; // I2C
Adafruit_MCP23017 mcp2; // I2C
Adafruit_PCF8574 safex;// I2C
Adafruit_PCF8574 safey;// I2C
Adafruit_PCF8574 safez;// I2C
SoftwareSerial SoftSer(2, 3);
//mcp1
const int takeastepx = 0;
const int directionx = 1;
const int axisXenable = 2;
const int step_ms1x = 3;
const int step_ms2x = 4;
const int step_ms3x = 5;

const int takeastepy = 6;
const int directiony = 7;
const int axisYenable = 8;
const int step_ms1y = 9;
const int step_ms2y = 10;
const int step_ms3y = 11;

const int takeastepz = 12;
const int directionz = 13;
const int axisZenable = 14;
//mcp2
const int step_ms1z = 0;
const int step_ms2z = 1;
const int step_ms3z = 2;
const int Spin = 3;
const int SpinRun = 4;

String disc = "";
String diss = "";
String Qx = "";
String Qy = "";
String Qz = "";
String replX = "";
String replY = "";
String replZ = "";

int SpindleStop = 0;
int Startx = 0;
int Starty = 0;
int Startz = 0;
int Refx = 0;
int Refy = 0;
int Refz = 0;
unsigned long cm = 0;
unsigned long pm = 0;
long iv = 15;
long cvx = 0; //X-axis Encoder Counts
long cvy = 0; //Y-axis Encoder Counts
long cvz = 0; //Z-axis Encoder Counts
long pvx = 0; //X-axis process variable Counts to position
long pvy = 0; //Y-axis process variable Counts to position
long pvz = 0; //Z-axis process variable Counts to position
long cpx = 0; //Recieved command for X-axis position
long cpy = 0; //Recieved command for Y-axis position
long cpz = 0; //Recieved command for Z-axis position

int xspare = 0;
int yspare = 0;
int zspare = 0;
int gohomex = 0;
int JogFwdx = 0;
int JogRevx = 0;
int Stopx = 0;
int exteotx = 0;
int reteotx = 0;
int xhome = 0;
int gohomey = 0;
int JogFwdy = 0;
int JogRevy = 0;
int Stopy = 0;
int exteoty = 0;
int reteoty = 0;
int yhome = 0;
int gohomez = 0;
int JogDwnz = 0;
int JogUpz = 0;
int Stopz = 0;
int exteotz = 0;
int reteotz = 0;
int zhome = 2;
int Tmrx = 0;
int Tmry = 0;
int Tmrz = 0;
int Nopz = 0;
int R1x = 100;
int R2x = 50;
int R3x = 10;
int R4x = 3;
int D1x = 1000;
int D2x = 750;
int W1x = 2;
int W2x = 4;
int R1y = 100;
int R2y = 50;
int R3y = 10;
int R4y = 3;
int D1y = 1000;
int D2y = 750;
int W1y = 2;
int W2y = 4;
int R1z = 100;
int R2z = 50;
int R3z = 10;
int R4z = 3;
int D1z = 1000;
int D2z = 750;
int D3z = 500;
int D4z = 250;
int D5z = 75;
int D6z = 35;
int D7z = 20;
int D8z = 10;
int W1z = 2;
int W2z = 4;
int R = 0;
int LL = 0;
int timeWinSlo1 = 125;
int timeWinSlo2 = 126;
int timeWinFst1 = 10;
int timeWinFst2 = 11;
int readAll = 0;
int getEncData = 0;
int SerNot = 0;
int RampTimez = 0;
int Q = 0;

void setup() {
  // Remember Serial has the Encoder position data

  SPI.begin();
  Ethernet.init(10);
  Ethernet.begin(mac, ip);
  Wire.begin();
  mcp1.begin(0x03);
  mcp2.begin(0x04);
  safex.begin(0x20, &Wire);// I2C
  for (uint8_t p = 0; p < 8; p++) {
    safex.pinMode(p, INPUT_PULLUP);
  }
  safey.begin(0x21, &Wire);// I2C
  for (uint8_t p = 0; p < 8; p++) {
    safey.pinMode(p, INPUT_PULLUP);
  }
  safez.begin(0x22, &Wire);// I2C
  for (uint8_t p = 0; p < 8; p++) {
    safez.pinMode(p, INPUT_PULLUP);
  }

  mcp1.pinMode(takeastepx, OUTPUT);// step pin X
  mcp1.pinMode(takeastepy, OUTPUT);// step pin Y
  mcp1.pinMode(takeastepz, OUTPUT);// step pin Z
  mcp1.pinMode(directionx, OUTPUT);// stepperX direction
  mcp1.pinMode(directiony, OUTPUT);// stepperY direction
  mcp1.pinMode(directionz, OUTPUT);// stepperZ direction
  mcp1.pinMode(axisXenable, OUTPUT);// Enable stepper X movement
  mcp1.pinMode(axisYenable, OUTPUT);// Enable stepper Y movement
  mcp1.pinMode(axisZenable, OUTPUT);// Enable stepper Z movement
  mcp1.pinMode(step_ms1x, OUTPUT);// stepper step select ms1x
  mcp1.pinMode(step_ms2x, OUTPUT);// stepper step select ms2x
  mcp1.pinMode(step_ms3x, OUTPUT);// stepper step select ms3x
  mcp1.pinMode(step_ms1y, OUTPUT);// stepper step select ms1y
  mcp1.pinMode(step_ms2y, OUTPUT);// stepper step select ms2y
  mcp1.pinMode(step_ms3y, OUTPUT);// stepper step select ms3y
  mcp2.pinMode(step_ms1z, OUTPUT);// stepper step select ms1z
  mcp2.pinMode(step_ms2z, OUTPUT);// stepper step select ms2z
  mcp2.pinMode(step_ms3z, OUTPUT);// stepper step select ms3z
  mcp2.pinMode(Spin, OUTPUT);// command to run Spindle Motor
  mcp2.pinMode(SpinRun, INPUT);//Indication of spindle motor Powered
  mcp2.pullUp(SpinRun, HIGH);
  //mcp2.pinMode(SpinRun, INPUT);
  mcp1.digitalWrite(step_ms1x, LOW); //was 8
  mcp1.digitalWrite(step_ms1y, LOW); //was 2
  mcp2.digitalWrite(step_ms1z, LOW); //was 12
  mcp1.digitalWrite(step_ms2x, LOW); //was 7
  mcp1.digitalWrite(step_ms2y, LOW); //was 1
  mcp2.digitalWrite(step_ms2z, LOW); //was 11
  mcp1.digitalWrite(step_ms3x, LOW); //was 5
  mcp1.digitalWrite(step_ms3y, LOW); //was 0
  mcp2.digitalWrite(step_ms3z, LOW); //was 10
  mcp1.digitalWrite(takeastepx, LOW);// takeastepx
  mcp1.digitalWrite(takeastepy, LOW);// takeastepy
  mcp1.digitalWrite(takeastepz, LOW);// takeastepz
  Serial.begin(9600);
  SoftSer.begin(9600);//was 57600
  udp.begin(localPort);
}


void loop() {


  Timer();
  timeWinSlo1 = 126;
  if (Startx == 2 && R == 2 || Starty == 2 && R == 2) {
    R = 0;
  }
  if (Startx == 0 && getEncData == timeWinSlo1 && getEncData < timeWinSlo2) {
    SoftSer.println("000RD!");
    getEncData = 0;
  }
  if (Startx > 0 && getEncData == timeWinFst1 && getEncData < timeWinFst2) {
    SoftSer.println("000RD!");
    getEncData = 0;
  }
  UdpRec();
  RealSer1();
  getio();

  if (cvx > cpx) {
    pvx = (cvx - cpx);
  }
  if (cpx > cvx) {
    pvx = (cpx - cvx);
  }
  //start of X axis
  if (Tmrx < 20 && Stopx == 1) {
    mcp1.digitalWrite(takeastepx, LOW);
    mcp1.digitalWrite(axisXenable, HIGH);
  }
  //pvx = process variable, cpx = Command Position
  if (pvx > W2x && Startx == 1 && Refx == 0) {
    Startx = 2;
  }
  if (Refx == 1) {
    Reffx(); //remote Ref == 5 comes from remote
  }
  if (gohomex == 0 && Refx == 0 || Refx == 5) {
    mcp1.digitalWrite(directionx, LOW);  //manual or remote
    Refx = 1;
    Startx = 20;
    cpx = -1;
  }
  if (Stopx == 0 && exteotx == 1 && reteotx == 1) {
    Startx = 2;
    mcp1.digitalWrite(takeastepx, HIGH);
  }
  if (Stopx == 0) {
    Startx = 0;
    mcp1.digitalWrite(takeastepx, LOW);
    mcp1.digitalWrite(axisXenable, HIGH);
  }
  if (exteotx == 0) {
    Startx = 0;
    mcp1.digitalWrite(takeastepx, LOW);
    mcp1.digitalWrite(axisXenable, HIGH);
  }
  if (reteotx == 0) {
    Startx = 0;
    mcp1.digitalWrite(takeastepx, LOW);
    mcp1.digitalWrite(axisXenable, HIGH);
  }
  if (JogFwdx == 0) {
    Startx = 30;
  }
  if (JogRevx == 0) {
    Startx = 40;
  }
  if (exteotx == 1 && reteotx == 1) {
    if (Startx == 2 && Refx == 0) {
      positionX();
    }
    if (Startx == 35 || Startx == 45 || Startx == 30 || Startx == 40) {
      jogX();
    }
  }

  //start of Y axis
  // determine position movement for Y axis
  if (cvy > cpy) {
    pvy = (cvy - cpy);
  }
  if (cpy > cvy) {
    pvy = (cpy - cvy);
  }
  if (Tmry < 20 && Stopy == 1) {
    mcp1.digitalWrite(takeastepy, LOW);
    mcp1.digitalWrite(axisYenable, HIGH);
  }
  //pvy = process variable, cpy = Command Position
  if (pvy > W2y && Starty == 1 && Refy == 0) {
    Starty = 2;
  }
  if (Refy == 1) {
    Reffy(); //remote Ref == 5 comes from remote
  }
  //manual or remote
  if (gohomey == 0 && Refy == 0 || Refy == 5) {
    mcp1.digitalWrite(directiony, LOW);
    Refy = 1;
    Starty = 20;
    cpy = -1;
  }
  if (Stopy == 0 && exteoty == 1 && reteoty == 1) {
    Starty = 2;
    mcp1.digitalWrite(takeastepy, HIGH);
  }
  if (Stopy == 0) {
    Starty = 0;
    mcp1.digitalWrite(takeastepy, LOW);
    mcp1.digitalWrite(axisYenable, HIGH);
  }
  if (exteoty == 0) {
    Starty = 0;
    mcp1.digitalWrite(takeastepy, LOW);
    mcp1.digitalWrite(axisYenable, HIGH);
  }
  if (reteoty == 0) {
    Starty = 0;
    mcp1.digitalWrite(takeastepy, LOW);
    mcp1.digitalWrite(axisYenable, HIGH);
  }
  if (JogFwdy == 0) {
    Starty = 30;
  }
  if (JogRevy == 0) {
    Starty = 40;
  }
  if (exteoty == 1 && reteoty == 1) {
    if (Starty == 2 && Refy == 0) {
      positionY();
    }
    if (Starty == 35 || Starty == 45 || Starty == 30 || Starty == 40) {
      jogY();
    }
  }
  //start of Z axis
  // determine position movement for Z axis

  if (cvz > cpz) {
    pvz = (cvz - cpz);
  }
  if (cpz > cvz) {
    pvz = (cpz - cvz);
  }
  if (mcp2.digitalRead(Spin) == 0 && SpindleStop == 0) {
    SpindleStop = 1;
    diss = "25Z";
    UdpTrans();
  }
  if (mcp2.digitalRead(Spin) == 1 && SpindleStop == 1) {
    diss = "27Z";
    SpindleStop = 0;
    UdpTrans();
  }
  if (Tmrz < 20 && Stopz == 1) {
    mcp1.digitalWrite(takeastepz, LOW);
    mcp1.digitalWrite(axisZenable, HIGH);
  }
  //pvz = process variable, cpz = Command Position
  if (pvz > W2z && Startz == 1 && Refz == 0) {
    Startz = 2;
  }
  if (Refz == 1) {
    Reffz(); //remote Refz == 5 comes from remote
  }
  //manual or remote
  if (gohomez == 0 && Refz == 0 || Refz == 5) {
    mcp1.digitalWrite(directionz, LOW);
    Refz = 1;
    Startz = 20;
    cpz = -1;
  }
  if (Stopz == 0 && exteotz == 1 && reteotz == 1) {
    Startz = 2;
    mcp1.digitalWrite(takeastepz, HIGH);
  }
  if (Stopz == 0) {
    Startz = 0;
    mcp1.digitalWrite(takeastepz, LOW);
    mcp1.digitalWrite(axisZenable, HIGH);
  }
  if (exteotz == 0) {
    Startz = 0;
    mcp1.digitalWrite(takeastepz, LOW);
    mcp1.digitalWrite(axisZenable, HIGH);
  }
  if (reteotz == 0) {
    Startz = 0;
    mcp1.digitalWrite(takeastepz, LOW);
    mcp1.digitalWrite(axisZenable, HIGH);
  }
  if (JogDwnz == 0) {
    Startz = 30;
  }
  if (JogUpz == 0) {
    Startz = 40;
  }
  if (exteotz == 1 && reteotz == 1) {
    if (Startz == 2 && Refz == 0) {
      positionZ();
    }
    if (Startz == 35 || Startz == 45 || Startz == 30 || Startz == 40) {
      jogZ();
    }
  }
  if (readAll == 5) {
    if (pvx <= W1x && Startx == 2 || pvx <= W1x && Startx == 1 && replX.length() < 8) {
      replX = String(cvx) + "IX";
      for (int k = replX.length(); k < 8; k++) {
        replX = "0" + replX;
      }
    }
    if (pvy <= W1y && Starty == 2 || pvy <= W1y && Starty == 1 && replY.length() < 8) {
      replY = String(cvy) + "IY";
      for (int k = replY.length(); k < 8; k++) {
        replY = "0" + replY;
      }
    }
    if (pvz <= W1z && Startz == 2 || pvz <= W1z && Startz == 1 && replZ.length() < 8) {
      replZ = String(cvz) + "IZ";
      for (int k = replZ.length(); k < 8; k++) {
        replZ = "0" + replZ;
      }
    }

    if (replX.length() == 8 && replY.length() == 8 && replZ.length() == 8) {
      diss = replX + replY + replZ;
      replX = "";
      replY = "";
      replZ = "";
      UdpTrans();
    }
  }
  if (Startx == 1 && Starty == 1 && Startz == 1 && R == 0) {
    diss = "REQpos";  //request next position
    R = 2;
    UdpTrans();
  }

  if (Qx.length() == 8 && Qy.length() == 8 && Qz.length() == 8) {
    diss = Qx + Qy + Qz;
    Qx = "";
    Qy = "";
    Qz = "";
    UdpTrans();
  }
}


void UdpRec() {
  int packetSize = udp.parsePacket();
  if (packetSize) {
    udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
    disc = packetBuffer;


    if (disc.length() > 20) {
      Q = 24;
      //Serial.println(disc);
      Qx = disc.substring(0, 8);
      Qy = disc.substring(8, 16);
      Qz = disc.substring(16, 24);
      disc = "";
      if (Qx.length() > 0) {
        decodex();
      }
      if (Qy.length() > 0) {
        decodey();
      }
      if (Qz.length() > 0) {
        decodez();
      }
    }

  }
}




void UdpTrans() {
  udp.beginPacket(udp.remoteIP(), udp.remotePort());
  udp.println(diss);
  udp.endPacket();
  diss = "";

}

void Timer() {
  cm = millis(); // cm = current Millis, pm = previous Millis, iv = intervalTime

  if ((cm - pm) > iv) {
    pm = cm;

    if (RampTimez < 5000) {
      ++RampTimez;
    }
    if (Tmrx < 10000) {
      ++Tmrx;
    }
    if (Tmry < 10000) {
      ++Tmry;
    }
    if (Tmrz < 10000) {
      ++Tmrz;
    }
    if (getEncData < 5000) {
      ++getEncData;
    }
    //error handling for unexpected serial function interupt, below
    if (Startx == 0 && getEncData > (timeWinSlo2) + 20) {
      getEncData = 0;
    }
    if (Startx > 0 && getEncData > (timeWinFst2) + 20) {
      getEncData = 0;
    }
  }
}

void positionX () {
  if (cpx < cvx && Startx < 20) {
    mcp1.digitalWrite(directionx, LOW); // Reverse  was High, changed encoder wiring
  }
  if (cpx > cvx && Startx < 20) {
    mcp1.digitalWrite(directionx, HIGH); // Forward   was Low
  }
  // One Inch = 1024 pulses
  if (Startx == 2) {
    mcp1.digitalWrite(axisXenable, LOW);  // Stepper A4988 enabled
    mcp1.digitalWrite(takeastepx, HIGH);
  }
  //start stepping
  if (pvx >=  R1x) {
    mcp1.digitalWrite(step_ms1x, LOW);  // full step
    mcp1.digitalWrite(step_ms2x, LOW);
    mcp1.digitalWrite(step_ms3x, LOW);
  }
  if (pvx <  R1x && pvx >= R2x) {
    mcp1.digitalWrite(step_ms1x, HIGH); // half Step
  }
  if (pvx <  R2x && pvx >= R3x) {
    mcp1.digitalWrite(step_ms2x, HIGH);  // 1/4 step
    mcp1.digitalWrite(step_ms1x, LOW);
  }
  if (pvx <  R3x && pvx >= R4x) {
    mcp1.digitalWrite(step_ms2x, HIGH);  // 1/8 step
    mcp1.digitalWrite(step_ms1x, HIGH);
  }
  if (pvx <= W1x && Startx == 2) {
    mcp1.digitalWrite(takeastepx, LOW);
    mcp1.digitalWrite(step_ms1x, LOW);
    mcp1.digitalWrite(step_ms2x, LOW);
    mcp1.digitalWrite(step_ms3x, LOW);
    // don't transmit until all axis are in position
    //replX = String(cvx) + "IX"; // transmitt X position to computer
    //for(int k = replX.length();k < 8;k++){replX = "0" + replX;}
    Startx = 1; // standby - was running but now enabled and standing by for next command

  }
  Tmrx = 0;
}

void positionY () {
  if (cpy < cvy && Starty < 20) {
    mcp1.digitalWrite(directiony, LOW); // Reverse  was High, changed encoder wiring
  }
  if (cpy > cvy && Starty < 20) {
    mcp1.digitalWrite(directiony, HIGH); // Forward   was Low
  }
  // One Inch = 1046 pulses
  if (Starty == 2) {
    mcp1.digitalWrite(axisYenable, LOW);  // Stepper A4988 enabled
    mcp1.digitalWrite(takeastepy, HIGH);
  }
  if (pvy >=  R1y) {
    mcp1.digitalWrite(step_ms1y, LOW);  // full step
    mcp1.digitalWrite(step_ms2y, LOW);
    mcp1.digitalWrite(step_ms3y, LOW);
  }
  if (pvy <  R1y && pvy >= R2y) {
    mcp1.digitalWrite(step_ms1y, HIGH); // half Step
  }
  if (pvy <  R2y && pvy >= R3y) {
    mcp1.digitalWrite(step_ms2y, HIGH);  // 1/4 step
    mcp1.digitalWrite(step_ms3y, LOW);
  }
  if (pvy <  R3y && pvy >= R4y) {
    mcp1.digitalWrite(step_ms2y, HIGH);  // 1/8 step
    mcp1.digitalWrite(step_ms3y, HIGH);
  }
  if (pvy <= W1y && Starty == 2) {
    mcp1.digitalWrite(takeastepy, LOW);
    mcp1.digitalWrite(step_ms1y, LOW);
    mcp1.digitalWrite(step_ms2y, LOW);
    mcp1.digitalWrite(step_ms3y, LOW);
    //replY = String(cvy) + "IY";
    //for(int k = replY.length();k < 8;k++){replY = "0" + replY;}
    Starty = 1; // standby - was running but now enabled and standing by for next command

  }
  Tmry = 0;
}

void positionZ () {
  if (cpz < cvz && Startz < 20) {
    mcp1.digitalWrite(directionz, LOW); // Reverse  was High, changed encoder wiring
  }
  if (cpz > cvz && Startz < 20) {
    mcp1.digitalWrite(directionz, HIGH); // Forward   was Low
  }
  // One Inch = 2512 pulses
  if (Startz == 2) {
    mcp1.digitalWrite(axisZenable, LOW);  // Stepper A4988 enabled
    mcp1.digitalWrite(takeastepz, HIGH);
  }
  if (pvz >=  R1z) {
    mcp1.digitalWrite(step_ms1z, LOW);  // full step
    mcp1.digitalWrite(step_ms2z, LOW);
    mcp1.digitalWrite(step_ms3z, LOW);
  }
  if (pvz <  R1z && pvz >= R2z) {
    mcp1.digitalWrite(step_ms1z, HIGH); // half Step
  }
  if (pvz <  R2z && pvz >= R3z) {
    mcp1.digitalWrite(step_ms2z, HIGH);  // 1/4 step
    mcp1.digitalWrite(step_ms1z, LOW);
  }
  if (pvz <  R3z && pvz >= R4z) {
    mcp1.digitalWrite(step_ms2z, HIGH);  // 1/8 step
    mcp1.digitalWrite(step_ms1z, HIGH);
  }
  if (pvz <= W1z && Startz == 2) {
    mcp1.digitalWrite(takeastepz, LOW);
    mcp2.digitalWrite(step_ms1z, LOW);
    mcp2.digitalWrite(step_ms2z, LOW);
    mcp2.digitalWrite(step_ms3z, LOW);
    //replZ = String(cvz) + "IZ";  // transmitt Z position to computer
    //for(int k = replZ.length();k < 8;k++){replZ = "0" + replZ;}
    Startz = 1; // standby - was running but now enabled and standing by for next command

  }
  Tmrz = 0;;
}

void Reffx() {
  if (Startx == 20) {
    mcp1.digitalWrite(directionx, LOW);
    mcp1.digitalWrite(axisXenable, LOW);
    mcp1.digitalWrite(takeastepx, HIGH);
    mcp1.digitalWrite(step_ms1x, LOW);
    mcp1.digitalWrite(step_ms2x, LOW);
    mcp1.digitalWrite(step_ms3x, LOW);
  } // full step
  if (Startx == 20 && xhome == 0) {
    Startx = 21;
    Tmrx = 0;
    mcp1.digitalWrite(takeastepx, LOW);
    mcp1.digitalWrite(axisXenable, HIGH);
  }
  if (Startx == 21 && xhome == 0 && Tmrx > 20) {
    mcp1.digitalWrite(axisXenable, LOW);
    mcp1.digitalWrite(directionx, HIGH);
    mcp1.digitalWrite(step_ms2x, HIGH);
    mcp1.digitalWrite(step_ms1x, HIGH); // 1/8 step
    mcp1.digitalWrite(takeastepx, HIGH);
  }
  if (Startx == 21 && xhome == 1) {
    mcp1.digitalWrite(takeastepx, LOW);
  }
  if (Startx == 21 && xhome == 1 && Tmrx > 20) {
    Startx = 0;
    SoftSer.println("CLX!");
    replX = "000000RX";
    mcp1.digitalWrite(step_ms1x, LOW);
    mcp1.digitalWrite(step_ms2x, LOW);
    mcp1.digitalWrite(step_ms3x, LOW);
    mcp1.digitalWrite(directionx, HIGH);
  }
}

void Reffy() {

  if (Starty == 20) {
    mcp1.digitalWrite(directiony, LOW);
    mcp1.digitalWrite(axisYenable, LOW);
    mcp1.digitalWrite(takeastepy, HIGH);
    mcp1.digitalWrite(step_ms1y, LOW);
    mcp1.digitalWrite(step_ms2y, LOW);
    mcp1.digitalWrite(step_ms3y, LOW);
  } // full step
  if (Starty == 20 && yhome == 0) {
    Starty = 21;
    Tmry = 0;
    mcp1.digitalWrite(takeastepy, LOW);
    mcp1.digitalWrite(axisYenable, HIGH);
  }
  if (Starty == 21 && yhome == 0 && Tmry > 20) {
    mcp1.digitalWrite(axisYenable, LOW);
    mcp1.digitalWrite(directiony, HIGH);
    mcp1.digitalWrite(step_ms2y, HIGH);
    mcp1.digitalWrite(step_ms1y, HIGH); // 1/8 step
    mcp1.digitalWrite(takeastepy, HIGH);
  }
  if (Starty == 21 && yhome == 1) {
    mcp1.digitalWrite(takeastepy, LOW);
  }
  if (Starty == 21 && yhome == 1 && Tmry > 20) {
    Starty = 0;
    SoftSer.println("CLY!");
    replY = "000000RY";
    mcp1.digitalWrite(step_ms1y, LOW);
    mcp1.digitalWrite(step_ms2y, LOW);
    mcp1.digitalWrite(step_ms3y, LOW);
    mcp1.digitalWrite(directiony, HIGH);
  }
}

void Reffz() {

  if (Startz == 20) {
    mcp1.digitalWrite(directionz, LOW);
    mcp1.digitalWrite(axisZenable, LOW);
    mcp1.digitalWrite(takeastepz, HIGH);
    mcp2.digitalWrite(step_ms1z, LOW);
    mcp2.digitalWrite(step_ms2z, LOW);
    mcp2.digitalWrite(step_ms3z, LOW);
  } // full step
  if (Startz == 20 && zhome == 0) {
    Startz = 21;
    Tmrz = 0;
    mcp1.digitalWrite(takeastepz, LOW);
    mcp1.digitalWrite(axisZenable, HIGH);
  }
  if (Startz == 21 && zhome == 0 && Tmrz > 20) {
    mcp1.digitalWrite(axisZenable, LOW);
    mcp1.digitalWrite(directionz, HIGH);
    mcp2.digitalWrite(step_ms2z, HIGH);
    mcp2.digitalWrite(step_ms1z, HIGH); // 1/8 step
    mcp1.digitalWrite(takeastepz, HIGH);
  }
  if (Startz == 21 && zhome == 1) {
    mcp1.digitalWrite(takeastepz, LOW);
  }
  if (Startz == 21 && zhome == 1 && Tmrz > 20) {
    Startz = 0;
    SoftSer.println("CLZ!");
    replZ = "000000RZ";
    mcp2.digitalWrite(step_ms1z, LOW);
    mcp2.digitalWrite(step_ms2z, LOW);
    mcp2.digitalWrite(step_ms3z, LOW);
    mcp1.digitalWrite(directionz, HIGH);
  }
}

void jogX() {
  // remote computer
  if (Startx > 29) {
    mcp1.digitalWrite(step_ms1x, LOW);
    mcp1.digitalWrite(step_ms2x, LOW);
    mcp1.digitalWrite(step_ms3x, LOW);
  } // full step
  if (Startx == 35 && JogFwdx == 1) {
    mcp1.digitalWrite(directionx, LOW);
    mcp1.digitalWrite(takeastepx, HIGH);
    mcp1.digitalWrite(axisXenable, LOW);
  }
  if (Startx == 45 && JogRevx == 1) {
    mcp1.digitalWrite(directionx, HIGH);
    mcp1.digitalWrite(takeastepx, HIGH);
    mcp1.digitalWrite(axisXenable, LOW);
  }

  //Local
  if (JogFwdx == 0 && Startx == 30) {
    mcp1.digitalWrite(directionx, LOW);
    mcp1.digitalWrite(takeastepx, HIGH);
    mcp1.digitalWrite(axisXenable, LOW);
  }
  if (JogFwdx == 1 && Startx == 30) {
    Startx = 0;
    mcp1.digitalWrite(takeastepx, LOW);
    mcp1.digitalWrite(axisXenable, HIGH);
  }
  if (JogRevx == 0 && Startx == 40) {
    mcp1.digitalWrite(directionx, HIGH);
    mcp1.digitalWrite(takeastepx, HIGH);
    mcp1.digitalWrite(axisXenable, LOW);
  }
  if (JogRevx == 1 && Startx == 40) {
    Startx = 0;
    mcp1.digitalWrite(takeastepx, LOW);
    mcp1.digitalWrite(axisXenable, HIGH);
  }
  if (JogRevx == 1 && Startx == 40 || JogFwdx == 1 && Startx == 30) {
    replX = "0000011X";
  }
}

void jogY() {
  // remote computer
  if (Starty > 29) {
    mcp1.digitalWrite(step_ms1y, LOW);
    mcp1.digitalWrite(step_ms2y, LOW);
    mcp1.digitalWrite(step_ms3y, LOW);
  } // full step
  if (Starty == 35 && JogFwdy == 1) {
    mcp1.digitalWrite(directiony, LOW);
    mcp1.digitalWrite(takeastepy, HIGH);
    mcp1.digitalWrite(axisYenable, LOW);
  }
  if (Starty == 45 && JogRevy == 1) {
    mcp1.digitalWrite(directiony, HIGH);
    mcp1.digitalWrite(takeastepy, HIGH);
    mcp1.digitalWrite(axisYenable, LOW);
  }

  //Local
  if (JogFwdy == 0 && Starty == 30) {
    mcp1.digitalWrite(directiony, LOW);
    mcp1.digitalWrite(takeastepy, HIGH);
    mcp1.digitalWrite(axisYenable, LOW);
  }
  if (JogFwdy == 1 && Starty == 30) {
    Starty = 0;
    mcp1.digitalWrite(takeastepy, LOW);
    mcp1.digitalWrite(axisYenable, HIGH);
  }
  if (JogRevy == 0 && Starty == 40) {
    mcp1.digitalWrite(directiony, HIGH);
    mcp1.digitalWrite(takeastepy, HIGH);
    mcp1.digitalWrite(axisYenable, LOW);
  }
  if (JogRevy == 1 && Starty == 40) {
    Starty = 0;
    mcp1.digitalWrite(takeastepy, LOW);
    mcp1.digitalWrite(axisYenable, HIGH);
  }
  if (JogRevy == 1 && Starty == 40 || JogFwdy == 1 && Starty == 30) {
    replY = "0000011Y";
  }
}

void jogZ() {

  // remote computer
  if (Startz > 29) {
    mcp2.digitalWrite(step_ms1z, LOW);
    mcp2.digitalWrite(step_ms2z, LOW);
    mcp2.digitalWrite(step_ms3z, LOW);
  } // full step
  if (Startz == 35 && JogDwnz == 1) {
    mcp1.digitalWrite(directionz, LOW);
    mcp1.digitalWrite(takeastepz, HIGH);
    mcp1.digitalWrite(axisZenable, LOW);
  }
  if (Startz == 45 && JogUpz == 1) {
    mcp1.digitalWrite(directionz, HIGH);
    mcp1.digitalWrite(takeastepz, HIGH);
    mcp1.digitalWrite(axisZenable, LOW);
  }

  //Local
  if (JogDwnz == 0 && Startz == 30) {
    mcp1.digitalWrite(directionz, LOW);
    mcp1.digitalWrite(takeastepz, HIGH);
    mcp1.digitalWrite(axisZenable, LOW);
  }
  if (JogDwnz == 1 && Startz == 30) {
    Startz = 0;
    mcp1.digitalWrite(takeastepz, LOW);
    mcp1.digitalWrite(axisZenable, HIGH);
  }
  if (JogUpz == 0 && Startz == 40) {
    mcp1.digitalWrite(directionz, HIGH);
    mcp1.digitalWrite(takeastepz, HIGH);
    mcp1.digitalWrite(axisZenable, LOW);
  }
  if (JogUpz == 1 && Startz == 40) {
    Startz = 0;
    mcp1.digitalWrite(takeastepz, LOW);
    mcp1.digitalWrite(axisZenable, HIGH);
  }
  if (JogUpz == 1 && Startz == 40 || JogDwnz == 1 && Startz == 30) {
    diss = "0000011Z";
  }
}

void getio() {
  exteotx = safex.digitalRead(0);//End of Travel Extend
  reteotx = safex.digitalRead(1);//End of Travel Retract
  xhome = safex.digitalRead(2);//Optical home switch
  xspare = safex.digitalRead(3);//spare
  Stopx = safex.digitalRead(4);//Stop PB
  JogFwdx = safex.digitalRead(5);//Jog FWD PB
  gohomex = safex.digitalRead(6);//reference PB
  JogRevx = safex.digitalRead(7);//Jog REV PB

  exteoty = safey.digitalRead(0);//End of Travel Extend
  reteoty = safey.digitalRead(1);//End of Travel Retract
  yhome = safey.digitalRead(2);//Optical home switch
  yspare = safey.digitalRead(3);//spare
  Stopy = safey.digitalRead(4);//Stop PB
  JogFwdy = safey.digitalRead(5);//Jog FWD PB
  gohomey = safey.digitalRead(6);//reference PB
  JogRevy = safey.digitalRead(7);//Jog REV PB

  exteotz = safez.digitalRead(0);//End of Travel Extend
  reteotz = safez.digitalRead(1);//End of Travel Retract
  zhome = safez.digitalRead(2);//Optical home switch
  zspare = safez.digitalRead(3);//spare
  Stopz = safez.digitalRead(4);//Stop PB
  JogDwnz = safez.digitalRead(5);//Jog DWN PB
  gohomez = safez.digitalRead(6);//reference PB
  JogUpz = safez.digitalRead(7);//Jog UP PB

}




void RealSer1() {

  String xx;
  String yy;
  String zz;
  if (SoftSer.available() > 0) {
    disc = SoftSer.readStringUntil('!');
    disc.trim();
    if (disc.length() >= 21) {
      if (readAll == 5) {
        diss = disc;
        UdpTrans();
        readAll = 0;
      }
      xx = disc.substring(0, 8);
      yy = disc.substring(8, 16);
      zz = disc.substring(16, 24);
      disc = "";
      if (xx.length() > 0) {
        cvx = xx.toInt();
        xx = "";
      }
      if (yy.length() > 0) {
        cvy = yy.toInt();
        yy = "";
      }
      if (zz.length() > 0) {
        cvz = zz.toInt();
        zz = "";
      }

    }
  }
}




void decodex() {
  if (Qx.endsWith("RGX")) {
    readAll = 5;
    Qx = "";
  }
  if (Qx.endsWith("ITX")) {
    SoftSer.println("ITX!");
    Qx = "Inital-X";
  }
  if (Qx.endsWith("CLX")) {
    SoftSer.println("CLX!");
    Qx = "Clr-EncX";
  }
  if (Qx.endsWith("R1X")) {
    R1x = Qx.toInt();
  }
  if (Qx.endsWith("R2X")) {
    R2x = Qx.toInt();
  }
  if (Qx.endsWith("R3X")) {
    R3x = Qx.toInt();
  }
  if (Qx.endsWith("R4X")) {
    R4x = Qx.toInt();
  }
  if (Qx.endsWith("D1X")) {
    D1x = Qx.toInt();
  }
  if (Qx.endsWith("D2X")) {
    D2x = Qx.toInt();
  }
  if (Qx.endsWith("W1X")) {
    W1x = Qx.toInt();
  }
  if (Qx.endsWith("W2X")) {
    W2x = Qx.toInt();
  }
  if (Qx.endsWith("20X")) {
    Qx = String(cvx) + "EX"; // Get Encoder Position
  }
  if (Qx.endsWith("22X")) {
    Startx = 2;  //Run
    Qx = "22X";
  }
  if (Qx.endsWith("21X")) {
    Startx = 1;  //Auto
    Qx = "21X";
  }
  if (Qx.endsWith("32X")) {
    Startx = 35;  //Jog fwd
    mcp1.digitalWrite(directionx, LOW);
    Qx = "32X";
  }
  if (Qx.endsWith("42X")) {
    Startx = 45;  //Jog rev
    mcp1.digitalWrite(directionx, HIGH);
    Qx = "42X";
  }
  if (Qx.endsWith("52X")) {
    Startx = 0;  //Reference
    Refx = 5;
    mcp1.digitalWrite(directionx, LOW);
    Qx = "52X";
  }
  if (Qx.endsWith("11X")) {
    Startx = 0;  //Stop
    mcp1.digitalWrite(takeastepx, LOW);
    mcp1.digitalWrite(axisXenable, HIGH);
    Qx = "11X";
  }
  if (Qx.endsWith("A")) {
    cpx = Qx.toInt();
    Qx = (String(cpx) + "A");
  }
  if (Qx.endsWith("PX")) {
    Qx = String(pvx) + "PX";
  }
  if (Qx.length() > 2 ) {
    for (int k = Qx.length(); k < 8; k++) {
      Qx = "0" + Qx;
    }
  }
}

void decodey() {
  if (Qy.endsWith("ITY")) {
    SoftSer.println("ITY!");
    Qy = "";
    diss = "Inital-Y";
  }
  if (Qy.endsWith("CLY")) {
    SoftSer.println("CLY!");
    Qy = "";
    diss = "Clr-EncY";
  }
  if (Qy.endsWith("R1Y")) {
    R1y = Qy.toInt();
  }
  if (Qy.endsWith("R2Y")) {
    R2y = Qy.toInt();
  }
  if (Qy.endsWith("R3Y")) {
    R3y = Qy.toInt();
  }
  if (Qy.endsWith("R4Y")) {
    R4y = Qy.toInt();
  }
  if (Qy.endsWith("D1Y")) {
    D1y = Qy.toInt();
  }
  if (Qy.endsWith("D2Y")) {
    D2y = Qy.toInt();
  }
  if (Qy.endsWith("W1Y")) {
    W1y = Qy.toInt();
  }
  if (Qy.endsWith("W2Y")) {
    W2y = Qy.toInt();
  }
  if (Qy.endsWith("20Y")) {
    Qy = String(cvy) + "EY"; // Get Encoder Position
  }
  if (Qy.endsWith("22Y")) {
    Starty = 2;  //Run
    Qy = "22Y";
  }
  if (Qy.endsWith("21Y")) {
    Starty = 1;  //Auto
    Qy = "21Y";
  }
  if (Qy.endsWith("32Y")) {
    Starty = 35;  //Jog fwd
    mcp1.digitalWrite(directiony, LOW);
    Qy = "32Y";
  }
  if (Qy.endsWith("42Y")) {
    Starty = 45;  //Jog rev
    mcp1.digitalWrite(directiony, HIGH);
    Qy = "42Y";
  }
  if (Qy.endsWith("52Y")) {
    Starty = 0;  //Reference
    Refy = 5;
    mcp1.digitalWrite(directiony, LOW);
    Qy = "52Y";
  }
  if (Qy.endsWith("11Y")) {
    Starty = 0;
    mcp1.digitalWrite(takeastepy, LOW);
    mcp1.digitalWrite(axisYenable, HIGH);
    Qy = "11Y";
  }
  if (Qy.endsWith("B")) {
    cpy = Qy.toInt();
    Qy = (String(cpy) + "B");
  }
  if (Qy.endsWith("PY")) {
    Qy = String(pvy) + "PY";
  }
  if (Qy.length() > 2) {
    for (int k = Qy.length(); k < 8; k++) {
      Qy = "0" + Qy;
    }
  }
}

void decodez() {
  if (Qz.endsWith("ITZ")) {
    SoftSer.println("ITZ!");
    Qz = "Inital-Z";
  }
  if (Qz.endsWith("CLZ")) {
    SoftSer.println("CLZ!");
    Qz = "Clr-EncZ";
  }
  if (Qz.endsWith("R1Z")) {
    R1z = Qz.toInt();
  }
  if (Qz.endsWith("R2Z")) {
    R2z = Qz.toInt();
  }
  if (Qz.endsWith("R3Z")) {
    R3z = Qz.toInt();
  }
  if (Qz.endsWith("R4Z")) {
    R4z = Qz.toInt();
  }
  if (Qz.endsWith("D1Z")) {
    D1z = Qz.toInt();
  }
  if (Qz.endsWith("D2Z")) {
    D2z = Qz.toInt();
  }
  if (Qz.endsWith("D3Z")) {
    D3z = Qz.toInt();
  }
  if (Qz.endsWith("D4Z")) {
    D4z = Qz.toInt();
  }
  if (Qz.endsWith("W1Z")) {
    W1z = Qz.toInt();
  }
  if (Qz.endsWith("W2Z")) {
    W2z = Qz.toInt();
  }
  if (Qz.endsWith("15Z")) {
    mcp2.digitalWrite(SpinRun, HIGH);
    Qz = "15Z";
  }
  if (Qz.endsWith("18Z")) {
    mcp2.digitalWrite(SpinRun, LOW);
    SpindleStop = 0;
    Startz = 0;
    Qz = "18Z";
  }
  if (Qz.endsWith("20Z")) {
    Qz = String(cvz) + "EZ"; // Get Encoder Position
  }
  if (Qz.endsWith("22Z")) {
    Startz = 2;  //Run
    Qz = "22Z";
  }
  if (Qz.endsWith("21Z")) {
    Startz = 1;  //Auto
    Qz = "21Z";
  }
  if (Qz.endsWith("32Z")) {
    Startz = 35;  //Jog fwd
    mcp1.digitalWrite(directionz, LOW);
    Qz = "32Z";
  }
  if (Qz.endsWith("42Z")) {
    Startz = 45;  //Jog rev
    mcp1.digitalWrite(directionz, HIGH);
    Qz = "42Z";
  }
  if (Qz.endsWith("52Z")) {
    Startz = 0;  //Reference
    Refz = 5;
    digitalWrite(directionz, LOW);
    Qz = "52Z";
  }
  if (Qz.endsWith("11Z")) {
    Startz = 0;  //Stop
    mcp1.digitalWrite(takeastepz, LOW);
    mcp1.digitalWrite(axisZenable, HIGH);
    Qz = "11Z";
  }
  if (Qz.endsWith("C")) {
    cpz = Qz.toInt();
    Qz = (String(cpz) + "C");
  }
  if (Qz.endsWith("PZ")) {
    Qz = String(pvz) + "PZ";
  }
  if (Qz.length() > 2) {
    for (int k = Qz.length(); k < 8; k++) {
      Qz = "0" + Qz;
    }
  }
}



[[code]
#include <Adafruit_MCP23017.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
#include <SoftwareSerial.h>
//#include <Adafruit_MCP23X17.h>
#include <Adafruit_PCF8574.h>
#include <SPI.h>
#include <Wire.h>

byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 15, 220);

unsigned int localPort = 51000;      // local port to listen on

// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];  // buffer to hold incoming packet,
EthernetUDP udp;

Adafruit_MCP23017 mcp1; // I2C
Adafruit_MCP23017 mcp2; // I2C
Adafruit_PCF8574 safex;// I2C
Adafruit_PCF8574 safey;// I2C
Adafruit_PCF8574 safez;// I2C
SoftwareSerial SoftSer(2, 3);
//mcp1
const int takeastepx = 0;
const int directionx = 1;
const int axisXenable = 2;
const int step_ms1x = 3;
const int step_ms2x = 4;
const int step_ms3x = 5;

const int takeastepy = 6;
const int directiony = 7;
const int axisYenable = 8;
const int step_ms1y = 9;
const int step_ms2y = 10;
const int step_ms3y = 11;

const int takeastepz = 12;
const int directionz = 13;
const int axisZenable = 14;
//mcp2
const int step_ms1z = 0;
const int step_ms2z = 1;
const int step_ms3z = 2;
const int Spin = 3;
const int SpinRun = 4;

String disc = "";
String diss = "";
String Qx = "";
String Qy = "";
String Qz = "";
String replX = "";
String replY = "";
String replZ = "";

int SpindleStop = 0;
int Startx = 0;
int Starty = 0;
int Startz = 0;
int Refx = 0;
int Refy = 0;
int Refz = 0;
unsigned long cm = 0;
unsigned long pm = 0;
long iv = 15;
long cvx = 0; //X-axis Encoder Counts
long cvy = 0; //Y-axis Encoder Counts
long cvz = 0; //Z-axis Encoder Counts
long pvx = 0; //X-axis process variable Counts to position
long pvy = 0; //Y-axis process variable Counts to position
long pvz = 0; //Z-axis process variable Counts to position
long cpx = 0; //Recieved command for X-axis position
long cpy = 0; //Recieved command for Y-axis position
long cpz = 0; //Recieved command for Z-axis position

int xspare = 0;
int yspare = 0;
int zspare = 0;
int gohomex = 0;
int JogFwdx = 0;
int JogRevx = 0;
int Stopx = 0;
int exteotx = 0;
int reteotx = 0;
int xhome = 0;
int gohomey = 0;
int JogFwdy = 0;
int JogRevy = 0;
int Stopy = 0;
int exteoty = 0;
int reteoty = 0;
int yhome = 0;
int gohomez = 0;
int JogDwnz = 0;
int JogUpz = 0;
int Stopz = 0;
int exteotz = 0;
int reteotz = 0;
int zhome = 2;
int Tmrx = 0;
int Tmry = 0;
int Tmrz = 0;
int Nopz = 0;
int R1x = 100;
int R2x = 50;
int R3x = 10;
int R4x = 3;
int D1x = 1000;
int D2x = 750;
int W1x = 2;
int W2x = 4;
int R1y = 100;
int R2y = 50;
int R3y = 10;
int R4y = 3;
int D1y = 1000;
int D2y = 750;
int W1y = 2;
int W2y = 4;
int R1z = 100;
int R2z = 50;
int R3z = 10;
int R4z = 3;
int D1z = 1000;
int D2z = 750;
int D3z = 500;
int D4z = 250;
int D5z = 75;
int D6z = 35;
int D7z = 20;
int D8z = 10;
int W1z = 2;
int W2z = 4;
int R = 0;
int LL = 0;
int timeWinSlo1 = 125;
int timeWinSlo2 = 126;
int timeWinFst1 = 10;
int timeWinFst2 = 11;
int readAll = 0;
int getEncData = 0;
int SerNot = 0;
int RampTimez = 0;
int Q = 0;

void setup() {
  // Remember Serial has the Encoder position data

  SPI.begin();
  Ethernet.init(10);
  Ethernet.begin(mac, ip);
  Wire.begin();
  mcp1.begin(0x03);
  mcp2.begin(0x04);
  safex.begin(0x20, &Wire);// I2C
  for (uint8_t p = 0; p < 8; p++) {
    safex.pinMode(p, INPUT_PULLUP);
  }
  safey.begin(0x21, &Wire);// I2C
  for (uint8_t p = 0; p < 8; p++) {
    safey.pinMode(p, INPUT_PULLUP);
  }
  safez.begin(0x22, &Wire);// I2C
  for (uint8_t p = 0; p < 8; p++) {
    safez.pinMode(p, INPUT_PULLUP);
  }

  mcp1.pinMode(takeastepx, OUTPUT);// step pin X
  mcp1.pinMode(takeastepy, OUTPUT);// step pin Y
  mcp1.pinMode(takeastepz, OUTPUT);// step pin Z
  mcp1.pinMode(directionx, OUTPUT);// stepperX direction
  mcp1.pinMode(directiony, OUTPUT);// stepperY direction
  mcp1.pinMode(directionz, OUTPUT);// stepperZ direction
  mcp1.pinMode(axisXenable, OUTPUT);// Enable stepper X movement
  mcp1.pinMode(axisYenable, OUTPUT);// Enable stepper Y movement
  mcp1.pinMode(axisZenable, OUTPUT);// Enable stepper Z movement
  mcp1.pinMode(step_ms1x, OUTPUT);// stepper step select ms1x
  mcp1.pinMode(step_ms2x, OUTPUT);// stepper step select ms2x
  mcp1.pinMode(step_ms3x, OUTPUT);// stepper step select ms3x
  mcp1.pinMode(step_ms1y, OUTPUT);// stepper step select ms1y
  mcp1.pinMode(step_ms2y, OUTPUT);// stepper step select ms2y
  mcp1.pinMode(step_ms3y, OUTPUT);// stepper step select ms3y
  mcp2.pinMode(step_ms1z, OUTPUT);// stepper step select ms1z
  mcp2.pinMode(step_ms2z, OUTPUT);// stepper step select ms2z
  mcp2.pinMode(step_ms3z, OUTPUT);// stepper step select ms3z
  mcp2.pinMode(Spin, OUTPUT);// command to run Spindle Motor
  mcp2.pinMode(SpinRun, INPUT);//Indication of spindle motor Powered
  mcp2.pullUp(SpinRun, HIGH);
  //mcp2.pinMode(SpinRun, INPUT);
  mcp1.digitalWrite(step_ms1x, LOW); //was 8
  mcp1.digitalWrite(step_ms1y, LOW); //was 2
  mcp2.digitalWrite(step_ms1z, LOW); //was 12
  mcp1.digitalWrite(step_ms2x, LOW); //was 7
  mcp1.digitalWrite(step_ms2y, LOW); //was 1
  mcp2.digitalWrite(step_ms2z, LOW); //was 11
  mcp1.digitalWrite(step_ms3x, LOW); //was 5
  mcp1.digitalWrite(step_ms3y, LOW); //was 0
  mcp2.digitalWrite(step_ms3z, LOW); //was 10
  mcp1.digitalWrite(takeastepx, LOW);// takeastepx
  mcp1.digitalWrite(takeastepy, LOW);// takeastepy
  mcp1.digitalWrite(takeastepz, LOW);// takeastepz
  Serial.begin(9600);
  SoftSer.begin(9600);//was 57600
  udp.begin(localPort);
}


void loop() {


  Timer();
  timeWinSlo1 = 126;
  if (Startx == 2 && R == 2 || Starty == 2 && R == 2) {
    R = 0;
  }
  if (Startx == 0 && getEncData == timeWinSlo1 && getEncData < timeWinSlo2) {
    SoftSer.println("000RD!");
    getEncData = 0;
  }
  if (Startx > 0 && getEncData == timeWinFst1 && getEncData < timeWinFst2) {
    SoftSer.println("000RD!");
    getEncData = 0;
  }
  UdpRec();
  RealSer1();
  getio();

  if (cvx > cpx) {
    pvx = (cvx - cpx);
  }
  if (cpx > cvx) {
    pvx = (cpx - cvx);
  }
  //start of X axis
  if (Tmrx < 20 && Stopx == 1) {
    mcp1.digitalWrite(takeastepx, LOW);
    mcp1.digitalWrite(axisXenable, HIGH);
  }
  //pvx = process variable, cpx = Command Position
  if (pvx > W2x && Startx == 1 && Refx == 0) {
    Startx = 2;
  }
  if (Refx == 1) {
    Reffx(); //remote Ref == 5 comes from remote
  }
  if (gohomex == 0 && Refx == 0 || Refx == 5) {
    mcp1.digitalWrite(directionx, LOW);  //manual or remote
    Refx = 1;
    Startx = 20;
    cpx = -1;
  }
  if (Stopx == 0 && exteotx == 1 && reteotx == 1) {
    Startx = 2;
    mcp1.digitalWrite(takeastepx, HIGH);
  }
  if (Stopx == 0) {
    Startx = 0;
    mcp1.digitalWrite(takeastepx, LOW);
    mcp1.digitalWrite(axisXenable, HIGH);
  }
  if (exteotx == 0) {
    Startx = 0;
    mcp1.digitalWrite(takeastepx, LOW);
    mcp1.digitalWrite(axisXenable, HIGH);
  }
  if (reteotx == 0) {
    Startx = 0;
    mcp1.digitalWrite(takeastepx, LOW);
    mcp1.digitalWrite(axisXenable, HIGH);
  }
  if (JogFwdx == 0) {
    Startx = 30;
  }
  if (JogRevx == 0) {
    Startx = 40;
  }
  if (exteotx == 1 && reteotx == 1) {
    if (Startx == 2 && Refx == 0) {
      positionX();
    }
    if (Startx == 35 || Startx == 45 || Startx == 30 || Startx == 40) {
      jogX();
    }
  }

  //start of Y axis
  // determine position movement for Y axis
  if (cvy > cpy) {
    pvy = (cvy - cpy);
  }
  if (cpy > cvy) {
    pvy = (cpy - cvy);
  }
  if (Tmry < 20 && Stopy == 1) {
    mcp1.digitalWrite(takeastepy, LOW);
    mcp1.digitalWrite(axisYenable, HIGH);
  }
  //pvy = process variable, cpy = Command Position
  if (pvy > W2y && Starty == 1 && Refy == 0) {
    Starty = 2;
  }
  if (Refy == 1) {
    Reffy(); //remote Ref == 5 comes from remote
  }
  //manual or remote
  if (gohomey == 0 && Refy == 0 || Refy == 5) {
    mcp1.digitalWrite(directiony, LOW);
    Refy = 1;
    Starty = 20;
    cpy = -1;
  }
  if (Stopy == 0 && exteoty == 1 && reteoty == 1) {
    Starty = 2;
    mcp1.digitalWrite(takeastepy, HIGH);
  }
  if (Stopy == 0) {
    Starty = 0;
    mcp1.digitalWrite(takeastepy, LOW);
    mcp1.digitalWrite(axisYenable, HIGH);
  }
  if (exteoty == 0) {
    Starty = 0;
    mcp1.digitalWrite(takeastepy, LOW);
    mcp1.digitalWrite(axisYenable, HIGH);
  }
  if (reteoty == 0) {
    Starty = 0;
    mcp1.digitalWrite(takeastepy, LOW);
    mcp1.digitalWrite(axisYenable, HIGH);
  }
  if (JogFwdy == 0) {
    Starty = 30;
  }
  if (JogRevy == 0) {
    Starty = 40;
  }
  if (exteoty == 1 && reteoty == 1) {
    if (Starty == 2 && Refy == 0) {
      positionY();
    }
    if (Starty == 35 || Starty == 45 || Starty == 30 || Starty == 40) {
      jogY();
    }
  }
  //start of Z axis
  // determine position movement for Z axis

  if (cvz > cpz) {
    pvz = (cvz - cpz);
  }
  if (cpz > cvz) {
    pvz = (cpz - cvz);
  }
  if (mcp2.digitalRead(Spin) == 0 && SpindleStop == 0) {
    SpindleStop = 1;
    diss = "25Z";
    UdpTrans();
  }
  if (mcp2.digitalRead(Spin) == 1 && SpindleStop == 1) {
    diss = "27Z";
    SpindleStop = 0;
    UdpTrans();
  }
  if (Tmrz < 20 && Stopz == 1) {
    mcp1.digitalWrite(takeastepz, LOW);
    mcp1.digitalWrite(axisZenable, HIGH);
  }
  //pvz = process variable, cpz = Command Position
  if (pvz > W2z && Startz == 1 && Refz == 0) {
    Startz = 2;
  }
  if (Refz == 1) {
    Reffz(); //remote Refz == 5 comes from remote
  }
  //manual or remote
  if (gohomez == 0 && Refz == 0 || Refz == 5) {
    mcp1.digitalWrite(directionz, LOW);
    Refz = 1;
    Startz = 20;
    cpz = -1;
  }
  if (Stopz == 0 && exteotz == 1 && reteotz == 1) {
    Startz = 2;
    mcp1.digitalWrite(takeastepz, HIGH);
  }
  if (Stopz == 0) {
    Startz = 0;
    mcp1.digitalWrite(takeastepz, LOW);
    mcp1.digitalWrite(axisZenable, HIGH);
  }
  if (exteotz == 0) {
    Startz = 0;
    mcp1.digitalWrite(takeastepz, LOW);
    mcp1.digitalWrite(axisZenable, HIGH);
  }
  if (reteotz == 0) {
    Startz = 0;
    mcp1.digitalWrite(takeastepz, LOW);
    mcp1.digitalWrite(axisZenable, HIGH);
  }
  if (JogDwnz == 0) {
    Startz = 30;
  }
  if (JogUpz == 0) {
    Startz = 40;
  }
  if (exteotz == 1 && reteotz == 1) {
    if (Startz == 2 && Refz == 0) {
      positionZ();
    }
    if (Startz == 35 || Startz == 45 || Startz == 30 || Startz == 40) {
      jogZ();
    }
  }
  if (readAll == 5) {
    if (pvx <= W1x && Startx == 2 || pvx <= W1x && Startx == 1 && replX.length() < 8) {
      replX = String(cvx) + "IX";
      for (int k = replX.length(); k < 8; k++) {
        replX = "0" + replX;
      }
    }
    if (pvy <= W1y && Starty == 2 || pvy <= W1y && Starty == 1 && replY.length() < 8) {
      replY = String(cvy) + "IY";
      for (int k = replY.length(); k < 8; k++) {
        replY = "0" + replY;
      }
    }
    if (pvz <= W1z && Startz == 2 || pvz <= W1z && Startz == 1 && replZ.length() < 8) {
      replZ = String(cvz) + "IZ";
      for (int k = replZ.length(); k < 8; k++) {
        replZ = "0" + replZ;
      }
    }

    if (replX.length() == 8 && replY.length() == 8 && replZ.length() == 8) {
      diss = replX + replY + replZ;
      replX = "";
      replY = "";
      replZ = "";
      UdpTrans();
    }
  }
  if (Startx == 1 && Starty == 1 && Startz == 1 && R == 0) {
    diss = "REQpos";  //request next position
    R = 2;
    UdpTrans();
  }

  if (Qx.length() == 8 && Qy.length() == 8 && Qz.length() == 8) {
    diss = Qx + Qy + Qz;
    Qx = "";
    Qy = "";
    Qz = "";
    UdpTrans();
  }
}


void UdpRec() {
  int packetSize = udp.parsePacket();
  if (packetSize) {
    udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
    disc = packetBuffer;


    if (disc.length() > 20) {
      Q = 24;
      //Serial.println(disc);
      Qx = disc.substring(0, 8);
      Qy = disc.substring(8, 16);
      Qz = disc.substring(16, 24);
      disc = "";
      if (Qx.length() > 0) {
        decodex();
      }
      if (Qy.length() > 0) {
        decodey();
      }
      if (Qz.length() > 0) {
        decodez();
      }
    }

  }
}




void UdpTrans() {
  udp.beginPacket(udp.remoteIP(), udp.remotePort());
  udp.println(diss);
  udp.endPacket();
  diss = "";

}

void Timer() {
  cm = millis(); // cm = current Millis, pm = previous Millis, iv = intervalTime

  if ((cm - pm) > iv) {
    pm = cm;

    if (RampTimez < 5000) {
      ++RampTimez;
    }
    if (Tmrx < 10000) {
      ++Tmrx;
    }
    if (Tmry < 10000) {
      ++Tmry;
    }
    if (Tmrz < 10000) {
      ++Tmrz;
    }
    if (getEncData < 5000) {
      ++getEncData;
    }
    //error handling for unexpected serial function interupt, below
    if (Startx == 0 && getEncData > (timeWinSlo2) + 20) {
      getEncData = 0;
    }
    if (Startx > 0 && getEncData > (timeWinFst2) + 20) {
      getEncData = 0;
    }
  }
}

void positionX () {
  if (cpx < cvx && Startx < 20) {
    mcp1.digitalWrite(directionx, LOW); // Reverse  was High, changed encoder wiring
  }
  if (cpx > cvx && Startx < 20) {
    mcp1.digitalWrite(directionx, HIGH); // Forward   was Low
  }
  // One Inch = 1024 pulses
  if (Startx == 2) {
    mcp1.digitalWrite(axisXenable, LOW);  // Stepper A4988 enabled
    mcp1.digitalWrite(takeastepx, HIGH);
  }
  //start stepping
  if (pvx >=  R1x) {
    mcp1.digitalWrite(step_ms1x, LOW);  // full step
    mcp1.digitalWrite(step_ms2x, LOW);
    mcp1.digitalWrite(step_ms3x, LOW);
  }
  if (pvx <  R1x && pvx >= R2x) {
    mcp1.digitalWrite(step_ms1x, HIGH); // half Step
  }
  if (pvx <  R2x && pvx >= R3x) {
    mcp1.digitalWrite(step_ms2x, HIGH);  // 1/4 step
    mcp1.digitalWrite(step_ms1x, LOW);
  }
  if (pvx <  R3x && pvx >= R4x) {
    mcp1.digitalWrite(step_ms2x, HIGH);  // 1/8 step
    mcp1.digitalWrite(step_ms1x, HIGH);
  }
  if (pvx <= W1x && Startx == 2) {
    mcp1.digitalWrite(takeastepx, LOW);
    mcp1.digitalWrite(step_ms1x, LOW);
    mcp1.digitalWrite(step_ms2x, LOW);
    mcp1.digitalWrite(step_ms3x, LOW);
    // don't transmit until all axis are in position
    //replX = String(cvx) + "IX"; // transmitt X position to computer
    //for(int k = replX.length();k < 8;k++){replX = "0" + replX;}
    Startx = 1; // standby - was running but now enabled and standing by for next command

  }
  Tmrx = 0;
}

void positionY () {
  if (cpy < cvy && Starty < 20) {
    mcp1.digitalWrite(directiony, LOW); // Reverse  was High, changed encoder wiring
  }
  if (cpy > cvy && Starty < 20) {
    mcp1.digitalWrite(directiony, HIGH); // Forward   was Low
  }
  // One Inch = 1046 pulses
  if (Starty == 2) {
    mcp1.digitalWrite(axisYenable, LOW);  // Stepper A4988 enabled
    mcp1.digitalWrite(takeastepy, HIGH);
  }
  if (pvy >=  R1y) {
    mcp1.digitalWrite(step_ms1y, LOW);  // full step
    mcp1.digitalWrite(step_ms2y, LOW);
    mcp1.digitalWrite(step_ms3y, LOW);
  }
  if (pvy <  R1y && pvy >= R2y) {
    mcp1.digitalWrite(step_ms1y, HIGH); // half Step
  }
  if (pvy <  R2y && pvy >= R3y) {
    mcp1.digitalWrite(step_ms2y, HIGH);  // 1/4 step
    mcp1.digitalWrite(step_ms3y, LOW);
  }
  if (pvy <  R3y && pvy >= R4y) {
    mcp1.digitalWrite(step_ms2y, HIGH);  // 1/8 step
    mcp1.digitalWrite(step_ms3y, HIGH);
  }
  if (pvy <= W1y && Starty == 2) {
    mcp1.digitalWrite(takeastepy, LOW);
    mcp1.digitalWrite(step_ms1y, LOW);
    mcp1.digitalWrite(step_ms2y, LOW);
    mcp1.digitalWrite(step_ms3y, LOW);
    //replY = String(cvy) + "IY";
    //for(int k = replY.length();k < 8;k++){replY = "0" + replY;}
    Starty = 1; // standby - was running but now enabled and standing by for next command

  }
  Tmry = 0;
}

void positionZ () {
  if (cpz < cvz && Startz < 20) {
    mcp1.digitalWrite(directionz, LOW); // Reverse  was High, changed encoder wiring
  }
  if (cpz > cvz && Startz < 20) {
    mcp1.digitalWrite(directionz, HIGH); // Forward   was Low
  }
  // One Inch = 2512 pulses
  if (Startz == 2) {
    mcp1.digitalWrite(axisZenable, LOW);  // Stepper A4988 enabled
    mcp1.digitalWrite(takeastepz, HIGH);
  }
  if (pvz >=  R1z) {
    mcp1.digitalWrite(step_ms1z, LOW);  // full step
    mcp1.digitalWrite(step_ms2z, LOW);
    mcp1.digitalWrite(step_ms3z, LOW);
  }
  if (pvz <  R1z && pvz >= R2z) {
    mcp1.digitalWrite(step_ms1z, HIGH); // half Step
  }
  if (pvz <  R2z && pvz >= R3z) {
    mcp1.digitalWrite(step_ms2z, HIGH);  // 1/4 step
    mcp1.digitalWrite(step_ms1z, LOW);
  }
  if (pvz <  R3z && pvz >= R4z) {
    mcp1.digitalWrite(step_ms2z, HIGH);  // 1/8 step
    mcp1.digitalWrite(step_ms1z, HIGH);
  }
  if (pvz <= W1z && Startz == 2) {
    mcp1.digitalWrite(takeastepz, LOW);
    mcp2.digitalWrite(step_ms1z, LOW);
    mcp2.digitalWrite(step_ms2z, LOW);
    mcp2.digitalWrite(step_ms3z, LOW);
    //replZ = String(cvz) + "IZ";  // transmitt Z position to computer
    //for(int k = replZ.length();k < 8;k++){replZ = "0" + replZ;}
    Startz = 1; // standby - was running but now enabled and standing by for next command

  }
  Tmrz = 0;;
}

void Reffx() {
  if (Startx == 20) {
    mcp1.digitalWrite(directionx, LOW);
    mcp1.digitalWrite(axisXenable, LOW);
    mcp1.digitalWrite(takeastepx, HIGH);
    mcp1.digitalWrite(step_ms1x, LOW);
    mcp1.digitalWrite(step_ms2x, LOW);
    mcp1.digitalWrite(step_ms3x, LOW);
  } // full step
  if (Startx == 20 && xhome == 0) {
    Startx = 21;
    Tmrx = 0;
    mcp1.digitalWrite(takeastepx, LOW);
    mcp1.digitalWrite(axisXenable, HIGH);
  }
  if (Startx == 21 && xhome == 0 && Tmrx > 20) {
    mcp1.digitalWrite(axisXenable, LOW);
    mcp1.digitalWrite(directionx, HIGH);
    mcp1.digitalWrite(step_ms2x, HIGH);
    mcp1.digitalWrite(step_ms1x, HIGH); // 1/8 step
    mcp1.digitalWrite(takeastepx, HIGH);
  }
  if (Startx == 21 && xhome == 1) {
    mcp1.digitalWrite(takeastepx, LOW);
  }
  if (Startx == 21 && xhome == 1 && Tmrx > 20) {
    Startx = 0;
    SoftSer.println("CLX!");
    replX = "000000RX";
    mcp1.digitalWrite(step_ms1x, LOW);
    mcp1.digitalWrite(step_ms2x, LOW);
    mcp1.digitalWrite(step_ms3x, LOW);
    mcp1.digitalWrite(directionx, HIGH);
  }
}

void Reffy() {

  if (Starty == 20) {
    mcp1.digitalWrite(directiony, LOW);
    mcp1.digitalWrite(axisYenable, LOW);
    mcp1.digitalWrite(takeastepy, HIGH);
    mcp1.digitalWrite(step_ms1y, LOW);
    mcp1.digitalWrite(step_ms2y, LOW);
    mcp1.digitalWrite(step_ms3y, LOW);
  } // full step
  if (Starty == 20 && yhome == 0) {
    Starty = 21;
    Tmry = 0;
    mcp1.digitalWrite(takeastepy, LOW);
    mcp1.digitalWrite(axisYenable, HIGH);
  }
  if (Starty == 21 && yhome == 0 && Tmry > 20) {
    mcp1.digitalWrite(axisYenable, LOW);
    mcp1.digitalWrite(directiony, HIGH);
    mcp1.digitalWrite(step_ms2y, HIGH);
    mcp1.digitalWrite(step_ms1y, HIGH); // 1/8 step
    mcp1.digitalWrite(takeastepy, HIGH);
  }
  if (Starty == 21 && yhome == 1) {
    mcp1.digitalWrite(takeastepy, LOW);
  }
  if (Starty == 21 && yhome == 1 && Tmry > 20) {
    Starty = 0;
    SoftSer.println("CLY!");
    replY = "000000RY";
    mcp1.digitalWrite(step_ms1y, LOW);
    mcp1.digitalWrite(step_ms2y, LOW);
    mcp1.digitalWrite(step_ms3y, LOW);
    mcp1.digitalWrite(directiony, HIGH);
  }
}

void Reffz() {

  if (Startz == 20) {
    mcp1.digitalWrite(directionz, LOW);
    mcp1.digitalWrite(axisZenable, LOW);
    mcp1.digitalWrite(takeastepz, HIGH);
    mcp2.digitalWrite(step_ms1z, LOW);
    mcp2.digitalWrite(step_ms2z, LOW);
    mcp2.digitalWrite(step_ms3z, LOW);
  } // full step
  if (Startz == 20 && zhome == 0) {
    Startz = 21;
    Tmrz = 0;
    mcp1.digitalWrite(takeastepz, LOW);
    mcp1.digitalWrite(axisZenable, HIGH);
  }
  if (Startz == 21 && zhome == 0 && Tmrz > 20) {
    mcp1.digitalWrite(axisZenable, LOW);
    mcp1.digitalWrite(directionz, HIGH);
    mcp2.digitalWrite(step_ms2z, HIGH);
    mcp2.digitalWrite(step_ms1z, HIGH); // 1/8 step
    mcp1.digitalWrite(takeastepz, HIGH);
  }
  if (Startz == 21 && zhome == 1) {
    mcp1.digitalWrite(takeastepz, LOW);
  }
  if (Startz == 21 && zhome == 1 && Tmrz > 20) {
    Startz = 0;
    SoftSer.println("CLZ!");
    replZ = "000000RZ";
    mcp2.digitalWrite(step_ms1z, LOW);
    mcp2.digitalWrite(step_ms2z, LOW);
    mcp2.digitalWrite(step_ms3z, LOW);
    mcp1.digitalWrite(directionz, HIGH);
  }
}

void jogX() {
  // remote computer
  if (Startx > 29) {
    mcp1.digitalWrite(step_ms1x, LOW);
    mcp1.digitalWrite(step_ms2x, LOW);
    mcp1.digitalWrite(step_ms3x, LOW);
  } // full step
  if (Startx == 35 && JogFwdx == 1) {
    mcp1.digitalWrite(directionx, LOW);
    mcp1.digitalWrite(takeastepx, HIGH);
    mcp1.digitalWrite(axisXenable, LOW);
  }
  if (Startx == 45 && JogRevx == 1) {
    mcp1.digitalWrite(directionx, HIGH);
    mcp1.digitalWrite(takeastepx, HIGH);
    mcp1.digitalWrite(axisXenable, LOW);
  }

  //Local
  if (JogFwdx == 0 && Startx == 30) {
    mcp1.digitalWrite(directionx, LOW);
    mcp1.digitalWrite(takeastepx, HIGH);
    mcp1.digitalWrite(axisXenable, LOW);
  }
  if (JogFwdx == 1 && Startx == 30) {
    Startx = 0;
    mcp1.digitalWrite(takeastepx, LOW);
    mcp1.digitalWrite(axisXenable, HIGH);
  }
  if (JogRevx == 0 && Startx == 40) {
    mcp1.digitalWrite(directionx, HIGH);
    mcp1.digitalWrite(takeastepx, HIGH);
    mcp1.digitalWrite(axisXenable, LOW);
  }
  if (JogRevx == 1 && Startx == 40) {
    Startx = 0;
    mcp1.digitalWrite(takeastepx, LOW);
    mcp1.digitalWrite(axisXenable, HIGH);
  }
  if (JogRevx == 1 && Startx == 40 || JogFwdx == 1 && Startx == 30) {
    replX = "0000011X";
  }
}

void jogY() {
  // remote computer
  if (Starty > 29) {
    mcp1.digitalWrite(step_ms1y, LOW);
    mcp1.digitalWrite(step_ms2y, LOW);
    mcp1.digitalWrite(step_ms3y, LOW);
  } // full step
  if (Starty == 35 && JogFwdy == 1) {
    mcp1.digitalWrite(directiony, LOW);
    mcp1.digitalWrite(takeastepy, HIGH);
    mcp1.digitalWrite(axisYenable, LOW);
  }
  if (Starty == 45 && JogRevy == 1) {
    mcp1.digitalWrite(directiony, HIGH);
    mcp1.digitalWrite(takeastepy, HIGH);
    mcp1.digitalWrite(axisYenable, LOW);
  }

  //Local
  if (JogFwdy == 0 && Starty == 30) {
    mcp1.digitalWrite(directiony, LOW);
    mcp1.digitalWrite(takeastepy, HIGH);
    mcp1.digitalWrite(axisYenable, LOW);
  }
  if (JogFwdy == 1 && Starty == 30) {
    Starty = 0;
    mcp1.digitalWrite(takeastepy, LOW);
    mcp1.digitalWrite(axisYenable, HIGH);
  }
  if (JogRevy == 0 && Starty == 40) {
    mcp1.digitalWrite(directiony, HIGH);
    mcp1.digitalWrite(takeastepy, HIGH);
    mcp1.digitalWrite(axisYenable, LOW);
  }
  if (JogRevy == 1 && Starty == 40) {
    Starty = 0;
    mcp1.digitalWrite(takeastepy, LOW);
    mcp1.digitalWrite(axisYenable, HIGH);
  }
  if (JogRevy == 1 && Starty == 40 || JogFwdy == 1 && Starty == 30) {
    replY = "0000011Y";
  }
}

void jogZ() {

  // remote computer
  if (Startz > 29) {
    mcp2.digitalWrite(step_ms1z, LOW);
    mcp2.digitalWrite(step_ms2z, LOW);
    mcp2.digitalWrite(step_ms3z, LOW);
  } // full step
  if (Startz == 35 && JogDwnz == 1) {
    mcp1.digitalWrite(directionz, LOW);
    mcp1.digitalWrite(takeastepz, HIGH);
    mcp1.digitalWrite(axisZenable, LOW);
  }
  if (Startz == 45 && JogUpz == 1) {
    mcp1.digitalWrite(directionz, HIGH);
    mcp1.digitalWrite(takeastepz, HIGH);
    mcp1.digitalWrite(axisZenable, LOW);
  }

  //Local
  if (JogDwnz == 0 && Startz == 30) {
    mcp1.digitalWrite(directionz, LOW);
    mcp1.digitalWrite(takeastepz, HIGH);
    mcp1.digitalWrite(axisZenable, LOW);
  }
  if (JogDwnz == 1 && Startz == 30) {
    Startz = 0;
    mcp1.digitalWrite(takeastepz, LOW);
    mcp1.digitalWrite(axisZenable, HIGH);
  }
  if (JogUpz == 0 && Startz == 40) {
    mcp1.digitalWrite(directionz, HIGH);
    mcp1.digitalWrite(takeastepz, HIGH);
    mcp1.digitalWrite(axisZenable, LOW);
  }
  if (JogUpz == 1 && Startz == 40) {
    Startz = 0;
    mcp1.digitalWrite(takeastepz, LOW);
    mcp1.digitalWrite(axisZenable, HIGH);
  }
  if (JogUpz == 1 && Startz == 40 || JogDwnz == 1 && Startz == 30) {
    diss = "0000011Z";
  }
}

void getio() {
  exteotx = safex.digitalRead(0);//End of Travel Extend
  reteotx = safex.digitalRead(1);//End of Travel Retract
  xhome = safex.digitalRead(2);//Optical home switch
  xspare = safex.digitalRead(3);//spare
  Stopx = safex.digitalRead(4);//Stop PB
  JogFwdx = safex.digitalRead(5);//Jog FWD PB
  gohomex = safex.digitalRead(6);//reference PB
  JogRevx = safex.digitalRead(7);//Jog REV PB

  exteoty = safey.digitalRead(0);//End of Travel Extend
  reteoty = safey.digitalRead(1);//End of Travel Retract
  yhome = safey.digitalRead(2);//Optical home switch
  yspare = safey.digitalRead(3);//spare
  Stopy = safey.digitalRead(4);//Stop PB
  JogFwdy = safey.digitalRead(5);//Jog FWD PB
  gohomey = safey.digitalRead(6);//reference PB
  JogRevy = safey.digitalRead(7);//Jog REV PB

  exteotz = safez.digitalRead(0);//End of Travel Extend
  reteotz = safez.digitalRead(1);//End of Travel Retract
  zhome = safez.digitalRead(2);//Optical home switch
  zspare = safez.digitalRead(3);//spare
  Stopz = safez.digitalRead(4);//Stop PB
  JogDwnz = safez.digitalRead(5);//Jog DWN PB
  gohomez = safez.digitalRead(6);//reference PB
  JogUpz = safez.digitalRead(7);//Jog UP PB

}




void RealSer1() {

  String xx;
  String yy;
  String zz;
  if (SoftSer.available() > 0) {
    disc = SoftSer.readStringUntil('!');
    disc.trim();
    if (disc.length() >= 21) {
      if (readAll == 5) {
        diss = disc;
        UdpTrans();
        readAll = 0;
      }
      xx = disc.substring(0, 8);
      yy = disc.substring(8, 16);
      zz = disc.substring(16, 24);
      disc = "";
      if (xx.length() > 0) {
        cvx = xx.toInt();
        xx = "";
      }
      if (yy.length() > 0) {
        cvy = yy.toInt();
        yy = "";
      }
      if (zz.length() > 0) {
        cvz = zz.toInt();
        zz = "";
      }

    }
  }
}




void decodex() {
  if (Qx.endsWith("RGX")) {
    readAll = 5;
    Qx = "";
  }
  if (Qx.endsWith("ITX")) {
    SoftSer.println("ITX!");
    Qx = "Inital-X";
  }
  if (Qx.endsWith("CLX")) {
    SoftSer.println("CLX!");
    Qx = "Clr-EncX";
  }
  if (Qx.endsWith("R1X")) {
    R1x = Qx.toInt();
  }
  if (Qx.endsWith("R2X")) {
    R2x = Qx.toInt();
  }
  if (Qx.endsWith("R3X")) {
    R3x = Qx.toInt();
  }
  if (Qx.endsWith("R4X")) {
    R4x = Qx.toInt();
  }
  if (Qx.endsWith("D1X")) {
    D1x = Qx.toInt();
  }
  if (Qx.endsWith("D2X")) {
    D2x = Qx.toInt();
  }
  if (Qx.endsWith("W1X")) {
    W1x = Qx.toInt();
  }
  if (Qx.endsWith("W2X")) {
    W2x = Qx.toInt();
  }
  if (Qx.endsWith("20X")) {
    Qx = String(cvx) + "EX"; // Get Encoder Position
  }
  if (Qx.endsWith("22X")) {
    Startx = 2;  //Run
    Qx = "22X";
  }
  if (Qx.endsWith("21X")) {
    Startx = 1;  //Auto
    Qx = "21X";
  }
  if (Qx.endsWith("32X")) {
    Startx = 35;  //Jog fwd
    mcp1.digitalWrite(directionx, LOW);
    Qx = "32X";
  }
  if (Qx.endsWith("42X")) {
    Startx = 45;  //Jog rev
    mcp1.digitalWrite(directionx, HIGH);
    Qx = "42X";
  }
  if (Qx.endsWith("52X")) {
    Startx = 0;  //Reference
    Refx = 5;
    mcp1.digitalWrite(directionx, LOW);
    Qx = "52X";
  }
  if (Qx.endsWith("11X")) {
    Startx = 0;  //Stop
    mcp1.digitalWrite(takeastepx, LOW);
    mcp1.digitalWrite(axisXenable, HIGH);
    Qx = "11X";
  }
  if (Qx.endsWith("A")) {
    cpx = Qx.toInt();
    Qx = (String(cpx) + "A");
  }
  if (Qx.endsWith("PX")) {
    Qx = String(pvx) + "PX";
  }
  if (Qx.length() > 2 ) {
    for (int k = Qx.length(); k < 8; k++) {
      Qx = "0" + Qx;
    }
  }
}

void decodey() {
  if (Qy.endsWith("ITY")) {
    SoftSer.println("ITY!");
    Qy = "";
    diss = "Inital-Y";
  }
  if (Qy.endsWith("CLY")) {
    SoftSer.println("CLY!");
    Qy = "";
    diss = "Clr-EncY";
  }
  if (Qy.endsWith("R1Y")) {
    R1y = Qy.toInt();
  }
  if (Qy.endsWith("R2Y")) {
    R2y = Qy.toInt();
  }
  if (Qy.endsWith("R3Y")) {
    R3y = Qy.toInt();
  }
  if (Qy.endsWith("R4Y")) {
    R4y = Qy.toInt();
  }
  if (Qy.endsWith("D1Y")) {
    D1y = Qy.toInt();
  }
  if (Qy.endsWith("D2Y")) {
    D2y = Qy.toInt();
  }
  if (Qy.endsWith("W1Y")) {
    W1y = Qy.toInt();
  }
  if (Qy.endsWith("W2Y")) {
    W2y = Qy.toInt();
  }
  if (Qy.endsWith("20Y")) {
    Qy = String(cvy) + "EY"; // Get Encoder Position
  }
  if (Qy.endsWith("22Y")) {
    Starty = 2;  //Run
    Qy = "22Y";
  }
  if (Qy.endsWith("21Y")) {
    Starty = 1;  //Auto
    Qy = "21Y";
  }
  if (Qy.endsWith("32Y")) {
    Starty = 35;  //Jog fwd
    mcp1.digitalWrite(directiony, LOW);
    Qy = "32Y";
  }
  if (Qy.endsWith("42Y")) {
    Starty = 45;  //Jog rev
    mcp1.digitalWrite(directiony, HIGH);
    Qy = "42Y";
  }
  if (Qy.endsWith("52Y")) {
    Starty = 0;  //Reference
    Refy = 5;
    mcp1.digitalWrite(directiony, LOW);
    Qy = "52Y";
  }
  if (Qy.endsWith("11Y")) {
    Starty = 0;
    mcp1.digitalWrite(takeastepy, LOW);
    mcp1.digitalWrite(axisYenable, HIGH);
    Qy = "11Y";
  }
  if (Qy.endsWith("B")) {
    cpy = Qy.toInt();
    Qy = (String(cpy) + "B");
  }
  if (Qy.endsWith("PY")) {
    Qy = String(pvy) + "PY";
  }
  if (Qy.length() > 2) {
    for (int k = Qy.length(); k < 8; k++) {
      Qy = "0" + Qy;
    }
  }
}

void decodez() {
  if (Qz.endsWith("ITZ")) {
    SoftSer.println("ITZ!");
    Qz = "Inital-Z";
  }
  if (Qz.endsWith("CLZ")) {
    SoftSer.println("CLZ!");
    Qz = "Clr-EncZ";
  }
  if (Qz.endsWith("R1Z")) {
    R1z = Qz.toInt();
  }
  if (Qz.endsWith("R2Z")) {
    R2z = Qz.toInt();
  }
  if (Qz.endsWith("R3Z")) {
    R3z = Qz.toInt();
  }
  if (Qz.endsWith("R4Z")) {
    R4z = Qz.toInt();
  }
  if (Qz.endsWith("D1Z")) {
    D1z = Qz.toInt();
  }
  if (Qz.endsWith("D2Z")) {
    D2z = Qz.toInt();
  }
  if (Qz.endsWith("D3Z")) {
    D3z = Qz.toInt();
  }
  if (Qz.endsWith("D4Z")) {
    D4z = Qz.toInt();
  }
  if (Qz.endsWith("W1Z")) {
    W1z = Qz.toInt();
  }
  if (Qz.endsWith("W2Z")) {
    W2z = Qz.toInt();
  }
  if (Qz.endsWith("15Z")) {
    mcp2.digitalWrite(SpinRun, HIGH);
    Qz = "15Z";
  }
  if (Qz.endsWith("18Z")) {
    mcp2.digitalWrite(SpinRun, LOW);
    SpindleStop = 0;
    Startz = 0;
    Qz = "18Z";
  }
  if (Qz.endsWith("20Z")) {
    Qz = String(cvz) + "EZ"; // Get Encoder Position
  }
  if (Qz.endsWith("22Z")) {
    Startz = 2;  //Run
    Qz = "22Z";
  }
  if (Qz.endsWith("21Z")) {
    Startz = 1;  //Auto
    Qz = "21Z";
  }
  if (Qz.endsWith("32Z")) {
    Startz = 35;  //Jog fwd
    mcp1.digitalWrite(directionz, LOW);
    Qz = "32Z";
  }
  if (Qz.endsWith("42Z")) {
    Startz = 45;  //Jog rev
    mcp1.digitalWrite(directionz, HIGH);
    Qz = "42Z";
  }
  if (Qz.endsWith("52Z")) {
    Startz = 0;  //Reference
    Refz = 5;
    digitalWrite(directionz, LOW);
    Qz = "52Z";
  }
  if (Qz.endsWith("11Z")) {
    Startz = 0;  //Stop
    mcp1.digitalWrite(takeastepz, LOW);
    mcp1.digitalWrite(axisZenable, HIGH);
    Qz = "11Z";
  }
  if (Qz.endsWith("C")) {
    cpz = Qz.toInt();
    Qz = (String(cpz) + "C");
  }
  if (Qz.endsWith("PZ")) {
    Qz = String(pvz) + "PZ";
  }
  if (Qz.length() > 2) {
    for (int k = Qz.length(); k < 8; k++) {
      Qz = "0" + Qz;
    }
  }
}



[/code]]

Are you using the Arduino megaAVR board package, or MCUdude's MegaCoreX?
Obviously the code compiled OK, or you would never get to the download.

Can you copy and post the entire compiler output? Can't really think of anything that would cause the problem you are having, unless there is some mismatch in the baud rate that causes long serial data transfers to go out of sync, but that seems unlikely.

Do you have any hardware connected to the Nano Every?
Are you using a 3rd party board that has a different atmega chip?

to david_2018,

the Nano every is disconnected from everything on the proto board.

it is a Arduino from Italy(Amazon)

unlike

The first message is normal

avrdude: jtagmkII_initialize(): Cannot locate "flash" and "boot" memories in description

Not sure what is causing the problem after that. Are you still able to download the blink sketch?

That is the biggest sketch I have ever seen.
Describe in about 10 words what it does, I have a hunch it is very bady coded.

sonofcy,

It runs on a Mega 2560 just fine, the MEGA talks to my PC using UDP and talks to an a Pro-Mini using software serial to get the encoder data. so the code works well!

The code seems to be duplicated in the post, so its only half as big as it looks.

I'm unable to find the library with Adafruit_MCP23017.h, so can't compile myself.

Separate from the download problem, have you tested the libraries to see if they are compatible with the Nano Every? Many older libraries are not. Additionally, the Nano Every has multiple serial ports, usually no need to use SoftwareSerial, but that would not stop a download.

1 Like

david_2018,

Yeah, I didn’t know I fat fingered it twice, sorry. Initially I tried to use 2.3.6 IDE but , I have been burned by it a couple of times, so 1.8.19 is more predictable.

It's right there in the Library Manager

You still have not answered my question, Bye.

what question was that? “sonofcy,

It runs on a Mega 2560 just fine, the MEGA talks to my PC using UDP and talks to an a Pro-Mini using software serial to get the encoder data. so the code works well!”

the code runs a 3-axis wood router controlled by a pc running vb.net program

I have that library installed, but it does not have an Adafruit_MCP23017.h file, instead it has Adafruit_MCP23X17.h. Currently looking for older versions that might have the file.

< edit > Ok, version 1.3.0 has the correct file. Current version is 2.3.2

david_2018,

you must be run 2.3.6 IDE, that IDE will only see the MCP23X17 library as valid.

Unlike

I'm using Arduino IDE 1.8.19, and can compile and upload successfully.
Just needed to use an older version of the Adafruit library.

SoftwareSerial should not be needed on either the Nano Every or the Mega, unless you want more than four serial ports.

The Nano Every can be a bit finicky with the upload, have you tried unplugging/replugging the board, restarting the IDE, and possibly another USB cable? Poor quality cable might cause a problem.

david_2018,

can I see a screen shot of tools, nano every, registers emulation?

to get the blink to load I have to use the ATMEGa328 for register emulation

Unlike

Works for me with either setting for register emulation.

I don’t know what to say, other than maybe I got a bad batch of three form amazon

The register emulation should have no effect on the upload. That might affect whether the code successfully compiles, or whether or not it runs properly, but the upload itself should not care.

1 Like