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

 
 
> Датчик DS18B20, Нужен совет
Letis
сообщение Sep 14 2010, 21:11
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 124
Регистрация: 10-07-07
Пользователь №: 29 027



У меня проблема следующего характера. К микроконтроллеру Mega8535 подключены 4 датчика DS18B20. Но я их не могу подключить на одну линию, так как нужно считывать адреса, а датчики розмещены в разных местах, ну в общем, этот вариант мне не подходит.
Тогда я решил разместить датчики на одном порте на на разных линиях. Но когда дело дошло дело до программирования (Code Vision), у меня ничего не получается.
Вот так я подключаю первый датчик
#asm
.equ __w1_port=0x12 ;PORTD
.equ __w1_bit=0
#endasm
Считываю те-ру и хочу сменить адрес шины:
#asm
.equ __w1_port=0x12 ;PORTD
.equ __w1_bit=1
#endasm
Но при компиляции выбивает ошибку.
Посоветуйте, что делать.

Как повесить 4 датчика DS18B20 на разные ноги контроллера ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
zalg
сообщение Sep 15 2010, 17:04
Сообщение #2





Группа: Участник
Сообщений: 14
Регистрация: 15-09-10
Пользователь №: 59 507



У меня такая проблема. Писал код "с нуля" на ассемблере, все согласно даташиту. В итоге датчик реагирует, но как то странно. При включении показывает температуру +85 С(0550h в первых двух считанных байтах, затем считывание прекращаю, подавая "ресет" ). Насколько я понял, так и должно быть, НО затем он начинает фиксировать изменения температуры относительно этого значения, как будто калибруется при подаче питания. И еще одна странность - младший бит байта 0 - всегда ноль, т.е. при нагреве (если коснуться датчика пальцами) температура начинает расти так - 0550h,0552h,0554h и т.д. Перепроверял все по нескольку раз, симулировал в Proteus - работает как надо, уже грешу на датчик. Может кто сталкивался?
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Sep 16 2010, 03:04
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



to zalg
Цитата(zalg @ Sep 15 2010, 23:04) *
У меня такая проблема. Писал код "с нуля" на ассемблере, все согласно даташиту. В итоге датчик реагирует, но как то странно. При включении показывает температуру +85 С(0550h в первых двух считанных байтах, затем считывание прекращаю, подавая "ресет" ). Насколько я понял, так и должно быть, НО затем он начинает фиксировать изменения температуры относительно этого значения, как будто калибруется при подаче питания. И еще одна странность - младший бит байта 0 - всегда ноль, т.е. при нагреве (если коснуться датчика пальцами) температура начинает расти так - 0550h,0552h,0554h и т.д. Перепроверял все по нескольку раз, симулировал в Proteus - работает как надо, уже грешу на датчик. Может кто сталкивался?

1. При чтении значения (тем более при первом) необходимо дождаться завершения измерения температуры, но перед этим необходимо подать команду на старт
2. Скажите какой датчик, может у него точность измерения температуры по умолчанию задана с дискретом в один градус?
3. Лучше сделать новый топик!

To Letis.
Пишу с использованием WinAVR (на AVR-асме не пишу более 5 лет)
В одной проге было два ds18s20 на одном порту
Вот моя реализация.

В вашем случае достаточно переделать макросы onew_input, onew_out_hi, onew_out_lo под большее количество датчиков

В ds18s20.h
Код
    #define DS18S_PORT               PORTE
    #define DS18S_DDR                DDRE
    #define DS18S_PIN                PINE
    #define PIN_DS18S_1WR     (_BV(2))
    #define PIN_DS18S_1RD     (_BV(3))
    #define PIN_DS18S_2WR     (_BV(4))
    #define PIN_DS18S_2RD     (_BV(5))

  #define onew_input(par)   (DS18S_PIN  &   (par ? PIN_DS18S_2RD : PIN_DS18S_1RD))
  #define onew_out_hi(par)   DS18S_PORT &= ~(par ? PIN_DS18S_2WR : PIN_DS18S_1WR)
  #define onew_out_lo(par)   DS18S_PORT |=  (par ? PIN_DS18S_2WR : PIN_DS18S_1WR)


