Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Почему ATMega128 работает так медленно,
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
boryx
Имеется плата MicroVega с ATMega 128. (внешний кристалл 14,7456MHz)

Включаю питание. Зашиваю программатором Atmel прогу

while (1){
PORTB INV_B(2); (ножка PB2 сконфигурированна на выход)
};

Наблюдаю странную картину на ножке.
Частота всего 37.50 Hz

Пробовал менять Fuses на Internal RC Generator 1/4/8 MHz. Особых изменений не заметил.

Как заставить его работать на нормальной скорости?

Мне нужна частота всего 300Hz.
klop
Цитата(boryx @ Oct 27 2006, 11:42) *
Имеется плата MicroVega с ATMega 128. (внешний кристалл 14,7456MHz)

Включаю питание. Зашиваю программатором Atmel прогу

while (1){
PORTB INV_B(2); (ножка PB2 сконфигурированна на выход)
};

Наблюдаю странную картину на ножке.
Частота всего 37.50 Hz

Пробовал менять Fuses на Internal RC Generator 1/4/8 MHz. Особых изменений не заметил.

Как заставить его работать на нормальной скорости?

Мне нужна частота всего 300Hz.



Ну для начала посмотрите ассемблерный код. Потом все таки узнайте на какой частоте у Вас проц рработает.
boryx
Я честно говоря не спец по хардварной части.

Для меня не очень важно будет ли он работать от внешнего кристалла в 14,7456MHz или от внутреннего 8MHz или 4MHz RC генератора.

Мне надо получить на ножку сигнал с определенной частотой (~300Hz).

Но как это сделать, если контроллер зациклинную пару десятков иструкций выполняет так долго.

Тут еще и до таймеров дело не дошло.
=GM=
Цитата(boryx @ Oct 27 2006, 06:57) *
Я честно говоря не спец по хардварной части.

Для меня не очень важно будет ли он работать от внешнего кристалла в 14,7456MHz или от внутреннего 8MHz или 4MHz RC генератора.

Мне надо получить на ножку сигнал с определенной частотой (~300Hz).

Но как это сделать, если контроллер зациклинную пару десятков иструкций выполняет так долго.

Тут еще и до таймеров дело не дошло.

Возможно у вас не отключен охранный таймер. И проверьте схему сброса, может она в воздухе болтается.
boryx
Цитата(=GM= @ Oct 27 2006, 11:42) *
Возможно у вас не отключен охранный таймер. И проверьте схему сброса, может она в воздухе болтается.


с ресетом все OK. На плате есть кнопка для ресета.
А Watchdog вырублен в FUSES пустой квадратик

я могу через JTAG дебагить прогу. Ресета не происходит.
arttab
может так
PORTB_Bit2^=1;

и глянте всетаки асм. было дело линковщик слип добавил
boryx
247: DDRB = 0xF;
+00000316: E08F LDI R24,0x0F Load immediate
+00000317: 93800037 STS 0x0037,R24 Store direct to data space
248: PORTB = 0;
+00000319: 92100038 STS 0x0038,R1 Store direct to data space
251: PORTB INV_B(2);
+0000031B: 91800038 LDS R24,0x0038 Load direct from data space
+0000031D: E094 LDI R25,0x04 Load immediate
+0000031E: 2789 EOR R24,R25 Exclusive OR
+0000031F: 93800038 STS 0x0038,R24 Store direct to data space
+00000321: CFF9 RJMP PC-0x0006 Relative jump


никаких Sleep нет
arttab
толи я туплю, но не понял последнюю строку - это прыжок на -6?
должно ведь на +0000031E

про фузы прочитайте. особенно про выбор источника тактовой частоты. и то что если фуз=1, то он не запрограмирован. разные проги по разному это отображают.
можно при возможности в аврстудии погонять код
klop
А делитель частоты у Вас часом не врублен? А в прерывания Вы не валитесь?
boryx
Цитата(arttab @ Oct 27 2006, 12:55) *
толи я туплю, но не понял последнюю строку - это прыжок на -6?
должно ведь на +0000031E

про фузы прочитайте. особенно про выбор источника тактовой частоты. и то что если фуз=1, то он не запрограмирован. разные проги по разному это отображают.
можно при возможности в аврстудии погонять код



Я как раз и гоняю в Atmel AVR Studio 4. Странно, что код то работает. Я и таймеры могу использовать и АDC. Но только медленно.

на правельно
+0000031В

1)берем значение порта В
2)берем бит, что будем инвертировать 4 (0b100);
3)операция OR
4)сохраняем что получилось в порт В
5)прыжок на пункт 1


Я могу Fuse про частоту выбрать только один. Я пробовал и 1 и 4 и 8MHz internal RC generator. а также внешний кристал.

Итоговая частота на выходе ножки 20-40Hz


AVR Studio показывает, что XDIV=0 и прерывания я не врубаю
klop
Ну положим операция то не OR а XOR. А частоту правильно меряете?
Demeny
Проверьте стабильность питания. Что-то очень громкое подсказывает мне, что тут дело в питании...
Или на пине этом висит что-то такое, что при единице на выходе процессор ресетится из-за провала питания, а переинициализация контроллера - это и есть десятки миллисекунд...
Попробуйте вместо RJMP записать туды NOP и бесконечный пустой цикл - если частота все равно пойдёт - однозначно ресетится проц.
gladov
Есть еще такой FUSE: CLKDIV8. Если он включен, то частота делится на 8. По дефолту он в меге выставлен - его снимать надо. Но дело имхо не в нем, т.к. такого падения частоты, конечно, не было бы. Если проблема в питании, то можно попробовать переключить фьюз, который отвечает за старт МК (время ожидания стабилизации кварца после ресета). Если он ресетится по питанию, то переключив время можно заметить изменение частоты "моргания" пина
boryx
Цитата(Demeny @ Oct 27 2006, 13:23) *
Проверьте стабильность питания. Что-то очень громкое подсказывает мне, что тут дело в питании...
Или на пине этом висит что-то такое, что при единице на выходе процессор ресетится из-за провала питания, а переинициализация контроллера - это и есть десятки миллисекунд...
Попробуйте вместо RJMP записать туды NOP и бесконечный пустой цикл - если частота все равно пойдёт - однозначно ресетится проц.


для чистоты эксперемента я все отсоеденил. Включаю только плату с Атмегой и питание беру от источника в 10V (макс 1А) а не аккумулятора. На LM стабильно 5,05 В.
=GM=
Цитата(boryx @ Oct 27 2006, 09:43) *
для чистоты эксперемента я все отсоеденил. Включаю только плату с Атмегой и питание беру от источника в 10V (макс 1А) а не аккумулятора. На LM стабильно 5,05 В.

Проверьте, бит BORF не устанавливается?

На какой все-таки частоте работает проц? Выдайте частоту наружу на OCnx и померьте.

Ещё вот подумал. Хорошо бы на осциле визуально посмотреть, что происходит. В начале программы поставьте вывод 1-1-1-0-0-0-1-1-1-0-0-0, а в цикле 1-0-1-0-1-0-1-0, тогда если не происходит какого-то ресета вы никогда не увидите 3-х кратные импульсы, а только однократные и наоборот.
_artem_
Выключите прерывания вообше.
Yura_K
Возможно, измерения проводятся неверно smile.gif (если, конечно, смотрите осциллографом прямо на ноге).
_case_
А может процессор дохлый? Я всякое видал....
VDG
Если он фузы ещё не менял, то кварц выключен, работа идёт от внутреннего RC. Возможно и делитель изначально включен. Так что мега правильно всё генерит.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.