CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Re: CodeVision AVR в вопросах и ответах

Сообщение unalex »

AVL писал(а):Вот правильный ответ:


Код: Выделить всё

while (1)
 {
 // Place your code here
 unsigned long int res = 123456;
 printf("res = %lu\n", res);
}
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Реклама
Аватара пользователя
Aid1992
Встал на лапы
Сообщения: 140
Зарегистрирован: Вс ноя 11, 2012 14:13:02

Re: CodeVision AVR в вопросах и ответах

Сообщение Aid1992 »

Ребята, прошу помощи.
Делаю цифровой термометр на AtMega8, с индикацией на LCD-дисплей.
Хотел спросить, как можно исправить код, чтобы на дисплей выводилось что-то типа: "Температура дома-ХХ, температра в помещении-ХХ". Вот код:

Код: Выделить всё

sprintf(lcd_buffer,"t=%i.%u\xdfC",temp,temp%1);

Возможно ли сделать чтобы температура отображалась с двумя знаками после запятой?
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Аlex »

Возможно ли сделать чтобы температура отображалась с двумя знаками после запятой?

Код: Выделить всё

temp=12.345;
sprint (buffer, "T = %.2f", temp)
Выведет в буфер: "T = 12.34".
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение urry »

Непонятно, что есть темп...
Он хочет чего-то такого, возможно...
sprintf(lcd_buffer,"t=%d.%02d",temp/100,temp%100);
Если темп целое...
Последний раз редактировалось urry Сб апр 06, 2013 12:02:52, всего редактировалось 1 раз.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Aid1992
Встал на лапы
Сообщения: 140
Зарегистрирован: Вс ноя 11, 2012 14:13:02

Re: CodeVision AVR в вопросах и ответах

Сообщение Aid1992 »

Аlex писал(а):
Возможно ли сделать чтобы температура отображалась с двумя знаками после запятой?

Код: Выделить всё

temp=12.345;
sprint (buffer, "T = %.2f", temp)
Выведет в буфер: "T = 12.34".


Не получается. Выводит T=2f.
Вот код:

Код: Выделить всё

temp=ds18b20_temperature(&rom_code[i][0]);  //читаем температуру с выбранного датчика
          if (temp>1000){               //если датчик выдаёт больше 1000
             temp=4096-temp;            //отнимаем от данных 4096
             temp=-temp;                //и ставим знак "минус"
          }
          sprintf(lcd_buffer,"T = %.2f",temp);  //записуемв масив для экрана температуру и всё такое
          //k=1;
          //ftoa(temp,k,tem);
          lcd_clear();                  //чистим дисплей перед выводом
          lcd_puts(lcd_buffer);         //выводим масив на LCD
          delay_ms(500); 
Реклама
Аватара пользователя
Aid1992
Встал на лапы
Сообщения: 140
Зарегистрирован: Вс ноя 11, 2012 14:13:02

Re: CodeVision AVR в вопросах и ответах

Сообщение Aid1992 »

urry писал(а):Непонятно, что есть темп...
Он хочет чего-то такого, возможно...
sprintf(lcd_buffer,"t=%d.%02d",temp/100,temp%100);
Если темп целое...

Не получается... Температура отображается с одним знаком после запятой, надо вывести тоже с одним знаком после запятой... Оказывается в Proteus нельзя вывести с 2 знаками после запятой, датчики так не меняют температуру...
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Аlex »

Не получается. Выводит T=2f.
Значит компилятор не поддерживает вывод с плавающей точнкой, либо отключена эта возможность для экономии ресурсов (что вероятнее всего).
Аватара пользователя
Aid1992
Встал на лапы
Сообщения: 140
Зарегистрирован: Вс ноя 11, 2012 14:13:02

Re: CodeVision AVR в вопросах и ответах

Сообщение Aid1992 »

А как ее включить в CodeVision AVR?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Аlex »

Aid1992 писал(а):Температура отображается с одним знаком после запятой
Aid1992 писал(а):надо вывести тоже с одним знаком после запятой
Что Вам нужно то ? Определитесь....

