Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

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

 
Опции темы
Непрочитано 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
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,856
Сказал спасибо: 2,532
Сказали Спасибо 11,772 раз(а) в 5,896 сообщении(ях)
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
Сообщений: 201
Сказал спасибо: 12
Сказали Спасибо 29 раз(а) в 24 сообщении(ях)
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.RU
 
Регистрация: 05.05.2011
Адрес: Харьков
Сообщений: 5,049
Сказал спасибо: 592
Сказали Спасибо 3,968 раз(а) в 1,826 сообщении(ях)
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.RU
 
Регистрация: 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.RU
 
Регистрация: 05.04.2009
Сообщений: 976
Сказал спасибо: 35
Сказали Спасибо 155 раз(а) в 134 сообщении(ях)
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, время: 10:07.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot