atmega32 прерывание по таймеру

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: atmega32 прерывание по таймеру

Сообщение Engineer_Keen »

okmonster писал(а):в общем что получилось( в протеусе запускаешь проходит пару секунд и ерор выпадает потом опять работает некоторое время и ерор выпадает
Пара секунд реального или симулированного времени? Хотя это не так важно...
okmonster писал(а):закачал прошивку на железо все работает на ура
Если железный контроллер попытается записать информацию в несуществующую ячейку памяти, то без дополнительной диагностики вы этого не узнаете, так что не факт, что у вас все на ура...
okmonster писал(а):с чем это связано?
Дайте HEX, посмотрю в каком месте выползает бяка...
прошло пол-часа
...все уже не посмотрю, ухожу :dont_know: ...
Реклама
Аватара пользователя
okmonster
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Сб мар 10, 2012 11:29:53

Re: atmega32 прерывание по таймеру

Сообщение okmonster »

вот
Вложения
AVRGCC1.rar
(9.55 КБ) 403 скачивания
Реклама
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: atmega32 прерывание по таймеру

Сообщение ploop »

закачал прошивку на железо все работает на ура
с чем это связано?
С тем, что меньше надо доверять всяким протеусам.
Или в крайнем случае уметь их эффективно использовать.
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: atmega32 прерывание по таймеру

Сообщение Engineer_Keen »

okmonster писал(а):вот
Это скомпилированный вашим компилятором, тот же самый код? Мда, накрутил он там что пипец...
На сколько мог разобрался в чем причина. В этой прошивке компилятор такое вытворяет со стеком, что его просто напросто сносит. Я не знаю почему, но помимо начала памяти, он еще и зачем-то записывает какие-то данные ближе к концу, а там стек. Причем и стек этот получается просто неприличных размеров. Нет я понимаю что Си-компиляторы любят без повода накидать в начале подпрограммы конструкции вида PUSH R0 PUSH R1... и так до 31-го регистра, но тут помимо этого есть еще и чтение и модификация самого регистра SP.
Вот этот кусок кода вообще убил:

Код: Выделить всё

ST Y+11,R24
ST Y+12,R25
ST Y+13,R26
ST Y+14,R27
LDI R17,$01
LD R22,Y+11
LD R23,Y+12
LD R24,Y+13
LD R25,Y+14
Что, напрямую MOV R22,R24 сделать нельзя? Может конечно значение в Y+11 потом еще где-то используется, не знаю...
Причем во время симуляции значения Y получаются больше чем адрес в SP, т.е. числа пишутся прямо в стек.
В итоге, примерно после 3 секунд работы в результате этих манипуляций со стеком, его указатель превышает размер ОЗУ и очередная попытка что-либо туда затолкать или извлечь приводит к той самой ошибке про запись в несуществующую область. Может конечно это и глюк симулятора, так как отследить вручную правильность выполнения команд в таком запутанном коде невозможно, но в реальности такие вещи приводят к совершенно разнообразным глюкам, начиная от появления случайных данных в регистрах и заканчивая сбросом контроллера.
Еще раз спрошу, вы уверены, что ваша программа на 100% верно работает в железе длительное время?
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
okmonster
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Сб мар 10, 2012 11:29:53

Re: atmega32 прерывание по таймеру

Сообщение okmonster »

Engineer_Keen писал(а): вы уверены, что ваша программа на 100% верно работает в железе длительное время?
да, я где то час в работе ее держал и все было ровно, а в эмуляторе напрочь отказывается(
Реклама
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»