|
DS18b20 неправильно показывает температуру, Когда работает софтовый USB(от obdev) |
|
|
|
Nov 7 2009, 13:43
|
Местный
  
Группа: 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?
Причина редактирования: Уменьшение видимого размера цитаты исходника.
|
|
|
|
|
Nov 7 2009, 22:27
|
Группа: Участник
Сообщений: 6
Регистрация: 26-09-07
Пользователь №: 30 853

|
Цитата(Br.Misha @ Nov 7 2009, 17:43)  но не понял что означает строка while(UCSRA_RXC) UDR;, для чего тут UDR? Если в UDR есть какие-то ранее принятые данные, то читаем их из приемного буфера UDR в "никуда". Соответственно, после того, как этот цикл выполнится, регистр UDR будет чист.
|
|
|
|
|
Nov 8 2009, 18:38
|

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

|
Цитата куда оно пропало? Не знаю. Мне уведомление пришло. Если Вам не приходило на почту уведомление об удалении Вашего сообщения модератором, то может сглючил движок форума. Я, например, в тексте сообщения, включенного в уведомление, криминала с точки зрения нарушения правил форума вроде не увидел, так что более вероятен глюк, что более неприятно
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Nov 9 2009, 06:41
|

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

|
Цитата Никаких глюков. Понятно. 2 Br.Misha: Посмотрел я на Ваш код, если ничего не напутали с установкой скорости порта, то все должно работать. Пробуйте в реальном железе. Я то Вам кусок из рабочего проекта скопипастил.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Nov 15 2009, 11:32
|
Местный
  
Группа: 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 приходит постоянно одинаковое значение  я даже представить не могу в чем косяк.
|
|
|
|
|
Mar 2 2010, 14:45
|
Участник

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

|
Один умный человек как-то скрестил V-USB с протоколом 1-Wire. См. AVR-USB-MEGA16: измеряем и контролируем температуру.
Сообщение отредактировал microsin - Mar 2 2010, 14:46
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|