Знаю, знаю, что тема очень избитая и разжеванная, но что-то не выходит. Уже все прочитал, что нашел. Проблема в том, что микруха не хочет отдавать данные. Единственное, что я от нее добился - импульс присутствия. Передаю ей команды и жду приема, а в ответ тишина
(т.е. стабильный 1 на линии).
Вот код:
PHP код:
|
#define OWPORT PORTD
#define OWDDR DDRD
#define OWPIN_MASK 0b10000000
#define OWPIN PIND
/**
* Read one byte from 1-wire interface
*/
unsigned char oneWireReadByte() {
char i;
unsigned char result = 0;
// set pin to zero
OWPORT &= ~(OWPIN_MASK);
for (i = 0; i ‹ 8; ++i) {
// capture wire
OWDDR |= OWPIN_MASK;
_delay_us(6);
OWDDR &= ~OWPIN_MASK;
_delay_us(9);
if (OWPIN & OWPIN_MASK != 0) {
result += 1 ‹‹ i;
}
_delay_us(60);
}
return result;
}
/**
* Write one byte to 1-wire interface
*/
void oneWireWriteByte(unsigned char data) {
// set pin output to zero
OWPORT &= ~(OWPIN_MASK);
for (char i = 0; i ‹ 8; ++i) {
if ((data & 0x01) == 0x01) {
// send "1"
OWDDR |= OWPIN_MASK;
_delay_us(6);
OWDDR &= ~OWPIN_MASK;
_delay_us(64);
}
else {
// send 0
OWDDR |= OWPIN_MASK;
_delay_us(60);
OWDDR &= ~(OWPIN_MASK);
_delay_us(10);
}
data = data ›› 1;
_delay_us(4); // time gap between slots
}
// configure pin as input
OWDDR &= ~(OWPIN_MASK);
}
/**
* Init 1-wire interface
* @return bool initialization result (true or false)
*/
unsigned char oneWireInit() {
unsigned char devicePresents;
// send presense pulse
OWPORT &= ~(OWPIN_MASK);
// init 1-wire pin as output
OWDDR |= OWPIN_MASK;
// wait 480 microseconds
_delay_us(480);
// configure pin as input
OWDDR &= ~(OWPIN_MASK);
// wait 40 microseconds
_delay_us(60);
// read value
devicePresents = (OWPIN & OWPIN_MASK) == 0;
return devicePresents;
}
/**
* Read temperature from ds1822
*/
unsigned short ds1822ReadTemperature() {
unsigned char buf[9];
unsigned char i;
unsigned short temperature;
// send 0xCC - "skip rom" command (we have only one device)
oneWireWriteByte(0xCC);
// start conversion
oneWireWriteByte(0x44);
_delay_ms(1000);
// read values;
oneWireWriteByte(0xBE);
_delay_ms(10);
for (i = 0; i ‹ sizeof(buf); ++i) {
buf[i] = oneWireReadByte();
}
temperature = buf[0] + (buf[1] ‹‹ 8);
return temperature;
}
|
вызывается oneWireInit(), потом ds1822ReadTemperature().
Осциллограммы последовательно: presense(получается), потом отсыл 0xcc, 0x44.
Потом команда 0xbe и поппытка прочитать ответ.
Заранее спасибо за помощь.