1

I am working in my project and i want to use Timer2 interrupt every 100ms to get new measurement from the output of my 5 sensors which connected to pins A1,A2,A3,A4,A5.

I read in some article that using delay instruction is not as good as using timers'Interruptions so, I tried this code put it didn't work properly :

void setup(){
cli();
 TCCR2A = 0;
 TCCR2B = 0;
 TCNT2 = 0;
 OCR2A = 99;
 TCCR2A |= (1 << WGM21);
 TCCR2B |= (1 << CS21); 
 TIMSK2 |= (1 << OCIE2A);
sei();
Serial.begin(9600); 
}
void loop()
{
Serial.print(digitalRead(1));
Serial.print(' ');
Serial.print(digitalRead(2));
Serial.print(' ');
Serial.print(digitalRead(3));
Serial.print(' ');
Serial.print(digitalRead(4));
Serial.print(' ');
Serial.print(digitalRead(5));
Serial.println(' ');
}
Nick Gammon
38.9k13 gold badges69 silver badges125 bronze badges
asked Aug 17, 2015 at 8:04
9
  • 1
    Where is your ISR? Commented Aug 17, 2015 at 8:20
  • in fact I dont know where i put the ISR interupt service routine where i have to put measurement instruction . Commented Aug 17, 2015 at 8:36
  • 1
    Enabling the interrupt without writing a ISR is pointless. Commented Aug 17, 2015 at 8:38
  • i know that but where in the code i put the ISR?I think i have to put it in the loop Commented Aug 17, 2015 at 8:52
  • 2
    ISR(TIMER2_COMPA_vect){ ..code here.. }. However with your current setting the ISR gets called once every 0.5ms. Commented Aug 17, 2015 at 14:34

1 Answer 1

1

Well let's start from the start ...


Analog readings

to get new measurement from the output of my 5 sensors which connected to pins A1,A2,A3,A4,A5.

Serial.print(digitalRead(1));

That is not reading analog pin A1, it is reading digital pin 1. If you want to read A1 you need:

Serial.print(analogRead(1));

Check the time

By far the simplest thing would be to simply check the time and take a reading when 100 ms is up.

Example:

void setup()
{
 Serial.begin(115200); 
} // end of setup
unsigned long lastReading;
const unsigned long INTERVAL = 100; // ms
void loop()
{
 // is time up?
 if (millis () - lastReading >= INTERVAL)
 {
 lastReading = millis (); // when we took this reading
 Serial.print(analogRead(1));
 Serial.print(" ");
 Serial.print(analogRead(2));
 Serial.print(" ");
 Serial.print(analogRead(3));
 Serial.print(" ");
 Serial.print(analogRead(4));
 Serial.print(" ");
 Serial.print(analogRead(5));
 Serial.println();
 } // end of if time up
 // do other things here
} // end of loop

I increased the baud rate to 115200. Why use 9600 when you are trying to print 5 x 4 characters every 100 ms?


Using timers

If you really want to use timers (and I don't see what they achieve here) I have a page about timers that describes using them, and interrupts, in some depth.

The very least you would need is a timer 2 "compare A" interrupt like this:

ISR (TIMER2_COMPA_vect) 
 {
 // Timer 2 has reached its comparison value
 }
answered Aug 17, 2015 at 20:55

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.