How to add Interrupts to a code

I am using a code for a gear motor, during the rotations, missing some revolutions in it, would someone help me to add an interrupt to it that I don't miss reading from the hall sensor

I want to get the accurate angles from the motor

Cheers

//Define pin setup
#define motor_in1 7
#define motor_in2 8
#define motor_enA 9

volatile int half_revolutions = 0;
int revolutions_per_pos;

int pos = 0;

void setup() {
// Set pin mode
pinMode(motor_enA, OUTPUT);
pinMode(motor_in1, OUTPUT);
pinMode(motor_in2, OUTPUT);

Serial.begin(115200);

// Hallsensor connected to the interrupt pin (Pin 2 on Arduino Uno)
attachInterrupt(0, magnet_detect, RISING);
}

void loop() {
// Run full cycle to each position and back to 0

revolutions_per_pos=706;
move_amount(1);
pos = 1;
Serial.print(pos);
delay(2000);

revolutions_per_pos= 706;
move_amount(-1);
pos = 0;
Serial.print(pos);
delay(2000);

revolutions_per_pos=706;
move_amount(2);
pos = 2;
Serial.print(pos);
delay(2000);

revolutions_per_pos= 706;
move_amount(-2);
pos = 0;
Serial.print(pos);
delay(2000);

revolutions_per_pos= 706;
move_amount(3);
pos = 3;
Serial.print(pos);
delay(2000);

revolutions_per_pos= 706;
move_amount(-3);
pos = 0;
Serial.print(pos);
delay(2000);

revolutions_per_pos= 706;
move_amount(1);
pos = 4;
Serial.print(pos);
delay(2000);

revolutions_per_pos= 706;
move_amount(-1);
pos = 0;
Serial.print(pos);
delay(2000);

revolutions_per_pos= 706;
move_amount(2);
pos = 5;
Serial.print(pos);
delay(2000);

revolutions_per_pos= 706;
move_amount(-2);
pos = 0;
Serial.print(pos);
delay(2000);

revolutions_per_pos= 706;
move_amount(-3);
pos = 6;
Serial.print(pos);
delay(2000);

revolutions_per_pos= 706;
move_amount(3);
pos = 0;
Serial.print(pos);
delay(2000);

}

void magnet_detect() {
half_revolutions++;
}

void move_amount(int no_pos) {
half_revolutions = 0;
if (no_pos < 0) {
// Set rotation direction
digitalWrite(motor_in1, HIGH);
digitalWrite(motor_in2, LOW);
no_pos *= -1;
}
else {
// Set rotation direction
digitalWrite(motor_in1, LOW);
digitalWrite(motor_in2, HIGH);
}

while (half_revolutions < (no_pos * (2 * revolutions_per_pos))) {
Serial.println(half_revolutions);
analogWrite(motor_enA, 100);
}
analogWrite(motor_enA, 0);
}

ISR(INT0_vect) {
  // interrupt code here.
}

Would you please mention where I have to add this line exactly

Awais-1:
Would you please mention where I have to add this line exactly

it should be a function above or below or in between your setup() function and your loop() function. In short it can be anywhere it is not part of something else.

It's giving me error would can you help me in it

//Define pin setup
#define motor_in1 7
#define motor_in2 8
#define motor_enA 9

volatile int half_revolutions = 0;
int revolutions_per_pos;

int pos = 0;
ISR(INT0_vect) {
// interrupt code here.
}
void setup() {
// Set pin mode
pinMode(motor_enA, OUTPUT);
pinMode(motor_in1, OUTPUT);
pinMode(motor_in2, OUTPUT);

Serial.begin(115200);

// Hallsensor connected to the interrupt pin (Pin 2 on Arduino Uno)
attachInterrupt(0, magnet_detect, RISING);

}

