как выполнить деление на микроконтроллере Atmega16
как выполнить деление на микроконтроллере Atmega16
хочу отобразить данные АЦП на дисплее, поэтому результат преобразования перевожу в напряжение 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
У вам есть пробел между % и f?
И в смысле "ничего не получаете"?
Объяснитесь поподробнее. Участок кода хоть покажите, где у вас проблемное место.
И в смысле "ничего не получаете"?
Объяснитесь поподробнее. Участок кода хоть покажите, где у вас проблемное место.
Последний раз редактировалось IfoR Ср июн 22, 2011 17:52:06, всего редактировалось 2 раза.
Re: как выполнить деление на микроконтроллере Atmega16
я не могу получить действительное число. вот вычисляю значение напряжения adc_data = adc_data * (3480.0/1024) которое измерил АЦП и отправляю на ком порт то ничего не приходит, если отправлять целое все отправляется. не понимаю почему не вычисляется действительное число
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: как выполнить деление на микроконтроллере Atmega16
.. зачем "мучить" AVR действительными числами, целых не хватает или он работает "слишком быстро"?romanF1 писал(а):я не могу получить действительное число.
- Реклама
- IfoR
- Поставщик валерьянки для Кота
- Сообщения: 2029
- Зарегистрирован: Сб ноя 15, 2008 10:09:56
- Откуда: г. Тула
- Контактная информация:
Re: как выполнить деление на микроконтроллере Atmega16
romanF1, ну, по всей видимости, из того что вы сказали можно предположить только что то, что здесь функция printf не поддерживает дробные числа.
Киньте код что-ли. Там посмотрим.
Киньте код что-ли. Там посмотрим.
Re: как выполнить деление на микроконтроллере Atmega16
Тут читали: 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
Если пишешь на CVAVR,попробуй переключить printf Features на float в настройках компилятора.
Re: как выполнить деление на микроконтроллере Atmega16
Код: Выделить всё
#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
Кстати, %d, как и %i, означает целое десятичное число. И зачем r хранить как double? Сделайте целым. Судя по числу в 3480.0, я так понимаю, в r значение и так записывается в милливольтах.



