управление DS1822

Обсуждаем цифровые устройства...
Ответить
anrkaid
Родился
Сообщения: 8
Зарегистрирован: Пт ноя 30, 2007 11:18:32
Контактная информация:

управление DS1822

Сообщение anrkaid »

Стоит просто огромная проблема - не измеряется температура. Читано уже все что можно.
Пишу прогу в 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;
}
Presense pulse получаю, как и положено (т.е. схема-то вроде рабочая, ничего не забыл). Но, при чтении температуры получаю одни единицы. Т.е. почему-то устройству начхать на мои потуги и оно ничего не предает. Быть может, я неправильно передаю команды? Симулирую это дело в протеусе. Кстати, там есть настройки для микросхемы вроде high pulse time и low pulse time, я их тоже крутил, но все равно ничего не работает.
Гляньте пожалуйста код, может что не так? Буду рад любым ценным мыслям и советам.
Реклама
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: управление DS1822

Сообщение Мастер Ломастер »

Да сколько ж можно?! воспользуйтесь, наконец, поиском по форуму - здесь давалось минимум 5 разных исходников разных авторов для разных компиляторов с одной и той же целью - работой с 1-wire и термодатчиками в частности.
битва с дураками проиграна, победители торжествуют. слава победителям!
Реклама
Ответить

Вернуться в «Цифровая техника»