Цитата(Harvester @ Mar 8 2014, 20:25)

Указатель - это просто переменная, хранящая адрес в памяти.
Temp - 2-байтная переменная. Если указатель на Temp равен A, то содержимое переменной лежит по адресам [A] и [A+1]. Если мы просто инкрементируем указатель, он станет равным A+2, т.е. будет указывать на следующую 2-байтную переменную. А поскольку нам надо писать "внутрь" переменной, мы приводим тип к указателю на char. Тем самым говорим компилятору, что при инкременте указателя, его значение нужно увеличить не на 2, а на 1. Это позволит нам выполнить запись по адресу [A+1].
То есть если бы мы сделали вот так
Код
((char)&Temp) = w1_receive_byte();//здесь просто адрес переменной привели к типу char и производим по нему запись т.к. переменная двух байтовая то адрес занимает грубо две ячейки и мы одну из них заняли.
((char)&Temp + 1) = w1_receive_byte();//в этой строке следующий адрес переменной приводим к типу char производим по нему запись, но запись получается уже по другим двум ячейкам.
в результате получаем запись двух байтов по двум разным адресам переменной.
А если приводить не к типу, а указателю на тип
Код
(char*)&Temp
и производить запись в указатель всего этого безобразия
Код
*((char*)&Temp)
, то мы записываем данные по, скажем, первой ячейке адреса, предназначенной для младшего байта, а при
Код
*((char*)&Temp+1)
по второй ячейке этого же адреса, предназначенной для старшего байта.
Я на правильном пути?
И ещё попутный вопрос. Правильно ли я выбрал тип переменной char если переменная это дробные числа имеющие разный знак? Может лучше использовать тип float?
вот функция целиком
Код
char temp_18b20(){//функция преобразует полученые с датчика 18b20 данные в температуру
char temp = 0;
if(TD_find()==1)//если устройство присутствует на шине
{
TD_sendcmd(0xcc);//пропустить ROM код, так ка датчик в устройстве один и не требуется идентификация
TD_sendcmd(0x44);//команда датчику преобразовать температуру
_delay_ms(750);//преобразование в 12 битном режиме занимает 750ms
TD_find();//снова опрос присутствия и пропуск кода
TD_sendcmd(0xcc);
TD_sendcmd(0xbe);//команда датчику передать байты (у 18b20 в первых двух байтах содержится температура)
//читаем два байта с температурой и записываем оба байта в двух байтовую переменную
temp = (char)TD_receive_byte();
temp = (temp << 8) | (char)TD_receive_byte();
//переводим в градусы
//пока кода нет, но в результате будут температурные данные
}
//возвращаем температуру
return temp;
}