| AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
Проблема с функцией задержки
20.05.2014, 20:31
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
|
Re: Проблема с функцией задержки
Такого не должно быть. Весь проект в студию. Чем проверяете задержку?
|
|
|
|
Сказали "Спасибо" Godzilla82
|
|
|
21.05.2014, 08:51
|
|
|
Временная регистрация
Регистрация: 28.07.2011
Адрес: Петропавловск, Казахстан.
Сообщений: 62
Сказал спасибо: 10
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: Проблема с функцией задержки
Подтверждаю, функциям delay_ms(); и delay_us(); доверять не стоит НИКОГДА, они не корректно отрабатывают время(компилятор CVAVR, тестил на Mega8, Mega16, Mega32). Пользуйте прерывание любого удобного таймера и будет Вам счастье. Учтите, использование подобных функций занимает определенное время, в течении которого, контроллер тупо ждет и ни чего не делает. При использовании таймера, Ваша программа может спокойно что-то делать, а про прерыванию отработать обработчик и вернуться к выполнению обязанностей.
|
|
|
|
Сказали "Спасибо" Nikolaysherbakov
|
|
|
21.05.2014, 15:38
|
|
|
Гражданин KAZUS.RUN
Регистрация: 03.07.2010
Сообщений: 842
Сказал спасибо: 156
Сказали Спасибо 377 раз(а) в 189 сообщении(ях)
|
Re: Проблема с функцией задержки
Ему может и не надо что-то ещё делать.
Сообщение от insiderbik
|
подключаемая функция delay.h содержит следующие строки:
|
Код:
|
// CodeVisionAVR C Compiler
// (C) 1998-2000 Pavel Haiduc, HP InfoTech S.R.L.
#ifndef _DELAY_INCLUDED_
#define _DELAY_INCLUDED_
#pragma used+
void delay_us(unsigned int n);
void delay_ms(unsigned int n);
#pragma used-
#endif |
|
не видно тут процедуры "delay_us", то что вы привели, только объявляет её, ищите в файле с расширением ".с", т.е "delay.c"
|
|
|
|
21.05.2014, 18:35
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
|
Re: Проблема с функцией задержки
Сообщение от Nikolaysherbakov
|
|
Подтверждаю, функциям delay_ms(); и delay_us(); доверять не стоит НИКОГДА, они не корректно отрабатывают время(компилятор CVAVR, тестил на Mega8, Mega16, Mega32).
|
Вот не надо. Эти функции - тупо задержка на нужное количество циклов, которое расчитывается компилятором с учётом тактовой частоты.
Реально получается на несколько десятков тактов больше за счёт накладных расходов загрузки значения задержки в регистры, вызова подпрограммы задержки и т.п.
Если на момент выполнения функции задержки прерывания запрещены или не происходят, то задержка будет достаточно точная.
Естесственно, если в момент выполнения функции задержки возникают прерывания, то задержка увеличивается на время, требуемое для выполнения возникших прерываний. Просто это надо знать и учитывать.
|
|
|
|
Сказали "Спасибо" Godzilla82
|
|
|
21.05.2014, 18:37
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
|
Re: Проблема с функцией задержки
Сообщение от С.М.С
|
|
не видно тут процедуры "delay_us", то что вы привели, только объявляет её, ищите в файле с расширением ".с", т.е "delay.c"
|
Искать не надо. В CV эти функции скрыты в недрах компилятора. Но можно посмотреть дизассемблер. Многое прояснится.
|
|
|
|
Сказали "Спасибо" Godzilla82
|
|
|
21.05.2014, 19:14
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 07.05.2008
Адрес: Мурманск
Сообщений: 1,290
Сказал спасибо: 452
Сказали Спасибо 501 раз(а) в 267 сообщении(ях)
|
Re: Проблема с функцией задержки
Сообщение от insiderbik
|
delay_ms(3000);
PORTB.2 = 0;
delay_ms(3000);
PORTB.2 = 1;
|
Попробуйте так:
|
Цитата:
|
PORTB.2 = 1;
delay_ms(3000);
PORTB.2 = 0;
delay_ms(3000);
|
Возможно из-за оптимизации кода компилятор не понимает, зачем сначала задержка, а потом действие.
Последний раз редактировалось IOPA4; 21.05.2014 в 19:25.
|
|
|
|
21.05.2014, 22:22
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
|
Re: Проблема с функцией задержки
Сообщение от IOPA4
|
|
Возможно из-за оптимизации кода компилятор не понимает, зачем сначала задержка, а потом действие.
|
Речь идёт о CV. Так что оптимизация не причём. Возможные причины.
1. неправильно измеряется задержка
2. тактовая частота в настройках проекта не совпадает с реальной
3. во время второй задержки возникает куча прерываний
P.S. Просил выложить весь проект.
|
|
|
|
Сказали "Спасибо" Godzilla82
|
|
|
22.05.2014, 10:26
|
|
|
Временная регистрация
Регистрация: 20.06.2009
Сообщений: 51
Сказал спасибо: 44
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Проблема с функцией задержки
Сообщение от Godzilla82
|
Речь идёт о CV. Так что оптимизация не причём. Возможные причины.
1. неправильно измеряется задержка
2. тактовая частота в настройках проекта не совпадает с реальной
3. во время второй задержки возникает куча прерываний
P.S. Просил выложить весь проект.
|
1. Задержки смотрятся на экране осциллографа - ошибки быть не может.
2. Тактовая частота в настройках совпадает с реальной - без вопросов.
3. Скорее всего в прерываниях дело и было ....
Я обошелся задержкой таймером. Всем поучаствовавшим огромное спасибо.
|
|
|
|
22.05.2014, 19:41
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 07.05.2008
Адрес: Мурманск
Сообщений: 1,290
Сказал спасибо: 452
Сказали Спасибо 501 раз(а) в 267 сообщении(ях)
|
Re: Проблема с функцией задержки
Сообщение от Godzilla82
|
|
Речь идёт о CV. Так что оптимизация не причём. Возможные причины.
|
А, что CV без оптимизации? А режимы - по скорости, по размеру, максимальная, так, для красного словца.
|
|
|
|
22.05.2014, 20:59
|
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
|
Re: Проблема с функцией задержки
Сообщение от IOPA4
|
|
Возможно из-за оптимизации кода компилятор не понимает, зачем сначала задержка, а потом действие.
|
Вот твердили же сколько раз: встроенные фичи недокомпиляторов -зло.
Тем более задержки с гигантскими параметрами.
Сделайте свою функцию с вызовом delay_ms() , delay_ms() передавать минимальный параметр.
К примеру .
|
Код:
|
void wait ( uint16_t count)
{
while (count--){delay_ms(1)};
} |
__________________
Осторожно , злой кот
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 22:00.
|
|