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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> DS18b20 неправильно показывает температуру, Когда работает софтовый USB(от obdev)
Rst7
сообщение Nov 6 2009, 13:41
Сообщение #16


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
но я не совсем понял что вы написали.


Разъясняю. Если есть свободный UART (это написано в посте выше), то можно работать с 1W используя UART (код приведен, как подключить - написано), при этом прерывания запрещены минимальное время (на 4 такта).


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
xemul
сообщение Nov 6 2009, 13:44
Сообщение #17



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(Br.Misha @ Nov 6 2009, 16:36) *
Rst7, извиняюсь но я не совсем понял что вы написали. в моем девайсе чтоит датчик не с паразитным питанием и подтянут 2к2, но причем тут юарт и зачем соеденять Rx и Tx?

Using a UART to Implement a 1-Wire Bus Master
У производителя много аппнотов по ванвари. Имеет смысл ознакомиться.
Go to the top of the page
 
+Quote Post
Br.Misha
сообщение Nov 7 2009, 10:30
Сообщение #18


Местный
***

Группа: Validating
Сообщений: 253
Регистрация: 21-12-08
Пользователь №: 42 646



Блин..... у меня почему то так и не получилось реализовать 1wire на UART'e
Rst7, а у вас есть рабочая либа для работы с DS18B20 через UART?
Go to the top of the page
 
+Quote Post
Rst7
сообщение Nov 7 2009, 11:11
Сообщение #19


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
Rst7, а у вас есть рабочая либа для работы с DS18B20 через UART?


О_о

А что по Вашему я в пост под тег codebox положил?


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Br.Misha
сообщение Nov 7 2009, 11:17
Сообщение #20


Местный
***

Группа: Validating
Сообщений: 253
Регистрация: 21-12-08
Пользователь №: 42 646



гы....странно. какой та код маленький......
Go to the top of the page
 
+Quote Post
Br.Misha
сообщение Nov 7 2009, 13:43
Сообщение #21


Местный
***

Группа: Validating
Сообщений: 253
Регистрация: 21-12-08
Пользователь №: 42 646



такс.... переделал я вашу либу, вот что получилось:
CODE
static unsigned char OWByte(unsigned char b )
{
unsigned char i=8;
//UBRR0=10; //115200
UBRRH = 0;
UBRRL = 12;
UCSRA |= (1<<U2X);

do
{
unsigned char d=0x00;
if (b&1) d=0xFF;
cli();
UDR=d;
UCSRA=(1<<TXC);
sei();
//while(!UCSRA_TXC);
while(!(UCSRA&(1<<TXC)));
b>>=1;
if (UDR>0xFE) b|=128;
}
while(--i);
return b&255;
}

static unsigned char OWReset(void)
{
unsigned char c;
UCSRB=(1<<RXEN)|(1<<TXEN);
//UBRR0=129; //9600
UBRRH = 0;
UBRRL = 77;
UCSRA &= ~(1<<U2X);

//while(UCSRA_RXC) UDR; //Зачистка буферов
while(UCSRA&(1<<RXC)) UDR; //Зачистка буферов
cli();
UDR=0xF0;
UCSRA=(1<<TXC);
sei();
//while(!UCSRA_TXC);
while(!(UCSRA&(1<<TXC)));
c=UDR;
if (c!=0xF0) return 1;
return 0;
}

void StartMeasureTemp(void)
{
if (!OWReset()) return;
OWByte(0xCC); //Skip ROM
OWByte(0x44); //Convert Temperature
}

int ExtractMeasureTemp_one(void)
{
if (!OWReset()) return -273*16;
OWByte(0xCC); //Skip ROM
OWByte(0xBE); //Read scratchpad
int v=OWByte(0xFF);
v|=OWByte(0xFF)<<8;
return v;
}


насколько я понял, вы писали в IAR, я переделал на ВинАВР но не понял что означает строка while(UCSRA_RXC) UDR;, для чего тут UDR?
Причина редактирования: Уменьшение видимого размера цитаты исходника.
Go to the top of the page
 
+Quote Post
Андрей Лютько
сообщение Nov 7 2009, 22:27
Сообщение #22





Группа: Участник
Сообщений: 6
Регистрация: 26-09-07
Пользователь №: 30 853



Цитата(Br.Misha @ Nov 7 2009, 17:43) *
но не понял что означает строка while(UCSRA_RXC) UDR;, для чего тут UDR?

Если в UDR есть какие-то ранее принятые данные, то читаем их из приемного буфера UDR в "никуда". Соответственно, после того, как этот цикл выполнится, регистр UDR будет чист.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 8 2009, 12:34
Сообщение #23


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Br.Misha @ Nov 7 2009, 16:43) *
... но не понял что означает строка while(UCSRA_RXC) UDR;, для чего тут UDR?

Посмотрите эту тему.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Br.Misha
сообщение Nov 8 2009, 17:35
Сообщение #24


Местный
***

Группа: Validating
Сообщений: 253
Регистрация: 21-12-08
Пользователь №: 42 646



блин, я пару часов назад написал тут сообщение. куда оно пропало?
Go to the top of the page
 
+Quote Post
Rst7
сообщение Nov 8 2009, 18:38
Сообщение #25


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
куда оно пропало?


Не знаю. Мне уведомление пришло. Если Вам не приходило на почту уведомление об удалении Вашего сообщения модератором, то может сглючил движок форума. Я, например, в тексте сообщения, включенного в уведомление, криминала с точки зрения нарушения правил форума вроде не увидел, так что более вероятен глюк, что более неприятно sad.gif


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 8 2009, 22:37
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Rst7 @ Nov 8 2009, 21:38) *
так что более вероятен глюк, что более неприятно sad.gif

Никаких глюков. Очередная неформатированная портянка с исходником удалена. Несколько предыдущих, кто-то из модераторов редактировал и указывал причину редактирования. Хватит. Уведомление Автору, естественно, отправлено.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Rst7
сообщение Nov 9 2009, 06:41
Сообщение #27


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
Никаких глюков.


Понятно.

2 Br.Misha:

Посмотрел я на Ваш код, если ничего не напутали с установкой скорости порта, то все должно работать. Пробуйте в реальном железе. Я то Вам кусок из рабочего проекта скопипастил.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Br.Misha
сообщение Nov 15 2009, 11:32
Сообщение #28


Местный
***

Группа: Validating
Сообщений: 253
Регистрация: 21-12-08
Пользователь №: 42 646



Rst7, всё работает правильно!!! ExtractMeasureTemp_one возвращает правильные значения 16 битного температурного регистра.
Волько вот никак не пойму почему не получаеться конвертировать в нормальную температуру, делал всё как и в библиотеке с первого поста. сделал ф-цию showTemperature:
CODE
void showTemperature(char *ds_buffer)
{
unsigned char ds_temp[2]; // массив для хранения возвращаемой температуры
unsigned char ds_digit; // целое значение
unsigned char ds_decimal; //десятичное значение
unsigned int ds_data = ExtractMeasureTemp_one();// считавыем значение температуры и записываем в переменную
ds_temp[0]=(ds_data>>8);// старший байт
ds_temp[1]=(ds_data<<8);// младший байт
ds_digit=ds_temp[0]>>4;// сюда пишем старшие 4 бита старшего байта
ds_digit|=(ds_temp[1]&0x07)<<4;// сюда пишем младшие 4 бита младшего байта
ds_decimal=ds_temp[0]&0xf;//
ds_decimal*=5; // десятичное значение
if (ds_temp[1]>0xFB) // еси датчик показывает меньше -55С
{
ds_digit = 127-ds_digit; //
ds_buffer[0] = '-'; // ставим минус
} else ds_buffer[0] = '+'; // в противоположном случает - плюс
ds_buffer[1] = to_ascii(ds_digit/100); //
ds_buffer[2] = to_ascii((ds_digit%100)/10); //
ds_buffer[3] = to_ascii(ds_digit%10); //
ds_buffer[4] = '.'; //
ds_buffer[5] = to_ascii((ds_decimal%100)/10);//
}


в бесконечном цикле сначала вызываю StartMeasureTemp и спустя 750мс эту функцию.

проблема в том, что по ЮСБ мне приходит температура 000.0С а еси напишу
ds_temp[1]=(ds_data>>8);// старший байт
ds_temp[0]=(ds_data<<8);// младший байт
тогда приходит +016.0С.
в чем тут может быть проблема? я же все вроде правильно сделал.

Кстате, забыл написать.
Когда я просто отсылаю с МК на комп значение возвращаемое ExtractMeasureTemp_one() то при смене температуры меняеться значение этой переменной, показывая реальную температуру но с ф-цией showTemperature приходит постоянно одинаковое значениеsad.gif я даже представить не могу в чем косяк.
Go to the top of the page
 
+Quote Post
microsin
сообщение Mar 2 2010, 14:45
Сообщение #29


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 27-11-08
Пользователь №: 41 999



Один умный человек как-то скрестил V-USB с протоколом 1-Wire. См. AVR-USB-MEGA16: измеряем и контролируем температуру.

Сообщение отредактировал microsin - Mar 2 2010, 14:46
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 09:52
Рейтинг@Mail.ru


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