Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы

Куда пропадает точность _delay_ms() ?

Непрочитано 26.04.2022, 10:13  
alexbmd
Прописка
 
Регистрация: 10.01.2016
Адрес: Молдова, Кишинёв
Сообщений: 134
Сказал спасибо: 31
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
alexbmd на пути к лучшему
По умолчанию Куда пропадает точность _delay_ms() ?

Привет

atmega328p
настраиваю таймер 0 в режиме Normal, предделитель 64, по сравнению 250 тиков (1 мс)
делаю
Код:
int a = 0, b = 0;
a = millis();
_delay_ms(7100);
b = millis();
#ifdef _UTIL_DELAY_H_
terminal ‹‹ a ‹‹ " " ‹‹ b;
#endif
получаю 7179 разницу.
если использую delay из ардуино то там точно.

как можно повысить точность дилей от авр ?
Реклама:
alexbmd вне форума  
Непрочитано 26.04.2022, 10:34  
sanya
Временная регистрация
 
Регистрация: 10.11.2016
Сообщений: 53
Сказал спасибо: 6
Сказали Спасибо 16 раз(а) в 13 сообщении(ях)
sanya на пути к лучшему
По умолчанию Re: Куда пропадает точность _delay_ms() ?

Проверь настройки:

TCCR0A=(0‹‹COM0A1) | (0‹‹COM0A0) | (0‹‹COM0B1) | (0‹‹COM0B0) | (1‹‹WGM01) | (0‹‹WGM00);
TCCR0B=(0‹‹WGM02) | (0‹‹CS02) | (1‹‹CS01) | (1‹‹CS00);
TCNT0=0x00;
OCR0A=0xF9;
OCR0B=0x00;
TIMSK0=(0‹‹OCIE0B) | (1‹‹OCIE0A) | (0‹‹TOIE0);

interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
}

Функция _delay_ms() чисто циклами реализована, если при этом работают прерывания-точность никакая. Попробуй перед вызовом блокировать прерывания.

Последний раз редактировалось sanya; 26.04.2022 в 10:45.
sanya вне форума  
Непрочитано 26.04.2022, 13:29  
alexbmd
Прописка
 
Регистрация: 10.01.2016
Адрес: Молдова, Кишинёв
Сообщений: 134
Сказал спасибо: 31
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
alexbmd на пути к лучшему
По умолчанию Re: Куда пропадает точность _delay_ms() ?

Сообщение от sanya Посмотреть сообщение
TCCR0A=(0‹‹COM0A1) | (0‹‹COM0A0) | (0‹‹COM0B1) | (0‹‹COM0B0) | (1‹‹WGM01) | (0‹‹WGM00);
это СТС . у меня Нормал. хотя что так что так. это влияет на подсчет милис но не на дилей функцию
в остальном одинаково.

Последний раз редактировалось alexbmd; 26.04.2022 в 13:39.
alexbmd вне форума  
Непрочитано 26.04.2022, 13:39  
baiderin
Почётный гражданин KAZUS.RUN
 
Аватар для baiderin
 
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,739
Сказал спасибо: 2,487
Сказали Спасибо 897 раз(а) в 584 сообщении(ях)
baiderin на пути к лучшему
По умолчанию Re: Куда пропадает точность _delay_ms() ?

А в Ардуине же delay() вроде на таймере реализована?
baiderin вне форума  
Непрочитано 26.04.2022, 14:31  
sanya
Временная регистрация
 
Регистрация: 10.11.2016
Сообщений: 53
Сказал спасибо: 6
Сказали Спасибо 16 раз(а) в 13 сообщении(ях)
sanya на пути к лучшему
По умолчанию Re: Куда пропадает точность _delay_ms() ?

Сообщение от baiderin Посмотреть сообщение
А в Ардуине же delay() вроде на таймере реализована?
Так то в дурине. Вопрос про AVR GCC. Там на циклах.
sanya вне форума  
Непрочитано 26.04.2022, 14:49  
alexbmd
Прописка
 
Регистрация: 10.01.2016
Адрес: Молдова, Кишинёв
Сообщений: 134
Сказал спасибо: 31
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
alexbmd на пути к лучшему
По умолчанию Re: Куда пропадает точность _delay_ms() ?

Сообщение от baiderin Посмотреть сообщение
А в Ардуине же delay() вроде на таймере реализована?
ну привязан к микрос да. вопрос про дилей от авр

Последний раз редактировалось alexbmd; 26.04.2022 в 17:12.
alexbmd вне форума  
Непрочитано 26.04.2022, 15:19  
sanya
Временная регистрация
 
Регистрация: 10.11.2016
Сообщений: 53
Сказал спасибо: 6
Сказали Спасибо 16 раз(а) в 13 сообщении(ях)
sanya на пути к лучшему
По умолчанию Re: Куда пропадает точность _delay_ms() ?

Вот код функции в WinAVR (GCC):

void
_delay_loop_2(uint16_t __count)
{
__asm__ volatile (
"1: sbiw %0,1" "\n\t"
"brne 1b"
: "=w" (__count)
: "0" (__count)
);
}

void _delay_ms(double __ms)
{
uint16_t __ticks;
double __tmp = ((F_CPU) / 4e3) * __ms;
if (__tmp ‹ 1.0)
__ticks = 1;
else if (__tmp › 65535)
{
// __ticks = requested delay in 1/10 ms
__ticks = (uint16_t) (__ms * 10.0);
while(__ticks)
{
// wait 1/10 ms
_delay_loop_2(((F_CPU) / 4e3) / 10);
__ticks --;
}
return;
}
else
__ticks = (uint16_t)__tmp;
_delay_loop_2(__ticks);
}

Все задержки на циклах. Если нужна точность при работающих прерываниях-только таймер!
В чем проблема его использовать. Кстати а F_CPU правильно выставлена?

Последний раз редактировалось sanya; 26.04.2022 в 15:32.
sanya вне форума  
Непрочитано 26.04.2022, 17:16  
alexbmd
Прописка
 
Регистрация: 10.01.2016
Адрес: Молдова, Кишинёв
Сообщений: 134
Сказал спасибо: 31
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
alexbmd на пути к лучшему
По умолчанию Re: Куда пропадает точность _delay_ms() ?

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

F CPU 16000000 вроде правильно
alexbmd вне форума  
Непрочитано 27.04.2022, 00:00  
eddy
Почётный гражданин KAZUS.RUN
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,684
Сказал спасибо: 116
Сказали Спасибо 823 раз(а) в 597 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: Куда пропадает точность _delay_ms() ?

Я надеюсь, миллисекундные задержки в рилтайме не используются - только во время конфигурации?
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
eddy вне форума  
Непрочитано 27.04.2022, 01:35  
Someone
Гражданин KAZUS.RUN
 
Регистрация: 16.06.2005
Сообщений: 942
Сказал спасибо: 25
Сказали Спасибо 174 раз(а) в 123 сообщении(ях)
Someone на пути к лучшему
По умолчанию Re: Куда пропадает точность _delay_ms() ?

Сообщение от alexbmd Посмотреть сообщение
делаю
Сообщение от alexbmd Посмотреть сообщение
получаю 7179 разницу.
Сообщение от alexbmd Посмотреть сообщение
ну таймер (прерывание) у меня выставлен на 1 мс. каждую мс тикает и акумулирует в глобальную перемнную. функция милис возвращяет эту глобальную.
И шо вас таки удивляет? То, что в посчитанное компилятором число тактов, и, в соответствии с этими расчётами, сформованными наборами циклов, вы 7100 раз добавляете время выполнения вашего "прерывания 1 мс"?
Someone вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обзоры покупок товаров на GEARBEST.COM mikesmith Барахолка электронных компонентов 397 12.10.2018 22:51
Пропадает байт 0x55 при передачи USART vavan1983 PIC 2 12.02.2015 23:19
Помогите с лампой - куда чего sobyninsk Источники питания и свет 11 05.09.2013 20:46
Как рассчитать точность измерения напряжения? alenka_fml Электроника - это просто 22 27.05.2012 23:10
Точность GPS Angel_leo Автоматика и аппаратура связи 2 05.07.2010 15:42


Часовой пояс GMT +4, время: 23:05.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.