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

 
 
 
Reply to this topicStart new topic
> Программные задержки в IAR
artemm
сообщение Dec 27 2008, 10:11
Сообщение #1


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

Группа: Свой
Сообщений: 80
Регистрация: 23-07-07
Из: Украина, г. Сумы
Пользователь №: 29 306



Пользуюсь Embedded Workbench 4.0 AVR.
Для реализации программных задержек использую библиотеку, скачанную здесь
delay.h
Цитата
#include <intrinsics.h>
#define f_cpu (1000000) //Частота задающего генератора(ГЦ)

#define delay_us(temp) (__delay_cycles((temp * f_cpu) / 1000000));
#define delay_ms(temp) (__delay_cycles((temp * f_cpu) / 1000));
#define delay_s(temp) (__delay_cycles(temp * f_cpu));


Проблема в том, что задержки получаются точными только с кварцем в 16МГц. С другими кварцами что-попало выходит.
В чём может быть проблема???
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 27 2008, 11:08
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(artemm @ Dec 27 2008, 12:11) *
С другими кварцами что-попало выходит.
Да и с 16 МГц должно получаться "что попало". Вычисления в приведенных вами формулах происходят, согласно правилам языка С, в размерности int, котрой явно мало даже для f_cpu. Нужно явно заставить компилятор работать с размерностью long long:
Код
#define F_CPU (1000000LL)
И еще - принято макроопределения писать заглавными буквами, чтобы отличать от идентификаторов.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
artemm
сообщение Dec 27 2008, 12:24
Сообщение #3


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

Группа: Свой
Сообщений: 80
Регистрация: 23-07-07
Из: Украина, г. Сумы
Пользователь №: 29 306



Тоже самое. При 16МГц задержка допустим 100.5мкс, при 10МГц - 101.2мкс, при 1МГц - 112мкс
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 27 2008, 13:11
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(artemm @ Dec 27 2008, 14:24) *
при 10МГц - 101.2мкс, при 1МГц - 112мкс
Т.е. ошибка в 12 тактов кварца. Как измеряете? Дергаете ногами? А время на дерганье учитываете?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
artemm
сообщение Dec 27 2008, 13:20
Сообщение #5


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

Группа: Свой
Сообщений: 80
Регистрация: 23-07-07
Из: Украина, г. Сумы
Пользователь №: 29 306



Цитата(Сергей Борщ @ Dec 27 2008, 17:11) *
Т.е. ошибка в 12 тактов кварца. Как измеряете? Дергаете ногами? А время на дерганье учитываете?

Да, дёргаю ногами, но время ж на дёрганье что при 16мгц что при 1мгц одно и тоже, поэтому им можно пренебречь.
Go to the top of the page
 
+Quote Post
Petka
сообщение Dec 27 2008, 13:28
Сообщение #6


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

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



Цитата(artemm @ Dec 27 2008, 16:20) *
Время ж на дёрганье что при 16мгц что при 1мгц одно и тоже, поэтому им можно пренебречь.

07.gif
как пренебречь?
если время дёрганья ногой одинаково на 1МГц и на 16Мгц, то код
Код
PORTA=0xFF;
PORTA=0x00;
PORTA=0xFF;
PORTA=0x00;
......
.....
...
PORTA=0xFF;
PORTA=0x00;

должен "показывать" одинаковую картину на осциллографе что на 1МГц, что на 16МГц?
Go to the top of the page
 
+Quote Post
artemm
сообщение Dec 27 2008, 13:42
Сообщение #7


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

Группа: Свой
Сообщений: 80
Регистрация: 23-07-07
Из: Украина, г. Сумы
Пользователь №: 29 306



Цитата
PORTF = 0xFF;
while(1)
{
delay_us(100);
PORTF =~PORTF;
}
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 27 2008, 13:49
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Так, а теперь покажите листинг. Сколько, по-вашему, занимает инверсия порта и переход на начало цикла?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
artemm
сообщение Dec 27 2008, 13:59
Сообщение #9


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

Группа: Свой
Сообщений: 80
Регистрация: 23-07-07
Из: Украина, г. Сумы
Пользователь №: 29 306



Цитата(Сергей Борщ @ Dec 27 2008, 17:49) *
Так, а теперь покажите листинг. Сколько, по-вашему, занимает инверсия порта и переход на начало цикла?

2 машинных цикла, что в случае с 1 мгц какраз и получается примерно на 12 мкс больше

Всем спасибо, дошло
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Dec 27 2008, 16:00
Сообщение #10


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(artemm @ Dec 27 2008, 13:11) *
Проблема в том, что задержки получаются точными только с кварцем в 16МГц. С другими кварцами что-попало выходит.
В чём может быть проблема???

Программные задержки по определению не могут быть точными. Любое прерывание может изменить длительность задержки произвольным образом. Для единиц и десятков мкс может быть приемлемо, для сотен и миллисекунд лучше использовать таймер. Про секундные речи не идёт - однозначно таймер.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post

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

 


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


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