2016-09-13 6 views
-5

Для моего проекта регистратора данных я должен хранить значения температуры каждые 6 часов. Я замечаю, что максимальное время тикера составляет 30 минут. Есть ли способ сделать прерывание при длительном дублении, например, 6 часов или 10 часов?как сделать прерывание каждые 6 часов

спасибо.

+1

В любом случае? Есть много способов. Если ваша система уже имеет центральный цикл ввода-вывода, сначала посмотрите туда, так как у этого уже есть такой объект. –

+1

Одна возможность: наложить интервал прерывания, чтобы сказать одну минуту, и считать себя. –

ответ

2

Таким образом, вы можете сделать прерывание каждые 30 минут. Если есть только способ игнорировать каждые 11 прерываний подряд и обрабатывать только 12-й один ..

volatile int interruptCounter = 0; 
void interruptFunction (void) 
{ 
    interruptCounter++; 
    if(interruptCounter == 12) 
    { 
     interruptcounter = 0; 
     /* 
      Do your stuff here 
     */ 
    } 
} 

Почему 12? Потому что вы можете обрабатывать прерывания, возникающие каждые 0,5 часа. Таким образом, для обработки его каждые 6 ч максимальное значение счетчика будет 6/0,5 = 12, в течение 10 часов оно будет 10/0,5 = 20 и так далее.

+0

Спасибо Gravell – Gandhi

+2

Хорошо: +1. Но 'volatile 'здесь не имеет большого смысла. Локальная область «static uint8_t» может быть прекрасной. И проверьте '> =' всегда лучше, а не '=='. – LPs

+0

@LPs Вы правы с 'volatile', это имеет смысл только тогда, когда переменная используется как внутри, так и снаружи функции прерывания. Для меня некоторая привычка использовать 'volatile' внутри функции прерывания :). И вы правы с '> =' check, но в этом случае я не вижу никакого способа пропустить проверку 'interruptCounter == 12'. – Gravell