Не читается порт после PCINT в чём дело?

Обсуждаем контроллеры компании Atmel.
Ответить
alex68md
Грызет канифоль
Сообщения: 275
Зарегистрирован: Сб янв 03, 2015 21:03:24

Не читается порт после PCINT в чём дело?

Сообщение alex68md »

Добрый день любимый форум. знаю тут есть умные коты. плиз помогите я застрял :)

задача определить пин который сработал (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++;
}
Реклама
LEVV2006
Грызет канифоль
Сообщения: 286
Зарегистрирован: Сб фев 06, 2010 20:39:59

Re: Не читается порт после PCINT в чём дело?

Сообщение LEVV2006 »

Что за МК? Как подключены кнопки? Есть ли подтяжка резистором?
Читал это описание? https://habr.com/ru/post/131908/
Реклама
Ответить

Вернуться в «AVR»