Interrupts and sub-programs

Functions

Functions are the set of statements that are executed always when the function is called. Two functions that were mentioned before are already known - setup() and loop(). The programmer is usually trying to make several functions that contain all the statements and then to call them in the setup() or loop() functions.

The structure of the function is following:

type functionName(arguments) //a return type, name and arguments of the function
{
  //the body of a function - statements to execute
}

For the example, a function that periodically turns on and off the LED is created:

void exampleFunction() 
{
  digitalWrite(13, HIGH); //the LED is ON		
  delay(1000);			
  digitalWrite(13, LOW);  //the LED is OFF				
  delay(1000);	
}

In the example code can be seen that the return type of an exampleFunction function is void that means the function does not have the return type. This function also does not have any arguments, because the brackets are empty.

This function should be called inside the loop() function in the following way:

void loop()
{
  exampleFunction(); //the call of the defined function inside loop()
}

The whole code in the Arduino environment looks like this:

void loop()
{
  exampleFunction(); //the call of the defined function inside loop()
}
 
void exampleFunction() 
{
  digitalWrite(13, HIGH); //the LED is ON		
  delay(1000);			
  digitalWrite(13, LOW);  //the LED is OFF				
  delay(1000);	
}

It can be seen that the function is defined outside the loop() or setup() functions.

When some specific result must be returned as a result of a function, then the function return type should be indicated, for example:

int  sumOfTwoNumbers(int x, int y) //the return type is "int"; arguments are still optional
{
    return (x+y); //the value next to the "return" should have the "int" type; this is what will be returned as a result.
}

In the loop() this function would be called in a following way:

void loop()
{
  int result = sumOfTwoNumbers(2, 3); //the call of the defined function inside loop()
}

Interrupts

Interrupt is a signal that stops normal execution of a program in the processor, to be able to handle tasks with higher priority. These tasks usually are called Interrupt service routine (IRS) or interrupt handler. Interrupt signals can be generated from external source, like change of value on the pin and from internal source, like timer. When the interrupt signal is received, the processor stops executing the code and starts the IRS. After completing the IRS, the processor returns to the normal program execution state.

IRS should be as short as possible and the return type of it is void. Some of normal Arduino functions do not work or behave differently in the IRS, for example, delay() function does not work in the IRS. Variables, used in the IRS must be volatile variables.

Interrupts are used to detect important real time events, that occur during the normal code execution of the code, without continuously checking them, like pushing a button.

Different Arduino types has different external interrupt pin availability. In most Arduino boards pins number 2 and 3 are used for interrupts.

To attach interrupt, the function attachInterrupt(digitalPinToInterrupt(pin), ISR, mode) is called. This function has 3 parameters:

  1. pin – the number of a pin number where the interrupt signal generating device will be attached,
  2. ISR – the name of a function of interrupt service routine,
  3. mode - defines when interrupt signal is triggered. There are four basic mode values:
    • LOW - interrupt is triggered when the pin value is LOW,
    • HIGH - interrupt is triggered when the pin value is HIGH,
    • CHANGE - interrupt is triggered when the pin value is changed,
    • RISING - interrupt is triggered when the pin value is changed from LOW to HIGH.

The example program that uses interrupt:

volatile bool button =0; //a variable to save button state
 
void setup() {
  pinMode(13,OUTPUT);       //define LED pin 
  pinMode(2,INPUT_PULLUP);  // define button pin
  attachInterrupt(digitalPinToInterrupt(2),ButtonIRS,FALLING); // attach interrupt to button pin
}
 
void ButtonIRS() {  // IRS function
  button =!button;
}
 
void loop() {
  digitalWrite (13,button);
}

Check yourself

1. What are the built-in functions used for?

  • To reduce the size of the program
  • To delete unnecessary functions
  • To simplify the source file
  • To increase the speed of the program

2. Which of the following statements are true?

  • built-in functions must return a value.
  • built-in functions can not return values.
  • The compiler can ignore the declaration of the built-in function.
  • built-in functions can not contain more than 10 lines of code.

3. Is it possible to guarantee that the declared built-in function is really built-in?

  • guarantee is not possible, in each individual case it is different
  • can be confidently ensured that the function you have declared as built-in is really built-in
en/iot-open/programming_fundamentals_rtu/interrupts_and_sub-programs.txt · Last modified: 2020/07/20 09:00 by 127.0.0.1
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0