Вопрос по LCD

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение sirha »

Подскажите пожалуйста почему не выводит на LCD переменную S ?

:(

именно с дробными числами нет арифметики( , на дисплее 0 вместо числа

подаю импульсы на вход INT1 (10 гц)

УЗНАЮ частоту

дальше делю 1 на частоту ,узнаю период (0.1 сек)


а вод умножая его на число 10 получаю на дисплее 0 :( как так


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


#include <mega8.h>
#include <delay.h>


#asm                             
    .equ __lcd_port=0x12 
#endasm 

#include <lcd.h>
#include <stdio.h>
 
 float t;
int i = 0, freq=0,s; 
char lcd_buf[33];
 
interrupt [EXT_INT1] void ext_int1_isr(void)
{
i++;       
}
 
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
 freq=i; 
 i=0; 
 TCNT1H=0x00;
 TCNT1L=0x00;   
}


void main(void)
{
TIMSK=0x10;
TCCR1B=0x05;
OCR1AH=0x1E;
OCR1AL=0x85;
GICR=0x80;
MCUCR=0x0C;
DDRB=0x01;
lcd_init(16);
#asm("sei")
while(1)

{      
   
      
 t=(1/freq);
 s=t*10;


   
   
sprintf(lcd_buf,"%d",s); 

lcd_clear();
lcd_puts(lcd_buf);
delay_ms(20);
                }

}





Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

Сообщение eess9 »

Сделайте явное приведение типов данных:

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

t=(1/(float)freq);
 s=(int)(t*10);
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18785
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

не надо делать приведения типов там, где не надо :)))
достаточно всего-навсего использовать правильную константу типа float

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

t=1.0/freq;
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение sirha »

Спасибо))

все заработало

ARV

А что значит правильную float?

я ведь и так обозначил

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

float t;
работает вот так

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

t=(float)1/freq
Реклама
Эиком - электронные компоненты и радиодетали
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт июл 02, 2013 09:17:49

Сообщение misyachniy »

sirha писал(а):Спасибо))
А что значит правильную float?
Компилятор C манипулирует с данными не так как человек.
Для человека 1 и 1,0 одно и то же.
Для компьютера 1 может занимать 1,2,4,8 байт если объявлен как целочисленное.
Для float - 4 байта, для double - 8 байт.

При целочисленном вычислении числа меньше 1 отбрасываются.

В данном конкретном случае обе переменные в правой части целочисленные.
В AVR, по моему, intзанимает два байта.
Компилятор делает целочисленное деление и остаток отбрасывает - получается 0.
Так называемое "антипереполнение".

Для предотвращения такой ситуации в нужных местах, требуется прямое указание компилятору как проводить вычисления.

Выражение "1.0" и "(float)1" эквивалентны.
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18785
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

я бы не согласился, что 1.0 и (float)1 эквивалентные записи. смысл первой записи в то, что мы задаем константу типа float, а смысл второй несколько иной: мы принудительно преобразовываем константу типа int к типу float. результат действительно одинаковый, но смысл все-таки разный. образно говоря, это как выйти в дверь или выскочить в окно - в обоих случаях окажемся снаружи, однако через дверь как-то все-таки правильнее...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт июл 02, 2013 09:17:49

Сообщение misyachniy »

ARV писал(а):я бы не согласился, что 1.0 и (float)1 эквивалентные записи. смысл первой записи в то, что мы задаем константу типа float, а смысл второй несколько иной: мы принудительно преобразовываем константу типа int к типу float. результат действительно одинаковый, но смысл все-таки разный. образно говоря, это как выйти в дверь или выскочить в окно - в обоих случаях окажемся снаружи, однако через дверь как-то все-таки правильнее...
Согласен "в лоб" и "по лбу" имеют разный смысл ;-)
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение sirha »

вообщем буду писать 1.0))))

спс :)
Ответить

Вернуться в «Периферия»