Skip to main content
Arduino

You are not logged in. Your edit will be placed in a queue until it is peer reviewed.

We welcome edits that make the post easier to understand and more valuable for readers. Because community members review edits, please try to make the post substantially better than how you found it, for example, by fixing grammar or adding additional resources and hyperlinks.

Required fields*

Required fields*

Sending serial data in an interrupt

An ATMEGA328-P chip is used with a toggle switch attached to pin 8 and a momentary switch attached to pin 9. My objective is to send the following information over serial:

  1. The status of pin 8, every second.
  2. Count the number of presses of pin 9, sending the value as the counter increments

I understand that to achieve point 2 I will need to utilise interrupts, but I have become stuck in the way I am trying to use them.

I am familiar with the following code's simple style:

  1. Within the loop...
  2. Poll the status of the input
  3. Send status over serial

Code A:

const int SWITCH_1 = 8;
const int READ_INTERVAL = 1000;
int val_s1 = 0;
void setup() {
 Serial.begin(9600);
 pinMode(LED_BUILTIN, OUTPUT);
 pinMode(SWITCH_1, INPUT);
 digitalWrite(S1, HIGH);
}
void loop() {
 val_s1 = digitalRead(SWITCH_1);
 Serial.print("S1:");
 Serial.print(val_s1);
 Serial.print("\n");
 digitalWrite(LED_BUILTIN, HIGH);
 delay(10);
 digitalWrite(LED_BUILTIN, LOW);
 delay(READ_INTERVAL);
}

When introducing the concept of interrupts, I have tried to retain the simplistic style of code A for testing purposes. The next snipped attempts to achieve the following:

  1. Attach an interrupt to pin 9 when the voltage rises
  2. No need for loop function (?)
  3. Within interrupt callback function...
  4. Increment the counter
  5. Send the counter value over serial

Code B:

void c1_rise();
const int COUNTER_1 = 9;
const int READ_INTERVAL = 1000;
volatile int val_c1 = 0;
void setup() {
 Serial.begin(9600);
 pinMode(LED_BUILTIN, OUTPUT);
 pinMode(COUNTER_1, INPUT_PULLUP);
 attachInterrupt(COUNTER_1, c1_rise, RISING);
}
void loop() {
}
void c1_rise() {
 val_c1 ++;
 Serial.print("C1:");
 Serial.print(val_c1);
 Serial.print("\n");
}

I've tried to learn where I'm going wrong, but I have become stuck and have decided to ask my questions here.

  • Observation: I expect to see some data sent over serial when the button is pressed, but actually nothing observable happens.
  • Problem 1: This might be because the interrupt isn't being attached at all.
  • Problem 2: This might be because I misunderstand the limitations of interrupt callback functions.

While trying to solve problem 1, Arduino documentation implies that to use the attachInterrupt function, parameter 1 must be an interrupt, from digitalPinToInterrupt, but if I use that function I receive the following error message: error: ‘digitalPinToInterrupt’ was not declared in this scope.

From reading up about how interrupts behave, I found problem 2: it seems that even though I have declared the integer as volatile, using Serial from within a callback function isn't allowed. This is the limit of my knowledge currently, I hope that someone can help me out.

Answer*

Draft saved
Draft discarded
Cancel

AltStyle によって変換されたページ (->オリジナル) /