|
Самодельный 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
|
|
|
|
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: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 секунды максимум. Я думаю это он бы заметил
|
|
|
|
Сообщений в этой теме
gluckmaker Самодельный JTAG ICE + Mega128: при отладке "прыгает не туда" Jan 20 2008, 01:14 gluckmaker Спасибо, попробую. Но в просмотреных мною примерах... Jan 20 2008, 11:50 sensor_ua ЦитатаКстати, ещё заметил странность
Бывали нюансы... Jan 20 2008, 15:39 sensor_ua ЦитатаЯ всегда неиспользуемые вектора собираю на к... Jan 20 2008, 15:56 Qwertty Цитата(sensor_ua @ Jan 20 2008, 18:56) Та... Jan 20 2008, 15:59 =VRA= ЦитатаЯ прекрасно знаю как устроены вектора прерыв... Jan 20 2008, 16:22 gluckmaker Сорри, AVRовский ассемблер знаю крайне плохо - эту... Jan 20 2008, 19:23
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|