реклама на сайте
подробности

 
 
> Не работает с float, mega16
Serg_greS
сообщение Apr 27 2006, 13:43
Сообщение #1


Частый гость
**

Группа: Новичок
Сообщений: 85
Регистрация: 13-01-05
Из: Москва
Пользователь №: 1 922



Помогите разобраться вот с чем:
с АЦП считываются значения напряжения с последующим отображением на 5-ти 7-ми сегментных индикаторах, так вот при использовании целых типов все хорошо, а стоит написать float, так такое ощущение, как будто проц висит. float нужен для апроксимации логарифмической зависимости. В чем грабли?
IAR AVR 4.12

апроксимация вида: X = -(log((0.0025*Y)/4.959)/0.029)
Y - значение с АЦП (10 бит)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Serg_greS
сообщение Apr 28 2006, 04:00
Сообщение #2


Частый гость
**

Группа: Новичок
Сообщений: 85
Регистрация: 13-01-05
Из: Москва
Пользователь №: 1 922



Код следующий:

//Mega16
//iar EW AVR 4.12

#include <iom16.h>
#include <ioavr.h>
#include <inavr.h>
#include <stdlib.h>
#include <math.h>

#define NUM_IZM 128

//#define _N0 0x03
//#define _N1 0x9f
//#define _N2 0x25
//#define _N3 0x0d
//#define _N4 0x99
//#define _N5 0x49
//#define _N6 0x41
//#define _N7 0x1f
//#define _N8 0x01
//#define _N9 0x09

// 1-st digit 0x10
// 2-nd digit 0x08
// 3-rd digit 0x04
// 4-th digit 0x02
// 5-th digit 0x01


//fuses 8MHz CKSEL3=0 CKSEL2=1 CKSEL1=0 CKSEL0=0
// SUT1=1 SUT0=0 65ms startup


__flash unsigned char Nums[]={0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};


#pragma vector = TIMER2_OVF_vect
__interrupt void TIMER2_OVF(void);

#pragma vector = TIMER2_COMP_vect
__interrupt void TIMER2_COMP(void);

unsigned char print[5];
unsigned char num=0, di=0;
unsigned int i=0;
unsigned int temp=0, gc=0;
//float temperature=0.0;

void init(void);
void long2char(unsigned int);
unsigned int ADCread(void);


//long int ADCread(void);

void main(void)
{
init();
di=0;
while(1)
{
temp = ADCread();
gc=(unsigned int)((log(((temp*0.0025)-0.1438)/4.959))/0.029);
long2char(gc);
}
}

