реклама на сайте
подробности

 
 
> Counter0 и переполнение
azazelloAV
сообщение Jun 29 2012, 06:54
Сообщение #1





Группа: Новичок
Сообщений: 6
Регистрация: 29-06-12
Пользователь №: 72 554



Не могу разобратся в простом коде, может кто просветит.

Код
unsigned long micros() {
unsigned long m;    
cli();
m = timer0_overflow_count;
t = TCNT0;  
if ((TIFR0 & _BV(TOV0)) && (t < 255))
        m++;
    
return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond());
}


Не пинайте только, код взят с библиотеки ардуино - функция получения времени в микросекундах.
Ну вот объясните, ну вот с чего, с чего они взяли что прерывание по переполнению (сам флаг) не будет между этими двумя строчками
Код
t = TCNT0;  
if ((TIFR0 &

Да и вообще, может кто подскажет как это сделать корректно, без потери точности

Сообщение отредактировал azazelloAV - Jun 29 2012, 06:56
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Непомнящий Евген...
сообщение Jun 29 2012, 07:01
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



cli() же...

и кстати, не вижу sei()
Go to the top of the page
 
+Quote Post
azazelloAV
сообщение Jun 29 2012, 07:09
Сообщение #3





Группа: Новичок
Сообщений: 6
Регистрация: 29-06-12
Пользователь №: 72 554



Цитата(Непомнящий Евгений @ Jun 29 2012, 10:01) *
cli() же...

и кстати, не вижу sei()

Ну причем здесь cli()
Он запрещает выполнения прерывания, а не отменяет его. Они же смотят флаг
Код
if ((TIFR
- т.е. возникало ли оно.
А sei() нету... Ну не знаю, может Си все выходы функций через reti делает
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Jun 29 2012, 07:18
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Если переполнение случилось после t = TCNT0, но до if, то t будет 255, ++m выполнена не будет

Цитата(azazelloAV @ Jun 29 2012, 11:09) *
А sei() нету... Ну не знаю, может Си все выходы функций через reti делает


нет, с чего вдруг. Только для прерываний.
Go to the top of the page
 
+Quote Post
azazelloAV
сообщение Jun 29 2012, 07:31
Сообщение #5





Группа: Новичок
Сообщений: 6
Регистрация: 29-06-12
Пользователь №: 72 554



Цитата(Непомнящий Евгений @ Jun 29 2012, 10:18) *
Если переполнение случилось после t = TCNT0, но до if, то t будет 255, ++m выполнена не будет

Гм, логично. Спасибо большое. Пребольшое.

Цитата
нет, с чего вдруг. Только для прерываний.

Ну а собственно, а почему бы и нет. А может компилятор раздупляется. Не знаю. А вообще бог с ним - не текущая задача.

Сообщение отредактировал azazelloAV - Jun 29 2012, 07:32
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th July 2025 - 14:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01384 секунд с 7
ELECTRONIX ©2004-2016