реклама на сайте
подробности

 
 
> Помогите. AVRstudio+Jtag+Atmega128
big_nikolas
сообщение Nov 2 2006, 10:07
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 28
Регистрация: 28-04-06
Пользователь №: 16 574



help.gif
Всем привет! Помогите разобраться, плиз.
Накалякал простую программу:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

#define Freq 16000000

SIGNAL(SIG_OVERFLOW1)
{
TCNT1 = 0x10000 - (Freq / 1024);
PORTA ^= 0x01;
}

int main (void)
{
DDRA = 0x01;
TCCR1A = 0;
TCCR1B = 5;
TCNT1 = 0x10000 - (Freq / 1024);
TIFR = 0;
TIMSK = 0x04;

sei();
while(1);
}
Подключил JTAGice собранный своими руками. Всё вроде нормально. Запустил программу, эмулятор зашуршал, светодиодик через каждую секунду замигал (на тестируемой плате) см. программу. Поставил breakpoint на начало прерывания, всё нормально. Остановился в прерывании, жму RUN, тоже всё нормально возвращается к breakpoint. Начинаю делать step into, когда доходит до конца подпрограммы прерывания и как-бы зависает. Нажимаю на паузу он высвечивает окно Дизассемблера и показывает что жёлтая стрелочка находится вне телы программы на не понятном адресе. Посмотрел окно памяти DATA а там о ужас непонятные числа и причём вся область, и когда он возвращается из подпрограммы он выходит по лже-значениям в DATA, а не по значению адреса сохраннём стеком.
За што зацепится, даже ума не приложу. Мож кто подскажет, ЧТО ЭТО? help.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 6)
klop
сообщение Nov 2 2006, 10:45
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 433
Регистрация: 28-02-06
Пользователь №: 14 788



Цитата(big_nikolas @ Nov 2 2006, 13:07) *
while(1);
}


Ну попробуете написать

while(1){};
}

Может поможет
Go to the top of the page
 
+Quote Post
big_nikolas
сообщение Nov 3 2006, 06:35
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 28
Регистрация: 28-04-06
Пользователь №: 16 574



Спасибо Klop что откликнулся. Но дело, по ходу, в другом.
Чего я обнаружил: У Atmega128 внутреннее ОЗУ с $0100 по $10FF. Так вот, компилятор С естественно указатель стека записывает в конец ОЗУ. НО! как видно из приложенного фото, ОЗУ забито непонятно чем, начиная с адреса $0FFE по $10FF записано хрен знает што и я даже изменить это значение не могу.
Взял специально в программе указал стек $0FEE и у меня всё заработало.
ЧТО ЭТО? может я настройки какие то в AVRstudio не сделал, но микросхему atmega128 я выбрал, он память определил правильно. Или же это что-то с контроллером? тогда как проверить?
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 3 2006, 08:36
Сообщение #4


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



При старте значение RAM в AVR имеет непредсказуемое значение.
Компиляторы инициализируют только то, что должно быть проинициализировано и обнуляют только то, что должно быть обнулено, остальное оставляют без изменения. Стеки не инициализируются.
Указатель стека обычно инициализируется на конец стекового сегмента самим компилятором (линкером).
Необходимо правильно указать расположение стекового сегмента (или сегментов, в зависимости от применяемого тулчейна).
Компилятором какого производителя пользуетесь? Судя по всему WinAVR?
Go to the top of the page
 
+Quote Post
big_nikolas
сообщение Nov 3 2006, 09:10
Сообщение #5


Участник
*

Группа: Новичок
Сообщений: 28
Регистрация: 28-04-06
Пользователь №: 16 574



То что значения в RAM от rnd я знаю. Компилятор стек определяет в конец память на фото видно белом по чёрному по адресу 10FF и не работает. А когда я сам в программе указал адрес $0FEE, то всё заработало. Если обратите внимание на предущей картинке числа одинаковые 81, вот эти ячейки я поменят не могу, а другие могу в реальном времени.
Действительно я пользуюсь winAVR.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
aesok
сообщение Nov 3 2006, 10:06
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Разберитесь с фюзой M103

Анатолий.
Go to the top of the page
 
+Quote Post
big_nikolas
сообщение Nov 3 2006, 10:50
Сообщение #7


Участник
*

Группа: Новичок
Сообщений: 28
Регистрация: 28-04-06
Пользователь №: 16 574



Цитата(aesok @ Nov 3 2006, 13:06) *
Разберитесь с фюзой M103

Анатолий.



Спасибо большое! Тема закрыта. Заработало ОЗУ, а также заработал и бит порта F как цифровой выход, паралельно с другим входом порта F как АЦП

Обязательно знать всем кто связывается с Atmega128:

Режим совместимости с ATmega103

Если запрограммировать конфигурационный бит M103C, то ATmega128 будет функционировать в режиме совместимости с ATmega103, настраивая ОЗУ, линии ввода-вывода и векторы прерываний как описано выше. Однако, некоторые новые функции ATmega128 в этом режиме станут недоступными. Данные функции перечислены ниже:

Один УСАПП вместо двух, только асинхронный режим. Доступны только 8 младших разрядов в регистре скорости связи.
Один 16-разр. таймер-счетчик с двумя регистрами сравнения вместо двух 16-разр. таймер-счетчиков с тремя регистрами сравнения.
Не поддерживается двухпроводной последовательный интерфейс.
Порт C действует только на вывод.
Порт G выполняет только альтернативные функции (не универсальный ввод-вывод).
Порт F действует только как цифровой ввод в дополнение к аналоговому вводу к АЦП.
Не поддерживаются возможности автономного программирования из загрузочного сектора.
Не возможно регулировать частоту внутреннего калиброванного RC-генератора.
Интерфейс внешней памяти не может освободить неиспользуемые адресные сигналы для задач универсального ввода-вывода, не конфигурируются различные паузы для разных диапазонов адресов внешней памяти.
Кроме того, для большей совместимости с ATmega103 выполнены другие незначительные изменения:

В регистре MCUCSR присутствуют только EXTRF и PORF.
Временная последовательность не требуется для изменения периода переполнения сторожевого таймера.
Запросы на внешние прерывания 3 - 0 генерируются только по уровню входного сигнала.
УСАПП не имеет буфера FIFO, поэтому, переполнение при приеме данных происходит раньше.
Неиспользуемые биты ввода-вывода у ATmega103 должны быть сброшены (запись 0) для гарантирования одинакового функционирования в составе ATmega128.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 11:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.01412 секунд с 7
ELECTRONIX ©2004-2016