Страница 37 из 59

Re: Всё по DS18(B/S)20.

Добавлено: Пт фев 27, 2015 06:32:22
Хатуль_мадан
Пожалуйста!
Хотя обвинения не по адресу. Изначально, прочитав осбуждение, вспомнил про адаптер для 1-w, предложил ссылку, где есть отработанная схема, которая применима как для компа, или согласуется с TTL через MAX232, так и подключаема напрямую к ножкам МК. Chip115 писал:
Разбираюсь с Ds1820.
В ручную поднял 1-wire. Всё работает. Захотелось натянуть 1-wire "поверх" UART.
схема узла

Тут ни слова про согласование с МК, поэтому и предложил вариант адаптера. Но затем Gudd-Head отнес это в разряд "высера" по непонятным причинам. Поэтому и простите что вмешался, просто хотел помочь.
HHIMERA, BOB51 спасибо за интересную информацию, ранее мне не встречалась.

Re: Всё по DS18(B/S)20.

Добавлено: Пт фев 27, 2015 07:07:17
Chip115
Хатуль_мадан писал(а): Хотя обвинения не по адресу. Изначально, прочитав осбуждение, вспомнил про адаптер для 1-w, предложил ссылку, где есть отработанная схема, которая применима как для компа, или согласуется с TTL через MAX232, так и подключаема напрямую к ножкам МК.
Верно. Я не всё написал, вы своё додумали, потом другие присоединились и понеслась моча по трубам. Предлагаю остановиться, пока такой пустяк не привёл к ссоре.

Re: Всё по DS18(B/S)20.

Добавлено: Пт фев 27, 2015 07:11:02
Chip115
HHIMERA писал(а):
Chip115 писал(а):Просто конфигурируем порты как альтернативная ф-ция OD и RX/TX на провод данных вешаем?
Ну да!!! Неважно... UART или TIM...
Ну, резистор подтяжки как бы по дефолту 1-wire стоит.
Резистор - святое!!!
Спасибо! Жаль что сам не додумался так сделать ))) Никогда не юзал входы/выходы в режиме OD.

Re: Всё по DS18(B/S)20.

Добавлено: Пт фев 27, 2015 10:28:01
BOB51
И всё же не рекомендую забывать о внешнем драйвере.
Проведите простой тест - метров 25 телефонной проводины и датчик.
На "микроконтроллерном" порте без "заморочек" и на спецдрайвере из апнотиков - результат покажет что лучше.
(По старым данным МК - уверенно до 10 метров, на буфер-формирователе http://img.radiokot.ru/files/20529/kc1ezblxl.JPG даже простая " хамская бухта" (http://img.radiokot.ru/files/20529/kjmicvkxi.jpg) проблем не вызвала).
:roll:

Re: Всё по DS18(B/S)20.

Добавлено: Пт фев 27, 2015 10:44:21
HHIMERA
на буфер-формирователе
Ну... если уж быть честным... данная схема тоже не блещет... Рассказывать... или сам знаешь???

Re: Всё по DS18(B/S)20.

Добавлено: Пт фев 27, 2015 12:55:09
BOB51
Меня вполне устраивает на данный момент.
Кроме прочего - развязка внешних цепей и внутриМКшных токов.
:)
Есть чего предложить - выкладывай, посмотрим. 8)

Re: Всё по DS18(B/S)20.

Добавлено: Вт мар 03, 2015 22:49:26
flusher
а есть у кого-то простой пример на С покурить под avrstudio чтения температуры из DS1621/LM75/TMP75?

Re: Всё по DS18(B/S)20.

Добавлено: Ср мар 04, 2015 08:51:36
Gudd-Head
flusher писал(а):DS1621/LM75/TMP75?
Темой не ошиблись? Это всё I²C.

Re: Всё по DS18(B/S)20.

Добавлено: Ср мар 04, 2015 09:03:25
BOB51
LM75 - есть I2C... 8)
Причем еще и с режимом термостата...

Re: Всё по DS18(B/S)20.

Добавлено: Ср мар 04, 2015 13:28:38
Аlex
BOB51, к чему был Ваш пост ? Если из вышесказанного итак понятно, что у этих микросхем интерфейс I²C. Человек запостил не в той теме, а Вы продолжаете флудом посты набивать.
Не первый раз уже такое замечаю за Вами.

Подскажите по 18В20

Добавлено: Вт мар 10, 2015 21:51:16
djrec
Подскажите как изменить код что бы возможно было использовать два датчика. Например второй к порту С5, ну или паралельно первому.

PORTВ=T1;

Спойлер

Код: Выделить всё

****************************************************
/#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
 
#define SKIP_ROM 0xCC // Пропустить индентификацию
#define CONVERT_T 0x44 // Измерить температуру
#define READ_SCRATCHPAD 0xBE // Прочитать измеренное
 
//определяем порт и бит к которому подключено устройство
#define OWI_PORT PORTC
#define OWI_DDR DDRC
#define OWI_PIN PINC
#define OWI_BIT 4
 
#define OWI_LOW OWI_DDR |= 1<<OWI_BIT//притягиваем шину к 0
#define OWI_HIGH OWI_DDR &= ~(1<<OWI_BIT)//отпускаем шину
 
//функция определяет есть ли устройство на шине
char OWI_find(void)
{
char SR0=SREG;//сохраняем значение регистра
cli(); //запрещаем прерывания
char device;
OWI_LOW; //притягиваем шину к 0
_delay_us(485);//ждем минимум 480мкс
OWI_HIGH;//отпускаем шину
_delay_us(65);//ждем минимум 60мкс и смотрим что на шине
 
if((OWI_PIN & (1<<OWI_BIT)) ==0x00)//смотрим есть ли ответ
device = 1; //на шине есть устройство
else
device = 0; //на шине нет устройства
SREG=SR0;//возвращаем первонач знач регистра
_delay_us(420);//ждем оставшееся время до 480мкс
return device;
}
 
// функция отправляет бит на устройство
void OWI_write_bit (char bit)
{
char SR1=SREG;//сохраняем значение регистра
cli(); //запрещаем прерывания
OWI_LOW;//логический "0"
_delay_us(2);
if(bit) OWI_HIGH; //отпускаем шину
_delay_us(65);
OWI_HIGH; //отпускаем шину
SREG=SR1;//возвращаем первонач знач регистра
}
 
//функция посылает байт на устройство
void OWI_write_byte(unsigned char c)
{
char i;
for(i = 0; i < 8; i++)//в цикле посылаем побитно
{
if((c & (1<<i)) == 1<<i)//если бит=1 посылаем 1
OWI_write_bit(1);
else//иначе посылаем 0
OWI_write_bit(0);
}
}
 
//функция чтения одного бита
char OWI_read_bit (void)
{
char SR2=SREG;//сохраняем значение регистра
cli(); //запрещаем прерывания
char OWI_rbit; //переменная хранения бита
OWI_LOW;//логический "0"
_delay_us(2);
OWI_HIGH; //отпускаем шину
_delay_us(13);
OWI_rbit=(OWI_PIN & (1<<OWI_BIT))>>OWI_BIT;//строчка исправлена 05.2014 (исправлена ошибка)
_delay_us(45);//задержка до окончания тайм-слота
SREG=SR2;//возвращаем первонач знач регистра
return OWI_rbit;
}
 
//функция читает один байт с устройства 1-wire
unsigned char OWI_read_byte()
{
char data=0,i;
for(i = 0; i < 8; i++) //в цикле смотрим что на шине и сохраняем значение
data|= OWI_read_bit()<<i;//читаем очередной бит
return data;
}
 
