Пробуждение по PCINT

Засыпает и больше не просыпается. Как ее проснуть?

#include <avr/sleep.h>
#include "KeypadInt.h"
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
volatile uint32_t tmrSleep;
volatile uint8_t counter;
char hexaKeys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'0','0','0'}
};
byte rowPins[ROWS] = {A1, A2, A4, A5}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {A0, A3, 7, 2}; //connect to the column pinouts of the keypad
KeypadInt Keypad( (char *)hexaKeys, rowPins, colPins, ROWS, COLS, KEY_PRESSED);
void setup(){
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  pinMode(13, OUTPUT);
  Serial.begin(115200);
  PCICR |= B00000010; //порт C
  PCMSK1 |= B00110110; //A1,A2,A4,A5
}
  ISR (PCINT1_vect)
{   
  sleep_disable(); tmrSleep=millis; digitalWrite(13,0);counter++;

  }
void loop(){
  if (millis()-tmrSleep>=10000){digitalWrite(13,1); sleep_mode();
}
  char Key = Keypad.getKey();
 if (Key!=0) {
    Serial.println(Key);
    Serial.println(counter);
  }
}

Контроллер-то какой?

И, кстати, не помешала бы схема, как Вы там матрицу подключили, никто ж не знает.

Говнокод в чистом виде. ТС, постыдился бы такое выкладывать.
ЕвгенийП, я бы постыдился (побрезговал) отвечать.

1 лайк

328P. Ну пусть это будут кнопки подключенные A1,A2,A4,A5 с внутренним PULLUP, а вторыми концами на земле.

Я, конечно, дико извиняюсь, но разве PC6 - не резет?

1 лайк

Так точно. Не понимаю вопроса.

Да, пусть, конечно, только Вы не поняли для чего я спрашиваю.
Обычно я запускаю это добро у себя и смотрю, что там. Поэтому, если Вы хотите, чтобы я это сделал и что-то Вам разумное сказал, вставьте это (пул-ап и пр.) в код, убедитесь, что не работает и выложите этот код, чтобы я мог просто запустить его (без дописывания отсебятины) и увидеть проблему. Если увижу, попытаюсь решить, что-то подсказать.

Только, когда допишете код, таки запустите его и убедитесь, что по-прежнему не работает, а то обидно будет мне запустить, сказать Вам, что у меня работает, а потом услышать, что у Вас тоже :slight_smile:

Он самый!

Понял, сейчас переделаю.

Скобки у millis пропустили.

1 лайк

А еще в SREG еденицу загнать нужно (в I), судя по даташиту:

В седьмой бит:

Или просто вызвать функцию sei(); в конце блока setup().

1 лайк

Она там и без нас благополучно вызывается (ещё до setup), иначе миллис бы ни в жисть не работал.

Благодарю всех. Так заработало:

#include <avr/sleep.h>
#include "KeypadInt.h"
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
volatile uint32_t tmrSleep;
volatile uint8_t counter;
char hexaKeys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'0','0','0'}
};
byte rowPins[ROWS] = {A1, A2, A4, A5}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {A0, A3, 7, 2}; //connect to the column pinouts of the keypad
KeypadInt Keypad( (char *)hexaKeys, rowPins, colPins, ROWS, COLS, KEY_PRESSED);
void setup(){
  sleep_enable(); // Разрешаем использование спящего режима
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  pinMode(13, OUTPUT);
  Serial.begin(115200);
  PCICR |= B00000010; //порт C
  PCMSK1 |= B00110110; //A1,A2,A4,A5
  SREG |= B10000000;
}
  ISR (PCINT1_vect)
{   
  sleep_disable(); tmrSleep=millis(); digitalWrite(13,0);counter++;

  }
void loop(){
  if (millis()-tmrSleep>=10000){digitalWrite(13,1); sleep_cpu();
}
  char Key = Keypad.getKey();
 if (Key!=0) {
    Serial.println(Key);
    Serial.println(counter);
  }
}

Вопрос наводящий можно задать ?
Как работает матричная клавиатура ?

Мне конечно пофик, но почему отметили «вопрос решен» пост #13, а не #12 (в котором о SREG как раз и шла речь).

Заработало после правки строк 17,27 и 31. SREG никак не повлиял на работу, что с ним, что без. Но я очень благодарен лично Вам за помощь.

1 лайк

Но, Вы, надеюсь, понимаете, что там ещё доводить до ума и доводить? Так нельзя оставлять.

Был бы благодарен за подсказки.