Страница 1 из 1
GGC числа с запятой.
Добавлено: Вс сен 15, 2013 10:50:28
foton6
Всем доброго времени суток)
Хочу сделать генератор прямоугольников, возникли затыки при написании программы( atmel_studio_6.1)
Думал на дисплей выводить задаваемую частоту, количество тиков которое надо записать в OCR1A .
сначала считаю длительность 1 тика:
f_cpu = 4 000 000
делитель 8
8 / f_cpu = 2*10^-6 cек
затем считаю число которое надо записать в OCR1A, с учетом требуемой частоты(допустим 300).
(1/300)/2*10^-6 = 1667 тиков / 2 = 833 записываю в OCR1A
Вообщем ничего не выходит
пробавал разные способы, даже объявлял вещественные переменные для подсчета
, а потом уже записывал результат в INT. Не работает(((
Re: GGC числа с запятой.
Добавлено: Вс сен 15, 2013 11:26:10
blackx
А что у вас конкретно то не работает? Код фстудию.
Re: GGC числа с запятой.
Добавлено: Вс сен 15, 2013 12:11:50
foton6
Не хочет нормально выводить цифры:
Спойлер
Код: Выделить всё
#define F_CPU 4000000L
#define baudrate 9600L
#define bauddivider (F_CPU/(16*baudrate)-1)
#define HI(x) ((x)>>8)
#define LO(x) ((x)& 0xFF)
#define time_f (((1./F_CPU)*8)*)
#include <avr/io.h>
#include <util/delay.h>
#include <string.h>
#include <avr/eeprom.h>
#include <avr/interrupt.h>
volatile uint16_t frec=300, OCR_lh=833, frec_r=0;
float math=0;
volatile int i=0, ft=0;
void send (uint16_t A);
void clear (void);
void init (void)
{
UBRRL = LO(bauddivider);
UBRRH = HI(bauddivider);
UCSRA = 0x00;
UCSRB = 1<<RXEN|1<<TXEN|0<<RXCIE|0<<TXCIE;
UCSRC = 1<<URSEL|1<<UCSZ0|1<<UCSZ1;
//////////////////////////////////////////////
TCCR1B |= 1<<CS11;
OCR1AH = (OCR_lh>>8);
OCR1AL = (OCR_lh&0x00ff);
TIMSK |= 1<<OCIE1A;
sei();
///////////////////////////////////////////////
DDRC=1<<0;
}
void main (void)
{
init();
while(1)
{
_delay_ms(300);
clear();
send(frec);
send(OCR1A);
frec_r=(1./(OCR_lh*2.*(8/4000000)));
send(frec_r);
if(PINC&(1<<4))
frec++;
if(PINC&1<<5)
frec--;
}
}
void send (uint16_t A)
{
char buff[250]={0};
itoa(A,buff,10);
i=0;
while(buff[i])
{
while(UCSRA & (1<<UDRE))
{
UDR=buff[i];
i++;
}
}
while(!(UCSRA & (1<<UDRE)));
UDR=0x0d;
}
void clear (void)
{
for(int k=0;k<16;)
{
while(UCSRA & (1<<UDRE))
{
UDR=0x08;
k++;
}
}
}
ISR(TIMER1_COMPA_vect)
{
PORTC^=1;
TCNT1H=0x00;
TCNT1L=0x00;
}
frec_r=(1./(OCR_lh*2.*(8/4000000))); результат этого подсчета выводит как 0. хотя должно быть 298,686 после записи в INT это 298.
Re: GGC числа с запятой.
Добавлено: Вс сен 15, 2013 12:16:00
Jack_A
Я не большой знаток в Си для МК, но на первый взгляд 8/4000000 делится целочисленно, и ноль обязан быть. А если 8./4000000. ?
Re: GGC числа с запятой.
Добавлено: Вс сен 15, 2013 13:55:29
foton6
Jack_A писал(а): А если 8./4000000. ?
появление хотя бы 1 точки в выражении достаточно.(вроде бы)
Re: GGC числа с запятой.
Добавлено: Вс сен 15, 2013 15:52:54
blackx
Если совсем точно, то для бинарных операторов (+, -, *, /, % итд) осуществляется автоматическое приведение обоих операндов к double перед вычислением, если хотя бы один из них имеет вещественный тип (double или float). То есть, это не распространяется на все выражение целиком: 4.0 * (1/100500) не будет вычислено правильно, так как сначала производится вычисление над целочисленными операндами.
Ну так как, помогло добавление точек то?
Re: GGC числа с запятой.
Добавлено: Вс сен 15, 2013 19:33:40
foton6
Везде где мог натыкал точек ^^ робит) спасибо за помощь)
Re: GGC числа с запятой.
Добавлено: Вс сен 15, 2013 20:28:30
Jack_A
То то же!
