DTG printer / принтер планшетный

некоторые моменты я проверил .
Что бы вернуть джойстик … вернул и некоторые параметры .
#define checkBtnPeriod 1
поставил 1 так квк джойстик на 4 и выше очень медленно крутил мотор
1 мсек . это часто но на точность никак не влияет.

убрал костыль …
“”"
delay(2000);
asm volatile(“jmp 0x00”);
“”"
что бы посмотреть что поменялось .
вроде как поменялось . тес ты с прогоном джойстика и без него сделал раз 50
вроде как теперь с первого раза проход например в 16000 шагов двигателя при 12000 мм мин возвращает мотор на ту же позицию
не теряя сотки
такое было со второго и последующих прогонов . а первый раз он мог потерять и десятку . и даже пару мм . поэтому я и поставил легкий ресет .
джойстик вроде без нареканий работает . но есть условия .
я должен джойстиком довести каретку до концевика и когда она отедет от него в ноль могу запускать прогон туда сюда при этом условии ничего не теряется с первого и последующих раз прогонов .
если я не доведу до концевика . результат бывает разный по патерям .
еще условие . если я руками подведу каретку в любое место и отправлю прогон .то тоже будет потеря мм

далее
я забыл проверить без этого параметра
ISR_NOBLOCK*/
позже проверю

вы спрашивали про потери на энкодере . 16000 шагов _1500 тиков и обратно также 16000_0 возврат и сотые мм возвращаются в своё первоначальное состояния
с точностью нормально
дребезга нет
буду думать как руками двигать или джойстиком не доезжая концевика . ведь в принтере и такая задача может быть когда с середины нужно начать печать.

далее я доделаю позже этот код на цифре ведь он уже готов . осталось проверить на пинах 3 сетки 2-3 ведь я проверял позавчера на 1 сетки а там у меня и мой код не заработал .
хотя на аналоговых вполне меня устраивает только уже не приделаешь потэнцеометр дря регулировки оборотов . в коде нужно прописывать .

далее сделал код на цифровых пинах 2-3
работает хорошо .
точность такая же высокая без пропусков
вопросы с джойстиком и концевиком решил
костыль в виде ресета стоит . без него не получается с первого раза прогнать прогон туда сюда .
попробую ваш код применить у себя
меня и ресет устраивает но бывает он раз из десяти не срабатывает.

еще у меня были проблемы с дребезгом но вроде решил их
и иногда после прогонов начинаешь управлять джойстиком а мотор странные звуки издает как будто в резонансе . вроде тоже решил но не уверен - нужны еще тесты

Вот такой простой код получился .

#define enc_A   2   
#define enc_B   3 
#define STEP_PIN    4   
#define DIR_PIN     7    
#define ENABLE_PIN  8
#define limitPin    9
#define button1     6
#define button2     5

volatile long temp, motor_position, enc;
int T = 1;
int A = 0;
void setup (){
    Serial.begin (115200);
    pinMode(enc_A, INPUT_PULLUP);
    pinMode(enc_B, INPUT_PULLUP);
    pinMode(STEP_PIN, OUTPUT);
    pinMode(DIR_PIN, OUTPUT);
	  pinMode(ENABLE_PIN , OUTPUT);
    pinMode(4, INPUT_PULLUP);
	  pinMode(5, INPUT_PULLUP);
    pinMode(6, INPUT_PULLUP);
    pinMode(9, INPUT_PULLUP);
    attachInterrupt(0, encPinA, CHANGE);
    enc = 0;
}
    
void encPinA() {
   if( enc != temp ){
     Serial.println (enc);
     temp = enc;
    }
  
  if (digitalRead(enc_A) == digitalRead(enc_B))
   {if (enc < 0; enc--); 
    (digitalWrite(DIR_PIN , 1),  Step());
    } else
  {(enc++,    digitalWrite(DIR_PIN , 0),  Step());} 
}

void Step() {		
	    digitalWrite(ENABLE_PIN , LOW);
        digitalWrite(STEP_PIN    , HIGH);
	    delayMicroseconds(T);
        digitalWrite(STEP_PIN    , LOW);
        motor_position++;
        enc = 0;

}


void loop()  {  
if (!digitalRead(5)) {delay(5);
digitalWrite(8, LOW);}

if (!digitalRead(6)) {delay(5);
digitalWrite(8, HIGH);}

    A = analogRead(A4);
    if (A > 520) {
       digitalWrite(8, LOW);
      T = map(A, 520, 1123, 500, 0);
       (digitalWrite(DIR_PIN , 1),  Step());
    }
    if (A < 480) {
       digitalWrite(8, LOW);
      T = map(A, 480, 0, 500, 0);
       (digitalWrite(DIR_PIN , 0),  Step());
    }
    if (A > 480 && A < 520) {
       (digitalWrite(DIR_PIN , 0),  digitalWrite(STEP_PIN, 0));
    }
	
     if (!digitalRead(9)) {
        digitalWrite(ENABLE_PIN , HIGH);
        delay(150);	                      
	    digitalWrite(ENABLE_PIN , LOW);        
		digitalWrite(DIR_PIN    , LOW);
		for (int i = 0; i < 200; i++) {                
        digitalWrite(STEP_PIN    , HIGH);
        delayMicroseconds(1000);
        digitalWrite(STEP_PIN    , LOW);
        }
     if (!digitalRead(9)) 
        delay(100);
        asm volatile("jmp 0x00");	      
    } 			
}