Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите. AVRstudio+Jtag+Atmega128
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
big_nikolas
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
klop
Цитата(big_nikolas @ Nov 2 2006, 13:07) *
while(1);
}


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

while(1){};
}

Может поможет
big_nikolas
Спасибо Klop что откликнулся. Но дело, по ходу, в другом.
Чего я обнаружил: У Atmega128 внутреннее ОЗУ с $0100 по $10FF. Так вот, компилятор С естественно указатель стека записывает в конец ОЗУ. НО! как видно из приложенного фото, ОЗУ забито непонятно чем, начиная с адреса $0FFE по $10FF записано хрен знает што и я даже изменить это значение не могу.
Взял специально в программе указал стек $0FEE и у меня всё заработало.
ЧТО ЭТО? может я настройки какие то в AVRstudio не сделал, но микросхему atmega128 я выбрал, он память определил правильно. Или же это что-то с контроллером? тогда как проверить?
IgorKossak
При старте значение RAM в AVR имеет непредсказуемое значение.
Компиляторы инициализируют только то, что должно быть проинициализировано и обнуляют только то, что должно быть обнулено, остальное оставляют без изменения. Стеки не инициализируются.
Указатель стека обычно инициализируется на конец стекового сегмента самим компилятором (линкером).
Необходимо правильно указать расположение стекового сегмента (или сегментов, в зависимости от применяемого тулчейна).
Компилятором какого производителя пользуетесь? Судя по всему WinAVR?
big_nikolas
То что значения в RAM от rnd я знаю. Компилятор стек определяет в конец память на фото видно белом по чёрному по адресу 10FF и не работает. А когда я сам в программе указал адрес $0FEE, то всё заработало. Если обратите внимание на предущей картинке числа одинаковые 81, вот эти ячейки я поменят не могу, а другие могу в реальном времени.
Действительно я пользуюсь winAVR.
aesok
Разберитесь с фюзой M103

Анатолий.
big_nikolas
Цитата(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.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.