Я не понимаю что и в каком формате возвращает Ваша функция. Если unsigned char, то значение после знака Вы не выведете, т.к. скорее всего, она возвращает целое значение температуры.Вот посмотрите код, и скажите где что поменять можно?
CodeVision AVR в вопросах и ответах
- Реклама
- Сообщения: 140
- Зарегистрирован: Вс ноя 11, 2012 14:13:02
Да я пока не особо разбираюсь в программировании... Недавно начал только.
Ну так что, вы посмотрели код?
Ну напишу я float temp, но как на LCD то вывести?
Ну так что, вы посмотрели код?
Ну напишу я float temp, но как на LCD то вывести?
- Сообщения: 140
- Зарегистрирован: Вс ноя 11, 2012 14:13:02
Вот код программы полностью:А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мс
};
}
- Сообщения: 581
- Зарегистрирован: Ср янв 05, 2011 10:03:18
Не мучайте несчастного Алекса, имевшего неосторожность пару раз Вам подсказать. Существует очень эффективный метод "проб и ошибок". Если вы не понимаете, что делаете, и что надо делать, сделайте, наконец, сами. Один раз, другой, третий. Каждый раз смотрите, что изменяется, от чего зависит. Но перед тем, как делать, читать, читать и еще раз читать.Аlex писал(а):Я не понимаю что и в каком формате возвращает Ваша функция. Если unsigned char, то значение после знака Вы не выведете, т.к. скорее всего, она возвращает целое значение температуры.
Вам же сразу готовый код подавай. Половина здесь присутствующих вам этот код напишет за несколько минут. И все будет работать. Но вот беда, вам захочется идти дальше. А ничего не поняв из этого простейшего примера вы снова будете просить людей сделать за вас?
С уважением,
Виктор.
Виктор.
как все нормальные люди выводятAid1992 писал(а):Ну напишу я float temp, но как на LCD то вывести?
Код: Выделить всё
float temp;
printf ("temp= %4.2f", temp, " градусов\n");Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
- Реклама
Скорее наоборот, я мучаю человекаНе мучайте несчастного Алекса
А сделать просто. Выкинуть из головы мысли о встроенных недобиблиотеках, открыть даташит на датчик, написать нормальный код с его опросом и всё это "хозяйство" вывести на дисплей. После того, как он разберётся с датчиком и поймёт как с ним работать и что в нём лежит, способ вывода данных на дисплей придёт в голову сам по себе.
- Сообщения: 140
- Зарегистрирован: Вс ноя 11, 2012 14:13:02
Хоть убейте, но не понимаю как по нормальному сделать вывод температуры с датчика DS18B20 с двумя или хотя бы с одним знаком после запятой.
Вы все хотите чтобы я сам понял, но я сегодня весь день просидел, так и не понял ничего.
Вот выкладываю проект в CodeVisionAVR и проект в Proteus.
Настоятельно прошу посмотреть, и сказать что не так!
Вы все хотите чтобы я сам понял, но я сегодня весь день просидел, так и не понял ничего.
Вот выкладываю проект в CodeVisionAVR и проект в Proteus.
Настоятельно прошу посмотреть, и сказать что не так!
То, что функция ds18b20_temperature, по всей видимости, возвращает целое значение температуры. Из этих данных Вы никак не добудите данные с десятыми. Понимаете ?сказать что не так
- Сообщения: 140
- Зарегистрирован: Вс ноя 11, 2012 14:13:02
А как по другому то опросить датчик то? DS18B20 ведь опрашивают именно так temp=ds18b20_temperature(&rom_code[0]).
А DS18S20 так: temp=ds18b20_temperature_10(&rom_code[0]).
А DS18S20 так: temp=ds18b20_temperature_10(&rom_code[0]).
- Сообщения: 140
- Зарегистрирован: Вс ноя 11, 2012 14:13:02
Если переменной temp выставить тип float, тогда вывод на LCD как запишется?
Просто я как только не писал сегодня, на дисплей выходит что то типа 2f... Вы мне говорили что то там в компиляторе включить чтобы отображались числа после запятой...
Просто я как только не писал сегодня, на дисплей выходит что то типа 2f... Вы мне говорили что то там в компиляторе включить чтобы отображались числа после запятой...
Я уже писал парой постов выше как это сделать, повторяться не хочется.А как по другому то опросить датчик то?
Я не знаю, делается ли это в CV и как, поищите в настройках поддержку float для printf. Но это Вам не поможет - смотрите мой предыдущий пост.Вы мне говорили что то там в компиляторе включить чтобы отображались числа после запятой...
Сначала присвойте "руками" значение своей переменной temp = 12.3; и добейтесь правильного отображения и только потом "воюйте" с чтением температуры.
«И всё-таки она вертится!»
- Сообщения: 581
- Зарегистрирован: Ср янв 05, 2011 10:03:18
Настоятельно прошу... Да еще с восклицательным знаком! Почти как требование. Может, в консерватории что-то подправить?Aid1992 писал(а):Настоятельно прошу посмотреть, и сказать что не так!
PS Позвольте поинтересоваться, что вас подтолкнуло на столь сложную для вас тему? Вы светодиодом мрыгали? А по прерыванию? А кнопку опрашивали? А по прерыванию?
С уважением,
Виктор.
Виктор.
ЗЫ: Народ, перестаньте цитировать предыдущие сообщения (особенно создавать многоэтажные цитаты), меня завалил жалобами доблестные участники форума и я замучился править ваши посты
Будьте любезны... Это просьба...
Чтоб не заморачиватся с "float" температуру лучше читать в сотых долях градуса в 16 битную знаковую переменную, но для этого придется самому писать. Функции "встроенные" в CVAVR далеко не самые лучшие.Aid1992 писал(а):А как по другому то опросить датчик то?
«И всё-таки она вертится!»
- Сообщения: 140
- Зарегистрирован: Вс ноя 11, 2012 14:13:02
И это все? Интересно жеAid1992 писал(а):Разобрался.
«И всё-таки она вертится!»
И в чём была проблема, не просветите ? Обычно, после решений проблем, принято выкладывать решения...
- Сообщения: 140
- Зарегистрирован: Вс ноя 11, 2012 14:13:02
Аlex писал(а):И в чём была проблема, не просветите ? Обычно, после решений проблем, принято выкладывать решения...
float temp;
temp=ds18b20_temperature(&rom_code[0]);
sprintf(lcd_buffer,"t%u=%.2f\xdfC",++i,temp);
проект взят отсюда
http://mega-avr.ucoz.ru/publ/ds18b20_co ... 5/1-1-0-15
там же описаны варианты вывода на дисплей числа дробной частью
http://mega-avr.ucoz.ru/publ/ds18b20_co ... 5/1-1-0-15
там же описаны варианты вывода на дисплей числа дробной частью
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...


