В общем, сделал в режиме непрерывного измерения:
Код
unsigned long T_high, T_low;
double Temperature;
volatile unsigned Timer1OvfCount;
unsigned long Accum[2];
int Offset;
__eeprom __no_init int ee_Offset; // Значение смещения (EEPROM)
//==============================================================================
// INT0 External interrupt handler ISR: Вызывается при каждом перепаде TMP05_OUT
//------------------------------------------------------------------------------
#pragma vector=INT0_vect
__interrupt void INT0_ISR()
{
unsigned Tick;
if(EICRA == 2) // FALLING_EDGE
{
Tick = TCNT1;
T_high = Tick + ((unsigned long)Timer1OvfCount << 16);
RISING_EDGE;
}
else if(EICRA == 3) // RISING_EDGE
{
Tick = TCNT1;
T_low = Tick + ((unsigned long)Timer1OvfCount << 16) - T_high;
Timer1OvfCount = TCNT1 = 0; // Reset count
Flags.IsMeasure = true;
FALLING_EDGE;
}
}
//==============================================================================
// Timer/Counter1 Overflow ISR: Вызывается с интервалом 3.27675 мс
// Инкремент счетчика переполненй
//------------------------------------------------------------------------------
#pragma vector=TIMER1_OVF_vect
__interrupt void TC1_OVF_ISR()
{
Timer1OvfCount++; // Keep a record of timer1 overflows
}
//------------------------------------------------------------------------------
void TMP05_Init()
{
Offset = ee_Offset;
// Initialization TMP05
CLRBIT(TMP05_DDR, TMP05_FUNC); // One Shot Mode (FUNC = 0)
CLRBIT(TMP05_PORT, TMP05_FUNC); // Continuouse Converting Mode (FUNC => Hi-Z)
FALLING_EDGE;
ENABLE_INT0;
Timer1Start();
SETBIT(TIMSK1, TOIE1); // Enable timer1 interrupts
}
//------------------------------------------------------------------------------
void TMP05_Measure()
{
FALLING_EDGE;
ENABLE_INT0;
while(!Flags.IsMeasure); // First cycle is dummy
Flags.IsMeasure = false;
for(unsigned char i = 0; i < 8; i++)
{
while(!Flags.IsMeasure);
Accum[HIGH] += T_high;
Accum[LOW] += T_low;
Flags.IsMeasure = false;
}
Temperature = 421 - (751 * ((double)(Accum[HIGH] >> 3) / (Accum[LOW] >> 3))) + Offset;
Accum[HIGH] = Accum[LOW] = 0;
DISABLE_INT0;
}
Все теперь работает. Просто я заработался

...
Но все же вопросы к AD остались.
Первое. Не понятно, почему состояние вывода
CONV_IN не влияет на длительности
T_high, T_low,- всегда идет номинальная
Convertion Rate (25 C гр) 40/76 ms. И когда вывод
FUNC = Low, и когда
FUNC = High. Значения
T_high, T_low для отладки вывожу на ЖКИ, UART. Это же подтверждает и осциллограф.
После установки вывода
FUNC = Low или
FUNC = High питание датчика пересбрасываю. Для надежности после обесточивания датчика закорачиваю выводы питания датчика отверткой.
Второе. В режиме
One Shot Mode всегда идет меандр, а не одиночный цикл, как я предполагал. Судя по даташиту, после стартового импульса (OUT = Low длительностью >20ns, затем OUT = Hi-Z) датчик должен выдать один цикл
T_high, T_low и затем вывод остается в OUT = High, пока не будет новый стартовый импульс.