Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
05.03.2010, 23:39
|
|
Вид на жительство
Регистрация: 13.02.2010
Сообщений: 372
Сказал спасибо: 12
Сказали Спасибо 15 раз(а) в 12 сообщении(ях)
|
Re: CodeVisionAVR начинающим с нуля
у кодевижна есть мануал на вражеском языке. я функцию температуры осваивал из него. если нужно - могу скинуть, там есть для нас начинающих СИписцев доступное разжевывание встроенных библиотек
|
|
|
|
06.03.2010, 00:00
|
|
Прописка
Регистрация: 09.08.2006
Сообщений: 198
Сказал спасибо: 14
Сказали Спасибо 27 раз(а) в 20 сообщении(ях)
|
Re: CodeVisionAVR начинающим с нуля
Переменная __ds18b20_scratch_pad определена в библиотеке ds18b20.lib, которая написана на С. К сожелению в help`e CV не показано как эту структурную переменную использовать. Но просматривая как написана сама библиотека можно с этим разобраться.
|
|
|
|
06.03.2010, 00:05
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.04.2009
Сообщений: 5,611
Сказал спасибо: 1,070
Сказали Спасибо 1,273 раз(а) в 884 сообщении(ях)
|
Re: CodeVisionAVR начинающим с нуля
ish0,
Результат положительный.
int sp1 [MAX_DEVICES];
int sp2 [MAX_DEVICES];
........................
Код:
|
sp[i]=ds18b20_read_spd(&rom_codes[i][0]);
sp1[1]= __ds18b20_scratch_pad.temp_low;
sp2[1]= __ds18b20_scratch_pad.temp_high;
printf("T=%i\xf8\n\r",sp1[1]);
printf("T=%i\xf8\n\r",sp2[1]); |
Возвращает значение низкого и высокого сигнала алармов. Люкс.
Единственный вопрос - почему в значении переменных SP надо ставит 1. С другими значениями не работает.?
И все работает с несколькими датчиками - строго обращаясь по ROM code.
|
|
|
|
06.03.2010, 00:25
|
|
Прописка
Регистрация: 09.08.2006
Сообщений: 198
Сказал спасибо: 14
Сказали Спасибо 27 раз(а) в 20 сообщении(ях)
|
Re: CodeVisionAVR начинающим с нуля
Сообщение от nsl2004
|
Единственный вопрос - почему в значении переменных SP надо ставит 1. С другими значениями не работает.?
|
Это как? Если определить массивы
int sp1[MAX_DEVICES];
int sp2[MAX_DEVICES];
и в цикле выполнять:
for (i = 0; i ‹ devices; i++)
{ sp[i]=ds18b20_read_spd(&rom_codes[i][0]);
sp1[i]= __ds18b20_scratch_pad.temp_low;
sp2[i]= __ds18b20_scratch_pad.temp_high;
printf("T=%i\xf8\n\r",sp1[i]);
printf("T=%i\xf8\n\r",sp2[i]); };
то не работает?
|
|
|
|
06.03.2010, 00:38
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.04.2009
Сообщений: 5,611
Сказал спасибо: 1,070
Сказали Спасибо 1,273 раз(а) в 884 сообщении(ях)
|
Re: CodeVisionAVR начинающим с нуля
ish0,
Да если сделать sp1[i]= __ds18b20_scratch_pad.temp_low;
как сейчас у Вас, то выводит нули. Если вместо i - единица то работает. Может это связано что используется структурная переменная? Типа стоять!!
|
|
|
|
06.03.2010, 01:06
|
|
Прописка
Регистрация: 09.08.2006
Сообщений: 198
Сказал спасибо: 14
Сказали Спасибо 27 раз(а) в 20 сообщении(ях)
|
Re: CodeVisionAVR начинающим с нуля
Похоже у Вас где-то вместо i используется 1. Попробуйте поискать "[i]" или заменить [i] на [k] и посмотреть на результат.
|
|
|
|
06.03.2010, 01:42
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.04.2009
Сообщений: 5,611
Сказал спасибо: 1,070
Сказали Спасибо 1,273 раз(а) в 884 сообщении(ях)
|
Re: CodeVisionAVR начинающим с нуля
Сделаю. Только завтра
|
|
|
|
06.03.2010, 11:50
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.04.2009
Сообщений: 5,611
Сказал спасибо: 1,070
Сказали Спасибо 1,273 раз(а) в 884 сообщении(ях)
|
Re: CodeVisionAVR начинающим с нуля
ish0,
Подвела невнимательность. Все заработало. Вот окончательно работающий код для определния температуры на каждом присутствующем датчике и выводе установк регистров temp_low и temp_high
Код:
|
unsigned char read_spd[MAX_DEVICES][9]; // смотрим как объявлена в файле ds18B20.lib
void main(void)
{
............
unsigned char i;// объявляем индексную переменную i
float temp [MAX_DEVICES]; // смотрим как объявлена в файле ds18B20.lib
int sp1 [MAX_DEVICES];
int sp2 [MAX_DEVICES];
..................................
while (1)
{
for (i=0;i‹devices;i++)
{
temp[i]=ds18b20_temperature(&rom_codes[i][0]);
//delay_ms(750);
printf("DEVICE #%-u TEMP Value:",i+1);
printf("T=%5.2f\xf8C\n\r",temp[i]);
sp[i]=ds18b20_read_spd(&rom_codes[i][0]);
sp1[i]= __ds18b20_scratch_pad.temp_low;
sp2[i]= __ds18b20_scratch_pad.temp_high;
printf("T=%i\xf8\n\r",sp1[i]);
printf("T=%i\xf8\n\r",sp2[i]); |
Скрин из Proteusa ( третий девайс не датчик температуры , а ключ - поэтому выдает ошибку. Сделано для контроля.)
|
|
|
|
07.03.2010, 15:17
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.04.2009
Сообщений: 5,611
Сказал спасибо: 1,070
Сказали Спасибо 1,273 раз(а) в 884 сообщении(ях)
|
Re: CodeVisionAVR начинающим с нуля
Появился еще один вопрос.
В help CVAVR присутствуют две конструкции
devices=w1_search(0xf0,rom_codes);
и если сделать так
printf("Detect %-u Device \n\r",devices) то получаем на терминале количество устройств
Все работает.
Другая конструкция. Для команды 0хec. Судя по даташету должна работать аналогично, но ... искать устройства , в которых текущая температура вышла за пределы temp_low и temp_high.
Я взял код из help'a CVAVR
printf("ALARM GENERATED BY %-u DEVICE(S)\n\r",
w1_search(0xec,alarm_rom_codes));
НЕРАБОТАЕТ показывает 0, хотя я явно создал аварийную ситуацию на датчиках. Думал что нибудь с синтаксисом, проверил заменой 0xec на 0хf0 - исправно показывает количество устройств. Выходит дело в другом? Может кто подскажет?
Из даташета
Цитата:
|
Выполнение этой команды идентично выполнению команды Поиск ROM за исключением того, что ответят только DS18B20 (датчики температуры) с установленным флажком аварии.
|
|
|
|
|
09.03.2010, 17:20
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.04.2009
Сообщений: 5,611
Сказал спасибо: 1,070
Сказали Спасибо 1,273 раз(а) в 884 сообщении(ях)
|
Re: CodeVisionAVR начинающим с нуля
Вопрос с поиском по 0xEC остался открытым. Так и не удалось оживить Может быть кто то все таки сталкивался с подобным.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:38.
|
|