Attiny2313 sleep mode : waking up

Hey,

!!! Code on the first comment because of character restriction !!

I am trying to put my Attiny2313 to sleep.
Actually I think I managed to put it to sleep but I am having issue waking it up.

I have watched numerous tutorials and exemples on how to put an attiny (85 mostly, because nobody is using 2313) or arduino to sleep (since I use to arduino IDE and DrAzzy's work to programm my attiny2313).

About my program:
When I press a button, on release, a number between 1 and 6 (included) is displayed ona 7 segment display.
If no interrupt is triggered (button is released) in the last 5 seconds, the display turns black and the device goes to sleep.
When the button is pressed again, it wakes up and display a new number. (the part I can't achieve).

Issue:
Once the the display turns black (and most likely the attiny goes to sleep), the display stays black even after pressing the push button.

What I have done:
I have read threads such as:
https://www.avrfreaks.net/forum/sleep-mode-and-attiny2313

And looked at all sentences including "sleep" in the datasheet.

In the tutorials it is explained that the Attiny goes to sleep after the command sleep_mode();
It is then woken up by the interrupt calling the (empty) function wake_up. In the datasheet it is explained that the trigger of an interrupt will stop the sleep, that's why wake_up() is empty.
When it wakes up, it continue the script from where it left, so it will run the code under "sleep_mode();", that's why we disable sleep mode after "sleep_mode();".

I also tried to put "sleep_disable();" in the wake_up function just to be sure. But it doesn't change anything.

I also tried to use the functions from the data sheet such as:
SM0 |= (1<<SM0); //sleepmode to power down
SE |= (1<<SE); //sleep enabled
__sleep(); //enter sleep

but I get those compiling error messages:

 In function 'void loop()':

DeElectroniqueV2:52:19: error: lvalue required as left operand of assignment

     SM0 |= (1<<SM0);  //sleepmode to power down
                   ^

DeElectroniqueV2:53:17: error: lvalue required as left operand of assignment

     SE |= (1<<SE);    //sleep enable enabled
                 ^

DeElectroniqueV2:54:5: error: '__sleep' was not declared in this scope

     __sleep();  //enter sleep
     ^~~~~~~

exit status 1

lvalue required as left operand of assignment

I hope it is clear and that you can help me! :slight_smile:

#include <avr/sleep.h>

const int button=4;           //the button to display a new number
const int interrupt_button=5; //the button to exit sleep

volatile int changed=0;       //value to check before entering sleep
volatile int seed=0;          //seed for the random number generation

//renaming all the segments' pins
const int segment1 = 8;
const int segment2 = 9;
const int segment3 = 7;
const int segment4 = 6;
const int segment5 = 3;
const int segment6 = 11;
const int segment7 = 12;

//"calling" the functions here to avoid compiling errors (this way the compiler know the functions)
void going_to_sleep();
void interrupt_funct();
void printRand();
void waking_up();

void setup() {
  pinMode(button, INPUT);
  pinMode(interrupt_button, INPUT);
  pinMode(segment1, OUTPUT);
  pinMode(segment2, OUTPUT);
  pinMode(segment3, OUTPUT);
  pinMode(segment4, OUTPUT);
  pinMode(segment5, OUTPUT);
  pinMode(segment6, OUTPUT);
  pinMode(segment7, OUTPUT);

  attachInterrupt(digitalPinToInterrupt(button), interrupt_funct, FALLING); //creating the interrupt

  set_sleep_mode(SLEEP_MODE_PWR_DOWN);  //setting sleep mode to "deep sleep")

  //initialise the display to "0"
  digitalWrite(segment1, HIGH);
  digitalWrite(segment2, HIGH);
  digitalWrite(segment3, HIGH);
  digitalWrite(segment4, HIGH);
  digitalWrite(segment5, HIGH);
  digitalWrite(segment6, HIGH);
  digitalWrite(segment7, LOW);
}

void loop() {
  if (changed>2){ //after running the while 3 times and not getting interrupted...
    going_to_sleep();   //...call the function to sleep
  }
  else {
    changed++;  
    delay(2000);  
    }
}

void interrupt_funct(){
  if(seed==0){  //set the seed
    randomSeed(millis());
    seed=1;
  }
  printRand();
  changed=0; 
}

void printRand(){
  switch(random(1,7)) //rand [1;6]
  {
    case 1: //display "1"
    digitalWrite(segment1, LOW);
    digitalWrite(segment2, HIGH);
    digitalWrite(segment3, HIGH);
    digitalWrite(segment4, LOW);
    digitalWrite(segment5, LOW);
    digitalWrite(segment6, LOW);
    digitalWrite(segment7, LOW);
    return;
    
    case 2:
    digitalWrite(segment1, HIGH);
    digitalWrite(segment2, HIGH);
    digitalWrite(segment3, LOW);
    digitalWrite(segment4, HIGH);
    digitalWrite(segment5, HIGH);
    digitalWrite(segment6, LOW);
    digitalWrite(segment7, HIGH);
    return;
    
    case 3:
    digitalWrite(segment1, HIGH);
    digitalWrite(segment2, HIGH);
    digitalWrite(segment3, HIGH);
    digitalWrite(segment4, HIGH);
    digitalWrite(segment5, LOW);
    digitalWrite(segment6, LOW);
    digitalWrite(segment7, HIGH);
    return;
    
    case 4:
    digitalWrite(segment1, LOW);
    digitalWrite(segment2, HIGH);
    digitalWrite(segment3, HIGH);
    digitalWrite(segment4, LOW);
    digitalWrite(segment5, LOW);
    digitalWrite(segment6, HIGH);
    digitalWrite(segment7, HIGH);
    return;
    
    case 5:
    digitalWrite(segment1, HIGH);
    digitalWrite(segment2, LOW);
    digitalWrite(segment3, HIGH);
    digitalWrite(segment4, HIGH);
    digitalWrite(segment5, LOW);
    digitalWrite(segment6, HIGH);
    digitalWrite(segment7, HIGH);
    return;
    
    case 6:
    digitalWrite(segment1, HIGH);
    digitalWrite(segment2, LOW);
    digitalWrite(segment3, HIGH);
    digitalWrite(segment4, HIGH);
    digitalWrite(segment5, HIGH);
    digitalWrite(segment6, HIGH);
    digitalWrite(segment7, HIGH);
    return;
  }
}

void going_to_sleep(){
  attachInterrupt(digitalPinToInterrupt(interrupt_button), waking_up, RISING);  //attaching another interrupt, this is probably not needed since I already have another interrupt
  changed=0;  //reset changed so we can actually exist sleep and not loop forever in sleep because of the while loop
  digitalWrite(segment1, LOW);
  digitalWrite(segment2, LOW);
  digitalWrite(segment3, LOW);
  digitalWrite(segment4, LOW);
  digitalWrite(segment5, LOW);
  digitalWrite(segment6, LOW);
  digitalWrite(segment7, LOW);
  delay(100);

  sleep_enable(); //enable sleep
  sleep_mode(); //go to sleep

  //nothe happen, we sleeping

  //program takes back from here after wake up
  sleep_disable();  //disable sleep
  detachInterrupt(digitalPinToInterrupt(interrupt_button)); //detach interrupt
}

void waking_up(){ 
}