вычисление математических функций

Здесь вопросы новичков
Ответить
mas_nk
Сообщения: 19
Зарегистрирован: 26 мар 2009, 15:18

вычисление математических функций

Сообщение mas_nk » 10 июн 2009, 07:56

помогите разобраться с вычислением тангенса в CodeVision

исходные данные
unsigned int a1,a2; \\16 бит измерения АЦП

Для вычисления тангенса y/x в Codevision есть функция
float atan2(float y, float x)

подскажите с кодом, как мне описать фун-ию и вычислить тангенс?

мой вариант такой:

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

unsigned int a1,a2;
float temp;

float atan2(float a1, float a2);

void main(void)
 {
   while (1)
    { a1=read_adc(1);
      a2=read_adc(2);
      temp=atan2(float a1, float a2);
      
      printf("temp=%d",temp);   \\Отправляем в USART
      putchar(0x0D);
    };
 }

Аватара пользователя
Мужик
Сообщения: 39
Зарегистрирован: 15 ноя 2008, 21:36

Re: вычисление математических функций

Сообщение Мужик » 10 июн 2009, 12:32

Здравствуйте!
На какую строку ругается компилятор?
Выложите файл проекта в CodeVisionAVR - попытаюсь скомпилить.
Попробуйте заменить

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

float atan2(float a1, float a2);
на

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

float atan2((float)a1, (float)a2);
(обычно указываю в скобках).
Во вторых попробуйте писать

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

printf("temp=%f",temp); \\Отправляем в USART

mas_nk
Сообщения: 19
Зарегистрирован: 26 мар 2009, 15:18

вычисление математических функций

Сообщение mas_nk » 11 июн 2009, 06:42

Спасибо за ответ.
с компилятором разобрался сейчас компилирует
но считает что то непонятное выдает числа порядка 4095, 5632 и т.д.
я думаю что заморочка в следующем:
в меге16 (регистр ADCW) 10 разрядное ацп а переменные а1, а2 16 битные
как он их преобразует непойму?
как сделать что бы выводились на USART числа с плавающей точкой?
может перед вычислениями а1 и а2 перевести в двоичное число?

Аватара пользователя
Radioded
Site Admin
Сообщения: 184
Зарегистрирован: 07 ноя 2008, 02:47
Откуда: Москва
Контактная информация:

Re: вычисление математических функций

Сообщение Radioded » 11 июн 2009, 21:29

Попробуйте задать определённые значения а1 и а2 и посмотрите правильно ли высчитывается арктангентс.
В функции printf() %f показывает, что тип float т.е. число с плавающей запятой.

mas_nk
Сообщения: 19
Зарегистрирован: 26 мар 2009, 15:18

вычисление математических функций

Сообщение mas_nk » 15 июн 2009, 09:55

Попытался разобраться с printf(), написал код для отладки
значению a3 присваиваю 5.2 и в USART отправляю в разных видах
#include <mega16.h>
#include <stdio.h>
#include <delay.h>


float a3=5.2;
void main(void)
{

PORTA=0x00;
DDRA=0x00;

PORTB=0x00;
DDRB=0x00;

PORTC=0x00;
DDRC=0x00;

PORTD=0x00;
DDRD=0x00;


TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;


ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

MCUCR=0x00;
MCUCSR=0x00;


TIMSK=0x00;

UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x19;


ACSR=0x80;
SFIOR=0x00;

while (1)
{
printf("a3=%i",a3);
putchar(0x0D);

printf("a3=%d",a3);
putchar(0x0D);

printf("a3=%u",a3);
putchar(0x0D);

printf("a3=%e",a3);
putchar(0x0D);

printf("a3=%f",a3);
putchar(0x0D);

printf("a3=%x",a3);
putchar(0x0D);
// Place your code here

delay_ms(3000);
};
}




на терминале выводится
a3=26214
a3=26214
a3=26214
a3=
a3=
a3=6666

если присвоить 4.1 на терминал выводится
a3=13107
a3=13107
a3=13107
a3=
a3=
a3=3333

mas_nk
Сообщения: 19
Зарегистрирован: 26 мар 2009, 15:18

Re: вычисление математических функций

Сообщение mas_nk » 30 июн 2009, 04:34

Разобрался, в конфиге проекта нужно поставить свойства функции printf (float, width,precision)

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей