Перейти к содержанию
    

Николай, советую проверить работоспособность датчика на готовом примере в CodeVision. Если и там у вас ничего работать не будет - значит проблема железе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну вот, купил специально второй датчик для проверок в CodeVision

 

#include <mega16.h>
// 1 Wire Bus functions
#asm
   .equ __w1_port=0x1B;PORTA
   .equ __w1_bit=4
#endasm
#include <1wire.h>
#include <ds18b20.h>
#include <stdio.h>
void main(void)
{
// USART initialization
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x0C;

// 1 Wire Bus initialization
w1_init();
if (ds18b20_init(NULL,0,0,DS18B20_12BIT_RES))
  {
     while (1)
      {
      /* measure and display the temperature(s) */
          printf("t=%+.3f\xf8C\n\r",
          ds18b20_temperature(NULL));
      };
  }
else
  printf("error!");

while (1);
}

выдает ошибку на обоих датчиках...

 

от куда беруться такие напряжения (4.28В, см. выше)? Какие есть идеи?

Просто схема подключения элементарная, ну где там можно ошибиться....

Изменено пользователем Labinskiy Nikolay

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может у вас ошибка не в съеме информации с датчика, а в передаче ее? Я так понял вы через UART передаете?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, через УАРТ, но там ошибок нету, я через гиперткрминал посылаю команды контроллеру на которые он успешно отвечает мигая светодиодами и т.д., и одна из этих команд - опрос датчика...

Дебагил по шагам через JTAG ICE и мерял напряжения на ножках...

До сих пор не пойму почему там не появляется на выходе 0...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

/* Multipoint thermometer with LCD display
   using the Maxim DS18B20
   1 Wire bus temperature sensors

   CodeVisionAVR C Compiler
   (C) 2000-2005 HP InfoTech S.R.L.
   www.hpinfotech.ro

   Chip: ATmega8515
   Memory Model: SMALL
   Data Stack Size: 128 bytes
   
   THE ATmega8515 CLOCK FREQUENCY MUST BE 3.6864 MHz

   The DS18B20 sensors are connected to
   bit 6 of PORTA of the ATmega8515 as follows:

   [DS18B20]     [STK500 PORTA HEADER]
    1 GND         -   9  GND
    2 DQ          -   7  PA6
    3 VDD         -  10 +5V

   All the temperature sensors must be connected
   in parallel
   
   AN 4.7k PULLUP RESISTOR MUST BE CONNECTED
   BETWEEN DQ (PA6) AND +5V !
*/
#asm
    .equ __w1_port=0x1b
    .equ __w1_bit=6
#endasm

/* Use an 2x16 alphanumeric LCD connected
   to PORTC as follows:

  [LCD]   [STK500 PORTC HEADER]
   1 GND- 9  GND
   2 +5V- 10 VCC  
   3 VLC- LCD contrast control voltage 0..1V
   4 RS - 1  PC0
   5 RD - 2  PC1
   6 EN - 3  PC2
  11 D4 - 5  PC4
  12 D5 - 6  PC5
  13 D6 - 7  PC6
  14 D7 - 8  PC7
*/

#asm
    .equ __lcd_port=0x15
#endasm

#include <lcd.h> // LCD driver routines
#include <ds18b20.h>
#include <delay.h>
#include <stdio.h>

char lcd_buffer[33];

/* maximum number of DS18B20 connected to the 1 Wire bus */
#define MAX_DEVICES 8

/* DS18B20 devices ROM code storage area */
unsigned char rom_code[MAX_DEVICES][9];

main()
{
unsigned char i,j,devices;

lcd_init(16);
lcd_putsf("CodeVisionAVR\n1 Wire Bus Demo");
delay_ms(2000);
lcd_clear();

/* detect how many DS18B20 devices
   are connected to the 1 Wire bus */
devices=w1_search(0xf0,rom_code);
sprintf(lcd_buffer,"%u DS18B20\nDevice detected",devices);
lcd_puts(lcd_buffer);
delay_ms(2000);

/* display the ROM codes for each device */
if (devices)
   {
   for (i=0;i<devices;i++)
       {
       sprintf(lcd_buffer,"Device #%u ROM\nCode is:",i+1);
       lcd_clear();
       lcd_puts(lcd_buffer);
       delay_ms(2000);
       lcd_clear();
       for (j=0;j<8;j++)
           {
           sprintf(lcd_buffer,"%02X ",rom_code[i][j]);
           lcd_puts(lcd_buffer);
           if (j==3) lcd_gotoxy(0,1);
           };
       delay_ms(5000);
       };
   }
else
while (1); /* stop here if no devices were found */

/* configure each DS18B20 device for 12 bit temperature
   measurement resolution */
for (i=0;i<devices;)
    if (!ds18b20_init(&rom_code[i++][0],20,30,DS18B20_12BIT_RES))
       {
       sprintf(lcd_buffer,"Init error for\ndevice #%u",i);
       lcd_clear();
       lcd_puts(lcd_buffer);
       while (1); /* stop here if init error */
       };

/* measure and display the temperature(s) */       
while (1)
      {
      j=1;
      for (i=0;i<devices;i++)
          {
          sprintf(lcd_buffer,"t%u=%+.3f\xdfC",j++,ds18b20_temperature(&rom_code[i][0]));
          lcd_clear();
          lcd_puts(lcd_buffer);
          delay_ms(500);
          };
      };
}

 

У меня вот этот пример из кодевижена работает.

 

Посмотрите на эту строчку

(!ds18b20_init(&rom_code[i++][0],20,30,DS18B20_12BIT_RES))

Вроду нада поискать датччики и определмить их адрес, ну уж потом

делать инит

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вроду нада поискать датччики и определмить их адрес, ну уж потом

делать инит

Это если на 1wire шине их несколько, если же датчик один, его поиск (чтение заводского ROM кода) не обязателен.

 

Но я все равно проверю, спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...