Страница 253 из 421
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб апр 06, 2013 12:54:24
Аlex
Вот посмотрите код, и скажите где что поменять можно?
Я не понимаю что и в каком формате возвращает Ваша функция. Если unsigned char, то значение после знака Вы не выведете, т.к. скорее всего, она возвращает целое значение температуры.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб апр 06, 2013 12:55:37
Aid1992
Да я пока не особо разбираюсь в программировании... Недавно начал только.
Ну так что, вы посмотрели код?
Ну напишу я float temp, но как на LCD то вывести?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб апр 06, 2013 12:58:16
Aid1992
Аlex писал(а):Я не понимаю что и в каком формате возвращает Ваша функция. Если unsigned char, то значение после знака Вы не выведете, т.к. скорее всего, она возвращает целое значение температуры.
Вот код программы полностью:
Код: Выделить всё
#include <mega128.h> //библиотека ввода\вывода
#include <delay.h> //библиотека задержки
#asm
.equ __w1_port=0x1B ;PORTA
.equ __w1_bit=3
#endasm
#asm
.equ __lcd_port=0x12 ;PORTD
#endasm
#include <lcd.h>
#include <lcd.h> //библиотека для LCD
#include <1wire.h> //библиотека работы с 1Wire
#include <ds1820.h>
#include <ds18b20.h> //библиотека для работы с датчиком ds18b20
#include <stdio.h>
#include <stdlib.h>
unsigned char rom_code[8][9]; //масив с адресами найденых датчиков
char lcd_buffer[33]; //масив с данными для экрана
void main(void)
{
unsigned char devices,i,j,k;
//unsigned char k; //переменная в которой количество присоеденённых датчиков, и номер выбранного датчика
float temp;
//unsigned char tem[4]; //переменная для хранения температуры
lcd_init(16); //инициилизация LCD, и говорим что он на 16 символов
devices=w1_search(0xf0,rom_code); //ищим датчики, и записуем их адреса в масив
while(1) //бесконечный цикл, если датчик подключон
{
temp=ds18b20_temperature(&rom_code[i][0]); //читаем температуру с выбранного датчика
if (temp>1000){ //если датчик выдаёт больше 1000
temp=4096-temp; //отнимаем от данных 4096
temp=-temp; //и ставим знак "минус"
}
sprintf(lcd_buffer,"t=%e %.1e %2.2e\n",temp);; //записуемв масив для экрана температуру и всё такое
//k=1;
//ftoa(temp,k,tem);
lcd_clear(); //чистим дисплей перед выводом
lcd_puts(lcd_buffer); //выводим масив на LCD
delay_ms(500); //ждём 500мс
};
}
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб апр 06, 2013 17:21:29
ut1wpr
Аlex писал(а):Я не понимаю что и в каком формате возвращает Ваша функция. Если unsigned char, то значение после знака Вы не выведете, т.к. скорее всего, она возвращает целое значение температуры.
Не мучайте несчастного Алекса, имевшего неосторожность пару раз Вам подсказать. Существует очень эффективный метод "проб и ошибок". Если вы не понимаете, что делаете, и что надо делать, сделайте, наконец, сами. Один раз, другой, третий. Каждый раз смотрите, что изменяется, от чего зависит. Но перед тем, как делать, читать, читать и еще раз читать.
Вам же сразу готовый код подавай. Половина здесь присутствующих вам этот код напишет за несколько минут. И все будет работать. Но вот беда, вам захочется идти дальше. А ничего не поняв из этого простейшего примера вы снова будете просить людей сделать за вас?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб апр 06, 2013 20:38:46
unalex
Aid1992 писал(а):Ну напишу я float temp, но как на LCD то вывести?
как все нормальные люди выводят
Код: Выделить всё
float temp;
printf ("temp= %4.2f", temp, " градусов\n");
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб апр 06, 2013 21:27:32
Аlex
Не мучайте несчастного Алекса
Скорее наоборот, я мучаю человека

А всё ради того, чтобы он сам понял что он хочет от нас и , всё таки, задал нормальный вопрос, за место "Как сделать ?". Уровень его с первого-же поста очевиден - копипаст и тупик при желании что-то изменить.
А сделать просто. Выкинуть из головы мысли о встроенных недобиблиотеках, открыть даташит на датчик, написать нормальный код с его опросом и всё это "хозяйство" вывести на дисплей. После того, как он разберётся с датчиком и поймёт как с ним работать и что в нём лежит, способ вывода данных на дисплей придёт в голову сам по себе.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб апр 06, 2013 21:40:20
Aid1992
Хоть убейте, но не понимаю как по нормальному сделать вывод температуры с датчика DS18B20 с двумя или хотя бы с одним знаком после запятой.
Вы все хотите чтобы я сам понял, но я сегодня весь день просидел, так и не понял ничего.
Вот выкладываю проект в CodeVisionAVR и проект в Proteus.
Настоятельно прошу посмотреть, и сказать что не так!
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб апр 06, 2013 21:45:47
Аlex
сказать что не так
То, что функция
ds18b20_temperature, по всей видимости, возвращает целое значение температуры. Из этих данных Вы никак не добудите данные с десятыми. Понимаете ?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб апр 06, 2013 21:49:00
Aid1992
А как по другому то опросить датчик то? DS18B20 ведь опрашивают именно так temp=ds18b20_temperature(&rom_code[0]).
А DS18S20 так: temp=ds18b20_temperature_10(&rom_code[0]).
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб апр 06, 2013 21:51:07
Aid1992
Если переменной temp выставить тип float, тогда вывод на LCD как запишется?
Просто я как только не писал сегодня, на дисплей выходит что то типа 2f... Вы мне говорили что то там в компиляторе включить чтобы отображались числа после запятой...
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб апр 06, 2013 21:57:28
Аlex
А как по другому то опросить датчик то?
Я уже писал парой постов выше как это сделать, повторяться не хочется.
Вы мне говорили что то там в компиляторе включить чтобы отображались числа после запятой...
Я не знаю, делается ли это в CV и как, поищите в настройках поддержку
float для
printf. Но это Вам не поможет - смотрите мой предыдущий пост.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб апр 06, 2013 21:57:48
Apparatchik
Сначала присвойте "руками" значение своей переменной temp = 12.3; и добейтесь правильного отображения и только потом "воюйте" с чтением температуры.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб апр 06, 2013 22:02:12
ut1wpr
Aid1992 писал(а):Настоятельно прошу посмотреть, и сказать что не так!
thermo.zip
Настоятельно прошу... Да еще с восклицательным знаком! Почти как требование. Может, в консерватории что-то подправить?

Убивать вас никто не будет, вы приговорены к пожизненному изучению предмета!

PS Позвольте поинтересоваться, что вас подтолкнуло на столь сложную для вас тему? Вы светодиодом мрыгали? А по прерыванию? А кнопку опрашивали? А по прерыванию?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб апр 06, 2013 22:08:19
Аlex
ЗЫ: Народ, перестаньте цитировать предыдущие сообщения (особенно создавать многоэтажные цитаты), меня завалил жалобами доблестные участники форума и я замучился править ваши посты

Будьте любезны... Это просьба...
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб апр 06, 2013 22:16:06
Apparatchik
Aid1992 писал(а):А как по другому то опросить датчик то?
Чтоб не заморачиватся с "float" температуру лучше читать в сотых долях градуса в 16 битную знаковую переменную, но для этого придется самому писать. Функции "встроенные" в CVAVR далеко не самые лучшие.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб апр 06, 2013 22:33:17
Aid1992
Разобрался.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб апр 06, 2013 22:38:02
Apparatchik
Aid1992 писал(а):Разобрался.
И это все? Интересно же

Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб апр 06, 2013 22:38:14
Аlex
И в чём была проблема, не просветите ? Обычно, после решений проблем, принято выкладывать решения...
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб апр 06, 2013 23:21:52
Aid1992
Аlex писал(а):И в чём была проблема, не просветите ? Обычно, после решений проблем, принято выкладывать решения...
float temp;
temp=ds18b20_temperature(&rom_code[0]);
sprintf(lcd_buffer,"t%u=%.2f\xdfC",++i,temp);
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб апр 06, 2013 23:25:15
unalex
проект взят отсюда
http://mega-avr.ucoz.ru/publ/ds18b20_co ... 5/1-1-0-15
там же описаны варианты вывода на дисплей числа дробной частью