|
Почему ATMega128 работает так медленно, |
|
|
|
Oct 27 2006, 07:42
|
Участник

Группа: Новичок
Сообщений: 20
Регистрация: 25-05-06
Пользователь №: 17 428

|
Имеется плата 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.
|
|
|
|
|
Oct 27 2006, 07:46
|
Местный
  
Группа: Свой
Сообщений: 433
Регистрация: 28-02-06
Пользователь №: 14 788

|
Цитата(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. Ну для начала посмотрите ассемблерный код. Потом все таки узнайте на какой частоте у Вас проц рработает.
|
|
|
|
|
Oct 27 2006, 07:57
|
Участник

Группа: Новичок
Сообщений: 20
Регистрация: 25-05-06
Пользователь №: 17 428

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

Группа: Новичок
Сообщений: 20
Регистрация: 25-05-06
Пользователь №: 17 428

|
Цитата(=GM= @ Oct 27 2006, 11:42)  Возможно у вас не отключен охранный таймер. И проверьте схему сброса, может она в воздухе болтается. с ресетом все OK. На плате есть кнопка для ресета. А Watchdog вырублен в FUSES пустой квадратик я могу через JTAG дебагить прогу. Ресета не происходит.
|
|
|
|
|
Oct 27 2006, 09:48
|
Участник

Группа: Новичок
Сообщений: 20
Регистрация: 25-05-06
Пользователь №: 17 428

|
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 нет
|
|
|
|
|
Oct 27 2006, 10:11
|
Участник

Группа: Новичок
Сообщений: 20
Регистрация: 25-05-06
Пользователь №: 17 428

|
Цитата(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 и прерывания я не врубаю
Сообщение отредактировал boryx - Oct 27 2006, 10:14
|
|
|
|
|
Oct 27 2006, 10:43
|
Участник

Группа: Новичок
Сообщений: 20
Регистрация: 25-05-06
Пользователь №: 17 428

|
Цитата(Demeny @ Oct 27 2006, 13:23)  Проверьте стабильность питания. Что-то очень громкое подсказывает мне, что тут дело в питании... Или на пине этом висит что-то такое, что при единице на выходе процессор ресетится из-за провала питания, а переинициализация контроллера - это и есть десятки миллисекунд... Попробуйте вместо RJMP записать туды NOP и бесконечный пустой цикл - если частота все равно пойдёт - однозначно ресетится проц. для чистоты эксперемента я все отсоеденил. Включаю только плату с Атмегой и питание беру от источника в 10V (макс 1А) а не аккумулятора. На LM стабильно 5,05 В.
|
|
|
|
|
Oct 27 2006, 11:31
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(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-х кратные импульсы, а только однократные и наоборот.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|