void loop() {
// Run full cycle to each position and back to 0
ISR(INT0_vect) {
// interrupt code here.
}

revolutions_per_pos=706;
move_amount(1);
pos = 1;
Serial.print(pos);
delay(2000);

revolutions_per_pos= 706;
move_amount(-1);
pos = 0;
Serial.print(pos);
delay(2000);

revolutions_per_pos=706;
move_amount(2);
pos = 2;
Serial.print(pos);
delay(2000);

revolutions_per_pos= 706;
move_amount(-2);
pos = 0;
Serial.print(pos);
delay(2000);

revolutions_per_pos= 706;
move_amount(3);
pos = 3;
Serial.print(pos);
delay(2000);

revolutions_per_pos= 706;
move_amount(-3);
pos = 0;
Serial.print(pos);
delay(2000);

revolutions_per_pos= 706;
move_amount(1);
pos = 4;
Serial.print(pos);
delay(2000);

revolutions_per_pos= 706;
move_amount(-1);
pos = 0;
Serial.print(pos);
delay(2000);

revolutions_per_pos= 706;
move_amount(2);
pos = 5;
Serial.print(pos);
delay(2000);

revolutions_per_pos= 706;
move_amount(-2);
pos = 0;
Serial.print(pos);
delay(2000);

revolutions_per_pos= 706;
move_amount(-3);
pos = 6;
Serial.print(pos);
delay(2000);

revolutions_per_pos= 706;
move_amount(3);
pos = 0;
Serial.print(pos);
delay(2000);

}

void magnet_detect() {
half_revolutions++;
}

void move_amount(int no_pos) {
half_revolutions = 0;
if (no_pos < 0) {
// Set rotation direction
digitalWrite(motor_in1, HIGH);
digitalWrite(motor_in2, LOW);
no_pos *= -1;
}
else {
// Set rotation direction
digitalWrite(motor_in1, LOW);
digitalWrite(motor_in2, HIGH);
}

while (half_revolutions < (no_pos * (2 * revolutions_per_pos))) {
Serial.println(half_revolutions);
analogWrite(motor_enA, 100);
}
analogWrite(motor_enA, 0);
}

//Define pin setup
#define motor_in1 7
#define motor_in2 8
#define motor_enA 9

volatile int half_revolutions = 0;
int revolutions_per_pos;

int pos = 0;
ISR(INT0_vect) {
  // interrupt code here.
}
void setup() {
  // Set pin mode
  pinMode(motor_enA, OUTPUT);
  pinMode(motor_in1, OUTPUT);
  pinMode(motor_in2, OUTPUT);

  Serial.begin(115200);

  // Hallsensor connected to the interrupt pin (Pin 2 on Arduino Uno)
  //attachInterrupt(0, magnet_detect, RISING);

}

void loop() {
  // Run full cycle to each position and back to 0


  revolutions_per_pos = 706;
  move_amount(1);
  pos = 1;
  Serial.print(pos);
  delay(2000);

  revolutions_per_pos = 706;
  move_amount(-1);
  pos = 0;
  Serial.print(pos);
  delay(2000);

  revolutions_per_pos = 706;
  move_amount(2);
  pos = 2;
  Serial.print(pos);
  delay(2000);

  revolutions_per_pos = 706;
  move_amount(-2);
  pos = 0;
  Serial.print(pos);
  delay(2000);

  revolutions_per_pos = 706;
  move_amount(3);
  pos = 3;
  Serial.print(pos);
  delay(2000);

  revolutions_per_pos = 706;
  move_amount(-3);
  pos = 0;
  Serial.print(pos);
  delay(2000);


  revolutions_per_pos = 706;
  move_amount(1);
  pos = 4;
  Serial.print(pos);
  delay(2000);

  revolutions_per_pos = 706;
  move_amount(-1);
  pos = 0;
  Serial.print(pos);
  delay(2000);


  revolutions_per_pos = 706;
  move_amount(2);
  pos = 5;
  Serial.print(pos);
  delay(2000);

  revolutions_per_pos = 706;
  move_amount(-2);
  pos = 0;
  Serial.print(pos);
  delay(2000);



  revolutions_per_pos = 706;
  move_amount(-3);
  pos = 6;
  Serial.print(pos);
  delay(2000);

  revolutions_per_pos = 706;
  move_amount(3);
  pos = 0;
  Serial.print(pos);
  delay(2000);

}

/*void magnet_detect() {
  half_revolutions++;
}*/

