как выполнить деление на микроконтроллере Atmega16

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
romanF1
Открыл глаза
Сообщения: 42
Зарегистрирован: Пн апр 11, 2011 20:28:48

как выполнить деление на микроконтроллере Atmega16

Сообщение romanF1 »

хочу отобразить данные АЦП на дисплее, поэтому результат преобразования перевожу в напряжение adc_data = adc_data * (3480.0/1024), а затем выполняю операции чтобы получить отдельные цифры adc_data/1000, (adc_data/100)% 10, (adc_data/10)% 10 , adc_data% 10 но ничего не получаю. Посылаю данные на ком порт printf ("adc_data =% f", adc_data); но никакое число не отображается в терминале
Реклама
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re: как выполнить деление на микроконтроллере Atmega16

Сообщение IfoR »

У вам есть пробел между % и f?
И в смысле "ничего не получаете"?
Объяснитесь поподробнее. Участок кода хоть покажите, где у вас проблемное место.
Последний раз редактировалось IfoR Ср июн 22, 2011 17:52:06, всего редактировалось 2 раза.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Реклама
romanF1
Открыл глаза
Сообщения: 42
Зарегистрирован: Пн апр 11, 2011 20:28:48

Re: как выполнить деление на микроконтроллере Atmega16

Сообщение romanF1 »

пробелу нет
romanF1
Открыл глаза
Сообщения: 42
Зарегистрирован: Пн апр 11, 2011 20:28:48

Re: как выполнить деление на микроконтроллере Atmega16

Сообщение romanF1 »

я не могу получить действительное число. вот вычисляю значение напряжения adc_data = adc_data * (3480.0/1024) которое измерил АЦП и отправляю на ком порт то ничего не приходит, если отправлять целое все отправляется. не понимаю почему не вычисляется действительное число
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: как выполнить деление на микроконтроллере Atmega16

Сообщение ChipKiller »

romanF1 писал(а):я не могу получить действительное число.
.. зачем "мучить" AVR действительными числами, целых не хватает или он работает "слишком быстро"?
Реклама
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re: как выполнить деление на микроконтроллере Atmega16

Сообщение IfoR »

romanF1, ну, по всей видимости, из того что вы сказали можно предположить только что то, что здесь функция printf не поддерживает дробные числа.
Киньте код что-ли. Там посмотрим.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Реклама
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Re: как выполнить деление на микроконтроллере Atmega16

Сообщение md5sum »

Тут читали: stdio.h?
stdio.h писал(а):The default vfprintf() implements all the mentioned functionality except floating point conversions.
По умолчанию конвертации для чисел с плав. запятой отключены.
Чтобы включить надо добавить опции при компиляции:
stdio.h писал(а): If the full functionality including the floating point conversions is required, the following options should be used:
-Wl,-u,vfprintf -lprintf_flt -lm

Только потом не удивляйтесь, что вес прошивки вырастет на пару кило :))
— Не говорите мне что делать и я не скажу куда Вам идти...
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Re: как выполнить деление на микроконтроллере Atmega16

Сообщение Vov123 »

Если пишешь на CVAVR,попробуй переключить printf Features на float в настройках компилятора.
romanF1
Открыл глаза
Сообщения: 42
Зарегистрирован: Пн апр 11, 2011 20:28:48

Re: как выполнить деление на микроконтроллере Atmega16

Сообщение romanF1 »

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

#include <mega16.h>
#include <math.h>
#include <delay.h>

// Standard Input/Output functions
#include <stdio.h>
#define  LOAD PORTC.1
#define  DIN PORTC.2
#define  DCLC PORTC.3
#define ADC_VREF_TYPE 0x00


void display(int a,int b,int c,int d)
{
int i,j,k;
int num[10][9]={{0,0,1,1,1,1,0,1,1}     //0
                ,{0,0,1,1,0,0,0,0,0}     //1
                ,{0,0,0,1,1,0,1,1,1}     //2
                ,{0,0,1,1,1,0,1,0,1}     //3
                ,{0,0,1,1,0,1,1,0,0}     //4
                ,{0,0,1,0,1,1,1,0,1}     //5
                ,{0,0,1,0,1,1,1,1,1}     //6
                ,{0,0,1,1,1,0,0,0,0}     //7
                ,{0,0,1,1,1,1,1,1,1}     //8
                ,{0,0,1,1,1,1,1,0,1}};
         LOAD=0;
         delay_ms(1);
          for(i=0;i<72;i++)
             {
               DIN=0; //ca?eaaai ana naaiaiou
               delay_ms(1);
               DCLC=0;
               delay_ms(1);
               DCLC=1;
               delay_ms(1);
             }
             LOAD=1;             
             DCLC=0;
             LOAD=0;
          for(j=0;j<4;j++)   
          { 
            if (j==0) k=a;
            if (j==1) k=b;
            if (j==2) k=c;
            if (j==3) k=d;             
           for(i=0;i<9;i++)
             {
              LOAD=0; 
              DCLC=0;
              DIN=num[k][i];                     
              DCLC=1;
              LOAD=1;
              }           
           }   
}

// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
unsigned int adc_data;
double r;
// Read the AD conversion result
adc_data=ADCW;
// Place your code here

ADCSRA|=0xC0;
delay_ms(100);
r=adc_data*(3480.0/1024.0);

printf("adc_data=%d",r);
/*
printf("a=%i\r",adc_data/1000);
printf("b=%i\r",(adc_data/100)%10);
printf("c=%i\r",(adc_data/10)%10);
printf("d=%i\r",adc_data%10);  */

adc_data=adc_data*3480/1024;
//adc_data=adc_data/1000;

display(adc_data/1000,(adc_data/100)%10,(adc_data/10)%10,adc_data%10);
}



а как включить поддержку вещественных чисел в CodeVision?
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re: как выполнить деление на микроконтроллере Atmega16

Сообщение IfoR »

Кстати, %d, как и %i, означает целое десятичное число. И зачем r хранить как double? Сделайте целым. Судя по числу в 3480.0, я так понимаю, в r значение и так записывается в милливольтах.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»