Оператор else

ATTiny1616, megaTinyCore, NecDecoder v3.0.2

При удалении команды else перестаёт выполняться условие и отправлять данные в Serial. Почему?
Было:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <NecDecoder.h>
NecDecoder ir;

void setup() {
  Serial.begin(115200);
  PORTA.DIRSET = PIN7_bm; // Set only PA7(LED) as output without affecting other pins
  PORTA.DIRCLR = PIN5_bm; // Set PA5 to input
  PORTA.PIN5CTRL = PORT_PULLUPEN_bm | PORT_ISC_FALLING_gc; // Set PA5 to PULLUP with Interrupt sensing on Falling edge
  sei();
}

void loop() {
  if (ir.available()) {
    Serial.println(ir.readData(), HEX);
    PORTA.OUTTGL = PIN7_bm;  // toggle LED
    delay(100);
  }
  else {
    PORTA.OUTCLR = PIN7_bm;  // turn off LED
  }
}


ISR(PORTA_PORT_vect) {
  if (PORTA.INTFLAGS & PIN5_bm) { // only if the interrrupt trigger is for PA5
    ir.tick();
    PORTA.INTFLAGS = PIN5_bm; // clear PA5 interrupt flag
  }
}

Стало

#include <avr/io.h>
#include <avr/interrupt.h>
#include <NecDecoder.h>
NecDecoder ir;

void setup() {
  Serial.begin(115200);
  PORTA.DIRSET = PIN7_bm; // Set only PA7(LED) as output without affecting other pins
  PORTA.DIRCLR = PIN5_bm; // Set PA5 to input
  PORTA.PIN5CTRL = PORT_PULLUPEN_bm | PORT_ISC_FALLING_gc; // Set PA5 to PULLUP with Interrupt sensing on Falling edge
  sei();
}

void loop() {
  if (ir.available()) {
    Serial.println(ir.readData(), HEX);
  }
}


ISR(PORTA_PORT_vect) {
  if (PORTA.INTFLAGS & PIN5_bm) { // only if the interrrupt trigger is for PA5
    ir.tick();
    PORTA.INTFLAGS = PIN5_bm; // clear PA5 interrupt flag
  }
}

Можно увидеть исправленный код ПОЛНОСТЬЮ?

В порядке занудства - строчка sei() без соответвующей пары смотрится странно…
И да, else это не команда

1 лайк

Ну, Ваша Светлость, ну, кто ж так вопросы задаёт? Нужно два кода – как было и как стало и описание что неожиданно изменилось в поведении.

Верхний код это как было, нижний - как изменился loop, все остальное осталось без изменений. Верхний код работает, с изменениями не работает. Извольте - с.

Так Вы ж убиваете свой вывод, Ваша Светлость! Ещё бы оно работало!

Поставьте после третьей строки Serial.flush(); или delay(200);

1 лайк

что это с вами ?))) не уж то вам как то совестно стало когда кто то писал что занижают новичков)))

Adinah

PORTA.OUTCLR = PIN7_bm;

правильный ответ это строка нужная, и не работает потому что вы ее удалили))) и делай тут не поможет)))

хммм Это почему это?

Пусть ТС уточнит, но думаю что вывод от ИК идет не так уж часто, не чаще чем раз в несколько секунд… Соотвенно, времени для печати ИК-кода тут вагон.

Или где-то туплю?

Это для посвящённых.

не торопитесь.
для проверки поставьте во втором коде после вывода в Сериал делей 100мс

еще можно предложить почитать описание библиотеки которыми он пользуется)))

1 лайк

точнее имя автора :slight_smile:

Проверял, Serial.flush(); или delay(200); не помогают.

офигенный чел, который не позволяет другим копировать бездумно))) а заставляет читать и вникать, хоть я сам ненавижу его за это)))

чудеса.
Ну так возвращайте по одной оставшиеся строчки и смотрите, когда заработает. Там вариантов-то немного… Устройство у вас и этот тест никто, кроме вас, сделать не сможет.

Это козе ясно. Рабочий вариант у меня есть изначально. Я хочу докопаться до истины, почему это работает именно так. Хотя по моему разумению так работать не должно, где то я туплю. Согласно мануалу:

“PORTA.OUTTGL = PIN7_bm;” переключает состояние соответствующего пина порта А, а “PORTA.OUTCLR = PIN7_bm;” выставляет его в ноль. Вопрос: каким образом это влияет на “PIN5_bm” или на что-то еще, что препятствует выполнению условия с выводом в Serial?

Так тоже работает:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <NecDecoder.h>
NecDecoder ir;

void setup() {
  Serial.begin(115200);
  PORTA.DIRSET = PIN7_bm; // Set only PA7(LED) as output without affecting other pins
  PORTA.DIRCLR = PIN5_bm; // Set PA5 to input
  PORTA.PIN5CTRL = PORT_PULLUPEN_bm | PORT_ISC_FALLING_gc; // Set PA5 to PULLUP with Interrupt sensing on Falling edge
  sei();
}

void loop() {
  if (ir.available()) {
    Serial.println(ir.readData(), HEX);
  }
  PORTA.OUTCLR = PIN7_bm;
}

ISR(PORTA_PORT_vect) {
  if (PORTA.INTFLAGS & PIN5_bm) { // only if the interrrupt trigger is for PA5
    ir.tick();
    PORTA.INTFLAGS = PIN5_bm; // clear PA5 interrupt flag
  }
}

вроде то что вы удалили это часть библиотеки и без нее не работает, проверьте на это, поищите такую часть в самой библиотеке, это не троллинг…

Вы выше советовали открыть библиотеку и почитать. Так сделайте это сами. Посмотрите пример simple, там нет никаких лишних пинов.

#include <NecDecoder.h>
NecDecoder ir;

// в прерывании вызываем tick()
void irIsr() {
    ir.tick();
}

void setup() {
    Serial.begin(115200);
    // подключил на D2, прерывание 0
    attachInterrupt(0, irIsr, FALLING);
}

void loop() {
    // если пакет успешно принят
    if (ir.available()) {
        Serial.print("0x");

        // адрес + команда (16 бит)
        Serial.println(ir.readData(), HEX);

    }
}

А только пин 7 так влияет - или любой другой пин на порту А? … а на других портах?

времени нет… может позже…

а что будет если так сделать ?
else { delay(10); // ← Даем “передохнуть” процессору на 10 мс
} //если так работает, тогда делай поможет)))

Пробовал менять порты, поведение такое же.

Так работает:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <NecDecoder.h>
NecDecoder ir;

void setup() {
  Serial.begin(115200);
  PORTC.DIRSET = PIN1_bm; // Set only PA7(LED) as output without affecting other pins
  PORTB.DIRCLR = PIN4_bm; // Set PA5 to input
  PORTB.PIN4CTRL = PORT_PULLUPEN_bm | PORT_ISC_FALLING_gc; // Set PA5 to PULLUP with Interrupt sensing on Falling edge
  sei();
}

void loop() {
  if (ir.available()) {
    Serial.println(ir.readData(), HEX);
    PORTC.OUTTGL = PIN1_bm;  // toggle LED
    delay(100);
  }
  else {
    PORTC.OUTCLR = PIN1_bm;  // turn off LED
  }
}


ISR(PORTB_PORT_vect) {
  if (PORTB.INTFLAGS & PIN4_bm) { // only if the interrrupt trigger is for PA5
    ir.tick();
    PORTB.INTFLAGS = PIN4_bm; // clear PA5 interrupt flag
  }
}

Так не работает:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <NecDecoder.h>
NecDecoder ir;

void setup() {
  Serial.begin(115200);
  PORTC.DIRSET = PIN1_bm; // Set only PA7(LED) as output without affecting other pins
  PORTB.DIRCLR = PIN4_bm; // Set PA5 to input
  PORTB.PIN4CTRL = PORT_PULLUPEN_bm | PORT_ISC_FALLING_gc; // Set PA5 to PULLUP with Interrupt sensing on Falling edge
  sei();
}

void loop() {
  if (ir.available()) {
    Serial.println(ir.readData(), HEX);
  }
}


ISR(PORTB_PORT_vect) {
  if (PORTB.INTFLAGS & PIN4_bm) { // only if the interrrupt trigger is for PA5
    ir.tick();
    PORTB.INTFLAGS = PIN4_bm; // clear PA5 interrupt flag
  }
}