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

 
 
> 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:46
Сообщение #2


Знающий
****

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



SREG = oldSREG; - восстанавливает состояние прерываний, так что все ок

Код
m = timer0_overflow_count;
// прерывание
t = TCNT0; // t = 0, флаг TOV0 стоит
if ((TIFR0 & _BV(TOV0)) && (t < 255))
        m++; // выполнится




Go to the top of the page
 
+Quote Post
azazelloAV
сообщение Jun 29 2012, 13:30
Сообщение #3





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



Цитата(Непомнящий Евгений @ Jun 29 2012, 10:46) *
SREG = oldSREG; - восстанавливает состояние прерываний, так что все ок

Долго думал. Ну в упор не вижу, ну не вижу зачем восстанавливать флаги прерываний. Где они нарушаются?
Просвети, ибо ещё не дошёл до прозрачного понимания, а как известно, всё легкое очень сложно, пока конечно не поймёшь его.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jun 29 2012, 13:57
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(azazelloAV @ Jun 29 2012, 16:30) *
Где они нарушаются?


Код
uint8_t oldSREG = SREG;// сохранение статуса (с установленным или сброшенным флагом разрешения прерываний)
cli(); // сброс I в SREG - здесь "они нарушаются"
// код

SREG = oldSREG;// восcтановление SREG


Цитата(azazelloAV @ Jun 29 2012, 16:30) *
Ну в упор не вижу, ну не вижу зачем восстанавливать флаги прерываний.

Например в IAR AVR такая функция реализуется через ключевое слово __monitor - во время работы такой функции гарантировано не возникнут прерывания, а на выходе из неё восстановится статус с битом I (каким бы он не был до вызова функции).
Go to the top of the page
 
+Quote Post
azazelloAV
сообщение Jun 29 2012, 14:16
Сообщение #5





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



Цитата(_Артём_ @ Jun 29 2012, 16:57) *
[code]uint8_t oldSREG = SREG;// сохранение статуса (с установленным или сброшенным флагом разрешения прерываний)
cli(); // сброс I в SREG - здесь "они нарушаются"


Всё. Туплю. Искал там, где не должно быть. Просто ещё не перевёл в подсознание некоторые вещи. Спасибо за терпение и примитивные вопросы.


Ещё раз спасибо тем кто помог, теперь всё стало стройно и понятно.
Go to the top of the page
 
+Quote Post



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

 


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


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