Пишу прогу в avr studio 4. температуру узмеряю вот так:
(прошу прощения за многабукаф, но комменты выкидывать не стал)
Код: Выделить всё
#define OWPORT PORTD
#define OWPIN PIND
#define OWDDR DDRD
#define OWPIN_MASK 0b10000000
/**
* Read one byte from 1-wire interface
*/
unsigned char oneWireReadByte() {
unsigned 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(74);
}
else {
// send 0
OWDDR |= OWPIN_MASK;
_delay_us(80);
OWDDR &= ~(OWPIN_MASK);
//_delay_us(10);
}
data = data >> 1;
_delay_us(10); // 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)
cli();
oneWireWriteByte(0xCC);
// start conversion
oneWireWriteByte(0x44);
_delay_ms(750);
// read values;
oneWireWriteByte(0xCC);
oneWireWriteByte(0xBE);
_delay_ms(10);
for (i = 0; i < sizeof(buf); ++i) {
buf[i] = oneWireReadByte();
}
temperature = buf[0] + (buf[1] << 8);
sei();
return temperature;
}
Гляньте пожалуйста код, может что не так? Буду рад любым ценным мыслям и советам.
