Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 05.03.2010, 14:55  
nsl2004
Почётный гражданин KAZUS.RU
 
Регистрация: 13.04.2009
Сообщений: 5,611
Сказал спасибо: 1,070
Сказали Спасибо 1,273 раз(а) в 884 сообщении(ях)
nsl2004 на пути к лучшему
По умолчанию Re: CodeVisionAVR начинающим с нуля

Сообщение от ish0 Посмотреть сообщение
Прицепите весь текст программы.
Двумя постами выше в текстовом файле
Вложения:
Тип файла: txt NEWBEZLCD.txt (5.0 Кб, 77 просмотров)
Реклама:

Последний раз редактировалось nsl2004; 05.03.2010 в 14:58.
nsl2004 вне форума  
Непрочитано 05.03.2010, 14:58  
makser1
Прописка
 
Регистрация: 14.04.2009
Сообщений: 103
Сказал спасибо: 17
Сказали Спасибо 11 раз(а) в 10 сообщении(ях)
makser1 на пути к лучшему
По умолчанию Re: CodeVisionAVR начинающим с нуля

На сайте автора появился 2.06 Лекарство не встречали?
makser1 вне форума  
Непрочитано 05.03.2010, 15:28  
ish0
Прописка
 
Регистрация: 09.08.2006
Сообщений: 198
Сказал спасибо: 14
Сказали Спасибо 27 раз(а) в 20 сообщении(ях)
ish0 на пути к лучшему
По умолчанию 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. Имелась в виду последняя версия косяков.
ish0 вне форума  
Непрочитано 05.03.2010, 16:08  
nsl2004
Почётный гражданин KAZUS.RU
 
Регистрация: 13.04.2009
Сообщений: 5,611
Сказал спасибо: 1,070
Сказали Спасибо 1,273 раз(а) в 884 сообщении(ях)
nsl2004 на пути к лучшему
По умолчанию 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 - то так и надо указывать, компилятор не экстрасенс.
В этом и вопрос - указывать где, и каков правильный синтаксис.
Книгу предложенную Вами сейчас поищу.
nsl2004 вне форума  
Непрочитано 05.03.2010, 17:11  
ish0
Прописка
 
Регистрация: 09.08.2006
Сообщений: 198
Сказал спасибо: 14
Сказали Спасибо 27 раз(а) в 20 сообщении(ях)
ish0 на пути к лучшему
По умолчанию 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.
Оба стиля программы применимы в "С", в отличие от Паскаля, но создают поле для вариаций написания программы. В этом сила и слабость "С". Общее "правило" выглядит так: когда торопятся - используют байтовый стиль, если нет - используют смысловое обозначение полей в типах данных.
ish0 вне форума  
Непрочитано 05.03.2010, 19:49  
nsl2004
Почётный гражданин KAZUS.RU
 
Регистрация: 13.04.2009
Сообщений: 5,611
Сказал спасибо: 1,070
Сказали Спасибо 1,273 раз(а) в 884 сообщении(ях)
nsl2004 на пути к лучшему
По умолчанию 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] и может после этого поробовать считать байты? Следующий вопрос будет как ( извините за наглость)?
Миниатюры:
Нажмите на изображение для увеличения
Название: Scrin2.jpg
Просмотров: 659
Размер:	141.5 Кб
ID:	5338  
nsl2004 вне форума  
Непрочитано 05.03.2010, 21:13  
ish0
Прописка
 
Регистрация: 09.08.2006
Сообщений: 198
Сказал спасибо: 14
Сказали Спасибо 27 раз(а) в 20 сообщении(ях)
ish0 на пути к лучшему
По умолчанию 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.
ish0 вне форума  
Непрочитано 05.03.2010, 22:32  
nsl2004
Почётный гражданин KAZUS.RU
 
Регистрация: 13.04.2009
Сообщений: 5,611
Сказал спасибо: 1,070
Сказали Спасибо 1,273 раз(а) в 884 сообщении(ях)
nsl2004 на пути к лучшему
По умолчанию 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.
nsl2004 вне форума  
Непрочитано 05.03.2010, 22:48  
ish0
Прописка
 
Регистрация: 09.08.2006
Сообщений: 198
Сказал спасибо: 14
Сказали Спасибо 27 раз(а) в 20 сообщении(ях)
ish0 на пути к лучшему
По умолчанию Re: CodeVisionAVR начинающим с нуля

В настройках проекта нужно выставить -float, width, precision на вкладке Code Generation для того, чтобы работал формат %3.1f. По умолчанию там стоит int, width для уменьшения размера кода.
ish0 вне форума  
Непрочитано 05.03.2010, 23:25  
nsl2004
Почётный гражданин KAZUS.RU
 
Регистрация: 13.04.2009
Сообщений: 5,611
Сказал спасибо: 1,070
Сказали Спасибо 1,273 раз(а) в 884 сообщении(ях)
nsl2004 на пути к лучшему
По умолчанию 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.
nsl2004 вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ARM начинающим с нуля - KEIL с лекарсвом, методички, книги avr123-nm-ru Микроконтроллеры, АЦП, память и т.д 22 31.03.2010 00:24
CodeVisionAVR 1.25 and ds1992 Serj1987 Микроконтроллеры, АЦП, память и т.д 1 25.11.2009 14:11


Часовой пояс GMT +4, время: 01:46.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot