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

 
 
> DS18b20 неправильно показывает температуру, Когда работает софтовый USB(от obdev)
Br.Misha
сообщение Nov 5 2009, 14:02
Сообщение #1


Местный
***

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



Здраствуйте!
Вобщем хочу я сделать USB термомерт используя мегу8 и DS18b20. Вобщем написал програмку, а когда запустил то по USB(CDC) начали приходить неверные данные с термометра, сначала грешил на DS18b20 но когда подключил его к другому девайсу то он там работал нормально. Потом я отключил USB (в самом коде) и отправлял даные с датчика на UART, на компе было видно реальную температуру. Дальше я написал программу так, чтобы юсб был включен но даные передавались на ЮАРТ и тут ошибка повториласьsad.gif
Вобщем насколько я понял, то комп постоянно отправляет даные на мегу8 и очень часто вызываеться прерывание по INT0 даже тогда, когда меряеться температура а так как задержки между отправкой и приемом команд к DS маленькие, несколько микросекунд(хотя задержка для измерения температуры датчиком минимум 750мс) то или при отправке комманды долго передается бит и DS перезагружаеться, или когда принимаються то МК невовремя реагирует на комманды и получает неправильные данные. Пробовал отключать глобольно прерывания(cli) перед измерением температуры и включать(sei) после измерения но тогда МК вообще не шлет даные по ЮСБ и не отвечает на комманды с ЮСБ(например когда отправляю "1" то он должен прислать "one", 2 - "two") . Ещё пробовал делать так:
------- отключил прерывания перед отправкой комманд к DS чтобы он измерил температуру.
------- включил после этих комманд потому что далее должна быть задержка 800мс.
------- спустя 800 мс отключал, отправлял комманду чтения температуры, когда он присылал даные опять включал
------- эфект тот же!

Кароче мне нада сделать так,чтобы как то отключать ЮСБ на время измерения температуры ну или ещё что нибутьsmile.gif.

Частота 12Мгц, питание от ЮСБ. Вот клавный файл и библиотека для измерения температуры которую я скачал с инета, немного переделал после чего она работает отлично, правда тока на 1 датчик http://upwap.ru/619341 .

Заранее спасиба!!!!!!!

вот кстате те самые даные с термометра:

+031.1
+125.7
+127.5
+031.3
+023.7
-000.7
+127.1
+021.3
+031.1
-000.7
-000.7
-000.7
-000.7
-000.7
+125.7
-000.7
-000.7
+119.7
+063.7
-000.7
-000.7
+125.6
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Андрей Лютько
сообщение Nov 5 2009, 14:43
Сообщение #2





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



Во время чтения/записи данных по шине 1-Wire yужно запрещать прерывания на время tREC+tRDV (см. документацию на DS18b20). В течение этого промежутка времени данные спокойно пишутся/читаются с шины. У меня нижеприведенный код вполне успешно работает совместно с прерываниями и проблем нет.

CODE
#include <iom168.h>
//#include <inavr.h>
#include <ina90.h>
#include "OneWire.h"

#define _1W_CLK 8000000
#define _1W_TKSPer10uS _1W_CLK/100000
#define MILLION 1000000
#define tRSTL 48*_1W_TKSPer10uS //480uS
#define tPDH 65*_1W_CLK/MILLION //65uS
#define tRSTH tRSTL-tPDH
#define tSAMPLE 12*_1W_CLK/MILLION
#define tSLOT 12*_1W_TKSPer10uS //120uS
#define tLOW1 0*_1W_CLK/MILLION //3uS
#define t1uS 1*_1W_CLK/MILLION //3uS
#define tLOW0 10*_1W_TKSPer10uS //120uS
#define tREC 7*_1W_CLK/MILLION //7uS

//==================================================================
//Выходы 1Wire
//1Wire port/ SCK ( D INPUT/OUTPUT)
#define OWIREIOOUT DDRC|=(1<<2)
#define OWIREIOIN DDRC&=~(1<<2)
#define OWIREIOH PORTC|=(1<<2)
#define OWIREIOL PORTC&=~(1<<2)
#define OWIRE (PINC&(1<<2))


