2017-02-09 6 views
1

Я использую 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

+0

Спасибо за редактирование. Насколько трудно вам создать [минимальный, проверяемый и воспроизводимый пример] (http://stackoverflow.com/help/mcve), чтобы другие могли его протестировать? исчезает ли текущая проблема, если вы удаляете что-то, что явно не нужно из эскиза? –

+0

Минимальный хороший вопрос. Потребовал бы мне 2 часа или около того, вот ссылка на мой код. https://drive.google.com/file/d/0BzCRu6FuIiXJS1ZxVUhrT2N2ME0/view?usp=sharing – Deckdyl

+0

Хорошо, просто для ясности, когда вы говорите, что вы отключили свой таймер1, вы имеете в виду, что ни одна из этих строк не является когда-либо исполнялся, иначе вы прокомментировали этот код? –

ответ

0

Немного образцов приблизиться к RAM коррупции ...

#define MEM_PER_LEVEL 50 
#define TRY_TO_SURVIVE 10 
void KillMe(int level) { 
    byte dummy[MEM_PER_LEVEL]; 
    for (byte i = 0; i < MEM_PER_LEVEL; i++) 
     dummy[i]= i; 
    Serial.println(level); 
    delay(1000); // not sure why this would hurt more than others 
    if (level < TRY_TO_SURVIVE) KillMe(level+1); 
    for (byte i = 0; i < MEM_PER_LEVEL; i++) { 
     if (dummy[i] != i) { 
      Serial.println(F("corruption happened")); 
      while(1) {} // HALT 
     } 

    } 
    if (level == 0) 
    Serial.println(F("survived")); 
} 
void setup() { 
    Serial.begin(9600); 
    KillMe(0); 
} 

void loop() { } 
+0

Я пробовал ваш код несколько раз, не было проблем на моем ардуине. Мне пришлось изменить TRY_TO_SURVIVE на 30. Когда я это сделал, arduino перезагрузился один раз и во второй раз, он повесился. Когда он перезагружается, объем доступной оперативной памяти меньше 200. Однако, когда я тестировал свой код, у меня было чуть больше 700 байт. Поэтому я сомневаюсь, что повреждение RAM было проблемой при перезагрузке. – Deckdyl

Смежные вопросы