Всё по DS18(B/S)20.
- Реклама
Операцию деления можно исключить, умножив код на 160 (0,1ºC), 1600(0,01ºC) и т.д. Младший байт отбрасывается (при усечении) или его 7-бит прибавляется к результату, расположенному в старших байтах, а затем оный отбрасывается.
у меня в термометре нет ни умножения, ни деления. есть только сдвиги.
сначала я вывожу целую часть, потом дробную часть умножаю на 10 сдвигами и сложением, и сразу получаю цифру десятых.
сначала я вывожу целую часть, потом дробную часть умножаю на 10 сдвигами и сложением, и сразу получаю цифру десятых.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Приветствую!Настало время CRC.теорию вроде как понял, осталось реализовать. 1. Первое, что не понятно это СRC8==100110001, как вообще это вычислено? принимаем это как константу так понял. 2. считываю 56 бит с датчика, куда и как столько данных поместить?в какую-то одну переменную или разбить на байты по 8 бит,то тогда вообще не понятно как мне применить ИЛИ-НЕ с 8 битным байтом и 9 битным СRC8...
по-моему, настало время изучить документацию как следует. там все написано - и что считывать, и куда, и как CRC считать. и на сайте полно статей, и даже моя есть среди них. И даже с примерами...ROMan2947 писал(а):Настало время CRC
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Реклама
Starichok51 писал(а):нет ни умножения, ни деления
Это как ? 2 предложения и оба друг другу противоречатStarichok51 писал(а): умножаю на 10 сдвигами и сложением
Когда считанное значение делится на 16, получается всё абсолютно тоже самое - выделение целого и дробной частей. А как уже деление делать, сдвигами или операцией деления - дело тридесятое.
Так что, Вы делаете всё тоже самое, только через ...
ну, не корректно выразился.
нет "явного" умножения, с использованием команды mul.
а умножение косвенное - через сдвиги и сложение.
считанные 2 байта я 4 раза сдвигаю влево (умножение на 16 сдвигами). в одном регистре получается целая часть, в другом регистре остается дробная часть.
сначала вывожу целую часть, потом дробную "умножаю" на 10 и вывожу получившуюся цифру десятых.
в общем-то, дело вкуса каждого человека, как ему делать...
нет "явного" умножения, с использованием команды mul.
а умножение косвенное - через сдвиги и сложение.
считанные 2 байта я 4 раза сдвигаю влево (умножение на 16 сдвигами). в одном регистре получается целая часть, в другом регистре остается дробная часть.
сначала вывожу целую часть, потом дробную "умножаю" на 10 и вывожу получившуюся цифру десятых.
в общем-то, дело вкуса каждого человека, как ему делать...
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
как же я тупанул со своим желанием избавиться от применения команды mul...
это же не 2 байта умножить на 2 байта...
тут надо-то всего 2 строчки - загрузить в регистр число 10 и перемножить 2 регистра.
а я взялся двигать, складывать...
это же не 2 байта умножить на 2 байта...
тут надо-то всего 2 строчки - загрузить в регистр число 10 и перемножить 2 регистра.
а я взялся двигать, складывать...
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
С Новым годом всех!!!
Сил нет уже втыкать к код, ошибки не вижу но она есть. Считываю ROM побитно в DATA_REGISTR, первый считанный бит 1 ,хоть и должен быть 0. остальные биты считываются исправно. Откуда берется первая 1?
Сил нет уже втыкать к код, ошибки не вижу но она есть. Считываю ROM побитно в DATA_REGISTR, первый считанный бит 1 ,хоть и должен быть 0. остальные биты считываются исправно. Откуда берется первая 1?
Код: Выделить всё
int read_bit(void)
{
int bit=0x00;
BUS_LOW;
_delay_us(3);
BUS_HIGT;
_delay_us(20);
if(ds18b20_PIN&(1<<DQ))
{
bit=0x01;
}
else
{
bit=0x00;
}
_delay_us(60);
return bit;
}
void registr(void)
{
int DATA_REGISTR = 0x00;
int j = 0x00;
while (j<=(SIZE))
{
if (DATA_REGISTR&0x80) // 0x80==1<<7
{
DATA_REGISTR = DATA_REGISTR << 1;
DATA_REGISTR |= read_bit(); // enter_bit(&i);
//DATA_REGISTR ^= 0x131;
}
else
{
DATA_REGISTR = DATA_REGISTR << 1;
DATA_REGISTR |= read_bit(); //enter_bit(&i);
}
j++;
}
}
void read_ID (void)
{
ds18b20_init();
write_ds18b20(READ1_ROM);
registr();
}Не вижу разницы между if и else в функции со странным именем registr.
Непонятно, что такое SIZE, и есть чувство, что цикл лишний раз выполняется.
20мкс пауза при чтении бита - как по мне, многовато.
Непонятно, что такое SIZE, и есть чувство, что цикл лишний раз выполняется.
20мкс пауза при чтении бита - как по мне, многовато.
[uquote="WiseLord",url="/forum/viewtopic.php?p=3273416#p3273416"]Не вижу разницы между if и else в функции со странным именем registr.[/uquote]
это функция для чтения ,бита и вычисления СRC . там в if коммент.вот и стало без разницы, но это после.
это функция для чтения ,бита и вычисления СRC . там в if коммент.вот и стало без разницы, но это после.
Добавлено after 6 minutes 49 seconds:#define SIZE 8 // количество считываемых бит
считывание ROM все ОК,да с осциллографом щупал там все допустимо и 15мкс выставлял. Но вот откуда первый бит 1 берется ХЗ20мкс пауза при чтении бита - как по мне, многовато.
У меня есть вычислитель crc8 1wire: https://github.com/d-el/PS3604L_Regulat ... /src/crc.c
А вот как использовать: https://github.com/d-el/PS3604L_Regulat ... /ds18TSK.c
Лучше прими весь пакет а затем посчитай контрольную сумму.
А вот как использовать: https://github.com/d-el/PS3604L_Regulat ... /ds18TSK.c
Лучше прими весь пакет а затем посчитай контрольную сумму.
А как с округлением? Лично я десятые от этой 18х20 делал по таблице в 16 байт. Четыре младших бита кода температуры - вход в таблицу, на выходе - десятичная цифра, которую следует светить после точки. Можно прямо в ASCII, если надо.Starichok51 писал(а):потом дробную часть умножаю на 10 сдвигами и сложением, и сразу получаю цифру десятых.
Таблица такая:
Код: Выделить всё
"0112334456678899"Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Если нужно округление то как обычно:
temperature = (scratchpad * 10 + (16/2)) / 16; //Деление с округлением
К числителю прибавить половину знаменателя.
temperature = (scratchpad * 10 + (16/2)) / 16; //Деление с округлением
К числителю прибавить половину знаменателя.
после умножения на 10 получаем целое число (от 0 до 9), потом смотрим старший бит остатка в дробной части. если есть старший бит, то делаем инкремент получившейся цифры десятых.afz писал(а):А как с округлением? Лично я десятые от этой 18х20 делал по таблице в 16 байт.
а можно и по таблице. с таблицей, пожалуй, будет быстрее, чем умножать и потом анализировать округление.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
[uquote="Starichok51",url="/forum/viewtopic.php?p=3382015#p3382015"][quote="afz"]с таблицей, пожалуй, будет быстрее, чем умножать и потом анализировать округление.[/uquote]
Зависит от архитектуры, нужно уточнять.
Табличная математика для такого простого выражения это вообще каменный век.
Зависит от архитектуры, нужно уточнять.
Табличная математика для такого простого выражения это вообще каменный век.
Вот именно, зависит. На STM32, да даже на больших АВР-ках, программируя на Си, естественно, этой ерундой никто не будет заниматься. А вот на мелких ATtiny, на которых нет даже команды умножения и под которые пишут на Асме - самое то. И этой 18х20 даже полноценное преобразование 2->10 не нужно: считаем, сколько раз можно вычесть 100 (без цикла, поскольку вычесть получится не больше одного раза) - получили старшую цифру, в цикле считаем, сколько раз можно вычесть из остатка 10 - вот вторая цифра, остаток - третья, десятые - по таблице. Ну, еще не забыть, что число может быть и отрицательным, тогда надо запомнить где-то знак минуса и сделать всему числу NEG. Максимум, два десятка машинных команд плюс 16-байтовая таблица, и все.
И вся эта возня, естественно, не ради скорости, а ради компактности кода - подобная задачка легко влезет и в тиньку с 1К флеши (512 машинных команд максимум).
Добавлено after 20 minutes 9 seconds:
И вся эта возня, естественно, не ради скорости, а ради компактности кода - подобная задачка легко влезет и в тиньку с 1К флеши (512 машинных команд максимум).
Добавлено after 20 minutes 9 seconds:
Программируя на Си, лучше всего умножить код числа на 100, прибавить к нему 5 и преобразовать в строку, после чего отбросить последнюю цифру, предпоследняя будет десятыми, остальные - целой частью. Да, перед этим надо учесть минус.Starichok51 писал(а):после умножения на 10 получаем целое число (от 0 до 9), потом смотрим старший бит остатка в дробной части. если есть старший бит, то делаем инкремент получившейся цифры десятых.
а можно и по таблице. с таблицей, пожалуй, будет быстрее, чем умножать и потом анализировать округление.
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
И получите в результате фигню. https://radiokot.ru/forum/viewtopic.php ... 8#p3259348


