Добавление еще одной оси

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

ua6em пишет:

ноутов должно быть много )))

По одному-два для каждой оси. 

не мало?

Ra3eR
Offline
Зарегистрирован: 01.08.2016

Итак, переназначил аналог в цифру и все стало ок(правда браться за край макетки и нажимать кнопки, вчера не стоило)) Вообщем минус ещё одна нано)) Кинул "костыль" 

int en_s = 2;
pinMode(en_s,INPUT);  

и назначил его условием прерывания

ISR(PCINT2_vect){

    if (!(PIND & B00000100)){ 

То есть подключил к en_mot. Однако показания все равно не изменяются для оси Z. Правильно ли я понимаю, что проблема кроется вот здесь ?

 //Enable interruptions on pins D8 to D12 for the Step and Direction read
  PCICR |= (1 << PCIE0);    //enable PCMSK0 scan                                                 
  PCMSK0 |= (1 << PCINT0);  //Set pin D8 trigger an interrupt on state change. 
  PCMSK0 |= (1 << PCINT1);  //Set pin D9 trigger an interrupt on state change.                                             
  PCMSK0 |= (1 << PCINT2);  //Set pin D10 trigger an interrupt on state change. 
  PCMSK0 |= (1 << PCINT3);  //Set pin D11 trigger an interrupt on state change.                                               
  PCMSK0 |= (1 << PCINT4);  //Set pin D12 trigger an interrupt on state change.
  PCMSK2 |= (1 << PCINT18);  //Set pin D2 trigger an interrupt on state change.
  PCMSK2 |= (1 << PCINT19);  //Set pin D3 trigger an interrupt on state change.
  PCMSK2 |= (1 << PCINT20);  //Set pin D4 trigger an interrupt on state change.

Так как у меня получилось 2 прерывания порта, нужно добавить   PCICR |= (1 << PCIE1); //enable PCMSK1 scan  ? Или я не правильно понимаю?

Ra3eR
Offline
Зарегистрирован: 01.08.2016

Или вместо ISR(PCINT2_vect){ надо указать ISR(PCINT18_vect){ ?

Ra3eR
Offline
Зарегистрирован: 01.08.2016

Попробовал сделать вот так

//Enable interruptions on pins D8 to D12 for the Step and Direction read
  PCICR |= (1 << PCIE0);    //enable PCMSK0 scan                                                 
  PCMSK0 |= (1 << PCINT0);  //Set pin D8 trigger an interrupt on state change. 
  PCMSK0 |= (1 << PCINT1);  //Set pin D9 trigger an interrupt on state change.                                             
  PCMSK0 |= (1 << PCINT2);  //Set pin D10 trigger an interrupt on state change. 
  PCMSK0 |= (1 << PCINT3);  //Set pin D11 trigger an interrupt on state change.                                               
  PCMSK0 |= (1 << PCINT4);  //Set pin D12 trigger an interrupt on state change.
  PCICR |= (1 << PCIE2);    //enable PCMSK2 scan
  PCMSK2 |= (1 << PCINT18);  //Set pin D2 trigger an interrupt on state change.
  PCMSK2 |= (1 << PCINT19);  //Set pin D3 trigger an interrupt on state change.
  PCMSK2 |= (1 << PCINT20);  //Set pin D4 trigger an interrupt on state change.
ISR(PCINT18_vect){
 
    if (!(PIND & B00000100)){ 
 
 
  //Now we do the same but for Z
    ////////////////////////Z////////////////////////        
 
    if(PIND & B00010000 ){
      if(PIND & B00001000 ){
        if(step_z_state == 0){
          step_z_state = 1;
          step_count_z = step_count_z + 1;        
        }        
      }
    
      else if(step_z_state == 1){
        step_z_state = 0;
        step_count_z = step_count_z + 1;        
        }        
    }//X_up D9
 
    if (!(PIND & B00010000 )){
      if(PIND & B00001000 ){
        if(step_z_state == 0){
          step_z_state = 1;
          step_count_z = step_count_z - 1;        
        }        
      }
    
      else if(step_z_state == 1){
        step_z_state = 0;
        step_count_z = step_count_z - 1;        
        }        
    }//X_down D9  
    
 
                     
   
  }//End EN enabled
  
}//End ISR
ардуино перезагружаться стала)
Ra3eR
Offline
Зарегистрирован: 01.08.2016

ISR(PCINT18_vect){ не правильно) правильно как говорил ua6em ISR(PCINT2_vect){ . Ура все заработало) Большое спасибо тебе ua6em за помощь! А то я мучаюсь с этим проектом месяц уже))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Ra3eR пишет:

ISR(PCINT18_vect){ не правильно) правильно как говорил ua6em ISR(PCINT2_vect){ . Ура все заработало) Большое спасибо тебе ua6em за помощь! А то я мучаюсь с этим проектом месяц уже))

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

Ra3eR
Offline
Зарегистрирован: 01.08.2016

Матчасть без интересной практики, не сильно завлекает и сложнее в запоминании) А тут интересный и практичный проект (для меня во всяком случае) Вот и решил стряхнуть пыль с ардуино ide и плат нано). А тогда(2016), смотрел я на всяких роботов, не завлекало) Из-за малой практичности. Параллельно этому проекту, ещё подумываю об автономном климате в гараже...)

b707
Offline
Зарегистрирован: 26.05.2017

ребят, вы бы код переписали, ну просто глаза ломит от считывания дигиталРидом  "Х вверх", "У вниз" на каждом шаге. Считайте их один раз в начале ЛУП, сформируйте матрицу по Х У и Z - и работайте с ней. Потом обратите внимание, что блок, например, "Х вниз" отличается от "Х вверх" буквально парой символов. Вынесетите эти символы в условие, а все остальное напишите только один раз...

Ну и так далее. Код станет короче, но не это главное - он станет в разы читабельнее, ошибки будет искать проще.