Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
05.03.2010, 14:55
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.04.2009
Сообщений: 5,611
Сказал спасибо: 1,070
Сказали Спасибо 1,273 раз(а) в 884 сообщении(ях)
|
Re: CodeVisionAVR начинающим с нуля
Сообщение от ish0
|
Прицепите весь текст программы.
|
Двумя постами выше в текстовом файле
Последний раз редактировалось nsl2004; 05.03.2010 в 14:58.
|
|
|
|
05.03.2010, 14:58
|
|
Прописка
Регистрация: 14.04.2009
Сообщений: 103
Сказал спасибо: 17
Сказали Спасибо 11 раз(а) в 10 сообщении(ях)
|
Re: CodeVisionAVR начинающим с нуля
На сайте автора появился 2.06 Лекарство не встречали?
|
|
|
|
05.03.2010, 15:28
|
|
Прописка
Регистрация: 09.08.2006
Сообщений: 198
Сказал спасибо: 14
Сказали Спасибо 27 раз(а) в 20 сообщении(ях)
|
Re: CodeVisionAVR начинающим с нуля
Сообщение от nsl2004
|
temp[i]=ds18b20_temperature(&rom_codes[i].temp_low);
|
Похоже Вам нужно перечитать Кернигана и Ричи т.к. с массивом структур и указателями на них Вы не разобрались. Функции ds18b20_temperature нужно передать в качестве параметра адрес первого элемента структуры размером 9 байт. Вы передаете адрес четвертого элемента структуры, поэтому инфа съедет на 4 байта. Нужно - &rom_codes[i][0] - адрес первого элемента структуры и имеет тип unsigned char * (указатель на символ).
Сообщение от nsl2004
|
printf("t=%i.%d\xf8C\n\r",temp_low);
|
-не нашел как переменная объявлена. Если это rom_codes[i].temp_low - то так и надо указывать, компилятор не экстрасенс.
Сообщение от nsl2004
|
и даже на это printf("t=%i.%d\xf8C\n\r",temp[i][2]);
|
вооще загадка:
Сообщение от nsl2004
|
=%i.%d
|
- за строкой формата должны следовать 2 целочисленные переменные, у Вас одна - temp[i][2].
-кстати о temp[i][2] - если определен массив: float temp[MAX_DEVICES] - то приведенная запись - 2-ой байт 32-х битного числа с плавающей точкой.
P.S. Имелась в виду последняя версия косяков.
|
|
|
|
05.03.2010, 16:08
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.04.2009
Сообщений: 5,611
Сказал спасибо: 1,070
Сказали Спасибо 1,273 раз(а) в 884 сообщении(ях)
|
Re: CodeVisionAVR начинающим с нуля
Сообщение от ish0
|
Похоже Вам нужно перечитать Кернигана и Ричи т.к. с массивом структур и указателями на них Вы не разобрались. Функции ds18b20_temperature нужно передать в качестве параметра адрес первого элемента структуры размером 9 байт. Вы передаете адрес четвертого элемента структуры, поэтому инфа съедет на 4 байта. Нужно - &rom_codes[i][0] - адрес первого элемента структуры и имеет тип unsigned char * (указатель на символ).
|
В том то и проблема что я не могу самостоятельно разобратся как мне получить это значение на терминал. Роэтому и обращаюсь. Литературы перечитал много, но читать в общем это годы. Стараюсь читать разбирая примеры. Когда неполучается обращаюсь за помощью. В этом случае я ориентировался на предложенное Вами rom_codes[i].temp_high подумав что так и надо считывать этот бит. Не могли бы Вы привести пример , как все таки должна выглядеть строка
Сейчас у меня
temp[i]=ds18b20_temperature(&rom_codes[i][0])
Вопрос как переменной temp1 присвоить значение 4ого байта?
Пробовал так printf("t=%i.%d\xf8C\n\r",rom_codes[i].temp_low); но даже сам понимаю , что полная чушь. Компилятор это тоже понял.
Цитата:
|
Если это rom_codes[i].temp_low - то так и надо указывать, компилятор не экстрасенс.
|
В этом и вопрос - указывать где, и каков правильный синтаксис.
Книгу предложенную Вами сейчас поищу.
|
|
|
|
05.03.2010, 17:11
|
|
Прописка
Регистрация: 09.08.2006
Сообщений: 198
Сказал спасибо: 14
Сказали Спасибо 27 раз(а) в 20 сообщении(ях)
|
Re: CodeVisionAVR начинающим с нуля
Сообщение от nsl2004
|
Сейчас у меня
temp[i]=ds18b20_temperature(&rom_codes[i][0])
Вопрос как переменной temp1 присвоить значение 4ого байта?
|
Т.к. функция ds18b20_temperature(&rom_codes[i][0]) читает все 9 байт с датчика в структуру по адресу rom_codes[i], то в переменную temp1 просто копируем значение:
temp1 = rom_codes[i][4]; если rom_codes определен как в примере: unsigned char rom_codes[MAX_DEVICES][9];
Можно определить rom_codes как массив структур:
struct __ds18b20_scratch_pad_struct rom_codes[MAX_DEVICES];
- тогда вызов функции: ds18b20_temperature((unsigned char *)&rom_codes[i]) и соответственно значение temp1 = rom_codes[i].temp_low;
В обоих определениях массива rom_codes выделяется одно и тоже количество байт под хранение данных, но при первом определении, обращение к конкретному полю происходит указанием смещения (в байтах) от начала, например: rom_codes[i][4]. А если использовать второе определение, то используется смысловое название поля структуры: rom_codes[i].temp_low.
Оба стиля программы применимы в "С", в отличие от Паскаля, но создают поле для вариаций написания программы. В этом сила и слабость "С". Общее "правило" выглядит так: когда торопятся - используют байтовый стиль, если нет - используют смысловое обозначение полей в типах данных.
|
|
|
|
05.03.2010, 19:49
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.04.2009
Сообщений: 5,611
Сказал спасибо: 1,070
Сказали Спасибо 1,273 раз(а) в 884 сообщении(ях)
|
Re: CodeVisionAVR начинающим с нуля
ish0,
Спасибо за подробное объяснение. Мне теперь стала более понятна связка между форматом переменной и структурой написания строки. Действительно не очень когда записи можно сделать поразному. Путаница возникат в голове.
Теперь к моим проблемам. Я по логике решил, что если можно обратится к байтам , как подсказано Вами temp1 = rom_codes[i].temp_low; и temp1[i]= rom_codes[i][1]; ( которые идентичны) то я приготовил такой код
Код:
|
{
temp[i]=ds18b20_temperature(&rom_codes[i][0]);
delay_ms(750);
temp0[i]= rom_codes[i][0];
temp1[i]= rom_codes[i][1];
temp2[i]= rom_codes[i][2];
temp3[i]= rom_codes[i][3];
temp4[i]= rom_codes[i][4];
temp5[i]= rom_codes[i][5];
temp6[i]= rom_codes[i][6];
temp7[i]= rom_codes[i][7];
temp8[i]= rom_codes[i][8];
printf("DEVICE #%-u TEMP Value:", i+1);
//printf("\n\r");
printf("T=%i.%d\xf8C\n\r",temp[i]);
printf("B0=%x\n\r",temp0[i]);
printf("B1=%x\n\r",temp1[i]);
printf("B2=%x\n\r",temp2[i]);
printf("B3=%x\n\r",temp3[i]);
printf("B4=%x\n\r",temp4[i]);
printf("B5=%x\n\r",temp5[i]);
printf("B6=%x\n\r",temp6[i]);
printf("B7=%x\n\r",temp7[i]);
printf("B8=%x\n\r",temp8[i]); |
Когда я заменил вывод на 16 ричный то получил просто ROM code. Этот результат я както получал уже в ходе экспериментов. Т.е достучатся до temp_high не удалось. Мне подумалось что надо как то считать skratch pad. Сейчас до меня доперло, что перебирая массив ROM code я его и перебираю, и получаю правильный результат. Уникальный код изделия. На скрине это видно
Т.е этот путь в никуда и мою задачу не решил. Мне надо выполнить команду Чтение памяти [BEh] и может после этого поробовать считать байты? Следующий вопрос будет как ( извините за наглость)?
|
|
|
|
05.03.2010, 21:13
|
|
Прописка
Регистрация: 09.08.2006
Сообщений: 198
Сказал спасибо: 14
Сказали Спасибо 27 раз(а) в 20 сообщении(ях)
|
Re: CodeVisionAVR начинающим с нуля
Еще раз:
Сообщение от nsl2004
|
temp[i]=ds18b20_temperature(&rom_codes[i][0]);
|
считывание температуры типа float в элемент массива temp. К сожалению, ранее я указал, что эта функция считывает scratchpad - в переменную rom_codes[i] - это неверно. Она берет из строки i переменной rom_codes 64-битовый номер датчика и именно этот датчик выполняет измерение температуры. Для считывания scratchpad нужно использовать структурную переменную __ds18b20_scratch_pad, объявленную в ds18b20.h, из которой затем считываются нужные поля:
..
temp2[i]= __ds18b20_scratch_pad.temp_high;
temp3[i]= __ds18b20_scratch_pad.temp_low;
..
Сообщение от nsl2004
|
printf("DEVICE #%-u TEMP Value:", i+1);
//printf("\n\r");
printf("T=%i.%d\xf8C\n\r",temp[i]);
|
Это попытка вывести значение температуры? Строка формата должна выглядеть так: "T=%3.1f\xf8C\n\r" - где 3.1f - вывод переменной типа float. Потому, что "%i.%d" - вывод двух целочисленных переменных, разделённых точкой и поэтому значение float в переменной temp[i] обрезается до целого.
Последний раз редактировалось ish0; 05.03.2010 в 22:13.
|
|
|
|
05.03.2010, 22:32
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.04.2009
Сообщений: 5,611
Сказал спасибо: 1,070
Сказали Спасибо 1,273 раз(а) в 884 сообщении(ях)
|
Re: CodeVisionAVR начинающим с нуля
Сообщение от ish0
|
К сожалению, ранее я указал, что эта функция считывает scratchpad - это неверно.
|
Я уже понял, накатал ответ, а Вы уже поправили. Сейчас попробую этот вариант. Но сперва по выводу температуры продолжу. Засада какаято.
Объявляю float temp [MAX_DEVICES];
вывожу как указали Вы printf("T=%3.1f\xf8C\n\r" ,temp[i]);
Получаю T=1fC полное невезенье. Не работает опять.
Мне кажется здесь что то в объявлениии переменных, но вроде все сделал.
Добавляю.
Сделал втупую
float c=5.76
printf("T=%3.1f\xf8C\n\r",c);
На терминале T=1fC - странно правда?
Последний раз редактировалось nsl2004; 05.03.2010 в 22:49.
|
|
|
|
05.03.2010, 22:48
|
|
Прописка
Регистрация: 09.08.2006
Сообщений: 198
Сказал спасибо: 14
Сказали Спасибо 27 раз(а) в 20 сообщении(ях)
|
Re: CodeVisionAVR начинающим с нуля
В настройках проекта нужно выставить -float, width, precision на вкладке Code Generation для того, чтобы работал формат %3.1f. По умолчанию там стоит int, width для уменьшения размера кода.
|
|
|
|
05.03.2010, 23:25
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.04.2009
Сообщений: 5,611
Сказал спасибо: 1,070
Сказали Спасибо 1,273 раз(а) в 884 сообщении(ях)
|
Re: CodeVisionAVR начинающим с нуля
ish0,
Доклвдываю, вывод работает.
float temp [MAX_DEVICES];
********
temp[i]=ds18b20_temperature(&rom_codes[i][0]);
printf("T=%3.1f\xf8C\n\r",temp[i]);
Выводит значение с одним десятичным знаком.
3.1 1 я понял что это количество знаков после запятой, а тройка?
Теперь по поводу вывода алармов займусь завтра, может что получится.
Хотя вот это "Для считывания scratchpad нужно использовать структурную переменную __ds18b20_scratch_pad," пока непонятно совсем. Попробую покопатся в литературе. Спасибо за помощь с выводом температуры.
Про тройку понял - общая длина числа , перед ней можно поставить 0 и добавятся нули до общей длины.
Последний раз редактировалось nsl2004; 05.03.2010 в 23:39.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 01:46.
|
|