В ds18s20.c
Код
//*****************************************************************************
// Layer 1 - Transmit/Receive Bit
void onew_set_lo(byte ch)
{
  byte s = SREG;
  cli();
  onew_out_lo (ch);
  _delay_us   (65);
  onew_out_hi (ch);
  _delay_us   (10); //5
  SREG = s;
}
//=============================================================================
void onew_set_hi(byte ch)
{
  byte s = SREG;
  cli();
  onew_out_lo (ch);
  _delay_us   (7); //
  onew_out_hi (ch);
  _delay_us   (70); // 65
  SREG = s;
}
//=============================================================================
byte onew_get_bit(byte ch)  
{
  byte t = 0;
  byte s = SREG;
  cli();
  onew_out_lo (ch);
  _delay_us   (2);
  onew_out_hi (ch);
  _delay_us   (12); //11
  if(onew_input(ch)) t=1;
  SREG = s;
  _delay_us   (60); //45
  return t;
}
//=============================================================================
byte onew_reset(byte ch)
{
  byte t = 0;
  byte s = SREG;
  cli();
  onew_out_lo (ch);
  _delay_us   (480);
  onew_out_hi (ch);
  _delay_us   (65);
  if(!onew_input(ch)) t=1;
  sei();
  SREG = s;
  _delay_us   (415);
  return t;
}
//*****************************************************************************


Сообщение отредактировал alexeyv - Sep 16 2010, 03:06
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Letis   Датчик DS18B20   Sep 14 2010, 21:11
- - miksergei   Цитата(Letis @ Sep 15 2010, 00:11) У меня...   Sep 14 2010, 23:41
- - Letis   А как нужно сделать ?   Sep 15 2010, 00:51
- - vovanse   AVR318: Dallas 1-Wire master on tinyAVR and megaAV...   Sep 15 2010, 02:35
- - Letis   Чесно говоря я ничего не понял с єтого app_note. М...   Sep 15 2010, 07:06
- - wer_1   http://www.gaw.ru/html.cgi/txt/app/micros/avr/avr3...   Sep 15 2010, 07:32
- - Letis   м-да, сложно єто, проще поставить ключ 4066. А мо...   Sep 15 2010, 08:14
- - Сергей Борщ   Цитата(Letis @ Sep 15 2010, 00:11) Посове...   Sep 15 2010, 08:16
- - Letis   Например ?   Sep 15 2010, 09:42
|- - Сергей Борщ   Цитата(Letis @ Sep 15 2010, 12:42) Наприм...   Sep 15 2010, 10:35
- - Letis   что надежнее ключи или программный метод?   Sep 15 2010, 12:37
|- - MrYuran   Цитата(Letis @ Sep 15 2010, 16:37) что на...   Sep 15 2010, 12:55
|- - ILYAUL   Цитата(zalg @ Sep 15 2010, 21:04) При вкл...   Sep 15 2010, 17:22
|- - serge71   to zalg: Если младший бит "0", может всё...   Sep 16 2010, 08:04
- - zalg   Опыт программирования у меня не большой, так что з...   Sep 15 2010, 17:37
- - ARV   у меня вообще сложилось впечатление, что Code Visi...   Sep 15 2010, 18:01
- - ILYAUL   zalg Вы создайте свою тему всё таки.   Sep 15 2010, 21:12
- - Letis   Цитатаи сам не один вариант написал для обмена 1-w...   Sep 16 2010, 09:20
|- - ARV   Цитата(Letis @ Sep 16 2010, 13:20) Виложи...   Sep 16 2010, 11:42
- - Letis   Код несколько не понятен в силу того что пишу в Co...   Sep 16 2010, 21:18
|- - ARV   Цитата(Letis @ Sep 17 2010, 01:18) Как мн...   Sep 17 2010, 06:17
|- - xemul   Цитата(Letis @ Sep 17 2010, 01:18) Код не...   Sep 17 2010, 09:56
- - Леонид Иванович   Для нескольких термометров делал так: Код//------...   Sep 17 2010, 17:59


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 08:17
Рейтинг@Mail.ru


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