0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
|
|
1 | |
Формирование задержки "РЕШЕНО"30.01.2014, 19:11. Показов 12284. Ответов 49
Метки нет (Все метки)
Коллеги, очень нужна ваша помощь, понимаю, что многие меня сразу подвергнут анафеме, но сознательно иду на это шаг, так как деваться мне некуда :)
Итак, мне нужно сформировать микросекундные задержки в прерывании, причем время задержки может меняться в теле программы. Пример: Код
interrupt [TYM1_OVF] void timer1_ovf_isr(void) { PORTB^=0x11; for(i=0;i<108;i++); //Примерно 150 мкс при 8МГц PORTB.0=1; } но стоит мне ввести глобальную переменную, скажем 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; } В библиотеке CV delay.h есть ф-я delay_us(); , но она естественно не принимает в качестве аргумента ничего кроме константы. Может кто нибудь подскажет как можно сократить время инициализации цикла? Спасибо. P.S. "IDE CodeVision 2.05, макс. оптимизация - скорость"
0
|
30.01.2014, 19:11 | |
Ответы с готовыми решениями:
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
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
0
|
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
|
|
30.01.2014, 19:40 | 11 |
Сообщение от voyd118
дельно, спасибо, я попробую....
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
И в чём проблема?
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
30.01.2014, 19:46 | 15 |
Сообщение от voyd118
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
проблема посчитать N микросекунд после входа в прерывание, а из топика не понятна проблема?
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
30.01.2014, 20:00 | 18 |
Сообщение от voyd118
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
30.01.2014, 20:03 | 19 |
Сообщение от voyd118
YTYOUT уже подсказывал, кАк можно сделать:
Сообщение от YTYOUT
0
|
0 / 0 / 0
Регистрация: 01.04.2012
Сообщений: 319
|
|
30.01.2014, 20:05 | 20 |
если это прерывание по переполнению, то значение TCNT1 при входе в прерывание будет чуть более нуля... вот и его можно использовать. если таймер без предделителя то ваще точно.
0
|
30.01.2014, 20:05 | |
30.01.2014, 20:05 | |
Помогаю со студенческими работами здесь
20
Интервал задержки Функция задержки функция задержки Задержки и сдвиг Подпрограмма задержки Задержки в сети Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |