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



