Цитата(Прораб счастья @ Nov 12 2008, 00:26)

Добрый день!
Помогите, пожалуйста, связать DS18B20 и ATtiny2313. У меня никак не получается.
Задача простая - считать показания с трех датчиков (максимум), преобразовать их в int и присвоить отдельные переменные temp1, temp2 и temp3.
На форуме эта тема мелькала много раз. Сам скачал исходники и переделал именно под этот тип датчика. При считывании 2х чатчиков столкнулся с проблемой - мне не удалось номер термодатчика передать как параметр функции т.е.
Код
//Сброс шины 1-wire: 2 таймслота 480мкс - мастер тянет шину вниз (RESET PULSE)
//480 мкс - датчик тянет шину вниз (присутствие на шине) OW_PORT &= ~(1<<OW_DQ);
unsigned char OW_reset(unsigned char sensor_num)
{
__disable_interrupt();
unsigned char answer;
//формируем RESET PULSE
OW_PORT &= ~(1<<sensor_num); //это не работает!!!!
OW_DDR |= (1<<sensor_num); //set DDR in 1
//удерживаем 480 мкс
delay_us(480);
...........................................................
}
Обошёл эту проблему через switch-case
Код
//Сброс шины 1-wire: 2 таймслота 480мкс - мастер тянет шину вниз (RESET PULSE)
//480 мкс - датчик тянет шину вниз (присутствие на шине) OW_PORT &= ~(1<<OW_DQ);
unsigned char OW_reset(unsigned char sensor_num)
{
switch(sensor_num)
{
case 1: //кусок кода для сенсора 1
__disable_interrupt();
unsigned char answer;
//формируем RESET PULSE
OW_PORT &= ~(1<<OW_DQ_1); //set PORT in 0
OW_DDR |= (1<<OW_DQ_1); //set DDR in 1
//удерживаем 480 мкс
delay_us(480);
.........................................................................
break;
case 2: //кусок кода для сенсора 2
__disable_interrupt();
unsigned char answer;
//формируем RESET PULSE
OW_PORT &= ~(1<<OW_DQ_2); //set PORT in 0
OW_DDR |= (1<<OW_DQ_2); //set DDR in 1
//удерживаем 480 мкс
delay_us(480);
.........................................................................
break
}
}
В чём была проблема толком не разбирался из-за отсутствия времени, но вариант со switch-case работае стабильно.
По поводу перевода показаний температуры в int. С датчика температура приходит в виде
signed int. Объявляйте temp как знаковые, храните там температуру и работайте с ней как со знаковой величиной но учитывайте что 4 младших бита хранят дробную часть с шагом 0.0625, целая часть температуры хранится в битах 15:4.
Удачи