реклама на сайте
подробности

 
 
> DS18B20 + WinAVR, не инициализируется датчик :(
Labinskiy Nikola...
сообщение Jul 22 2006, 07:20
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 27
Регистрация: 5-07-06
Из: Украина, Донецк
Пользователь №: 18 606



DQ подтянут 4к7 на +5 вольт. Датчик один, питание полное(на датчик тоже идет +5В)
Код
#include <avr/io.h>
#include <avr/eeprom.h>
#include <inttypes.h>
#include <stdio.h>
#include <string.h>

#define F_CPU 1000000UL  // 1 MHz
#include <util/delay.h>


void delay_us(uint16_t t)
{
  int i;
  if (t > 10)
    for (i=0;i<t/10;i++)
      _delay_us(10);
  else
    _delay_us(t);
}

void delay_ms(uint16_t t)
{
  int i;
  if (t > 10)
    for (i=0;i<t/10;i++)
      _delay_ms(10);
  else
    _delay_ms(t);
}

int ds_reset()
{
  int r=0;
  PORTA &= ~(1<<4);
  DDRA |= (1<<4);        // DQ = 0;
  delay_us(500);        // 480us minimum
  DDRA &= ~(1<<4);        // DQ in
  delay_us(80);            // waits 15-60us and then
  r = (PINA & (1<<4));    //   capture the presence pulse (60-240us)
  delay_us(400);        
  return !r;
}

все время возвращает 0. В чем может быть проблема?
Если в датчике то как его можно быстро и просто проверить?


--------------------
If you can't make it good - don't make it look good ;)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Labinskiy Nikola...
сообщение Jul 22 2006, 11:55
Сообщение #2


Участник
*

Группа: Новичок
Сообщений: 27
Регистрация: 5-07-06
Из: Украина, Донецк
Пользователь №: 18 606



вот что получилось:
Код
#include <avr/io.h>
#include <avr/eeprom.h>
#include <inttypes.h>
#include <stdio.h>
#include <string.h>

#define F_CPU 1000000UL  // 1 MHz
#include <util/delay.h>


void delay_ms(uint16_t t)
{
  uint8_t i;
  if (t > 10)
    for (i=0;i<t/10;i++)
      _delay_ms(10);
  else
    _delay_ms(t);
}

int ds_reset()
{
  uint8_t r=0;
  PORTA &= ~(1<<4);
  DDRA |= (1<<4);        // DQ = 0;
  _delay_us(480);
  DDRA &= ~(1<<4);        // DQ pull up
  _delay_us(70);
  r = (PINA & (1<<4));    // Capture the presence pulse
  _delay_us(410);        
  return !r;
}

void ds_write_bit(uint8_t b)
{
  if (b)
    {
        PORTA &= ~(1<<4);
      DDRA |= (1<<4);        // DQ = 0;
        _delay_us(6);
        DDRA &= ~(1<<4);        // DQ pull up
        _delay_us(64);    
    }
  else
    {
      PORTA &= ~(1<<4);
      DDRA |= (1<<4);        // DQ = 0;
      _delay_us(60);
      DDRA &= ~(1<<4);        // DQ pull up
      _delay_us(10);
    };
}

uint8_t ds_read_bit()
{
  uint8_t r=0;
  PORTA &= ~(1<<4);
  DDRA |= (1<<4);        // DQ = 0;
  _delay_us(6);
  DDRA &= ~(1<<4);        // DQ pull up
  _delay_us(9);
  r = (PINA & (1<<4));
  _delay_us(55);
  if (r)
    return 1;
  else
    return 0;
}

void ds_write_byte(uint8_t data)
{
  uint8_t loop;
  // Loop to write each bit in the byte, LS-bit first
  for (loop = 0; loop < 8; loop++)
    {
      ds_write_bit(data & 0x01);
      // shift the data byte for the next bit
      data >>= 1;
    }
}

uint8_t ds_read_byte()
{
  uint8_t loop, result=0;
  for (loop = 0; loop < 8; loop++)
    {
      // shift the result to get it ready for the next bit
      result >>= 1;
      // if result is one, then set MS bit
      if (ds_read_bit())
        result |= 0x80;
    }
  return result;
}

int16_t ds_read_temperature()
{
  int16_t r = -1;
  int i;
  uint8_t buf[9]={0};

  if (ds_reset())
    {
      ds_write_byte(0xCC);    //Skip ROM command
      ds_write_byte(0x44);    //Convert T command
      delay_ms(1000);        // lame :)
      ds_write_byte(0xBE);    //Read Scratchpad
      for (i=0; i < 10; i++)
        buf[i] = ds_read_byte();
      r = (buf[0] | (buf[1] << 8)) >> 4;

    };
  return r;
}

но инициализация все равно не проходит...
может что-то с датчиком?


--------------------
If you can't make it good - don't make it look good ;)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Labinskiy Nikolay   DS18B20 + WinAVR   Jul 22 2006, 07:20
- - xemul   Цитата(Labinskiy Nikolay @ Jul 22 2006, 11...   Jul 22 2006, 09:24
|- - Labinskiy Nikolay   Цитата(xemul @ Jul 22 2006, 12:24) Пробле...   Jul 22 2006, 09:43
|- - xemul   Цитата(Labinskiy Nikolay @ Jul 22 2006, 13...   Jul 22 2006, 10:31
- - beer_warrior   ЦитатаКак тогда корректно делать задержки? Прерыва...   Jul 22 2006, 09:54
- - virtuality   Вставлю свою лепту - у меня, да и судя по постам у...   Jul 22 2006, 10:11
- - aesok   Цитата(Labinskiy Nikolay @ Jul 22 2006, 11...   Jul 22 2006, 10:22
- - Labinskiy Nikolay   Цитата(virtuality @ Jul 22 2006, 13:11) В...   Jul 22 2006, 11:04
|- - xemul   Цитата(Labinskiy Nikolay @ Jul 22 2006, 15...   Jul 22 2006, 11:27
- - xemul   Цитата(Labinskiy Nikolay @ Jul 22 2006, 15...   Jul 22 2006, 14:05
- - Labinskiy Nikolay   Спасибо за ссылки, ну а delay_ms у меня только и о...   Jul 22 2006, 15:03
- - WHALE   Вручную считать задержки-нафига? Тот самый случай...   Jul 22 2006, 17:17
|- - xemul   Цитата(WHALE @ Jul 22 2006, 21:17) Вручну...   Jul 22 2006, 17:50
- - Labinskiy Nikolay   Ничего не понимаю... PORTA.4(нумерация с нуля) Meg...   Jul 25 2006, 18:20
- - virtuality   Николай, советую проверить работоспособность датчи...   Jul 25 2006, 19:07
- - Labinskiy Nikolay   Ну вот, купил специально второй датчик для проверо...   Jul 26 2006, 09:15
- - virtuality   Может у вас ошибка не в съеме информации с датчика...   Jul 26 2006, 18:24
- - Labinskiy Nikolay   Да, через УАРТ, но там ошибок нету, я через гиперт...   Jul 27 2006, 05:13
- - Balun   Код/* Multipoint thermometer with LCD display u...   Jul 27 2006, 05:45
- - Labinskiy Nikolay   ЦитатаВроду нада поискать датччики и определмить и...   Jul 27 2006, 17:06


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 10:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01429 секунд с 7
ELECTRONIX ©2004-2016