AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
26.04.2022, 10:13
|
|
Прописка
Регистрация: 10.01.2016
Адрес: Молдова, Кишинёв
Сообщений: 126
Сказал спасибо: 31
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Куда пропадает точность _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 из ардуино то там точно.
как можно повысить точность дилей от авр ?
|
|
|
|
26.04.2022, 10:34
|
|
Временная регистрация
Регистрация: 10.11.2016
Сообщений: 53
Сказал спасибо: 6
Сказали Спасибо 16 раз(а) в 13 сообщении(ях)
|
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.
|
|
|
|
26.04.2022, 13:29
|
|
Прописка
Регистрация: 10.01.2016
Адрес: Молдова, Кишинёв
Сообщений: 126
Сказал спасибо: 31
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Куда пропадает точность _delay_ms() ?
Сообщение от sanya
|
TCCR0A=(0‹‹COM0A1) | (0‹‹COM0A0) | (0‹‹COM0B1) | (0‹‹COM0B0) | (1‹‹WGM01) | (0‹‹WGM00);
|
это СТС . у меня Нормал. хотя что так что так. это влияет на подсчет милис но не на дилей функцию
в остальном одинаково.
Последний раз редактировалось alexbmd; 26.04.2022 в 13:39.
|
|
|
|
26.04.2022, 13:39
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,731
Сказал спасибо: 2,439
Сказали Спасибо 893 раз(а) в 580 сообщении(ях)
|
Re: Куда пропадает точность _delay_ms() ?
А в Ардуине же delay() вроде на таймере реализована?
|
|
|
|
26.04.2022, 14:31
|
|
Временная регистрация
Регистрация: 10.11.2016
Сообщений: 53
Сказал спасибо: 6
Сказали Спасибо 16 раз(а) в 13 сообщении(ях)
|
Re: Куда пропадает точность _delay_ms() ?
Сообщение от baiderin
|
А в Ардуине же delay() вроде на таймере реализована?
|
Так то в дурине. Вопрос про AVR GCC. Там на циклах.
|
|
|
|
26.04.2022, 14:49
|
|
Прописка
Регистрация: 10.01.2016
Адрес: Молдова, Кишинёв
Сообщений: 126
Сказал спасибо: 31
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Куда пропадает точность _delay_ms() ?
Сообщение от baiderin
|
А в Ардуине же delay() вроде на таймере реализована?
|
ну привязан к микрос да. вопрос про дилей от авр
Последний раз редактировалось alexbmd; 26.04.2022 в 17:12.
|
|
|
|
26.04.2022, 15:19
|
|
Временная регистрация
Регистрация: 10.11.2016
Сообщений: 53
Сказал спасибо: 6
Сказали Спасибо 16 раз(а) в 13 сообщении(ях)
|
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.
|
|
|
|
26.04.2022, 17:16
|
|
Прописка
Регистрация: 10.01.2016
Адрес: Молдова, Кишинёв
Сообщений: 126
Сказал спасибо: 31
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Куда пропадает точность _delay_ms() ?
sanya,
ну таймер (прерывание) у меня выставлен на 1 мс. каждую мс тикает и акумулирует в глобальную перемнную. функция милис возвращяет эту глобальную.
городить еще один таймер и глобальную для дилей как то ну незнаю
F CPU 16000000 вроде правильно
|
|
|
|
27.04.2022, 00:00
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,637
Сказал спасибо: 116
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
|
Re: Куда пропадает точность _delay_ms() ?
Я надеюсь, миллисекундные задержки в рилтайме не используются - только во время конфигурации?
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
27.04.2022, 01:35
|
|
Гражданин KAZUS.RU
Регистрация: 16.06.2005
Сообщений: 944
Сказал спасибо: 25
Сказали Спасибо 174 раз(а) в 123 сообщении(ях)
|
Re: Куда пропадает точность _delay_ms() ?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:00.
|
|