Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы

Чтение DS18B20

Непрочитано 31.05.2013, 22:02  
YURALL72
Прописка
 
Регистрация: 29.06.2007
Сообщений: 217
Сказал спасибо: 143
Сказали Спасибо 13 раз(а) в 11 сообщении(ях)
YURALL72 на пути к лучшему
По умолчанию Чтение DS18B20

Всем доброго время суток.Написал код общения с DS18B20.Возникла проблема,датчик шлёт данные младшим битом вперёд(((.После приёма байта написал цикл разворота этого байта.Этот код работает,Протеус симулирует и показывает температуру.
//чтение байта из датчика
unsigned char read_byte(void)
{
unsigned char read_byte=0,i,temp;
for (i=0;i‹8;i++)
{
DDRB.4=1;//Порд в выход
PORTB.4=0; //сбрасываем в 0
delay_us(10);//формируем синхроимпульс
DDRB.4=0; //порт к +5в
//PORTB.4=0;
delay_us(20);//ждём ответа датчика
if(PINB.4==1) read_byte++; //если на входе +5в, байт +1
if(i !=7)read_byte‹‹=1; //ну а если 0,и не последний проход цикла сдвигаем влево на 1 позицию,и готовим следующий бит
delay_us(60); //заканчуем слот
}
temp=read_byte;
read_byte=0;
for (i=8;i›0;i--)
{

if (temp & 1) read_byte++;
if(i!=1)read_byte‹‹=1;
temp››=1;
}
return read_byte;
}

Я захотел уменьшить код и и вышло такое:

//чтение байта из датчика
unsigned char read_byte(void)
{
unsigned char read_byte=0,i,temp;
for (i=8;i›0;i--)
{
DDRB.4=1;//Порд в выход
PORTB.4=0; //сбрасываем в 0
delay_us(10);//формируем синхроимпульс
DDRB.4=0; //порт к +5в
PORTB.4=0;
delay_us(20);//ждём ответа датчика
if(PINB.4==1) read_byte |= (1‹‹(i-1)); //если на входе +5в, устанавливаем 1 в нужном разряде
delay_us(60); //заканчуем слот
}

return read_byte;
}

но этот код не работает,хотя прогон в авр студио показывает корректную
работу кода.Т.е. при наличии на пине.4 лог. 1.Она записуется в соответствующий разряд.Если нетрудно,помогите разобраться .
Реклама:
YURALL72 вне форума  
Непрочитано 31.05.2013, 22:26  
uk8amk
Вид на жительство
 
Регистрация: 05.07.2006
Адрес: Tashkent
Сообщений: 454
Сказал спасибо: 24
Сказали Спасибо 67 раз(а) в 44 сообщении(ях)
uk8amk на пути к лучшему
По умолчанию Re: Чтение DS18B20

Вот этот код в железе работает.
Вложения:
Тип файла: txt 1wire.txt (3.1 Кб, 231 просмотров)
uk8amk вне форума  
Сказали "Спасибо" uk8amk
YURALL72 (31.05.2013)
Непрочитано 31.05.2013, 22:42  
YURALL72
Прописка
 
Регистрация: 29.06.2007
Сообщений: 217
Сказал спасибо: 143
Сказали Спасибо 13 раз(а) в 11 сообщении(ях)
YURALL72 на пути к лучшему
По умолчанию Re: Чтение DS18B20

Большое спасибо!Но у меня есть рабочий код на си и на ассемблере (чтение байта из датчика).Я не могу понять почему второй вариант не работает(((
YURALL72 вне форума  
Непрочитано 31.05.2013, 22:42  
akegor
Гуру портала
 
Аватар для akegor
 
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
akegor на пути к лучшему
По умолчанию Re: Чтение DS18B20

YURALL72, недостаточно информации. Какой контроллер? Подтяжка внешняя есть или только внутренняя?
Пишете в CV? Там есть функции специально для этого термометра, рожать не надо.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
akegor вне форума  
Непрочитано 31.05.2013, 22:52  
YURALL72
Прописка
 
Регистрация: 29.06.2007
Сообщений: 217
Сказал спасибо: 143
Сказали Спасибо 13 раз(а) в 11 сообщении(ях)
YURALL72 на пути к лучшему
По умолчанию Re: Чтение DS18B20

Прошу прощения,пишу в кодевижне. Подтяжка внешняя 4.7к. Для атмеги8. Встроенные функции не люблю,хочу понять где я наплужил во втором варианте.
YURALL72 вне форума  
Непрочитано 31.05.2013, 23:07  
electroTrash
Прописка
 
Регистрация: 05.01.2013
Сообщений: 195
Сказал спасибо: 11
Сказали Спасибо 24 раз(а) в 21 сообщении(ях)
electroTrash на пути к лучшему
По умолчанию Re: Чтение DS18B20

Сообщение от YURALL72 Посмотреть сообщение
хочу понять где я наплужил во втором варианте.
надо изменить порядок хранения битов
Сообщение от YURALL72 Посмотреть сообщение
//чтение байта из датчика
unsigned char read_byte(void)
{
unsigned char read_byte=0,i,temp;
for (i=0;i‹8;i++)
{
DDRB.4=1;//Порд в выход
PORTB.4=0; //сбрасываем в 0
delay_us(10);//формируем синхроимпульс
DDRB.4=0; //порт к +5в
PORTB.4=0;
delay_us(20);//ждём ответа датчика
if(PINB.4==1) read_byte |= (1‹‹i); //если на входе +5в, устанавливаем 1 в нужном разряде
delay_us(60); //заканчуем слот
}
return read_byte;
}
electroTrash вне форума  
Сказали "Спасибо" electroTrash
YURALL72 (31.05.2013)
Непрочитано 31.05.2013, 23:12  
alvadep
Почётный гражданин KAZUS.RUN
 
Регистрация: 05.05.2011
Адрес: Харьков
Сообщений: 5,042
Сказал спасибо: 589
Сказали Спасибо 3,967 раз(а) в 1,825 сообщении(ях)
alvadep на пути к лучшему
По умолчанию Re: Чтение DS18B20

Цитата:
if(PINB.4==1) read_byte |= (1‹‹(i-1)); //если на входе +5в, устанавливаем 1 в нужном разряде
А i случаем не портится?
alvadep вне форума  
Сказали "Спасибо" alvadep
YURALL72 (31.05.2013)
Непрочитано 01.06.2013, 00:00  
YURALL72
Прописка
 
Регистрация: 29.06.2007
Сообщений: 217
Сказал спасибо: 143
Сказали Спасибо 13 раз(а) в 11 сообщении(ях)
YURALL72 на пути к лучшему
По умолчанию Re: Чтение DS18B20

Нет,i не портится,проверял.electroTrash спасибо!Я чот не додумался до такого простого решения,нагородил кучу всего).Буду Ваш код использовать.Спасибо ВСЕМ.Удачи.
P/S Дошло!!!Младшим битом ВПЕРЁД!!!Я знал а пхал младший в старший!Ну как так можно перепутать?А ведь перепутал,и 2 вечера парился(((.Большое спасибо Ребята что вывели из ступора!)))
YURALL72 вне форума  
Непрочитано 01.06.2013, 00:44  
_Артём_
Гражданин KAZUS.RUN
 
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
_Артём_ на пути к лучшему
По умолчанию Re: Чтение DS18B20

Сообщение от YURALL72 Посмотреть сообщение
Я захотел уменьшить код и и вышло такое:

//чтение байта из датчика
но этот код не работает,хотя прогон в авр студио показывает корректную
работу кода.Т.е. при наличии на пине.4 лог. 1.Она записуется в соответствующий разряд.Если нетрудно,помогите разобраться .
Как-то сложно у вас. Зачем вычислять маску (1‹‹(i-1))?
Можно сдвигать вправо и устанавливать старший бит, если нужно.

Код:
unsigned char read_byte(void)
{
unsigned char read_byte,i;
PORTB.4=0;
for (i=0;i‹8;i++)
{
DDRB.4=1;//Порт в выход
//PORTB.4=0; //сбрасываем в 0 - не нужно
delay_us(10);//формируем синхроимпульс
DDRB.4=0;  //порт к +5в

delay_us(20);//ждём ответа датчика
read_byte››=1;
if(PINB.4) read_byte |= 0x80; 
delay_us(60);  
}
P.S. B PORTB.4 менять не обязательно, если есть подтяжка - достаточно DDRB.4 переключать в нужное состояние.

Последний раз редактировалось _Артём_; 01.06.2013 в 00:58.
_Артём_ вне форума  
Непрочитано 01.06.2013, 09:00  
oleg110592
Гражданин KAZUS.RUN
 
Регистрация: 05.04.2009
Сообщений: 973
Сказал спасибо: 35
Сказали Спасибо 154 раз(а) в 133 сообщении(ях)
oleg110592 на пути к лучшему
По умолчанию Re: Чтение DS18B20

Как-то сложно у вас. Зачем вычислять маску (1‹‹(i-1))?
Ну у производителя микросхемы (APPLICATION NOTE 162) так:
Код:
if(read_bit()) value|=0x01‹‹i; // reads byte in, one byte
at a time and then shifts it left
http://www.maximintegrated.com/app-n...dex.mvp/id/162

Ваш код, наверное покомпактнее будет.

Последний раз редактировалось oleg110592; 01.06.2013 в 09:07.
oleg110592 вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ищем несколько DS18B20 vvkka Микроконтроллеры, АЦП, память и т.д 10 28.02.2012 00:04
Atmega128 DS18B20 koznov123 Микроконтроллеры, АЦП, память и т.д 10 01.06.2011 10:39
Подключение DS18B20 r Attiny2313 vaal555 Микроконтроллеры, АЦП, память и т.д 1 27.09.2010 22:06
ATmega8 и DS18B20, не определяется датчик butman Микроконтроллеры, АЦП, память и т.д 21 09.06.2007 22:05


Часовой пояс GMT +4, время: 21:56.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.