AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
31.05.2013, 22:02
|
|
Прописка
Регистрация: 29.06.2007
Сообщений: 217
Сказал спасибо: 143
Сказали Спасибо 13 раз(а) в 11 сообщении(ях)
|
Чтение 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.Она записуется в соответствующий разряд.Если нетрудно,помогите разобраться .
|
|
|
|
31.05.2013, 22:26
|
|
Вид на жительство
Регистрация: 05.07.2006
Адрес: Tashkent
Сообщений: 454
Сказал спасибо: 24
Сказали Спасибо 67 раз(а) в 44 сообщении(ях)
|
Re: Чтение DS18B20
Вот этот код в железе работает.
|
|
|
|
31.05.2013, 22:42
|
|
Прописка
Регистрация: 29.06.2007
Сообщений: 217
Сказал спасибо: 143
Сказали Спасибо 13 раз(а) в 11 сообщении(ях)
|
Re: Чтение DS18B20
Большое спасибо!Но у меня есть рабочий код на си и на ассемблере (чтение байта из датчика).Я не могу понять почему второй вариант не работает(((
|
|
|
|
31.05.2013, 22:42
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,856
Сказал спасибо: 2,532
Сказали Спасибо 11,772 раз(а) в 5,896 сообщении(ях)
|
Re: Чтение DS18B20
YURALL72, недостаточно информации. Какой контроллер? Подтяжка внешняя есть или только внутренняя?
Пишете в CV? Там есть функции специально для этого термометра, рожать не надо.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
31.05.2013, 22:52
|
|
Прописка
Регистрация: 29.06.2007
Сообщений: 217
Сказал спасибо: 143
Сказали Спасибо 13 раз(а) в 11 сообщении(ях)
|
Re: Чтение DS18B20
Прошу прощения,пишу в кодевижне. Подтяжка внешняя 4.7к. Для атмеги8. Встроенные функции не люблю,хочу понять где я наплужил во втором варианте.
|
|
|
|
31.05.2013, 23:07
|
|
Прописка
Регистрация: 05.01.2013
Сообщений: 201
Сказал спасибо: 12
Сказали Спасибо 29 раз(а) в 24 сообщении(ях)
|
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
|
|
|
31.05.2013, 23:12
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.05.2011
Адрес: Харьков
Сообщений: 5,049
Сказал спасибо: 592
Сказали Спасибо 3,968 раз(а) в 1,826 сообщении(ях)
|
Re: Чтение DS18B20
Цитата:
|
if(PINB.4==1) read_byte |= (1‹‹(i-1)); //если на входе +5в, устанавливаем 1 в нужном разряде
|
А i случаем не портится?
|
|
|
Сказали "Спасибо" alvadep
|
|
|
01.06.2013, 00:00
|
|
Прописка
Регистрация: 29.06.2007
Сообщений: 217
Сказал спасибо: 143
Сказали Спасибо 13 раз(а) в 11 сообщении(ях)
|
Re: Чтение DS18B20
Нет,i не портится,проверял.electroTrash спасибо!Я чот не додумался до такого простого решения,нагородил кучу всего).Буду Ваш код использовать.Спасибо ВСЕМ.Удачи.
P/S Дошло!!!Младшим битом ВПЕРЁД!!!Я знал а пхал младший в старший!Ну как так можно перепутать?А ведь перепутал,и 2 вечера парился(((.Большое спасибо Ребята что вывели из ступора!)))
|
|
|
|
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
|
|
Гражданин KAZUS.RU
Регистрация: 05.04.2009
Сообщений: 976
Сказал спасибо: 35
Сказали Спасибо 155 раз(а) в 134 сообщении(ях)
|
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.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 10:07.
|
|