Подробности реализации таковы: Вначале была реализована, отлажена связь при запрещённых прерываниях с софтовыми задержками, затем код был переписан по "индусски", как линейный. Разбит на участки
строки кода1
задержка в мс
---
строки кода2
задержка в мс
.........
.........
строки кодаN
задержка в мс
---
Т.е. строки кода мы будем выполнять при каждом следующем вызове прервания выполняем "строки кода1", "строки кода2" и т.д. соответственно.
Эти "строки кода" оформлены как функции, указатели на эти функции помещены в массив структур, туда-же помещены задержки после этого кода.
typedef struct // Чтение градусника, по шагам, 1 шаг.
{ func_ptr f; // выполняемая функция
int del_time; // задержка после нее
} termo_step;
Используем прерывание по Compare, т.е. прерывание вызывается при совпадении значения таймера и значения регистра захвата/сравнения.
#pragma vector=TIMERB0_VECTOR
__interrupt void TIMERB0_isr( void )
{
( *( *++termo_arr_ptr ).f )();
TBCCR0 = TBR + ( *termo_arr_ptr ).del_time;
}
termo_arr_ptr - указатель на элемент массива.
Всё это проделывалось достаточно давно, работает, проблем нет. В системе нет длительных прерываний, или после выполнения критических секций в коде прерывания разрешаем прерывания (т.е. получаются вложеные прерывания). Иногда бывают сбои, раз в несколько минут, но т.к. у DS18B20 есть контрольная сумма, то сбойные значения игнорируем.
Это всё для MSP430, про AVR ничего не знаю...