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

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

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

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

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

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

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

 
Опции темы

CodeVisionAVR начинающим с нуля

Непрочитано 05.03.2010, 14:55  
nsl2004
Почётный гражданин KAZUS.RUN
 
Регистрация: 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
Сообщений: 197
Сказал спасибо: 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.RUN
 
Регистрация: 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
Сообщений: 197
Сказал спасибо: 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.RUN
 
Регистрация: 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
Сообщений: 197
Сказал спасибо: 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.RUN
 
Регистрация: 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
Сообщений: 197
Сказал спасибо: 14
Сказали Спасибо 27 раз(а) в 20 сообщении(ях)
ish0 на пути к лучшему
По умолчанию Re: CodeVisionAVR начинающим с нуля

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


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.