//==================================================================
//1wire atmega DRIVERS
//
//-------------------------------------------------------------------------
//This procedure calculates the cumulative Dallas Semiconductor 1ЦWire CRC of all bytes passed to it. The result
//accumulates in the global variable CRC.
unsigned char CRC8(unsigned char inData, unsigned char seed)
{//from AVR318
unsigned char bitsLeft;
unsigned char temp;

for (bitsLeft = 8; bitsLeft > 0; bitsLeft--)
{
temp = ((seed ^ inData) & 0x01);
if (temp == 0)
{
seed >>= 1;
}
else
{
seed ^= 0x18;
seed >>= 1;
seed |= 0x80;
}
inData >>= 1;
}
return seed;
}
//-------------------------------------------------------------------------
//Сброс устройств на шине 1W и чтение Presence Pulse
// Возврат 0- ничего нет
// 1- Есть устройство
// 2- Линия в КЗ
char Reset1W(void)
{
OWIREIOOUT;
__disable_interrupt();
OWIREIOL;
__delay_cycles(tRSTL);
OWIREIOH;
OWIREIOIN;
__delay_cycles(tPDH);
if(!OWIRE)
{ __enable_interrupt();
__delay_cycles(tRSTL);
if(OWIRE)
{ return 1;//Presence pulse
}//if(OWIRE)
else
return 2;//Short circuit
}
__enable_interrupt();
__delay_cycles(tRSTL);
return 0;//Nothing
}
//-------------------------------------------------------------------------
//Проверка наличия 1W устройства
char Check1W(void)
{
if(Reset1W()==1)
{ __delay_cycles(tRSTL);
if(Reset1W()==1)
return 1;
}
return 0;
}
//-------------------------------------------------------------------------
//Передача данных по шине 1Wire
void Write1W(char d)
{ char i;
OWIREIOOUT;
for(i=0;i<8;i++)
{ __disable_interrupt();
OWIREIOL;
__delay_cycles(tLOW1);
if(d&1)
{ OWIREIOH;
__delay_cycles(tSLOT);
}
else
{ __delay_cycles(tLOW0);
OWIREIOH;
}
__enable_interrupt();
__delay_cycles(tREC);
d=d>>1;
}
OWIREIOIN;
}
//-------------------------------------------------------------------------
//Прием данных по шине 1WIRE
char Read1W(void)
{ char i,d=0;
for(i=0;i<8;i++)
{ OWIREIOOUT;
d=d>>1;
__disable_interrupt();
OWIREIOL;
__delay_cycles(t1uS);
OWIREIOH;
OWIREIOIN;
__delay_cycles(tSAMPLE);
if(OWIRE)
d|=0x80;
__enable_interrupt();
__delay_cycles(tSLOT);//tRELEASE 30uS
}
return d;
}

//---------------------------------------------------------------------------
void StartT(char BusNo)//запуск измерения температуры по одной из шин
{ Reset1W();
Write1W(SKIPROM);
Write1W(CONVERTT);
}

//---------------------------------------------------------------------------
float GetT18B20(char *x)//Считывание температуры с датчиков DS18B20,DS1822
{ char i,crc=0;
int j;
char *p;
if(Reset1W()!=1)
return -100;//Нет такого датчика
p=x;
// Write1W(SKIPROM);
Write1W(MATCHROM);
for(i=0;i<8;i++)
{ //OutChar(*p);
Write1W(*p++);//Передача 8 байт адреса
}
Write1W(READSCRATCHPAD);
p=x;
for(i=0;i<8;i++)
{ *p=Read1W();
crc=CRC8(*p,crc);
//OutChar(*p);
*p++;
}
if(Read1W()!=crc)
return -101;//CRC error
p=x;
j=p[1]<<8;
j|=p[0];
return (float)j/16.0;
}

