задача определить пин который сработал (pin change прерывание). оно срабатывает и из глубокого сна выводит но не могу определить какой пин сработал
есть две проблеммы
1) если запускаю код без ухода в сон то определяются два порта. PB7 всегда выводит ноль когда он срабатывает почемуто
2) если ухожу в сон gotoSleep то когда просыпается ни одного пина уже не видит/читает, всегда ноль возвращяет для любой ноги
подскажите как решить отдельно первую и вторую проблемму ?
код для ардуины чтоб serial самому не подымать
Код: Выделить всё
#include "deepSleep.h"
#ifdef USBCON
#define LED (1 << PC7)
#define led_hi() PORTC |= LED
#define led_lo() PORTC &= ~LED
#else
#define LED (1 << PB5)
#define led_hi() PORTB |= LED
#define led_lo() PORTB &= ~LED
#endif
#define PIR (1 << INT0)
int flag = 0;
int KEYVAL = 0;
int PBLAST = 0;
int PBNOW = 0;
void setup() {
DDRB = 0; PORTB = 0;
cli();
PCICR |= (1 << PCIE0); // Enables Ports B as Pin Change Interrupts
PCMSK0 |= (1 << PCINT7) | (1 << PCINT6) | (1 << PCINT5); // PCINT0
sei();
DDRD |= LED; PORTD &= ~LED;
Serial.begin(19200);
}
void loop() {
if (flag) {
flag = 0;
Serial.println(millis());
led_hi(); // turn LED ON
delay(4000);
led_lo(); // turn LED OFF if we have no motion
Serial.println(KEYVAL);
KEYVAL = 0;
PBLAST = PINB;
PCMSK0 |= (1 << PCINT7) | (1 << PCINT6) | (1 << PCINT5);
}
//gotoSleep();
delay(2000);
Serial.println(F("Up"));
}
ISR(PCINT0_vect)
{
PCMSK0 = 0;
++flag;
PBNOW = PINB ^ PBLAST;
switch (PBNOW) {
case (1 << PB7):
KEYVAL = 11;
break;
case (1 << PB6):
KEYVAL = 10;
break;
case (1 << PB5):
KEYVAL = 9;
break;
default:
break;
}
}
inline void gotoSleep() {
Serial.println(F("goto"));
delay(2000);
Serial.println(F("s"));
delay(200);
Serial.println(F("l"));
delay(200);
Serial.println(F("e"));
delay(200);
Serial.println(F("e"));
delay(200);
Serial.println(F("p"));
delay(200);
deepSleep();
}
inline void wakeupMode() {
PORTD &= ~PIR;
EIFR = bit(INTF0);
attachInterrupt(0, wakeup, RISING );
}
void wakeup() {
sleep_disable();
detachInterrupt(0);
flag++;
}