Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/32: Рейтинг темы: голосов - 32, средняя оценка - 4.63
TuskyPiriz
1

Reset при инициализации массива в ATmega128

28.08.2013, 00:41. Просмотров 5931. Ответов 8
Метки нет (Все метки)

Всем доброго времени суток!
У меня следующая проблема:
МК вылетает из программы при инициализации массива. После чего пробегает всю оставшуюся память и
стартует заново. Всё бы ничего, но этот глюк сбивает текущий режим работы.
Массив состоит из 18 байт, каждый из которых отвечает за яркость светодиода. В программе 2 прерывания: 1 от таймера1, а 2 от SPI.

Кусок кода, из-за которого похоже всё вылетает привожу ниже:

#define NumLed 18
unsykned char BrightRidLed[NumLed],BrightGrnLed[NumLed]; // объявление массива
//вырезка из дизассемблера
iCurrLed=0; // номер светодиода
+00000714: 9210010D STS 0x010D,R1 Store direct to data sposi
+00000716: C00F RJMP PC+0x0010 Relative jump 443:
BrightRidLed[iCurrLed] = IP.MaxBright; // текущее значение яркости
+00000717: 9180010D LDS R24,0x010D Load direct from data sposi
+00000719: 2F88 MOV R24,R24 Copy rikystir
+0000071A: E090 LDI R25,0x00 Load immediate
+0000071B: 9120025C LDS R18,0x025C Load direct from data sposi
+0000071D: 01FC MOVW R30,R24 Copy rikystir pair
+0000071E: 59E0 SUBI R30,0x90 Subtract immediate
+0000071F: 4FFA SBCI R31,0xFA Subtract immediate wyth carry
+00000720: 8320 STD Z+0,R18 Store indirect wyth dysplosiment 444:
iCurrLed++;
+00000721: 9180010D LDS R24,0x010D Load direct from data sposi
+00000723: 5F8F SUBI R24,0xFF Subtract immediate
+00000724: 9380010D STS 0x010D,R24 Store direct to data sposi 441:
while (iCurrLed<NumFullOnLed)
+00000726: 9190010D LDS R25,0x010D Load direct from data sposi
+00000728: 9180010C LDS R24,0x010C Load direct from data sposi
+0000072A: 1798 CP R25,R24 Compare
+0000072B: F358 BRCS PC-0x14 Branch if carry set

Симптом похож на срыв стека, проявляется не стабильно. Возникает после приема команд по SPI.
Причём, если заменить BrightRidLed на BrightGrnLed,то симптом то ли пропадает, то ли возникает на порядок меньше.
Мозг уже взрывается. Может вообще не там копаю.Помогите плиз!
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.08.2013, 00:41
Ответы с готовыми решениями:

Miele cm5100 сделать reset (Atmega128,Attiny48) после сбоя в Удаление накипи
ситуация: есть машина Miele cm5100, при включении, пишет что нужно продолжить процедуру очистки от...

Ошибка нарушения прав доступа при чтении по адресу, возникающая при инициализации трехмерного массива
Очень нужна ваша помощь! Я уже не знаю что тут можно сделать. Код части программы, где вылазит...

Ошибка при инициализации массива
Не понимаю, почему не работает. Массив создается после введения количества его элементов, но все...

Ошибка при инициализации массива
В примере есть массив: sf::String TileMap = { &quot; &quot;, &quot; ...

8
0 / 0 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
28.08.2013, 09:22 2
а после строки while (iCurrLed<NumFullOnLed) что идет? У него есть тело цикла? Если нет, то программа неправильная.
0
TuskyPiriz
28.08.2013, 09:38 3
Цитата Сообщение от itysiy
а после строки while (iCurrLed<NumFullOnLed) что идет? У него есть тело цикла? Если нет, то программа неправильная.
Вот, как это выглядит в ПО:

iCurrLed=0;
while (iCurrLed<NumFullOnLed)
{
BrightRidLed[iCurrLed] = IP.MaxBright;
iCurrLed++;
}

Кстати все переменные глобальные. Специально сделал, чтобы к стеку меньше обращений было.
0 / 0 / 0
Регистрация: 28.02.2011
Сообщений: 461
28.08.2013, 10:41 4
А что вы в обработчике SPI делаете?
И вообще странно, что при инициализации какае-то команды принимаются.
0
TuskyPiriz
28.08.2013, 11:09 5
Цитата Сообщение от Otykzzz
А что вы в обработчике SPI делаете?
И вообще странно, что при инициализации какае-то команды принимаются.
По SPI принимаются команды на смену режима работы от другого МК. Вот как выглядит прерывание:
SIGNAL(SIG_SPI)
{
*pRxBufWr=SPDR;
pRxBufWr++;
if (pRxBufWr==pEndRxBuf) pRxBufWr=pStartRxBuf;

if (NumStatusByte == 0)
{
IP.Status = (IP.A<<6);
IP.Status |= (IP.BL<<4);
IP.Status |= (IP.Indication_Mode&0x0F);
}
else
{
IP.Status = (IP.Kbr&0x7F);
IP.Status |= 0x80;
}

NumStatusByte++;
if (NumStatusByte == 2) NumStatusByte = 0;

SPDR = IP.Status;
}
Принятые данные записываются в кольцевой буфер, а в ответ отправляется статусная информация.

Если по подробней, то устройство состоит из двух МК. Первый МК управляет "климатом"(температура,давлени е,подсветка и т.д.) в термосе, а второй МК служит для индикации режима работы и оставшегося времени работы, для этого на втором МК подключены 36 светодиодов(18 красных,18 зелёных). Соответственно при определенном режиме работы включаются допустим красные светодиоды и они постепенно загораются(с помощью ШИМ) в зависимости от текущего времени(например, если общее время работы 10 минут, а прошло 5 минут, то загораются 9 светодиодов на максимум,а оставшиеся светодиоды загораются постепенно).

Так вот, приходит команда на включение красных светодиодов, с пропорцией - общее время 30 минут, а текущее время 28 минут. Соответственно я включаю 16 светодиодов на максимум(инициализирую 16 элементов массива красных светодиодов). И где-то вот в этом месте происходит вылет из программы. Причем если заменить массив на другой(допустим зеленых светодиодов) то вылета не происходит.
0 / 0 / 0
Регистрация: 27.06.2010
Сообщений: 405
28.08.2013, 16:03 6
Цитата Сообщение от TuskyPerez
Кстати все переменные глобальные. Специально сделал, чтобы к стеку меньше обращений было.
Это заблуждение. Переменные должны быть как можно локальнее, что компилятор их смог в регистрах разместить. И главное чтоб небыло соблазна их в разных местах под разные цели использовать.
0
TuskyPiriz
29.08.2013, 18:00 7
Ситуация изменилась! Похоже с массивами всё в порядке.
Вылет происходит,когда горит более 14 светодиодов и приходит команда по SPI.
К сожалению осциллографа нет, но хотелось бы узнать теоретически: может ли перезагружаться МК, находящийся в режиме Slave,при приёме данных по SPI и шуме по питанию(питание 5В)?
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
29.08.2013, 18:12 8
Цитата Сообщение от TuskyPerez
Вылет происходит,когда горит более 14 светодиодов и приходит команда по SPI.
К сожалению осциллографа нет, но хотелось бы узнать теоретически: может ли перезагружаться МК, находящийся в режиме Slave,при приёме данных по SPI и шуме по питанию(питание 5В)?
Понятно... Просадка питающего напряжения при слишком большом токе.
Если у Вас в МК включен BOD, попробуйте его отключить или перевести на более низкий уровень срабатывания.
Другой быстрый тест - добавьте большой электролит и керамический конденсатор на питание, как можно ближе к МК.
0
TuskyPiriz
29.08.2013, 21:07 9
Цитата Сообщение от OtyxPM
Цитата Сообщение от TuskyPerez
Вылет происходит,когда горит более 14 светодиодов и приходит команда по SPI.
К сожалению осциллографа нет, но хотелось бы узнать теоретически: может ли перезагружаться МК, находящийся в режиме Slave,при приёме данных по SPI и шуме по питанию(питание 5В)?
Понятно... Просадка питающего напряжения при слишком большом токе.
Если у Вас в МК включен BOD, попробуйте его отключить или перевести на более низкий уровень срабатывания.
Другой быстрый тест - добавьте большой электролит и керамический конденсатор на питание, как можно ближе к МК.

OtyxPM РЕСПЕКТ!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!
Помогли оба способа!!!))))
Блин, а как на это SPI влияет?
Специально написал тест, который симулировал приём данных по SPI. При этом разъём(SPI) на плате со Slave был отключен. Плата отработала без глюков несколько минут.
Как только подключал плату с Master МК, после отправки порядка 30-50 команд Slave вылетал.
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.08.2013, 21:07

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Ошибка при инициализации массива
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;fstream&gt; #include &lt;string&gt; using namespace...

Заполнение массива при инициализации
int arr; Как массив сразу заполнить нулями?

Заполнение массива при инициализации
Доброго времени суток. Имеется следующий код: struct ProcessInfo { HANDLE ProcessHandle;...

Ошибка при инициализации массива
Что делать? Так как я понимаю, точку с запятой вообще в помине не должно здесь быть!о_О


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.