max_cnc
Aug 29 2009, 13:53
Добрый день всем.
Есть проблемы с ATMEGA8515. Если кто сталкивался с подобным - поделитесь опытом.
Проблема в следующем. При прогоне программы в симуляторе все прекрасно. Загружаю в контроллер и начинаю проверять. По началу все работает, но при некоторых условиях появляются сбои без видимой причины. Контроллер как бы сбрасывается, т.е. программа начинает выполнятся сначала, но после такого "сброса" ведет себя уже не адекватно. Такое впечатление, что нарушается стек, хотя в симуляторе этого не происходит.
С этой проблемой сталкиваюсь уже второй раз (программы разные!) именно на ATMEGA8515.
Заранее благодарен за любые советы.
prottoss
Aug 29 2009, 13:56
Цитата(max_cnc @ Aug 29 2009, 21:53)

Добрый день всем.Есть проблемы с ATMEGA8515...
Снимите бит совместимости с AT90S8515 - "C8515"
max_cnc
Aug 29 2009, 14:04
Кажется снимал, но проверю еще раз. Благодарю за совет.
Цитата(max_cnc @ Aug 29 2009, 17:53)

По началу все работает, но при некоторых условиях появляются сбои без видимой причины. Контроллер как бы сбрасывается, т.е. программа начинает выполнятся сначала, но после такого "сброса" ведет себя уже не адекватно.
Конденсаторы не забыли повесить на каждую пару Vcc-GND?
Цитата
Снимите бит совместимости с AT90S8515 - "C8515"
Цитата
Конденсаторы не забыли повесить на каждую пару Vcc-GND?
И тут появляются гуру телепаты :-)
Ув. автор темы, скорее всего у Вас процентов на 99,9 проблемы с кодом, а не с камнем. Но 0,1 процент оставлю на включенный аппаратно вачдок не сбрасываемый программно. Вам быстрее помогут, не гадая на кофейной гуще, если Вы предоставите на всеобщее обозрение свой код.
И что значит-"как бы сбрасывается"? Вы уверены что программа переходит на нулевой вектор?
max_cnc
Aug 31 2009, 13:21
Проблема однозначно с кодом, по тому как сбой при одной и той же внешней команде. Смущает то, что в симуляторе все нормально. Или симулятор AVR Studio и реальный камень не тождественны?
На счет перехода на нулевой вектор на 100% не уверен, но очень похоже, поскольку начальные значения, которые устанавливаю при старте устанавливаются и при сбое, дальше все как после включения питания но некоторые команды (устройства в целом а не контроллера) реботают уже не адекватно.
Повторюсь, что такое же явление наблюдал на другом устройстве с Mega8515, но там оно проявлялось в случайные моменты (или закономерность была не очевидна). Навеска емкостей по питанию и замена камней проблему не снимала, как не снимает и в этом случае (керамика 0,15 на каждом корпусе плюс электролиты 470мкф на каждой плате). Код в ближайшее время выложу, просто при моем любительском стиле написания боюсь, что вежливо пошлют, учитывая, что написано на ASM и почти без коментариев, да и перевалило уже за 3 кб.
Ув. prottoss. По поводу бита совместим с S8515. При прошивке оставлял этот бит с заводской установкой, т.е. 1(незапрограмирован), что по описанию соответствует режиму MEGA. К сожалению устройство сейчас на обкатке в другом городе, а на голом камне поэкспериментировать не смогу. Вопрос: в предложении "Снимите бит совместимости с AT90S8515 - "C8515"" Вы имели в виду сбросить его в ноль, т.е. перейти в режим совместимости с S8515, или "снять" в смысле выключить этот режим? С AT90S8515 не работал, но если не ошибаюсь, она не поддерживает команд умножения, которые у меня используются.
Коротко об устройстве. Простейшее устройство ЧПУ для фрезерного станка. Основнвя часть на одной Mega8515, контроллер привода (следящая часть) на трех Mega48 (по одному на каждую ось станка), которые с Mega8515 общаются через SPI (связь односторонняя). Кроме этого к Mega8515 подцеплено 32к внешнего СОЗУ и на этой же шине сидят контроллер клавиатуры/индикации на i8279 (К580ВГ79) и два регистра К580ИР82 для управления автоматикой станка.
Цитата(max_cnc @ Aug 31 2009, 16:21)

Или симулятор AVR Studio и реальный камень не тождественны?
В симуляторе хватает своих "тараканов", кроме того Studio не симулирует внешние цепи...
Цитата(max_cnc @ Aug 31 2009, 16:21)

На счет перехода на нулевой вектор на 100% не уверен, но очень похоже, поскольку начальные значения, которые устанавливаю при старте устанавливаются и при сбое, дальше все как после включения питания но некоторые команды (устройства в целом а не контроллера) реботают уже не адекватно.
Возможно, что Вы разрешили (ошибочно, случайно) некое прерывание, а процедуры его обработки - нет (т.к. не предполагали, что это прерывание произайдёт). Некоторые трансляторы в случае непредвиденного прерывания "выводят" программу на адрес 0 (т.е. забивают "свободные" вектора прерывания кодом приводящим на команду jmp 0).
max_cnc
Aug 31 2009, 15:09
В таблице векторов все неиспользуемые прерывания закрыл командами RETI, но еще раз проверю, благодарю за напоминание.
К стати, вот еще один прикол, который удалось устранить методом тыка. В цикле интерполяции (вычисление очередных координат перемещения) для задания направления использовал три младших бита R25, соответственно для координат X, Y, Z. Зашиваю и проверяю. Y и Z все нормально, а X отрабатыват только в одну сторону. Бадался около недели. Перепроверил все подпрограммы и прерывания, использующие - никаких конфликтов. В конце концов переставил флаг направления для X с нулевого на третий бит того же R25, и О чудо! Все заработало. Понимаю, что чудес не бывает, но... Причем потом по старым копиям сравнивал, это не ошибка, в старой копии было именно SBRS R25,0. И опять таки, в симуляторе все работало четко.
Я не в коем случае не качу бочку на AVR, наоборот, из тех 8 бит МК о которых я имею представление - это лучшая на мой взгляд архитектура, но вот когда неделями паришся над подобными проблемами... Должно же быть им какое-то логическое объяснение? Кривизна рук и головы естественно не исключается :-).
prottoss
Aug 31 2009, 15:39
Цитата(max_cnc @ Aug 31 2009, 21:21)

По поводу бита совместим с S8515...
Я имел ввиду установить его в "1", т.е. запрограммировать для того, чтобы не было режима совместимости с 90S8515.
Цитата(max_cnc @ Aug 31 2009, 23:09)

Должно же быть им какое-то логическое объяснение? Кривизна рук и головы естественно не исключается :-).
Дак Вы начните с малого. Разбейте программу на логические модули, сделайте работающий скелет и прочее, что делают программисты. Повесьте, наконец, на какой нибудь вывод светодиод и начните уже отлаживать программу пошагово. Еще лучше, конечно, выводить отладочную инфу через UART. Таким образом, на мой взгляд, за не большой период времени отлавливается большинство явных косяков - как раз Ваш случай.
max_cnc
Aug 31 2009, 15:50
Тогда проблема не в фюзе 8515С. Благодарю за беспокойство.
В том то и дело, что по частям все работает, только я отлаживал не по модулям, а по подпрограммам, давая им необжодимые начальные установки и зашивая по отдельности. А вот при сборке в кучу начинаются приколы. И как их отлавливать?
USART дело конечно, но боюсь в данной проге ему места уже не хватит. Хотя попробую помучать.
Цитата(max_cnc @ Aug 31 2009, 16:21)

Коротко об устройстве. Простейшее устройство ЧПУ для фрезерного станка. Основнвя часть на одной Mega8515, контроллер привода (следящая часть) на трех Mega48 (по одному на каждую ось станка), которые с Mega8515 общаются через SPI (связь односторонняя). Кроме этого к Mega8515 подцеплено 32к внешнего СОЗУ и на этой же шине сидят контроллер клавиатуры/индикации на i8279 (К580ВГ79) и два регистра К580ИР82 для управления автоматикой станка.
Предчувствую ОЧЕНЬ большие проблемы с отладкой устройства в реальных условиях. АВР очень чувствительны к разнообразным электромагнитным помехам, коих в станке выше крыши. Помню отлаживал ДУ передатчика - так уже на 20 Вт (УКВ-ФМ) 8 и 88 меги начинали буквально балдеть... РЕСЕТ напрямую на плюс, неиспользуемые ноги как выход или как вход и снаружи на землю, электролиты и керамика по питанию, питание аналоговой части естественно подключено - ничего не помогало... Разве только не догадался экранировать
В общем проблема решилась с помощью ПИК - причем вообще без переделок - то есть маленькая платка с мегой заменилась платкой с ПИК и всё ОК
max_cnc
Sep 1 2009, 15:47
Проблема явно не в наводках, т.к. сбоит и на станке и на столе (станок в другом городе - при наладке кататься туда накладно, поэтому привды подач эмулирую так: микродвигатели + TDA2030 + датчики ВТМ-1, а автоматику - светодиодами).
Выкладываю код. Правда сам не представляю как в нем можно разобраться без подробного описания алгоритма и схемы. Для конкретизации, вот одно из подпзреваемых мест где проявляются сбои:
;==============ПОДПРОГРАММА КОНТРОЛЛЕРА ЭЛЕКТРОАВТОМАТИКИ====================
RUN_M: PUSH R16
PUSH R17
LDS R16,$80
CPI R16,2
BREQ END_RM1
LDS R16,$90
CPI R16,3
BRNE RM4
(1) LDS R17,$8C
SBRC R17,0
RJMP END_RM
SBRC R17,2
RJMP END_RM
SBRC R17,1
RJMP END_RM
LDI R17,0B10000000
STS $0FF8,R17
LDI R16,7
STS $A1,R16
RCALL DELAY
SBR R17,0B10000010
STS $0FF8,R17
STS $8C,R17
LDI R16,8
STS $A1,R16
RCALL DELAY
END_RM1: RJMP END_RM
RM4: CPI R16,4
BRNE RM5
LDS R17,$8C
SBRC R17,0
RJMP END_RM
SBRC R17,1
RJMP END_RM
SBRC R17,2
RJMP END_RM
LDI R17,0B10000000
STS $0FF8,R17
LDI R16,7
STS $A1,R16
RCALL DELAY
SBR R17,0B10000100
STS $0FF8,R17
STS $8C,R17
LDI R16,8
STS $A1,R16
RCALL DELAY
RJMP END_RM
RM5: CPI R16,5
BRNE END_RM
LDI R16,0B10000000
STS $0FF8,R16
LDI R16,8
STS $A1,R16
RCALL DELAY
LDI R16,0B10001000
STS $0FF8,R16
LDI R16,30
STS $A1,R16
RCALL DELAY
LDI R16,0B10000000
STS $0FF8,R16
STS $8C,R16
END_RM: POP R17
POP R16
RET
Так вот: ветки алгоритма, которые начинаются со строки (1) и с метки RM5:отрабатываются нормально, а ветка по метке RM4:, т.е. когда в $90 записано 4 - высывает сброс с дальнейшими глюками. $0FF8 - это внешний порт на К580ИР82 для связи с релейной частью станка.
Чего-то с первого раза не получилось. Вот код в CNC.txt.
prottoss
Sep 1 2009, 22:49
Цитата(niXto @ Sep 1 2009, 18:40)

Цитата(max_cnc)
Коротко об устройстве. Простейшее устройство ЧПУ для фрезерного станка. Основнвя часть на одной Mega8515, контроллер привода (следящая часть) на трех Mega48 (по одному на каждую ось станка), которые с Mega8515 общаются через SPI (связь односторонняя). Кроме этого к Mega8515 подцеплено 32к внешнего СОЗУ и на этой же шине сидят контроллер клавиатуры/индикации на i8279 (К580ВГ79) и два регистра К580ИР82 для управления автоматикой станка.
Случайно

увидел подробности разработки. Топик стартеру извинения за флуд, но прям детством своим повеяло, когда так и не исполнилась мечта о "РК-86"

Плюс развесистая схема на комплекте 8080, Плюс писание на Ассемблере... Хотя, ИМХО ВСЕ можно было запихать в один АРМ и писать на Си. Но это так к слову, еще раз извиняюсь.
По теме. Возможно, у Вас аппаратные проблемы, а не программные. Потому как, судя по коду вершина стека у Вас находится как раз во внешнем ОЗУ. А на шине данных сидит, кроме ОЗУ, еще несколько устройств. Можно схему в студию?
PS: Все пишу на Си, даже для контроллеров с 2К флэши.
Цитата(max_cnc @ Sep 1 2009, 19:47)

Выкладываю код.
Не сочти за шутку, но может попробовать переписать программу на Си?
Цитата(max_cnc @ Sep 1 2009, 14:47)

...ветки алгоритма, которые начинаются со строки (1) и с метки RM5, отрабатываются нормально, а ветка по метке RM4, т.е. когда в $90 записано 4 - высывает сброс с дальнейшими глюками. $0FF8 - это внешний порт на К580ИР82 для связи с релейной частью станка
Посмотрел код по диагонали, много играетесь с сохранением в стеке, посмотрите, не налезает ли стек на какие-либо переменные в определённых режимах?
Ничего личного, как говорится, но стиль написания у вас конечно ещё тот. Я бы вам посоветовал поменять все адреса в программе на символьные переменные, сами же небось путаетесь где что находится. И, пожалуйста, замените это ужасные обозначения $90 на стандартные 0х90.
Уважаемый автор топика.
Не сочтите за грубость, но разбираться в криво написанных исходниках на ассемблере -- дело неблагодарное. Ваша программа просто просится быть переписанной на Си.
Чтоб переменные были как надо описаны, да и просто чтобы правильно понимать как отдельные части исходного текста взаимодействуют друг с другом.
А ещё лучше взять какой-нибудь более современный кристалл и отладчик (тот же первый jtag на коленке сделать дело одного вечера).
И элементную базу вменяемую подобрать.
Тогда всё станет наглядно и ясно
ЗЫ А кирпичи 580й серии шумят по питанию неслабо да и вообще не представляю сколько всё это инженерное чудо будет потреблять тока
Цитата(RA3WUM @ Sep 2 2009, 22:41)

ЗЫ А кирпичи 580й серии шумят по питанию неслабо да и вообще не представляю сколько всё это инженерное чудо будет потреблять тока :)
Вот не понимаю людей... Почему сразу надо советовать взять другой камень, перенести прогу на си. Автор топика обратился с конкретной проблемой. Не плохо бы попробовать сначала найти решение вопроса, а потом уж советовать портировать проект. Завтра гляну подробнее. Может чего найдем. А на счет стиля программирования, согласен с выше озвученным, причесать не мешало бы.
max_cnc
Sep 4 2009, 14:06
Ну так я же предупреждал на счет кода

