Страница 3 из 3

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

Добавлено: Чт мар 22, 2012 16:17:21
Engineer_Keen
okmonster писал(а):в общем что получилось( в протеусе запускаешь проходит пару секунд и ерор выпадает потом опять работает некоторое время и ерор выпадает
Пара секунд реального или симулированного времени? Хотя это не так важно...
okmonster писал(а):закачал прошивку на железо все работает на ура
Если железный контроллер попытается записать информацию в несуществующую ячейку памяти, то без дополнительной диагностики вы этого не узнаете, так что не факт, что у вас все на ура...
okmonster писал(а):с чем это связано?
Дайте HEX, посмотрю в каком месте выползает бяка...
прошло пол-часа
...все уже не посмотрю, ухожу :dont_know: ...

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

Добавлено: Чт мар 22, 2012 18:52:46
okmonster
вот

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

Добавлено: Чт мар 22, 2012 20:58:02
ploop
закачал прошивку на железо все работает на ура
с чем это связано?
С тем, что меньше надо доверять всяким протеусам.
Или в крайнем случае уметь их эффективно использовать.

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

Добавлено: Пт мар 23, 2012 14:56:54
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% верно работает в железе длительное время?

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

Добавлено: Пт мар 23, 2012 19:51:14
okmonster
Engineer_Keen писал(а): вы уверены, что ваша программа на 100% верно работает в железе длительное время?
да, я где то час в работе ее держал и все было ровно, а в эмуляторе напрочь отказывается(