PS: И перестаньте полностью цитировать предыдущее сообщение, тем более многоэтажно.
Аватара пользователя
Aid1992
Встал на лапы
Сообщения: 140
Зарегистрирован: Вс ноя 11, 2012 14:13:02

Re: CodeVision AVR в вопросах и ответах

Сообщение Aid1992 »

В общем в Proteus температура меняется с шагом в 0.1.
Надо на индикатор вывести число с одним знаком после запятой! Программу пишу в CodeVisionAVR.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Аlex »

Чтобы её вывести с одним знаком после запятой, её нужно и хранить с таким разрешением.
Аватара пользователя
Aid1992
Встал на лапы
Сообщения: 140
Зарегистрирован: Вс ноя 11, 2012 14:13:02

Re: CodeVision AVR в вопросах и ответах

Сообщение Aid1992 »

Ну а как это сделать? Объясните пожалуйста. Я уже не понимаю. Вот основной код моей программы:

Код: Выделить всё

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мс


Вывод не правильный.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Аlex »

Какой тип у переменной temp и что возвращает функция ds18b20_temperature ? Покажите её, ну или хотя-бы прототип.

Вывод не правильный.
Что значит "неправильный" ? Выводит не ту температуру или не так как Вам хочется ?
Аватара пользователя
Aid1992
Встал на лапы
Сообщения: 140
Зарегистрирован: Вс ноя 11, 2012 14:13:02

Re: CodeVision AVR в вопросах и ответах

Сообщение Aid1992 »

До этого я реализовал вывод через ftoa с одним знаком после запятой. Но на индикатор выводилось так: "25.6".

А мне надо выводить красиво, типо: "temp=25.6 градусов Цельсия".
Аватара пользователя
Aid1992
Встал на лапы
Сообщения: 140
Зарегистрирован: Вс ноя 11, 2012 14:13:02

Re: CodeVision AVR в вопросах и ответах

Сообщение Aid1992 »

тип переменной temp int, но я пробовал ставить float, не получилось вывести.
ds18b20_temperature unsigned char.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Аlex »

Aid1992 писал(а):ds18b20_temperature unsigned char.
Ну и как тогда Вы хотите вывести с точкой ? :)
Переделывайте функцию, чтобы выводила либо с точкой (float или double), либо int, в котором значение умножено на 10.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Аlex »

И вот это:

Код: Выделить всё

          if (temp>1000){               //если датчик выдаёт больше 1000
             temp=4096-temp;            //отнимаем от данных 4096
             temp=-temp;                //и ставим знак "минус"
          }
Что за волшебные манипуляции ? :) Сижу, въезжаю, никак не могу въехать, что Вы тут пытаетесь сделать...
Аватара пользователя
Aid1992
Встал на лапы
Сообщения: 140
Зарегистрирован: Вс ноя 11, 2012 14:13:02

Re: CodeVision AVR в вопросах и ответах

Сообщение Aid1992 »

Аlex писал(а):Ну и как тогда Вы хотите вывести с точкой ? :)
Переделывайте функцию, чтобы выводила либо с точкой (float или double), либо int, в котором значение умножено на 10.

Вот посмотрите код, и скажите где что поменять можно?
Вы еще говорили что в компиляторе надо что-то включить чтобы с точкой после запятой выводилось...
Безымянный.png
(27.24 КБ) 402 скачивания
Аватара пользователя
Aid1992
Встал на лапы
Сообщения: 140
Зарегистрирован: Вс ноя 11, 2012 14:13:02

Re: CodeVision AVR в вопросах и ответах

Сообщение Aid1992 »

Аlex писал(а):И вот это:

Код: Выделить всё

          if (temp>1000){               //если датчик выдаёт больше 1000
             temp=4096-temp;            //отнимаем от данных 4096
             temp=-temp;                //и ставим знак "минус"
          }
Что за волшебные манипуляции ? :) Сижу, въезжаю, никак не могу въехать, что Вы тут пытаетесь сделать...

Это вывод отрицательной температуры, смотрите формат хранения температуры DS18B20.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Аlex »

Кто Вас этому научил ? :facepalm:
Формат хранения температуры я знаю, она уже хранится в удобном формате - читай в знаковую переменную и выводи - никаких вычитаний и условий...
Ответить

Вернуться в «AVR»