Сознаюсь, стыдно, самоучка.
Благодарю всех за советы. Они все полезные но на стадии начала разработки.
А в моем случае изделие елиничное, полностью заточенное под конкретный станок и уже на него установленное. Дело за малым - убрать эти досадные глюки, а то пред клиентом как то неудобно, когда после реверса шпинделя он начинает сам собой включаться в неопределенный момент времени
На счет вершины стека, вроде бы я ее установил во внутреннем озу, а то как бы все это работало с вытащеным внешним озу. Во внешнем храню только программу ЧПУ.
По элементной базе полностью согласен, но К580ВГ79 - это каприз клиента. Отказался от человеческого ЖКИ, подавай мол только светодиодные, как на 16К20Т1 с НЦ-31, если кто знаком с таким ископаемым. К стати ВГ79 не такие уж и дрова, ей бы последовательный интерфейс и протокол поудобнее - цены бы небыло. И на счет питания: AVR и 580 на разных платах, заблокированы емкостями и запитаны отдельными линиями от БП. Кушает все это чудо около 600 ма, из которых больше половины на светодиоднуюиндикацию, и регистры прожорльвами оказались, ИР82 - аж по 65 ма на корпус.
По налезанию стека на переменные, тоже проверял, там запас приличный, разве что у меня какие-то подпрограммы входят в рекурсию. При трассировке я такого не выявил но в работе по нешним признакам иногда похоже что одна та же подпрограмма выполняется по несколько раз, в частности приведенная в предидущем моем сообщении, и предидущая ей подпрограмма переключения скоростей (к слову о коробке скоростей станка - это еще то чудо техники).
И по поводу перехода на ARM - это пока мечта будущего, но по поводу AVR зря Вы так. Аналогичные по уровню устройства Электроника НЦ-31, 2Р22 и 2С42 (в последнем возможности уже не детские) строились на базе Электроника 60, а там, если не ошибаюсь, что то в роде К1802 или К589. AVR даже при своих восьми разрядах но 16МГц и RISC ядре по производительней будет.
Проверте вначале свой код на наличие детских ошибок. Например в обработчике прерывания должны сохраняться/восстанавливаться все используемые регистры:
Код
;==========ВНЕШНЕЕ ПРЕРЫВАНИЕ 1 - ЗАПРОС ОТ КЛАВИАТУРЫ=================================
EXT_INT1: PUSH R16
IN R16,$3F
PUSH R16
PUSH R26
PUSH R20
PUSH R19
.......
POP R19
POP R20
POP R26
POP R16
OUT $3F,R16
POP R16
RETI
На первый взгляд все в порядке сколько регистров сохраняется столько и восстанавливается, в теле обработчика используются только эти регистры. Но в обработчике есть также вызовы функций, например:
Код
FIX_PAR: RCALL CHARG_PAR
;=======СБРОС================
KEYB20: CPI R16,$D3
BRNE KEYB21
RCALL CLIR
RCALL TYPE
L1: RJMP L2
И что мы видем?
Код
CLIR: PUSH R20
PUSH R26
;-----------------
LDS R20,$98
SBRS R20,6
RJMP CL_L2
CBR R20,0B11000001
STS $98,R20
CLR R20
LDI >>>>>R31,$01<<<<<<
LDI >>>>>R30,$09<<<<<<
C1_L01: ST Z+,R20;СБРОС KX, KY, KZ, MDX - MDZ
CPI R30,$1E
BRLO C1_L01
и
Код
CHARG_PAR: PUSH R17
CLR R17
STS $86,R17
STS $87,R17
STS $81,R19
CBR R19,$F0
CPI R19,3
BRLO CGP0
CPI R19,9
BRSH CGP0
>>>LDI R30,3<<<
>>>MOV R31,R19<<<
SUBI R31,3
>>MUL R31,R30<<<
CLR R31
LDI R30,$65
...
Портим регистры R0, R1, R30, R31? Нехорошо так поступать.
Анатолий.
max_cnc
Sep 7 2009, 14:55
Точно, упустил. (Хочеш спрятать положи на видное место). Ведь десять раз на подобные вещи код прошерстил. Большое спасибо за подсказку. Z регистр запросто может такие фокусы вызывать, да и R0, R1 сохранять нужно. Как только доберусь до железа - напишу результат.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.