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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Почему ATMega128 работает так медленно,
boryx
сообщение Oct 27 2006, 07:42
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 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.
Go to the top of the page
 
+Quote Post
klop
сообщение Oct 27 2006, 07:46
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 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.



Ну для начала посмотрите ассемблерный код. Потом все таки узнайте на какой частоте у Вас проц рработает.
Go to the top of the page
 
+Quote Post
boryx
сообщение Oct 27 2006, 07:57
Сообщение #3


Участник
*

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



Я честно говоря не спец по хардварной части.

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

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

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

Тут еще и до таймеров дело не дошло.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Oct 27 2006, 08:42
Сообщение #4


Ambidexter
*****

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



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

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

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

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

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

Возможно у вас не отключен охранный таймер. И проверьте схему сброса, может она в воздухе болтается.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
boryx
сообщение Oct 27 2006, 09:15
Сообщение #5


Участник
*

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



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


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

я могу через JTAG дебагить прогу. Ресета не происходит.
Go to the top of the page
 
+Quote Post
arttab
сообщение Oct 27 2006, 09:40
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



может так
PORTB_Bit2^=1;

и глянте всетаки асм. было дело линковщик слип добавил


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
boryx
сообщение Oct 27 2006, 09:48
Сообщение #7


Участник
*

Группа: Новичок
Сообщений: 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 нет
Go to the top of the page
 
+Quote Post
arttab
сообщение Oct 27 2006, 09:55
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



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

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


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
klop
сообщение Oct 27 2006, 09:59
Сообщение #9


Местный
***

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



А делитель частоты у Вас часом не врублен? А в прерывания Вы не валитесь?
Go to the top of the page
 
+Quote Post
boryx
сообщение Oct 27 2006, 10:11
Сообщение #10


Участник
*

Группа: Новичок
Сообщений: 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
Go to the top of the page
 
+Quote Post
klop
сообщение Oct 27 2006, 10:21
Сообщение #11


Местный
***

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



Ну положим операция то не OR а XOR. А частоту правильно меряете?
Go to the top of the page
 
+Quote Post
Demeny
сообщение Oct 27 2006, 10:23
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 648
Регистрация: 11-02-06
Из: Санкт-Петербург
Пользователь №: 14 237



Проверьте стабильность питания. Что-то очень громкое подсказывает мне, что тут дело в питании...
Или на пине этом висит что-то такое, что при единице на выходе процессор ресетится из-за провала питания, а переинициализация контроллера - это и есть десятки миллисекунд...
Попробуйте вместо RJMP записать туды NOP и бесконечный пустой цикл - если частота все равно пойдёт - однозначно ресетится проц.

Сообщение отредактировал Demeny - Oct 27 2006, 10:30


--------------------
Сделано в Китае. Упаковано в России.
Go to the top of the page
 
+Quote Post
gladov
сообщение Oct 27 2006, 10:34
Сообщение #13


Частый гость
**

Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687



Есть еще такой FUSE: CLKDIV8. Если он включен, то частота делится на 8. По дефолту он в меге выставлен - его снимать надо. Но дело имхо не в нем, т.к. такого падения частоты, конечно, не было бы. Если проблема в питании, то можно попробовать переключить фьюз, который отвечает за старт МК (время ожидания стабилизации кварца после ресета). Если он ресетится по питанию, то переключив время можно заметить изменение частоты "моргания" пина
Go to the top of the page
 
+Quote Post
boryx
сообщение Oct 27 2006, 10:43
Сообщение #14


Участник
*

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



Цитата(Demeny @ Oct 27 2006, 13:23) *
Проверьте стабильность питания. Что-то очень громкое подсказывает мне, что тут дело в питании...
Или на пине этом висит что-то такое, что при единице на выходе процессор ресетится из-за провала питания, а переинициализация контроллера - это и есть десятки миллисекунд...
Попробуйте вместо RJMP записать туды NOP и бесконечный пустой цикл - если частота все равно пойдёт - однозначно ресетится проц.


для чистоты эксперемента я все отсоеденил. Включаю только плату с Атмегой и питание беру от источника в 10V (макс 1А) а не аккумулятора. На LM стабильно 5,05 В.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Oct 27 2006, 11:31
Сообщение #15


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-х кратные импульсы, а только однократные и наоборот.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 14:46
Рейтинг@Mail.ru


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