Size: a a a

2021 August 06

AP

Alexander Polikushin in ru_ASUTP
источник

AP

Alexander Polikushin in ru_ASUTP
источник

D

Dim in ru_ASUTP
#include <SoftwareSerial.h>
// software serial #1: RX = digital pin 10, TX = digital pin 11
SoftwareSerial portOne(10, 11);

// software serial #2: RX = digital pin 8, TX = digital pin 9
// on the Mega, use other pins instead, since 8 and 9 don't work on the Mega
SoftwareSerial portTwo(8, 9);

оно работать не будет?
ни первый ни второй?
источник

AP

Alexander Polikushin in ru_ASUTP
Смотря на каком МК.
источник

D

Dim in ru_ASUTP
на 328
источник

AP

Alexander Polikushin in ru_ASUTP
Нет, не будет. На 328p только два внешних прерывания на пинах 2 и 3
источник

D

Dim in ru_ASUTP
та выше вроде писали что есть прерывания
источник

AP

Alexander Polikushin in ru_ASUTP
источник

D

Dim in ru_ASUTP
источник

AP

Alexander Polikushin in ru_ASUTP
Читайте даташиты
источник

D

Dim in ru_ASUTP
вот написано
источник

D

Dim in ru_ASUTP
D8 - D13 генерирует прерывания на PCINT0
источник

D

Dim in ru_ASUTP
D0 - D7 генерирует прерывания на PCINT2
источник

AP

Alexander Polikushin in ru_ASUTP
PCINTx-прерывания обслуживают сразу целый порт, поэтому в обработчике необходимо смотреть на записанное и текущее состояние выводов и выискивать, какой же из пинов изменил свое состояние (и в какую сторону).
источник

D

Dim in ru_ASUTP
значит все таки можно?
источник

AP

Alexander Polikushin in ru_ASUTP
Скорость будет ниже, пробуйте
источник

D

Dim in ru_ASUTP
а тот пример что выше ты доработал - ты тестил на камне?
источник

AP

Alexander Polikushin in ru_ASUTP
Да, там же видео
источник

AP

Alexander Polikushin in ru_ASUTP
Вот пример как работать с PCINT
источник

AP

Alexander Polikushin in ru_ASUTP
#define ledPin 13      // Пин для светодиода
#define setLedOnPin 8  // Пин кнопки включения светодиода
#define setLedOffPin 9 // Пин кнопки выключения светодиода

volatile uint8_t state = 0;
uint8_t oldPINB = 0xFF;

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

ISR (PCINT0_vect) { // Обработчик запросов прерывания от пинов D8..D13
 uint8_t changedbits = PINB ^ oldPINB;
 oldPINB = PINB;

 if (changedbits & (1 << PB0)) { // Изменился D8
   state = 1; // Зажигаем светодиод
 }

 if (changedbits & (1 << PB1)) { // Изменился D9
   state = 0; // Гасим светодиод
 }

 //if (changedbits & (1 << PB2)) { ... } - аналогичные условия для остальных пинов
}

ISR (PCINT1_vect) { // Обработчик запросов прерывания от пинов A0..A5
 // Обработка аналогична PCINT0_vect, только изменить на PINC, oldPINC, PCx
}

ISR (PCINT2_vect) { // Обработчик запросов прерывания от пинов D0..D7
 // Обработка аналогична PCINT0_vect, только изменить на PIND, oldPIND, PDx
}

void setup() {
 pinMode(ledPin, OUTPUT);
 pinMode(setLedOnPin,  INPUT_PULLUP); // Подтянем пины-источники PCINT к питанию
 pinMode(setLedOffPin, INPUT_PULLUP);
 pciSetup(setLedOnPin); // И разрешим на них прерывания
 pciSetup(setLedOffPin);
}


void loop() {
 digitalWrite(ledPin, state);
}
источник