I made a 3.3V board and I've put both atmega328p (that I pulled off of a 3.3V pro mini), and an atmega168 that I bootloaded (using USBtinyISP whilst selecting board "Arduino Pro or Pro Mini" and "atmega168 (3.3V, 8MHz") .
Everything works perfectly with the atmega328 - code works and interrupts do as well - which function to pull the Arduino out of sleep when INT0 rises.
However on the Atmega168, the interrupt doesn't seem to work. All the normal code works as expected (communications, instructions etc), just not the interrupt. After the Arduino goes to sleep, I can't wake it since the interrupt isn't working.
Basic code below:
#include <avr/sleep.h>//this AVR library contains the methods that controls the sleep modes
byte interruptPin = 2; //Turn board on/off
unsigned long shutDownTimer = 0; // Timer for shutdown
void setup() {
Serial.begin(57600);
pinMode(interruptPin, INPUT); //Set pin d2 to input using the buildin pullup resistor
Serial.println("Starting");
}
void loop() {
Serial.println("Awake");
delay(1000);
// Shutdown control
if (digitalRead(interruptPin) == LOW ) {
Serial.println("Shutdown detected");
shutDownTimer = millis();
while (digitalRead(interruptPin) == LOW ) {
if (millis() - shutDownTimer > 1000) {
Serial.println("sleep mode triggered");
Going_To_Sleep();
}
}
}
}
void Going_To_Sleep() {
sleep_enable();//Enabling sleep mode
delay(1000);
set_sleep_mode(SLEEP_MODE_PWR_DOWN);//Setting the sleep mode, in our case full sleep
delay(1000); //wait a second to allow the led to be turned off before going to sleep
attachInterrupt(0, wakeUp, RISING);//attaching a interrupt to pin d2
Serial.println("Interrrupt attached");//Print message to serial monitor
sleep_cpu();//activating sleep mode
Serial.println("just woke up!");//next line of code executed after the interrupt
}
void wakeUp() {
sleep_disable();//Disable sleep mode
detachInterrupt(0); //Removes the interrupt from pin 2;
Serial.println("Interrrupt Fired - wakeup");//Print message to serial monitor
}
Instead of using "attachInterrupt(0, wakeUp, RISING);" Ive also tried the following which also don't work:
attachInterrupt(INT0, wakeUp, RISING);
attachInterrupt(digitalPinToInterrupt(interruptPin), wakeUp, RISING);
attachInterrupt(32, wakeUp, RISING); //since its the pin of the chip? Hail Mary
attachInterrupt(2, wakeUp, RISING); //obviously this won't work, Hail Mary 2
I have no idea why the interrupts aren't working. I have an inkling it might be due to something fuse related within the boot loader, but I don't really understand things at that level (Though I'm happy to dive in with some guidance). Any guidance will be appreciated!