#1 2025-01-22 14:06:09

AVP
Учасник
Зареєстрований: 2025-01-22
Повідомлень: 2

Pro Mini нужно на PD0,PD1(RX,TX) повесить PCINT

В проекта закончились пины:-( Плата уже готова, но нужно добавить пульт ДУ, который должен к тому же будить МК из deepsleep. На плате остался разьем для перепрошивки (RX/TX на PD0,1) через который и хочу подключить аккуратно приемник ПДУ. Serial будет использоваться ТОЛЬКО для обновления прошивки, режим работы пинов переключу когда нужно в скетче.
Итак - не работает! После разрешения PCInt  при любом изменении их состояния происходит REBOOT.

volatile uint8_t oldPIND = 0x00;

void pciSetup(byte pin)
{
  *digitalPinToPCMSK(pin) |= bit (digitalPinToPCMSKbit(pin));  // Разрешаем PCINT для указанного пина
  PCIFR  |= bit (digitalPinToPCICRbit(pin)); // Очищаем признак запроса прерывания для соответствующей группы пинов
  PCICR  |= bit (digitalPinToPCICRbit(pin)); // Разрешаем PCINT для соответствующей группы пинов
}

void Setup ()
{
DDRD = DDRD & B11111100;  // bit0,1 - входы пульта
pciSetup (RemoteInPin0);           //прерывание пульта на RX (PD0)
}

ISR (PCINT0_vect)
{ // Обработчик запросов прерывания от пинов PD0,PD1
  uint8_t changedbits = PIND ^ oldPIND;
  oldPIND = PIND;
  if (changedbits & (1 << PD0))
  { // Изменился RX(PD0)
    interruptRemote0 = true;
  }
  if (changedbits & (1 << PD1))
  { // Изменился TX(PD1)
    interruptRemote1 = true;
  }

после этого изменение состоянии PD0 приводит в жесткому ребуту. Если не делать pciSetup - ребут не происходит. Если ISR (PCINT0_vect) пустой или там пишу не значущую команду - все равно ребут...

Неактивний

#2 2025-01-22 15:26:50

AVP
Учасник
Зареєстрований: 2025-01-22
Повідомлень: 2

Re: Pro Mini нужно на PD0,PD1(RX,TX) повесить PCINT

PORTD это (PCINT2_vect) а не 0.
РЕШЕНО

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму