Еще грабли могут быть с тем, что датчик читается слишком часто, попробуй его привязать к прерыванию таймера - чтобы оно не мешало. Например:
Код: Выделить всё
/*****************************************************
CodeWizardAVR V2.03.4 Standard
Project : DEMO_TERMOMETRE
Date : 14.06.2009
Author : Goodefine
Chip type : ATmega8
Program type : Application
Clock frequency : 4,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega8>
#include <delay>
#asm
.equ __w1_port=0x18 ;PORTB
.equ __w1_bit=0
#endasm
#include <1wire> //библиотека для работы с 1Wire
#include <ds18b20> //библиотека для работы с датчиком температуры
#define MAX_DS18B20 8
unsigned char ds18b20_devices;
unsigned char ds18b20_rom_codes[MAX_DS18B20][9];
//-------------------------------------------------------------------------
#define PIN_DIGIT_1 PINC.1
#define PIN_DIGIT_2 PINC.2
#define OUT_DIGIT_1 PORTC.1
#define OUT_DIGIT_2 PORTC.2
#define TIME_DS_READ 30 /*подбираем, так для опроса два раза в сек.*/
#define BUF_SIZE 2
unsigned char buffer[BUF_SIZE]; //буфер для разложения числа
unsigned int temp; //температура
unsigned char fl_ds_read; //флаг разрешения чтения датчика
//-------------------------------------------------------------------------
flash char digits[]={// массив для отображения на индикаторе
0b10000001,0b11110011,0b01001001,0b01100001,0b00110011,0b00100101,
0b00000101,0b11110001,0b00000001,0b00100001};
//-------------------------Функция преобразования числа в строку------------//
void decbin_ds (unsigned int const* x, unsigned char* buffer)
{ //функция не использует операцию деления
unsigned char i;
//PORTC.0=0;
for (i=0; i<BUF_SIZE>=10; i-=10) {buffer[0]++;}
for (i=*x-10*buffer[0]; i>=1; i-=1) {buffer[1]++;}
// PORTC.0=1;
}
//====================//
//-------------------- 0 overflow interrupt service routine------------//
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
//динамическая индикация, выводит поочередно числа из buffer
static unsigned char counter_ds_read;
(counter_ds_read==TIME_DS_READ)? (fl_ds_read=1,counter_ds_read=0):(counter_ds_read++);
(PIN_DIGIT_1)? (OUT_DIGIT_1=0,PORTD=digits[buffer[1]],OUT_DIGIT_2=1):
(OUT_DIGIT_2=0,PORTD=digits[buffer[0]],OUT_DIGIT_1=1);
}
//====================//
void main(void)
{
PORTB=0x00;
DDRB=0xFF;
PORTC=0xFF;
DDRC=0xFF;
PORTD=0x00;
DDRD=0xFF;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 15,625 kHz
TCCR0=0x04;
TCNT0=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
w1_init();
ds18b20_devices=w1_search(0xf0,ds18b20_rom_codes);
ds18b20_init(&ds18b20_rom_codes[0][0],-55,125,DS18B20_9BIT_RES);
// Global enable interrupts
#asm("sei")
for (;;)//---------------------MAIN_LOOP----------------------------------
{
#asm("wdr") //для Протеуса
//получаем температуру (два раза в секунду)
if(fl_ds_read){
temp=ds18b20_temperature(&ds18b20_rom_codes[0][0]);fl_ds_read=0;
//преобразуем значение температуры в строку и ложим в буфер buffer
decbin_ds(&temp, buffer);
//или так, если не поможет (в верху строчку закомментировать)
//if((temp>=0)&&(temp<100))decbin_ds(&temp, buffer);
}
} //end MAIN_LOOP----------------------------------------------------
}
Если не поможет, то сделайте проверку и не парьтесь...
Мля, да что ж за глюк такой с отображением в посте decbin_ds

Любой, заслуживающий внимания, опыт приобретается себе в убыток...