Arduino Uno продолжает цикл setup() каждый раз, когда я нажимаю определенную кнопку на пульте дистанционного управления.

Я пытаюсь расшифровать пульт от телевизора Panasonic, используя приведенный ниже скетч IR_RECEIVE.

Когда я нажимаю кнопки пульта, он работает нормально, и я получаю значения, за исключением случаев, когда я нажимаю кнопку питания — выполняется функция setup().

Это код:

/* Raw IR decoder sketch!

This sketch/program uses the Arduno and a PNA4602 to
decode IR received. This can be used to make a IR receiver
(by looking for a particular code)
or transmitter (by pulsing an IR LED at ~38KHz for the
durations detected

Code is public domain, check out www.ladyada.net and adafruit.com
for more tutorials!
*/

#define IRpin_PIN      PIND
#define IRpin          2
#define MAXPULSE 65000
#define RESOLUTION 20 

uint16_t pulses[100][2];  // пара — высокий и низкий импульс
uint8_t currentpulse = 0; // индекс импульсов, которые мы сохраняем

void setup(void) {
    Serial.begin(9600);
    Serial.println("Ready to decode IR!");
}

void loop(void) {
    uint16_t highpulse, lowpulse;  // время временного хранения
    highpulse = lowpulse = 0; // начинаем без длины импульса

    while (IRpin_PIN & (1 << IRpin)) {
        highpulse++;
        delayMicroseconds(RESOLUTION);

        if ((highpulse >= MAXPULSE) && (currentpulse != 0)) {
            printpulses();
            currentpulse = 0;
            return;
        }
    }
    pulses[currentpulse][0] = highpulse;

    while (!(IRpin_PIN & _BV(IRpin))) {
        lowpulse++;
        delayMicroseconds(RESOLUTION);
        if ((lowpulse >= MAXPULSE) && (currentpulse != 0)) {
            printpulses();
            currentpulse = 0;
            return;
        }
    }
    pulses[currentpulse][1] = lowpulse;

    currentpulse++;
}

void printpulses(void) {
    Serial.println("\n\r\n\rReceived: \n\rOFF \tON");
    for (uint8_t i = 0; i < currentpulse; i++) {
        Serial.print("delayMicroseconds(");
        Serial.print(pulses[i][0] * RESOLUTION, DEC);
        Serial.println(");");

        Serial.print("pulseIR(");
        Serial.print(pulses[i][1] * RESOLUTION, DEC);
        Serial.println(");");
    }
}

Вот результат:

Готовы к декодированию IR!

Получено:

ВЫКЛ.ВКЛ.
задержкамикросекунды(34724);
пульсIR(3600);
задержкамикросекунды(1800);
......
задержкамикросекунды(1340);
импульсIR(460);
задержкамикросекунды(1360);
импульсIR(460);
Готов декодировать IR!
Готовы декодировать IR!

Последние две строки появились, когда я нажал кнопку питания (дважды). Строки выше появляются, когда я нажимаю любую другую кнопку.

Я поигрался с Arduino и пультом дистанционного управления, возможно, я что-то сделал, чтобы это вызвать. Первый раз попробовал - получилось нормально.

Я попробовал сбросить настройки и загрузить заново.

Извините, если сообщение слишком длинное или недостаточно информативное — я новичок в этом и не совсем уверен, какую информацию предоставлять.

, 👍0

Обсуждение

чип сбрасывается из-за какой-то ошибки, @Juraj

попробуйте больший массив uint16_tpulses[150][2];, @Juraj


1 ответ


1

Насколько высоко может подняться currentpulse, прежде чем он обнулится? Используется индекс массива, и если он становится больше (количество элементов массива-1), ваш код будет писать за пределами массива.

Может ли массив быть настолько перезаписан, что он врастет в область стека? Это определенно может вызвать сброс или поведение, подобное сбросу.

,