//функция преобразует полученные с датчика 18b20 данные в температуру
int  temp_18b20()
{
unsigned char B;
unsigned int ds18_temp=0;
if(OWI_find()==1)//если есть устройство на шине
{
OWI_write_byte(SKIP_ROM);//пропустить ROM код, мы знаем, что у нас одно устройство или передаем всем
OWI_write_byte(CONVERT_T);//преобразовать температуру
_delay_ms(750);//преобразование в 12 битном режиме занимает 750ms
OWI_find();//снова посылаем Presence и Reset
OWI_write_byte(SKIP_ROM);
OWI_write_byte(READ_SCRATCHPAD);//передать байты ведущему(у 18b20 в первых двух содержится температура)
 
B = OWI_read_byte(); //читаем бит LS
ds18_temp = OWI_read_byte(); //читаем бит MS
ds18_temp = (ds18_temp<<8)|B;//уладываем биты в последовательности MS потом LS
}
// else return можно сделать возврат числа что датчика нет
return ds18_temp;//возвращаем int (MS,LS)
}
 
//перевод инф от temp_18b20() в удобный вид
char convert (unsigned int td)
{
char dat=td>>4;//сдвиг и отсечение старшего байта
return dat;// (знак,2в6,2в5,2в4,2в3,2в2,2в1,2в0)
}
 
int main (void)
{
DDRC=0x00;
PORTC=0x00;
char T=0;
 
DDRD=0xFF;
while(1)
{ T=convert(temp_18b20());
PORTD=T;
}
}

Re: Всё по DS18(B/S)20.

Добавлено: Ср мар 11, 2015 08:38:16
Аlex
djrec, а в чём затык ? :dont_know:
С одним же датчиком разобрались. Так и работайте с другим точно также, как и с первым, только на другом ПИНе.

Re: Всё по DS18(B/S)20.

Добавлено: Ср мар 11, 2015 09:03:58
-=Vovka=-
Для работы с двумя датчиками нужно работать с битами порта не напрямую, а через переменную-маску.

Re: Всё по DS18(B/S)20.

Добавлено: Ср мар 11, 2015 09:07:25
ARV
забодай вас комар! датчики DS18x20 рассчитаны на работу "параллельно", т.е. много на одной линии. как это реализуется - есть и в даташитах, и в многочисленных статьях, и в этой теме на форуме, и вообще, блин, на эту тему только совсем ленивый статей не писал! сколько можно об одном и том же талдычить?!

Re: Всё по DS18(B/S)20.

Добавлено: Ср мар 11, 2015 09:10:20
Gudd-Head
Если у меня 2 датчика и 2 свободных ноги, я бы тоже повесил по одному на порт.

Re: Всё по DS18(B/S)20.

Добавлено: Ср мар 11, 2015 09:13:12
Аlex
датчики DS18x20 рассчитаны на работу "параллельно"
С параллельным подключением существуют некторые неудобства (именно неудобства, а не отсутствие возможности), такие как привязка конкретного датчика к конкретному объекту.
С подключением на разные порты таких неудобств не будет. Заменил датчик на объекте и не паришься со всякими номерами и забиваниями их в девайс.
В остальном с Вами согласен. Интернет просто завален ответами на подобные вопросы, главное не лениться и искать информацию...

Re: Всё по DS18(B/S)20.

Добавлено: Ср мар 11, 2015 09:16:40
Gudd-Head
Плюс ко всему когда датчики разнесены по портам, они однозначно идентифицируются, и код короче.

Re: Всё по DS18(B/S)20.

Добавлено: Ср мар 11, 2015 09:17:42
ARV
задавший последний вопрос был готов использовать второй датчик
djrec писал(а):паралельно первому.

Re: Всё по DS18(B/S)20.

Добавлено: Ср мар 11, 2015 09:19:58
Gudd-Head
Не надо отдельные фразы вырывать.
второй к порту С5, ну или паралельно первому

Re: Всё по DS18(B/S)20.

Добавлено: Ср мар 11, 2015 09:28:38
ARV
что значит - вырывать? я избрал для своего возмущенного высказывания ВТОРУЮ часть фразы, ее и процитировал. автор вопроса соединил части союзом ИЛИ - значит, ему одинаково подходят любые варианты. в чем я не прав?!