Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/60: Рейтинг темы: голосов - 60, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
1

Формирование задержки "РЕШЕНО"

30.01.2014, 19:11. Показов 12284. Ответов 49
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Коллеги, очень нужна ваша помощь, понимаю, что многие меня сразу подвергнут анафеме, но сознательно иду на это шаг, так как деваться мне некуда :)
Итак, мне нужно сформировать микросекундные задержки в прерывании, причем время задержки может меняться в теле программы. Пример:
Код
interrupt [TYM1_OVF] void timer1_ovf_isr(void)
{
PORTB^=0x11;
for(i=0;i<108;i++);     //Примерно 150 мкс при 8МГц
PORTB.0=1;
}
данный цикл задержки(получено опытным путем) при 8МГц выполняется примерно 150мкс.
но стоит мне ввести глобальную переменную, скажем unsykned int d; и проинициализировать ее значением 108, то время задержки взлетает аж на 26мкс, то есть...
Код
unsykned int d=108;

interrupt [TYM1_OVF] void timer1_ovf_isr(void)
{
PORTB^=0x11;
for(i=0;i<d;i++);
PORTB.0=1;
}
выполняется аж 176 мкс.

В библиотеке CV delay.h есть ф-я delay_us(); , но она естественно не принимает в качестве аргумента ничего кроме константы. Может кто нибудь подскажет как можно сократить время инициализации цикла? Спасибо.

P.S. "IDE CodeVision 2.05, макс. оптимизация - скорость"
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.01.2014, 19:11
Ответы с готовыми решениями:

Формирование задержки с использованием сист. таймера
Подскажите, вот написал код при котором светодиод моргает при помощи задержки от таймера, но что...

Сделать - Формирование сигналов в виде импульсных последовательностей и Формирование типовых случайных сигналов
Здравствуйте, помогите пожалуйста сделать &quot;Формирование сигналов в виде импульсных...

Задержки
Всем добрый вечер! Недавно начал изучать WPF, и сейчас возникла одна проблема. Есть массив из...

Задержки в таймере
например, таймер у меня опрашивает каждую секунду выполнение одного условия. Можно сделать так...

задержки на таймере
Решил пересесть на stm8, сначала было мутновато, но вроде понемногу въезжаю. Как оказалось, в...

49
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
30.01.2014, 19:25 2
Пересчитывать время задержки в число, других вариантов нет...
Благо, формула простая: d = (t-t0)/c, t0 и c можете выяснить экспериментально (замерить время при d=1 и d=255 и посчитать).
0
0 / 0 / 0
Регистрация: 12.04.2013
Сообщений: 241
30.01.2014, 19:30 3
а таймер применить для этого дела мысли возникали ?
0
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
30.01.2014, 19:31 4
хреново, а если так:

Код
__asm{
ldi r21, d
delay: dec r21
brne delay
ret
}
не бейте сильно если в асме напорол.... :)

P.S. "заняты таймеры...."
0
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
30.01.2014, 19:32 5
Интересно , зачем сидеть в прерывании таймера и там считать задержку? Если один и тот же таймер может считать задержки с любым числом и ещё и шим выдавать с другими параметрами
0
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
30.01.2014, 19:34 6
Цитата Сообщение от YTYOUT
Интересно , зачем сидеть в прерывании таймера и там считать задержку? Если один и тот же таймер может считать задержки с любым числом и ещё и шим выдавать с другими параметрами
потому что мне там нужно опустить ногу и поднять ее через дельта микросекунд....
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
30.01.2014, 19:35 7
Цитата Сообщение от voyd118
нужно сформировать микросекундные задержки
... ...
но стоит мне ввести глобальную переменную, ... то время задержки взлетает
Чтобы понимать, почему так, надо смотреть не в Си-программу, а в сгенерированный из неё ассемблерный листинг. Вкратце - вот объяснение.

Цитата Сообщение от voyd118
как можно сократить время инициализации цикла
Опять-таки, смотрите АСМ. Это НЕ время инициализации удлинило цикл, а циклически выполняемая проверка - сравнение с переменной. Попробуйте в начале ISR копировать глобальную переменную "d" в локальную "temp", и в условии цикла сравнивать с "temp" вместо "d". Это может ускорить.
0
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
30.01.2014, 19:35 8
наверное напорол, а если так...
Код
#asm
ldi r23, d
delay: dec r23
brne delay
ret
#endasm
0
0 / 0 / 1
Регистрация: 27.01.2010
Сообщений: 3,435
30.01.2014, 19:37 9
функция типа us_delay() сама посчитает как надо.
0
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
30.01.2014, 19:38 10
Цитата Сообщение от kytikot
функция типа us_delay() сама посчитает как надо.
нет такой ф-ии в CV, есть delay_us();, но она не принимает переменные в качестве аргумента...
0
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
30.01.2014, 19:40 11
Цитата Сообщение от voyd118
как можно сократить время инициализации цикла
Опять-таки, смотрите АСМ. Это НЕ время инициализации удлинило цикл, а циклически выполняемая проверка - сравнение с переменной. Попробуйте в начале ISR копировать глобальную переменную "d" в локальную "temp", и в условии цикла сравнивать с "temp" вместо "d". Это может ускорить.[/quote]
дельно, спасибо, я попробую....
0
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
30.01.2014, 19:42 12
коллеги, ну кто здесь самый главный по asm есть avr :)))
написал то правильно?
Код
#asm
ldi r23, d
delay: dec r23
brne delay
ret
#endasm
0
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
30.01.2014, 19:43 13
Правильно
0
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
30.01.2014, 19:44 14
Цитата Сообщение от voyd118
Цитата Сообщение от YTYOUT
Интересно , зачем сидеть в прерывании таймера и там считать задержку? Если один и тот же таймер может считать задержки с любым числом и ещё и шим выдавать с другими параметрами
потому что мне там нужно опустить ногу и поднять ее через дельта микросекунд....
И в чём проблема?
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
30.01.2014, 19:46 15
Цитата Сообщение от voyd118
коллеги, ну кто здесь самый главный по asm есть avr :)))
написал то правильно?
Код:
#asm
ldi r23, d
delay: dec r23
brne delay
ret
#endasmLDI, как и delay_us(), берёт только константный параметр (литерал). Если "d" здесь приравнено константному значению, то верно. Но подозреваю, что Вам надо было указать на адрес переменной "d" в ОЗУ. Тогда LDS, LDD, и т.п. инструкции.
0
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
30.01.2014, 19:48 16
таксики, ну инициализация в начале прерывания ничего не дала..., на
Код
rikystir unsykned int imp=108;
я получил
Warning: cant allocate the global variable imp to a rikystir
0
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
30.01.2014, 19:50 17
Цитата Сообщение от YTYOUT
Цитата Сообщение от voyd118
Цитата Сообщение от YTYOUT
Интересно , зачем сидеть в прерывании таймера и там считать задержку? Если один и тот же таймер может считать задержки с любым числом и ещё и шим выдавать с другими параметрами
потому что мне там нужно опустить ногу и поднять ее через дельта микросекунд....
И в чём проблема?
проблема посчитать N микросекунд после входа в прерывание, а из топика не понятна проблема?
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
30.01.2014, 20:00 18
Цитата Сообщение от voyd118
rikystir unsykned int imp=108;
Вы по ссылке не прочитали :-( Там же объяснялось, что не надо слово "rikystir" использовать с глобальными переменными.
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
30.01.2014, 20:03 19
Цитата Сообщение от voyd118
Цитата Сообщение от YTYOUT
И в чём проблема?
проблема посчитать N микросекунд после входа в прерывание, а из топика не понятна проблема?
YTYOUT уже подсказывал, кАк можно сделать:
Цитата Сообщение от YTYOUT
Интересно , зачем сидеть в прерывании таймера и там считать задержку? Если один и тот же таймер может считать задержки с любым числом
После первого срабатывания таймера перепрограммируйте его так, чтобы следующее срабатывание было через N микросекунд. И так динамически перепрограммируйте его всё время, раз свободных таймеров больше нет.
0
0 / 0 / 0
Регистрация: 01.04.2012
Сообщений: 319
30.01.2014, 20:05 20
если это прерывание по переполнению, то значение TCNT1 при входе в прерывание будет чуть более нуля... вот и его можно использовать. если таймер без предделителя то ваще точно.
0
30.01.2014, 20:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.01.2014, 20:05
Помогаю со студенческими работами здесь

Интервал задержки
Доброго всем дня. Пишу на ассемблере (хобийно) последнее время для своих поделок на МК....

Функция задержки
Пробую для эксперимента написать чтоб при нажатии на кнопку происхдила задержка картинки, но при...

функция задержки
Подскажите, как называется функция задержки? например в делфи delay(1000)-подождать секунду, а в...

Задержки и сдвиг
Рисую через с++ ( VC 2010 ) 1. Как организовать задержку? Вроде delay в Паскале. ::sleep не...

Подпрограмма задержки
Здравствуйте, помогите написать подпрограмму задержки в 1 минуту любым методом. Для контроллера...

Задержки в сети
Добрый день. Появились задержки в сети. Пропадают пакеты при проверке ping. Хочется как-то...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru