именно таймерами один супер стабильный от температуры а второй - супер нестабильный
вот мой код в CVAVR
Код: Выделить всё
w1_init();
w1_write(0b11001100); // SkipRom
w1_write(0b01000100); // Convert T
delay_ms(750); // ждем завершения конверсии
for (i=0;i<devices;i++)
{
lcd_gotoxy(75,2+i);
sprintf(a2, "<");
lcd_putstr(a2);
//Пробуем вручную получить скретчпад
// отсылаем в шину команду MATCH ROM [55h]
//delay_ms(800);
putsf("writing 55 ...\n\r");
w1_init();
delay_ms(8);
while(w1_write(0x55)==0)
{
//wait
}
;
putsf("writed 55 ...\n\r");
// отсылаем собственно сам адрес
putsf("writing address ...\n\r");
// for(CurrDev = 0;CurrDev<=9;CurrDev++)
// {
// w1_write(rom_codes[i][CurrDev]);
// }
w1_write(rom_codes[i][0]);
w1_write(rom_codes[i][1]);
w1_write(rom_codes[i][2]);
w1_write(rom_codes[i][3]);
w1_write(rom_codes[i][4]);
w1_write(rom_codes[i][5]);
w1_write(rom_codes[i][6]);
w1_write(rom_codes[i][7]);
w1_write(rom_codes[i][8]);
//w1_write(rom_codes[i][8]);
putsf("writing address SUCCESS...\n\r");
for(CurrDev = 0;CurrDev<=9;CurrDev++)
{
w1_write(rom_codes[i][CurrDev]);
sprintf(a2, "Byte %i = %i \n\r" , CurrDev, rom_codes[i][CurrDev]);
puts(a2);
}
// запрос содержимого скретчпада
putsf("writing BE ...\n\r");
w1_write(0xBE);
// приём скретчпада
putsf("Getting LSB ...\n\r");
ds_scratch_pad.temp_lsb = w1_read();
//putsf("Getted LSB----getting msb ...\n\r");
ds_scratch_pad.temp_msb = w1_read();
//putsf("Getted msb----getting high ...\n\r");
ds_scratch_pad.temp_high = w1_read();
ds_scratch_pad.temp_low = w1_read();
ds_scratch_pad.conf_register = w1_read();
ds_scratch_pad.res1 = w1_read();
ds_scratch_pad.res2 = w1_read();
ds_scratch_pad.res3 = w1_read();
ds_scratch_pad.crc = w1_read();
/*
struct ds_scratch_pad_struct
{
unsigned char temp_lsb,temp_msb,
temp_high,temp_low,
conf_register,
res1,
res2,
res3,
crc;
} ds_scratch_pad;
*/
// строчка для com порта
sprintf(a2, "temp_lsb = %i \n\r" ,ds_scratch_pad.temp_lsb);
puts(a2);
sprintf(a2, "temp_msb = %i \n\r" ,ds_scratch_pad.temp_msb);
puts(a2);
sprintf(a2, "temp_high = %i \n\r" ,ds_scratch_pad.temp_high);
puts(a2);
sprintf(a2, "temp_low = %i \n\r" ,ds_scratch_pad.temp_low);
puts(a2);
sprintf(a2, "conf_register = %i \n\r" ,ds_scratch_pad.conf_register);
puts(a2);
sprintf(a2, "res1 = %i \n\r" ,ds_scratch_pad.res1);
puts(a2);
sprintf(a2, "res2 = %i \n\r" ,ds_scratch_pad.res2);
puts(a2);
sprintf(a2, "res3 = %i \n\r" ,ds_scratch_pad.res3);
puts(a2);
sprintf(a2, "crc = %i \n\r" ,ds_scratch_pad.crc);
puts(a2);
ds_temp = ds18b20_temperature(&rom_codes[i][0]);
//Просто по-старому - долго и неправильно
sprintf(a2, "t%u=%+.3f\xf8C\n\r",i+1, ds_temp);
lcd_clear_row(2+i);
lcd_gotoxy(1,2+i);
lcd_putstr(a2); // выводим на экранчик
// строчка для com порта
sprintf(a2, "t%u(%i)=%+.3f\xf8C\n\r",i+1, rom_codes[i], ds_temp);
puts(a2);
lcd_gotoxy(75,2+i);
sprintf(a2, "-");
lcd_putstr(a2);
}
};