Имеется плата 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 @ 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.
Ну для начала посмотрите ассемблерный код. Потом все таки узнайте на какой частоте у Вас проц рработает.
Я честно говоря не спец по хардварной части.
Для меня не очень важно будет ли он работать от внешнего кристалла в 14,7456MHz или от внутреннего 8MHz или 4MHz RC генератора.
Мне надо получить на ножку сигнал с определенной частотой (~300Hz).
Но как это сделать, если контроллер зациклинную пару десятков иструкций выполняет так долго.
Тут еще и до таймеров дело не дошло.
Цитата(boryx @ Oct 27 2006, 06:57)

Я честно говоря не спец по хардварной части.
Для меня не очень важно будет ли он работать от внешнего кристалла в 14,7456MHz или от внутреннего 8MHz или 4MHz RC генератора.
Мне надо получить на ножку сигнал с определенной частотой (~300Hz).
Но как это сделать, если контроллер зациклинную пару десятков иструкций выполняет так долго.
Тут еще и до таймеров дело не дошло.
Возможно у вас не отключен охранный таймер. И проверьте схему сброса, может она в воздухе болтается.
Цитата(=GM= @ Oct 27 2006, 11:42)

Возможно у вас не отключен охранный таймер. И проверьте схему сброса, может она в воздухе болтается.
с ресетом все OK. На плате есть кнопка для ресета.
А Watchdog вырублен в FUSES пустой квадратик
я могу через JTAG дебагить прогу. Ресета не происходит.
arttab
Oct 27 2006, 09:40
может так
PORTB_Bit2^=1;
и глянте всетаки асм. было дело линковщик слип добавил
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
Oct 27 2006, 09:55
толи я туплю, но не понял последнюю строку - это прыжок на -6?
должно ведь на +0000031E
про фузы прочитайте. особенно про выбор источника тактовой частоты. и то что если фуз=1, то он не запрограмирован. разные проги по разному это отображают.
можно при возможности в аврстудии погонять код
А делитель частоты у Вас часом не врублен? А в прерывания Вы не валитесь?
Цитата(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 и прерывания я не врубаю
Ну положим операция то не OR а XOR. А частоту правильно меряете?
Demeny
Oct 27 2006, 10:23
Проверьте стабильность питания. Что-то очень громкое подсказывает мне, что тут дело в питании...
Или на пине этом висит что-то такое, что при единице на выходе процессор ресетится из-за провала питания, а переинициализация контроллера - это и есть десятки миллисекунд...
Попробуйте вместо RJMP записать туды NOP и бесконечный пустой цикл - если частота все равно пойдёт - однозначно ресетится проц.
gladov
Oct 27 2006, 10:34
Есть еще такой FUSE: CLKDIV8. Если он включен, то частота делится на 8. По дефолту он в меге выставлен - его снимать надо. Но дело имхо не в нем, т.к. такого падения частоты, конечно, не было бы. Если проблема в питании, то можно попробовать переключить фьюз, который отвечает за старт МК (время ожидания стабилизации кварца после ресета). Если он ресетится по питанию, то переключив время можно заметить изменение частоты "моргания" пина
Цитата(Demeny @ Oct 27 2006, 13:23)

Проверьте стабильность питания. Что-то очень громкое подсказывает мне, что тут дело в питании...
Или на пине этом висит что-то такое, что при единице на выходе процессор ресетится из-за провала питания, а переинициализация контроллера - это и есть десятки миллисекунд...
Попробуйте вместо RJMP записать туды NOP и бесконечный пустой цикл - если частота все равно пойдёт - однозначно ресетится проц.
для чистоты эксперемента я все отсоеденил. Включаю только плату с Атмегой и питание беру от источника в 10V (макс 1А) а не аккумулятора. На LM стабильно 5,05 В.
Цитата(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_
Oct 27 2006, 14:43
Выключите прерывания вообше.
Yura_K
Oct 27 2006, 16:28
Возможно, измерения проводятся неверно

(если, конечно, смотрите осциллографом прямо на ноге).
_case_
Oct 27 2006, 19:40
А может процессор дохлый? Я всякое видал....
Если он фузы ещё не менял, то кварц выключен, работа идёт от внутреннего RC. Возможно и делитель изначально включен. Так что мега правильно всё генерит.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.