GGC числа с запятой.

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Сообщения: 146
Зарегистрирован: Вс сен 16, 2012 22:00:40

Сообщение 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. Не работает(((
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Сообщение blackx »

А что у вас конкретно то не работает? Код фстудию.
Изображение only pure true norwegian blackx Изображение
Реклама
Встал на лапы
Сообщения: 146
Зарегистрирован: Вс сен 16, 2012 22:00:40

Сообщение 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.
Друг Кота
Аватара пользователя
Сообщения: 6339
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Я не большой знаток в Си для МК, но на первый взгляд 8/4000000 делится целочисленно, и ноль обязан быть. А если 8./4000000. ?
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Сообщения: 146
Зарегистрирован: Вс сен 16, 2012 22:00:40

Сообщение foton6 »

Jack_A писал(а): А если 8./4000000. ?
появление хотя бы 1 точки в выражении достаточно.(вроде бы)
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Сообщение blackx »

Если совсем точно, то для бинарных операторов (+, -, *, /, % итд) осуществляется автоматическое приведение обоих операндов к double перед вычислением, если хотя бы один из них имеет вещественный тип (double или float). То есть, это не распространяется на все выражение целиком: 4.0 * (1/100500) не будет вычислено правильно, так как сначала производится вычисление над целочисленными операндами.

Ну так как, помогло добавление точек то?
Изображение only pure true norwegian blackx Изображение
Реклама
Встал на лапы
Сообщения: 146
Зарегистрирован: Вс сен 16, 2012 22:00:40

Сообщение foton6 »

Везде где мог натыкал точек ^^ робит) спасибо за помощь)
Друг Кота
Аватара пользователя
Сообщения: 6339
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

То то же! :)
Ответить

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