Страница 1 из 1

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

Добавлено: Ср июн 22, 2011 17:23:44
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); но никакое число не отображается в терминале

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

Добавлено: Ср июн 22, 2011 17:48:41
IfoR
У вам есть пробел между % и f?
И в смысле "ничего не получаете"?
Объяснитесь поподробнее. Участок кода хоть покажите, где у вас проблемное место.

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

Добавлено: Ср июн 22, 2011 17:49:34
romanF1
пробелу нет

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

Добавлено: Ср июн 22, 2011 20:01:50
romanF1
я не могу получить действительное число. вот вычисляю значение напряжения adc_data = adc_data * (3480.0/1024) которое измерил АЦП и отправляю на ком порт то ничего не приходит, если отправлять целое все отправляется. не понимаю почему не вычисляется действительное число

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

Добавлено: Ср июн 22, 2011 20:11:27
ChipKiller
romanF1 писал(а):я не могу получить действительное число.
.. зачем "мучить" AVR действительными числами, целых не хватает или он работает "слишком быстро"?

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

Добавлено: Ср июн 22, 2011 20:25:21
IfoR
romanF1, ну, по всей видимости, из того что вы сказали можно предположить только что то, что здесь функция printf не поддерживает дробные числа.
Киньте код что-ли. Там посмотрим.

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

Добавлено: Чт июн 23, 2011 08:59:22
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

Только потом не удивляйтесь, что вес прошивки вырастет на пару кило :))

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

Добавлено: Чт июн 23, 2011 10:30:46
Vov123
Если пишешь на CVAVR,попробуй переключить printf Features на float в настройках компилятора.

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

Добавлено: Чт июн 23, 2011 11:41:35
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?

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

Добавлено: Чт июн 23, 2011 14:04:21
IfoR
Кстати, %d, как и %i, означает целое десятичное число. И зачем r хранить как double? Сделайте целым. Судя по числу в 3480.0, я так понимаю, в r значение и так записывается в милливольтах.