Я использую Arduino Uno, подключенный к экрану USB, экрану RFID (adafruit PN532), LCD, EEPROM (24AA256) и модулю RTC (DS1307). Я не буду размещать здесь свой код, потому что он слишком большой и разделен на несколько файлов.Почему delay() вызывает перезагрузку arduino?
В моей программе я понимаю, что если мои программы входят в определенные функции, после ввода функции после функции, если я использую функцию delay() в конце функции, в которой я сейчас находится, arduino сбрасывается. Ниже приведен пример того, что я имею в виду.
void a() { b(); }
void b() { c(); }
void c() { d(); }
void d()
{
lcd_string("Testing", 0x80);
delay(2000); <---- Arduino resets at the delay here
}
Сначала я думал, что это было потому, что моя динамическая память была на уровне 80%, и, когда я собирал, они сказали, что Arduino может иметь некоторые проблемы со стабильностью. Поэтому я изменил свой код таким образом, что моя динамическая память теперь составляет 57%. Проблема все еще существует.
Я думал, может быть, функция delay() имеет переполнение или что-то в этом роде, поэтому я попытался заменить задержку на следующий код.
unsigned long timing;
timing = millis();
timing += 2000;
while(millis() < timing);
Arduino все еще сбрасывает.
Далее, я подумал, что, возможно, потому, что мой ардуино подключен к моему компьютеру, какой-то последовательный штырь мог вызвать сброс, поэтому я использовал внешнее питание для питания arduino и отсоединение USB. Ардуино все еще сбрасывается.
Далее, я подумал, может быть, Timer1 может быть сбой с функцией delay(), хотя функция задержки использует Timer0, поэтому я отключил свой Timer1. Ардуино все еще сбрасывается.
Есть ли другие возможности, которые я пропускаю? Мое пространство для хранения программы составляет 69%, что, по моему мнению, не должно быть проблемой.
Редактировать
Вот мой код Таймер1 ISR
ISR(TIMER1_OVF_vect)
{
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 34286;// = (16*10^6)/(1*1024) - 1 (must be <65536)
TCCR1B |= (1 << CS12);
// enable timer compare interrupt
TIMSK1 |= (1 << TOIE1);
triggered = 1;
}
Любое другое прерывание флагов, используемых находятся в заголовочных файлах библиотеки. Я использую следующие внешние библиотеки
USB Host щит библиотека мастер 2,0
Adafruit PN532
Спасибо за редактирование. Насколько трудно вам создать [минимальный, проверяемый и воспроизводимый пример] (http://stackoverflow.com/help/mcve), чтобы другие могли его протестировать? исчезает ли текущая проблема, если вы удаляете что-то, что явно не нужно из эскиза? –
Минимальный хороший вопрос. Потребовал бы мне 2 часа или около того, вот ссылка на мой код. https://drive.google.com/file/d/0BzCRu6FuIiXJS1ZxVUhrT2N2ME0/view?usp=sharing – Deckdyl
Хорошо, просто для ясности, когда вы говорите, что вы отключили свой таймер1, вы имеете в виду, что ни одна из этих строк не является когда-либо исполнялся, иначе вы прокомментировали этот код? –