Сб ноя 01, 2008 20:34:15
Сб ноя 01, 2008 20:43:58
Вс ноя 02, 2008 10:22:05
1. Почему???Если МК принимает данные, то опрос уровня в шине он должен сделать на промежутке от 13-й до 15-й микросекунде тайм-слота.
Следуя этому утверждению, да и с точки зрения "здравого смысла", для того, чтобы исключить влияние переходных процессов в начале и конце тайм-слота, МК должен ввести данные в середине слота....ведущий "тянет время" насколько это возможно при передаче, и старается как можно позже опрашивать линию при приеме - в этом случае вероятность правильного восприятия сигнала наиболее высока.
Вс ноя 02, 2008 17:03:28
Вс ноя 02, 2008 20:38:56
Вс янв 17, 2010 11:29:57
Вс янв 17, 2010 13:17:19
1. а как же без CRC вы сделали свой термометр?roma писал(а):Огромное спасибо за доходчивое обьяснение интерфейса. Я сделал термометр с использованием Tiny2313 и Ds18b20 всё прекрасно работает. И теперь хочу поставить в линию два DS18B20. А для этого надо знать как вычислять CRC. Скажите пожалуйста правильно ли я понял- CRC=((((((байт1 xor '0x00') xor байт2)xor байт3)xor байт4)xor байт5)xor байт6)xor байт7)
Вс янв 17, 2010 17:18:45
ARV писал(а):roma писал(а):1. а как же без CRC вы сделали свой термометр?
2. вы не правильно поняли алгоритм подсчета CRC
Вс янв 17, 2010 17:29:03
да так и понимать - неправильно вы делаете. CRC должно вычисляться при любом чтении из датчика, причем читать положено не первые 2 байта, а все 9 байт. иначе, если была помеха, вы никогда не узнаете, что данные искажены - будет показывать -18 градусов у больного гриппом, и точкаroma писал(а):1. Reset-presence-skip rom-конвертировать температуру-жду одну секунду-reset-presence-skip_rom-read-читаю только первые два байта и через одну секунду все по новой.(В линии у меня ТОЛЬКО ОДИН DS18B20. Я честно говоря не понимаю "а как же без CRC вы сделали свой термометр?")
здесь на РадиоКоте я публиковал статью с исходниками на ассемблере - там есть и обмен, и рсчет CRC. посмотрите среди статей, я сам не помню, где это.roma писал(а):2. Если у вас есть готовый кусок программы подсчёта CRC на ассемблере вышлете мне его пожалуйста. Или ссылочку с ответом на мой первый вопрос.
адрес по корпусу не узнать, во всяком случае, никакой достоверной инфы об этом нет. его можно считать из каждого датчика поотдельности и запомнить, либо использовать возможность "поиска" адресов всех датчиков на шине. второй вариант для реализации на ассемблере достаточно сложен, т.к. имеет неслабый алгоритм, в ктором легко запутаться. наконец, вы можете при помощи простейщего адаптера к СОМ-порту считать в компьютер адреса датчиков и затем их использовать в своей программе, как константы.roma писал(а):3. Как узнать адрес DS18B20? На корпусе нарисованны какие то циферки и буковки в три или четыре строчки не помню. Может быть часть этих циферок и есть адрес- имя термометра. Вобщем подскажите пожалуйста как узнать адрес?
Пн фев 15, 2010 11:04:23
int i = 5000;
do
{
i--;
}
while(i>0)
Вт мар 23, 2010 02:08:16
Вт мар 23, 2010 05:28:41
Вт мар 23, 2010 08:06:50
VIY писал(а):AVR, писал программку ИСКЛЮЧИТЕЛЬНО по вашей статье(на ассемблере), наконец-то у меня заработал датчик.. В этой теме viewtopic.php?f=20&t=9863&p=425195#p425195 я написал, почему у меня ОООчень долго не получалось, и некоторые личные наблюдения,..
Возможно не лишним было-бы внести некоторые дополнения в вашу статью, т.к. не исключено, что кто-та ещё попытается самостоятельно написать программу.. Возможно небольшая пометочка снизу позволит сэкономить кому-то уйму времени
Вт мар 23, 2010 10:11:05
Вт мар 23, 2010 11:37:17
Вт мар 23, 2010 23:55:12
ARV писал(а):"не менее 1 мкс" или, что то же самое, "1 мкс или более" - предел неявный...
Ср мар 24, 2010 00:45:43
ctpexhih писал(а):или мне придется использовать ассемблер?
#define Delay_us(x) __delay_cycles(x * FCLK_MHZ)
//---------- Генерация импульса сброса: ----------
bool TReset(void)
{
char si;
Port_OWP_0; //OWP <- 0
Delay_us(500); //delay 500 uS
si = __save_interrupt();
__disable_interrupt(); //запрещение прерываний
Port_OWP_Z; //OWP <- 1
Delay_us(14); //delay 14 uS
if(Pin_OWP) //если OWP = 0, то ошибка
{
Delay_us(52); //delay 52 uS
if(!Pin_OWP) //если OWP = 1, то ошибка
{
__restore_interrupt(si); //восстанавление прерываний
Delay_us(250); //delay 250 uS
if(Pin_OWP) //если OWP = 0, то ошибка
{
return(1); //если ошибок нет, термометр присутствует
}
}
}
__restore_interrupt(si); //восстанавление прерываний в случае ошибки
return(0);
}
//---------- Запись/чтение байта по однопроводной шине: ----------
char TByte(char dat)
{
char res;
for(char i = 0; i < 8; i++)
{
res = res >> 1;
if(TBit(dat & 1)) res |= 0x80;
else res &= ~0x80;
dat = dat >> 1;
}
return(res);
}
//---------- Запись/чтение бита по однопроводной шине: ----------
bool TBit(bool b)
{
char si;
si = __save_interrupt();
__disable_interrupt(); //запрещение прерываний
Port_OWP_0; //OWP <- 0
Delay_us(2); //delay 2 uS
if(b) Port_OWP_Z; //bit = 1, OWP <- 1
Delay_us(13); //delay 13 uS
bool owp = Pin_OWP; //чтение порта
Delay_us(45); //delay 45 uS
Port_OWP_Z; //OWP <- 1
__restore_interrupt(si); //восстанавление прерываний
Delay_us(2); //delay 2 uS
return(owp);
}
//---------- Вычисление контрольной суммы: ----------
void Do_Crc8(char b, char *crc)
{
for(char i = 0; i < 8; b = b >> 1, i++)
if((b ^ *crc) & 1) *crc = ((*crc ^ 0x18) >> 1) | 0x80;
else *crc = (*crc >> 1) & ~0x80;
}
Вс мар 27, 2011 13:19:03
Пт апр 01, 2011 00:45:24
IM1 писал(а):... что девайс для каждого конкретного измерения сам вычисляет CRC и передает его девятым байтом? Ну и обсчитывать соответственно придется не 8, а 9 байтов.
Пт апр 01, 2011 08:20:52