to zalg
Цитата(zalg @ Sep 15 2010, 23:04)

У меня такая проблема. Писал код "с нуля" на ассемблере, все согласно даташиту. В итоге датчик реагирует, но как то странно. При включении показывает температуру +85 С(0550h в первых двух считанных байтах, затем считывание прекращаю, подавая "ресет" ). Насколько я понял, так и должно быть, НО затем он начинает фиксировать изменения температуры относительно этого значения, как будто калибруется при подаче питания. И еще одна странность - младший бит байта 0 - всегда ноль, т.е. при нагреве (если коснуться датчика пальцами) температура начинает расти так - 0550h,0552h,0554h и т.д. Перепроверял все по нескольку раз, симулировал в Proteus - работает как надо, уже грешу на датчик. Может кто сталкивался?
1. При чтении значения (тем более при первом) необходимо дождаться завершения измерения температуры, но перед этим необходимо подать команду на старт
2. Скажите какой датчик, может у него точность измерения температуры по умолчанию задана с дискретом в один градус?
3. Лучше сделать новый топик!
To Letis.
Пишу с использованием WinAVR (на AVR-асме не пишу более 5 лет)
В одной проге было два ds18s20 на одном порту
Вот моя реализация.
В вашем случае достаточно переделать макросы onew_input, onew_out_hi, onew_out_lo под большее количество датчиков
В ds18s20.h
Код
#define DS18S_PORT PORTE
#define DS18S_DDR DDRE
#define DS18S_PIN PINE
#define PIN_DS18S_1WR (_BV(2))
#define PIN_DS18S_1RD (_BV(3))
#define PIN_DS18S_2WR (_BV(4))
#define PIN_DS18S_2RD (_BV(5))
#define onew_input(par) (DS18S_PIN & (par ? PIN_DS18S_2RD : PIN_DS18S_1RD))
#define onew_out_hi(par) DS18S_PORT &= ~(par ? PIN_DS18S_2WR : PIN_DS18S_1WR)
#define onew_out_lo(par) DS18S_PORT |= (par ? PIN_DS18S_2WR : PIN_DS18S_1WR)
В ds18s20.c
Код
//*****************************************************************************
// Layer 1 - Transmit/Receive Bit
void onew_set_lo(byte ch)
{
byte s = SREG;
cli();
onew_out_lo (ch);
_delay_us (65);
onew_out_hi (ch);
_delay_us (10); //5
SREG = s;
}
//=============================================================================
void onew_set_hi(byte ch)
{
byte s = SREG;
cli();
onew_out_lo (ch);
_delay_us (7); //
onew_out_hi (ch);
_delay_us (70); // 65
SREG = s;
}
//=============================================================================
byte onew_get_bit(byte ch)
{
byte t = 0;
byte s = SREG;
cli();
onew_out_lo (ch);
_delay_us (2);
onew_out_hi (ch);
_delay_us (12); //11
if(onew_input(ch)) t=1;
SREG = s;
_delay_us (60); //45
return t;
}
//=============================================================================
byte onew_reset(byte ch)
{
byte t = 0;
byte s = SREG;
cli();
onew_out_lo (ch);
_delay_us (480);
onew_out_hi (ch);
_delay_us (65);
if(!onew_input(ch)) t=1;
sei();
SREG = s;
_delay_us (415);
return t;
}
//*****************************************************************************
Сообщение отредактировал alexeyv - Sep 16 2010, 03:06