void move_amount(int no_pos) {
  half_revolutions = 0;
  if (no_pos < 0) {
    // Set rotation direction
    digitalWrite(motor_in1, HIGH);
    digitalWrite(motor_in2, LOW);
    no_pos *= -1;
  }
  else {
    // Set rotation direction
    digitalWrite(motor_in1, LOW);
    digitalWrite(motor_in2, HIGH);
  }

  while (half_revolutions < (no_pos * (2 * revolutions_per_pos))) {
    Serial.println(half_revolutions);
    analogWrite(motor_enA, 100);
  }
  analogWrite(motor_enA, 0);
}

Thanks manage it somehow, sorry I am really bad in programming

As I setting up an actual ISR pointing at an AVR vector isn't Arduino language, I have fixed your code using the attachInterrupt()....

//Define pin setup
#define motor_in1 7
#define motor_in2 8
#define motor_enA 9
#define sensorPin 2

volatile int half_revolutions = 0;
int revolutions_per_pos;

int pos = 0;

void setup() {
  // Set pin mode
  pinMode(motor_enA, OUTPUT);
  pinMode(motor_in1, OUTPUT);
  pinMode(motor_in2, OUTPUT);

  Serial.begin(115200);

  // Hallsensor connected to the interrupt pin (Pin 2 on Arduino Uno)
  attachInterrupt(digitalPinToInterrupt(sensorPin), magnet_detect, RISING);// attachInterrupt(digitalPinToInterrupt(pin), ISR, mode);

}

void loop() {
  // Run full cycle to each position and back to 0


  revolutions_per_pos = 706;
  move_amount(1);
  pos = 1;
  Serial.print(pos);
  delay(2000);

  revolutions_per_pos = 706;
  move_amount(-1);
  pos = 0;
  Serial.print(pos);
  delay(2000);

  revolutions_per_pos = 706;
  move_amount(2);
  pos = 2;
  Serial.print(pos);
  delay(2000);

  revolutions_per_pos = 706;
  move_amount(-2);
  pos = 0;
  Serial.print(pos);
  delay(2000);

  revolutions_per_pos = 706;
  move_amount(3);
  pos = 3;
  Serial.print(pos);
  delay(2000);

  revolutions_per_pos = 706;
  move_amount(-3);
  pos = 0;
  Serial.print(pos);
  delay(2000);


  revolutions_per_pos = 706;
  move_amount(1);
  pos = 4;
  Serial.print(pos);
  delay(2000);

  revolutions_per_pos = 706;
  move_amount(-1);
  pos = 0;
  Serial.print(pos);
  delay(2000);


  revolutions_per_pos = 706;
  move_amount(2);
  pos = 5;
  Serial.print(pos);
  delay(2000);

  revolutions_per_pos = 706;
  move_amount(-2);
  pos = 0;
  Serial.print(pos);
  delay(2000);



  revolutions_per_pos = 706;
  move_amount(-3);
  pos = 6;
  Serial.print(pos);
  delay(2000);

  revolutions_per_pos = 706;
  move_amount(3);
  pos = 0;
  Serial.print(pos);
  delay(2000);

}

void magnet_detect() {
  half_revolutions++;
}

void move_amount(int no_pos) {
  half_revolutions = 0;
  if (no_pos < 0) {
    // Set rotation direction
    digitalWrite(motor_in1, HIGH);
    digitalWrite(motor_in2, LOW);
    no_pos *= -1;
  }
  else {
    // Set rotation direction
    digitalWrite(motor_in1, LOW);
    digitalWrite(motor_in2, HIGH);
  }

  while (half_revolutions < (no_pos * (2 * revolutions_per_pos))) {
    Serial.println(half_revolutions);
    analogWrite(motor_enA, 100);
  }
  analogWrite(motor_enA, 0);
}

:slight_smile: Thanks so much for helping me

I have a problem here in the coding, the revolutions I have mention in the programming and the pulses I am reading from oscilloscope are different, for the clockwise, it is 1491 and for the counter-clockwise is 1451. I am comparing the data now I can't compare it because it is not correct, Can you help me with it