|
|
  |
Самодельный JTAG ICE + Mega128: при отладке "прыгает не туда" |
|
|
|
Jan 20 2008, 01:14
|

Частый гость
 
Группа: Свой
Сообщений: 75
Регистрация: 17-09-07
Из: Москва
Пользователь №: 30 594

|
Пытаюсь отлаживать простейшую программу в AVR Studio 4.13:
.include "m128def.inc" rjmp RESET ;Reset Handle RESET: ldi r16,$40 out DDRD,r16 lp: ldi r16,$40 out PORTD,r16 ldi r16,$00 out PORTD,r16 rjmp lp
Запускаю её через Auto Step. Через некоторое время отладка останавливается: курсор стоит на какой-то строчке, в статусной строке Студия показывает "Running", светодиод на отладчике горит постоянно или "подмигивает". Когда до метки RESET и после последнего rjmp был какой-то неиспользуемый код, оно не висло, а переходило вместо очередного шага в произвольную точку этого кода. Возникает резонный вопрос: WTF?
Сделал 2 варианта JTAG ICE: и с отдельным питанием, супервизором и согласованием с таргетом, и упрощённый, в котором Mega16 напрямую подключается к меге в таргете - оба ведут себя одинаково. Таргет - ATMega128-16AI c кварцем на 16.384 МГц, к ней подключен светодиод и MAX232. Цепь сброса - конденсатор на землю и резистор на питание. Плата с мегой без отладчика работает нормально. Кабель между отладчиком и таргетом пробовал сначала длинный (30 см), потом укоротил до 5 см. Частоту TCK в настройках уменьшал до 50 кГц. Скорость пробовал и 19200 (по умолчанию), и 9600. Симптомы всегда одни и те же.
|
|
|
|
|
Jan 20 2008, 01:56
|
Местный
  
Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527

|
Вектора у М128 расчитаны на использование команды jmp, а не rjmp. У Вас метка RESET находится ВНУТРИ 0-го вектора. Попробуйте так: .include "m128def.inc" .cseg .org 0x0000 jmp RESET ;Reset Handle
.cseg .org 0x0046 RESET: ldi r16,$40 out DDRD,r16 lp: ldi r16,$40 out PORTD,r16 ldi r16,$00 out PORTD,r16 rjmp lp Не уверен, что решит Вашу роблему, но так все же правильнее.
Сообщение отредактировал Qwertty - Jan 20 2008, 01:57
|
|
|
|
|
Jan 20 2008, 11:50
|

Частый гость
 
Группа: Свой
Сообщений: 75
Регистрация: 17-09-07
Из: Москва
Пользователь №: 30 594

|
Спасибо, попробую. Но в просмотреных мною примерах (AVRxxx) стоит именно rjmp. Да и к моменту возникновения глюка этот переход уже выполнился: всё нормально бегает в течение 1..20 минут, потом на произвольной команде внутри цикла происходит прыг. Кстати, ещё заметил странность. Оба отладчика шил одинаково: залил на программаторе лоадер, запустил в студии AVRprog, залил один и тот же update.ebn и снял фьюз BOOTRST. Но теперь один вариант запускается без каких-либо глупых вопросов, а другой (упрощённый) просит ещё какой-то апдейт. Если нажать "да", запускается опять AVRprog и не находит устройство, если нажать "нет" - всё работает так же, как и с первым.
|
|
|
|
Guest_=VRA=_*
|
Jan 20 2008, 13:01
|
Guests

|
Цитата(Qwertty @ Jan 20 2008, 04:56)  Вектора у М128 расчитаны на использование команды jmp, а не rjmp. У Вас метка RESET находится ВНУТРИ 0-го вектора Вектора у М128 расчитаны не на jmp, а на правильное понимание их сути, разжеванной в ДШ до безобразия. Следующие примеры работают одинаково корректно, а почему - попробуй догадаться самостоятельно: Код .cseg .org 0x0000 jmp RESET;Reset Handle .org 0x0046 RESET: ldi r16,$40 out DDRD,r16
;----------------------------------------------- Код .cseg .org 0x0000 rjmp RESET;Reset Handle .org 0x0046 RESET: ldi r16,$40 out DDRD,r16
;----------------------------------------------- Код .cseg .org 0x0000 RESET: ldi r16,$40 out DDRD,r16
;----------------------------------------------- Из этого сделай вывод - не учи других тому, чего не знаешь сам. gluckmaker: попробуй вставить внутрь цикла команду WDR
|
|
|
|
|
Jan 20 2008, 15:39
|
Профессионал
    
Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387

|
Цитата Кстати, ещё заметил странность Бывали нюансы насчёт автоопределения порта в студии - после выставления вручную (не авто) перешивка проходила нормально. Ну и загрузчики бывают разные. Там http://onembedding.bialix.com/files/jtag_vit/ лежит загрузчик рабочий, только говорит, что проц не м16, а м163. Исходники там есть. Если ему пару цифирек кода девайса из avrdude вправить, то будет говорить правильно. Но я не правил в своё время из-за отсутствия у меня этих кодов, а потом - за ненадобностью.
--------------------
aka Vit
|
|
|
|
|
Jan 20 2008, 15:44
|
Местный
  
Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527

|
Цитата(=VRA= @ Jan 20 2008, 16:01)  Вектора у М128 расчитаны не на jmp, а на правильное понимание их сути, разжеванной в ДШ до безобразия. Следующие примеры работают одинаково корректно, а почему - попробуй догадаться самостоятельно: Из этого сделай вывод - не учи других тому, чего не знаешь сам.
gluckmaker: попробуй вставить внутрь цикла команду WDR Я прекрасно знаю как устроены вектора прерываний. Да, в них можно применять команду rjmp, но это не значит, что так и следует делать. Есть такой древний афоризм - "не все, что ты можешь делать безнаказанно, следует делать".  В даташите кстати, "в котором все разжевано до безобразия", команда rjmp в этом случае не применяется. Не верите? Посмотрите стр 58. Разработчики ядра для Вас явно не авторитеты в этом вопросе. И я кстати, не писал - "так неправильно и работать не будет", я написал, что по другому - правильнее. Я всегда неиспользуемые вектора собираю на какую нибудь заглушку, это позволяет отследить в процессе отладки появление нежелательных прерываний. Писать .org перед каждым вектором мне не нравится, гораздо проще сделать простой список rjmp/jmp для всех векторов. В случае применения rjmp в начале может быть все хорошо, а потом, по мере развития проекта этой команды может просто не хватить. Может проще сразу применить jmp? По поводу WDR - в коде WDT не включается, фьюз WDTON по умолчанию не запрограммирован, так что непонятно, чем это может помочь. Тем более, что WDT работает независимо от JTAG, и если он включен, то "некоторое время" у автора темы превращается в 2-2,5 секунды максимум. Я думаю это он бы заметил
|
|
|
|
|
Jan 20 2008, 15:56
|
Профессионал
    
Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387

|
Цитата Я всегда неиспользуемые вектора собираю на какую нибудь заглушку Там пример встречал http://avr.h15.ru/index.php?page=coding
--------------------
aka Vit
|
|
|
|
Guest_=VRA=_*
|
Jan 20 2008, 16:22
|
Guests

|
Цитата Я прекрасно знаю как устроены вектора прерываний. Да, в них можно применять команду rjmp, но это не значит, что так и следует делать. Есть такой древний афоризм - "не все, что ты можешь делать безнаказанно, следует делать" Мне, четыре года проработавшему в фирме Atmel в должности Field Application Engineer, это слышать особенно прикольно приятно 
Сообщение отредактировал =VRA= - Jan 20 2008, 16:23
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|