CODE
// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{#asm("sei")
if (needdelay==0) {ICR1H=0xFF;ICR1L=0xC1; //2 ms
delayok=1;
}
if (needdelay==1){switch (resolution){case 0: ICR1H=0xF3;ICR1L=0xCA;break;//zadergka 100 ms
case 1: ICR1H=0xE7;ICR1L=0x95;break;//zadergka 200 ms
case 2: ICR1H=0xCF;ICR1L=0x2B;break;//zadergka 400 ms
case 3: ICR1H=0x9E;ICR1L=0x57;break;//zadergka 800 ms
}
needdelay=0;
}
}
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void) // 490 Hz
{
#asm("sei")
...
}
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 125 kHz
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x4F;
//TCNT2=130;//nachalnoe znachenie 125 000/(255-130)= 1000 gz
OCR2=0x00;
TIMSK=0xC5;
OSCCAL=170;
devices=w1_search(0xf0,rom_codes);
delay_ms(200);
if (!ds18b20_init(&rom_codes[0][0],20,30,DS18B20_9BIT_RES))
{init_error=1;}
while (1)
{if ((trmcount>20)&&(Menu==1))
{
TempSens=ds18b20_temperature(&rom_codes[0][0]);
trmcount=0;
}
}
}
И кусочек переделанного ds18b20.lib
Код
float ds18b20_temperature(unsigned char *addr)
{
unsigned char resolution;
delayok=0;
if (ds18b20_read_spd(addr)==0) return -9999;
resolution=(__ds18b20_scratch_pad.conf_register>>5) & 3;
if (ds18b20_select(addr)==0) return -9999;
w1_write(0x44);
//delay_ms(conv_delay[resolution]);
#asm("sei")
needdelay=1;
while(delayok==0){}
if (ds18b20_read_spd(addr)==0) return -9999;
w1_init();
return (*((int *) &__ds18b20_scratch_pad.temp_lsb) & bit_mask[resolution])*0.0625;
}