unsigned int ADCread(void)
{
unsigned long ADC=0, tempADC=0;
unsigned char i=0;
while (i < NUM_IZM) // Усреднение по NUM_IZM замерам
{
// VCC ref and ADCx
ADMUX = (1<<REFS1) | (1<<REFS0) | (0<<ADLAR) | (0<<MUX4) | (0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (0<<MUX0);
//Начинаем одиночное преобразование // ADLAR=0 -> ADCH ------98 ADCL 76543210
ADCSRA |= (1<<ADSC);
while (ADCSRA & (1<<ADSC));

// ADCSRA |= (1<<ADSC); // ADLAR=1 -> ADCH 98765432 ADCL 10------
// while(!(ADCSRA & (1 << ADIF))); //Ждем окончания преобразования
ADCSRA |= (1<<ADIF); //Сбрасываем флаг
tempADC = ADCL;
tempADC += (ADCH<<8);
ADC +=tempADC;
i++;
}
ADC /= NUM_IZM;
return ((unsigned int)ADC);
}


#pragma vector = TIMER2_OVF_vect
__interrupt void TIMER2_OVF(void)
{
di++;
if (di>=5)
{
di=0;
// i++;
}


}

#pragma vector = TIMER2_COMP_vect
__interrupt void TIMER2_COMP(void)
{
PORTB = 0x1f^(1<<di);
PORTC = Nums[print[di]];

}

void long2char(unsigned int input_num)
{
unsigned char ni=5;
while (ni>0)
{
print[ni-1]=div(input_num,10).rem;
input_num /=10;
ni--;

}
}


#pragma inline=forced
void init (void)
{
//port setup using portb & portc

PORTC = (1<<PORTC7) | (1<<PORTC6) | (1<<PORTC5) | (1<<PORTC4) | (1<<PORTC3) | (1<<PORTC2) | (1<<PORTC1) | (1<<PORTC0);
DDRC = (1<<DDC7) | (1<<DDC6) | (1<<DDC5) | (1<<DDC4) | (1<<DDC3) | (1<<DDC2) | (1<<DDC1) | (1<<DDC0);
PORTB = (1<<PORTB4) | (1<<PORTB3) | (1<<PORTB2) | (1<<PORTB1) | (1<<PORTB0);
DDRB = (1<<DDB4) | (1<<DDB3) | (1<<DDB2) | (1<<DDB1) | (1<<DDB0);



TCCR2 = (0<<FOC2) | (0<<WGM20) | (0<<COM21) | (0<<COM20) | (0<<WGM21) | (0<<CS22) | (0<<CS21) | (1<<CS20);
TIFR = (1<<OCF2) | (1<<TOV2); //clear
TIMSK = (1<<OCIE2) | (1<<TOIE2); //enable interrupt


TCNT2 = 0;
OCR2 = 0x7f;

//ADC init
//internal 2.56v with external capacitor at AREF pin
//ADC0 single ended
ADMUX = (1<<REFS1) | (1<<REFS0) | (0<<ADLAR) | (0<<MUX4) | (0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (0<<MUX0);


ADCSRA = (1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (1<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);


ADCSRA |= (1<<ADSC);
while (ADCSRA & (1<<ADSC)); //wait for end conversion
ADCSRA=ADCSRA; //clear ADCSRA
__enable_interrupt();

}
Go to the top of the page
 
+Quote Post
Old1
сообщение Apr 28 2006, 07:22
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095



Цитата(Serg_greS @ Apr 28 2006, 07:00) *
Код следующий:
...
temp = ADCread();
gc=(unsigned int)((log(((temp*0.0025)-0.1438)/4.959))/0.029);
...

Насколько я понял значения переменной temp лежат в диапазоне от 0 до 1023, при этом в соответствии с формулой переменная gc будет всегда отрицательная, а у вас используется приведение к беззнаковому типу...но даже в этом случае переменная gc вычисляется без зависаний, похоже, что дело не в числах с плавающей точкой... я ваш код проверил на реальном устройстве на М16...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Serg_greS   Не работает с float   Apr 27 2006, 13:43
- - _artem_   code please ...   Apr 27 2006, 14:00
- - Виктория   ЦитатаX = -(log((0.0025*Y)/4.959)/0.029) А также ...   Apr 27 2006, 14:30
- - WHALE   а симулятор что показывает?   Apr 27 2006, 17:34
- - Old1   Цитата(Serg_greS @ Apr 27 2006, 16:43) .....   Apr 27 2006, 20:34
- - arttab   float пробовал на меги8 - работает. только код сил...   Apr 28 2006, 01:20
- - Serg_greS   Логарифм натуральный, т.е. с основанием е   Apr 28 2006, 04:35
- - Serg_greS   и все равно что-то не то, даже если использовать: ...   May 2 2006, 04:52
- - proba   С по сушеству 16 битный язык. советую каждое решен...   May 2 2006, 06:50
- - vet   Цитата(Serg_greS)а на float я стал грешить после т...   May 2 2006, 06:51
- - Serg_greS   в общем, помучал еще немного и выяснилось, что ...   May 2 2006, 08:11
- - Serg_greS   подскажите в чем проблема при вычислении, если вот...   May 3 2006, 06:18
- - Serg_greS   Подскажите почему не работает такая конструкция: g...   May 3 2006, 08:07
- - vet   Цитата(Serg_greS @ May 3 2006, 12:07) Под...   May 3 2006, 09:15
- - topkin   gc - какой тип данных?   May 3 2006, 10:03
- - Serg_greS   2 vet Цитатаgc=((float)temp*0.5); так тоже не рабо...   May 3 2006, 13:14
|- - Old1   Цитата(Serg_greS @ May 3 2006, 16:14) даж...   May 3 2006, 17:46
- - WHALE   Имхо,что-то с выводом на ALC.У тебя динамическая и...   May 3 2006, 16:26
- - Serg_greS   2 WHALE ЦитатаИмхо,что-то с выводом на ALC.У тебя ...   May 4 2006, 04:03
|- - otrog   Цитата(Serg_greS @ May 4 2006, 08:03) Так...   May 4 2006, 05:48
|- - Old1   Цитата(Serg_greS @ May 4 2006, 07:03) 2 W...   May 4 2006, 07:55
- - Serg_greS   2 Old1 ЦитатаЯ ради интереса запустил код в JTAGIC...   May 4 2006, 10:59
|- - Old1   Цитата(Serg_greS @ May 4 2006, 13:59) ......   May 4 2006, 19:50
|- - Old1   2 Serg_greS Цитата(Old1 @ May 4 2006, 22...   May 5 2006, 07:26
- - Serg_greS   ЦитатаВот выкладываю файл с прошивкой, и на всякий...   May 5 2006, 08:40
|- - Old1   Цитата(Serg_greS @ May 5 2006, 11:40) Цит...   May 5 2006, 09:29
- - Serg_greS   ЦитатаЧем прошиваете прошиваю с помощью http://avr...   May 5 2006, 12:47
|- - Old1   Цитата(Serg_greS @ May 5 2006, 15:47) Цит...   May 5 2006, 18:42
- - Serg_greS   Цитатано только до тех пор пока в коде не появляют...   May 6 2006, 03:58
- - Serg_greS   Old1 огрОмный респект, все заработало. Сделал кло...   May 11 2006, 08:32
- - Old1   Цитата(Serg_greS @ May 11 2006, 11:32) Ol...   May 11 2006, 09:19


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 14:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.01412 секунд с 7
ELECTRONIX ©2004-2016