//---------------------------------------------------------------------------
float GetT18S20(char *x)//Считывание температуры с датчика DS18S20
{ char i,crc=0;
int j;
char *p=x;
if(Reset1W()!=1)
return -100;//Нет такого датчика
Write1W(SKIPROM);
// for(i=0;i<8;i++)
// Write1W(*p++);//Передача 8 байт адреса
Write1W(READSCRATCHPAD);
p=x;
for(i=0;i<8;i++)
{ *p=Read1W();
crc=CRC8(*p,crc);
*p++;
}
if(Read1W()!=crc)
return -101;//CRC error
p=x;
j=p[0];
return (float)j/2.0;
}

Код же с http://upwap.ru/619341 абсолютно не имеет никаких критических секций и правильно работать в системе с прерываниями без модификации не будет.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Br.Misha   DS18b20 неправильно показывает температуру   Nov 5 2009, 14:02
- - _Pasha   Цитата(Br.Misha @ Nov 5 2009, 18:02) Ещё ...   Nov 5 2009, 14:44
- - Br.Misha   вобщем сделал на "молекулярном уровне": ...   Nov 5 2009, 15:56
|- - _Pasha   Цитата(Br.Misha @ Nov 5 2009, 19:56) вобщ...   Nov 5 2009, 21:10
- - Br.Misha   Мужики, ну помогите, мож тут ещё че не так? Я уже ...   Nov 5 2009, 19:06
|- - xemul   Цитата(Br.Misha @ Nov 5 2009, 22:06) мож ...   Nov 5 2009, 21:00
- - Андрей Лютько   C OBDEV не использовал. В файле usbdrvasm есть ст...   Nov 5 2009, 20:57
- - Br.Misha   фух блин...... переделал код но опять не работает....   Nov 6 2009, 01:02
|- - xemul   Цитата(Br.Misha @ Nov 6 2009, 04:02) Обья...   Nov 6 2009, 07:43
- - Br.Misha   но почему когда выполняеться _delay_us он не може...   Nov 6 2009, 09:03
|- - xemul   Цитата(Br.Misha @ Nov 6 2009, 12:03) но п...   Nov 6 2009, 09:45
- - _Pasha   Раз Вы таки не поняли, показываю. Измените эти две...   Nov 6 2009, 10:38
- - Rst7   Господа, о чем вы? Понятное дело, что единственный...   Nov 6 2009, 11:33
- - Br.Misha   _Pasha, я понял и делал так уже, юсб не отвечал по...   Nov 6 2009, 13:36
|- - xemul   Цитата(Br.Misha @ Nov 6 2009, 16:36) Rst7...   Nov 6 2009, 13:44
- - Rst7   Цитатано я не совсем понял что вы написали. Разъя...   Nov 6 2009, 13:41
- - Br.Misha   Блин..... у меня почему то так и не получилось ре...   Nov 7 2009, 10:30
- - Rst7   ЦитатаRst7, а у вас есть рабочая либа для работы с...   Nov 7 2009, 11:11
- - Br.Misha   гы....странно. какой та код маленький......   Nov 7 2009, 11:17
- - Br.Misha   такс.... переделал я вашу либу, вот что получилось...   Nov 7 2009, 13:43
|- - Андрей Лютько   Цитата(Br.Misha @ Nov 7 2009, 17:43) но н...   Nov 7 2009, 22:27
|- - demiurg_spb   Цитата(Br.Misha @ Nov 7 2009, 16:43) ... ...   Nov 8 2009, 12:34
- - Br.Misha   блин, я пару часов назад написал тут сообщение. ку...   Nov 8 2009, 17:35
- - Rst7   Цитатакуда оно пропало? Не знаю. Мне уведомление ...   Nov 8 2009, 18:38
|- - zltigo   Цитата(Rst7 @ Nov 8 2009, 21:38) так что ...   Nov 8 2009, 22:37
- - Rst7   ЦитатаНикаких глюков. Понятно. 2 Br.Misha: Посм...   Nov 9 2009, 06:41
- - Br.Misha   Rst7, всё работает правильно!!! Extrac...   Nov 15 2009, 11:32
- - microsin   Один умный человек как-то скрестил V-USB с протоко...   Mar 2 2010, 14:45


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

 


RSS Текстовая версия Сейчас: 26th August 2025 - 06:05
Рейтинг@Mail.ru


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