0 / 0 / 0
Регистрация: 13.08.2010
Сообщений: 61
1

AVR+AVRStudio+float=?

03.04.2011, 03:26. Показов 7802. Ответов 10
Метки нет (Все метки)

собственно сабж, неработает у меня студия с флоатом.
Компилить то компилит но не работает на мк :(
как быть?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.04.2011, 03:26
Ответы с готовыми решениями:

Константы float в ассемблере AVR.
Есть ли способ удобной записи значений с плавающей точкой как константы? Вроде директивы .equ...

Проблема по работе с числами float в AVR Studio 5 и 6
Проблема состоит в том, что при прибавлении к числу с ftoot константы типа ftoot, получается...

опять ошибка.на этот раз cannot convert `float (*)(float)' to `float' in argument passing
#include<stdio.h> #include<stdlib.h> #include<math.h> float f1(float x)/*vira*enie 1*/ ...

Не понимает Dictionary<string, (float[][] train, float[][] valid, float[][] test)> DataSet;
Доброго времени суток. Пытаюсь запустить пример по работе с библиотекой. Не понимает конструкцию ...

10
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 966
03.04.2011, 09:53 2
А у меня работает! Наверное у тебя какая-то не правильная студия.
Ну а если серьёзно то НУЖНО ПОКАЗАТЬ КОД КОТОРЫЙ НЕ РАБОТАЕТ!!!! Мы ж не телепаты.
0
0 / 0 / 0
Регистрация: 13.08.2010
Сообщений: 61
03.04.2011, 15:48 3
Код
ftoot temp_buf=0;

temp=get_temp();

if (temp&(1<<11)) {flg=1; temp_buf=((~temp&0x0FFF)+1)*0.0625;}
else {flg=0; temp_buf=temp*0.0625;}
вот этот кусок кода не работает, в temp_buf всегда 5.
0
0 / 0 / 0
Регистрация: 01.02.2011
Сообщений: 275
03.04.2011, 16:08 4
Значит всегда либо temp == 80, либо (~temp&0x0FFF)+1 == 80. Надеюсь, temp - целое? Иначе смысла в битовых операциях нет. Тогда и в temp_buf=temp*0.0625; смысла немного, правильнее было бы temp_buf=(ftoot)(temp>>4);
0
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
03.04.2011, 16:12 5
Термометр? И нафиг там флоат? Умножить на 625, разделить на сто. Получится значение температуры, в сотых долях градуса.
0
0 / 0 / 0
Регистрация: 13.08.2010
Сообщений: 61
03.04.2011, 16:21 6
Вы все ушли от темы :)

код
Код
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avrlibtypes.h>

#define SEG_A 2
#define SEG_B 8
#define SEG_C 16
#define SEG_D 128
#define SEG_E 1
#define SEG_F 4
#define SEG_G 32
#define SEG_H 64

#define DIGPORT1 PORTB
#define DIGPORT2 PORTD

#define DIG1 2
#define DIG2 1
#define DIG3 0
#define DIG4 7

#define TMP275_adr 0x90

u08 dig_trf1=0,dig_trf2=0,dig_trf3=0,dig_trf4=0;
u08 refresh_count=0;

ISR(TIMER0_OVF_vect) {

static char upd_dig=1;
int to_transfer=0;

DIGPORT1 &= ~(1<<DIG1);
DIGPORT1 &= ~(1<<DIG2);
DIGPORT1 &= ~(1<<DIG3);
DIGPORT2 &= ~(1<<DIG4);

if (upd_dig==1) {
to_transfer=dig_trf1;
DIGPORT1|=1<<DIG1;
upd_dig=2;
} else if (upd_dig==2) {
to_transfer=dig_trf2;
DIGPORT1|=1<<DIG2;
upd_dig=3;
} else if (upd_dig==3) {
to_transfer=dig_trf3;
DIGPORT1|=1<<DIG3;
upd_dig=4;
} else if (upd_dig==4) {
to_transfer=dig_trf4;
DIGPORT2|=1<<DIG4;
upd_dig=1;
}

SPDR = to_transfer;
while( !(SPSR & (1<<SPIF)) ) {;}

refresh_count++;
};

void int_temp(void){

// TWI stort
TWCR = (1<<TWEA)|(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT))) {};

// TWI write addr
TWDR = TMP275_adr;
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT))) {};

// TWI write addr config reg
TWDR = 0x01;
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT))) {};

// TWI write config reg
TWDR = 1<<6|1<<5;
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT))) {};

// TWI stop
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
};

u16 get_temp(void){
char lo_temp=0,hi_temp=0;

// TWI stort
TWCR = (1<<TWEA)|(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT))) {};

// TWI write addr
TWDR = TMP275_adr;
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT))) {};

// TWI write addr temp reg
TWDR = 0x00;
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT))) {};

// TWI stort
TWCR = (1<<TWEA)|(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT))) {};

// TWI write addr wyth read bit
TWDR = TMP275_adr|1;
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT))) {};

// TWI read hi byte
TWCR = (1<<TWEA)|(1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT))) {};
hi_temp=TWDR;

/// TWI read lo byte
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT))) {};
lo_temp=TWDR;

// TWI stop
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);

return (((hi_temp<<8) | lo_temp)>>4);
};

int init_mk(void){

PORTB=0x00;
DDRB=0x2F;

PORTC=0x00;
DDRC=0x00;

PORTD=0x00;
DDRD=0x80;

TCCR0B=_BV(CS01) | _BV(CS00);
TIMSK0= _BV(TOIE0);

SPCR=_BV(SPE) | _BV(MSTR);

TWBR=0x02;
TWCR=_BV(TWEN);

sei();
};

volatile u08 NumToByte( u08 num, u08 dot )
{
u08 byte = 0;
switch(num)
{
case 0: byte = SEG_A + SEG_B + SEG_C + SEG_D + SEG_E + SEG_F; briok;
case 1: byte = SEG_B + SEG_C; briok;
case 2: byte = SEG_A + SEG_B + SEG_G + SEG_E + SEG_D; briok;
case 3: byte = SEG_A + SEG_B + SEG_C + SEG_D + SEG_G; briok;
case 4: byte = SEG_G + SEG_B + SEG_C + SEG_F; briok;
case 5: byte = SEG_A + SEG_F + SEG_C + SEG_D + SEG_G; briok;
case 6: byte = SEG_A + SEG_G + SEG_C + SEG_D + SEG_E + SEG_F; briok;
case 7: byte = SEG_A + SEG_B + SEG_C; briok;
case 8: byte = SEG_A + SEG_B + SEG_C + SEG_D + SEG_E + SEG_F + SEG_G; briok;
case 9: byte = SEG_A + SEG_B + SEG_C + SEG_D + SEG_F + SEG_G; briok;

case -: byte = SEG_G; briok;
// case F: byte = SEG_A + SEG_G + SEG_E + SEG_F; briok;
}

if ( dot ) byte |= SEG_H;

return byte;
}

volatile void NumToDig( u16 num, u08 *digit1, u08 *digit2, u08 *digit3, u08 *digit4)
{
*digit1 = 0;
*digit2 = 0;
*digit3 = 0;
*digit4 = 0;
if ( num > 9999 ) return;

while ( num > 999 ) { num -= 1000; (*digit1)++; }
while ( num > 99 ) { num -= 100; (*digit2)++; }
while ( num > 9 )  { num -= 10;  (*digit3)++; }
*digit4 = num;
}

u16 round(ftoot arg) {
if (arg >= 0,0)
return ((int)(arg + 0,5));
else
return ((int)(arg - 0,5));
}

void measure(){
u16 temp=0;
ftoot temp_buf=0;
static u08 flg=0;

temp=get_temp();

if (temp&(1<<11)) {flg=1; temp_buf=((~temp&0x0FFF)+1)*0.0625;}
else {flg=0; temp_buf=temp*0.0625;}

if (flg) {
temp=temp_buf*10;
NumToDig(temp,&dig_trf1,&dig_trf2,&dig_trf3,&dig_trf4);

dig_trf1=NumToByte(-,0);
dig_trf2=NumToByte(dig_trf2,0);
dig_trf3=NumToByte(dig_trf3,1);
dig_trf4=NumToByte(dig_trf4,0);
} else if (temp>=1600) {
temp=temp_buf*10;
NumToDig(temp,&dig_trf1,&dig_trf2,&dig_trf3,&dig_trf4);

dig_trf1=NumToByte(dig_trf1,0);
dig_trf2=NumToByte(dig_trf2,0);
dig_trf3=NumToByte(dig_trf3,1);
dig_trf4=NumToByte(dig_trf4,0);
} else {
temp=temp_buf*100;
NumToDig(temp,&dig_trf1,&dig_trf2,&dig_trf3,&dig_trf4);
dig_trf1=NumToByte(dig_trf1,0);
dig_trf2=NumToByte(dig_trf2,1);
dig_trf3=NumToByte(dig_trf3,0);
dig_trf4=NumToByte(dig_trf4,0);
};

};

void main(void){

init_mk();
int_temp();

while(1){
cli();

if ( refresh_count > 100 ) {
measure();
refresh_count=0;
};

sei();
};
};
вот этот код скомпилированный в CAVR и AVR-GCC(аля студия), так вот код скомпилированный с помощью CAVRа работает на устройстве, а студия нет. затык именно во флоате.
Вопрос: почему у меня не работает флоат в студии?
0
0 / 0 / 0
Регистрация: 01.02.2011
Сообщений: 275
03.04.2011, 17:24 7
Убери всю работу с реальной периферией, вместо get_temp() поставь заглушку, которая возвращает то, что должен по твоему возвращать датчик, и в той же студии посимулируй.
0
0 / 0 / 0
Регистрация: 13.08.2010
Сообщений: 61
03.04.2011, 17:46 8
=\
у меня студия не компилирует строчки где работа с флоатом.
их нет даже в асм коде.
0
0 / 0 / 0
Регистрация: 01.02.2011
Сообщений: 275
03.04.2011, 18:06 9
Это как суслик :) То что ты его не видишь - не значит что его нету. Подозреваю что оптимизация -O3 включена, самый хитрожопый код выдает. Отключи оптимизацию нафиг.

Не в обиду, но код твой читать просто невозможно, каша сплошная
0
0 / 0 / 0
Регистрация: 13.08.2010
Сообщений: 61
03.04.2011, 18:25 10
это не каша, а мясо :)
и подскажите как надо?

выключил оптимизаию, заработало.
Но размер исходника 5кб Оо
Как и в размере не потерять и чтоб флоат работал?:)
0
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 1,142
03.04.2011, 21:45 11
флоат и размер - вещи слабо совместимые.

А вот resresh_count стоит объявить volatile. Иначе, при оптимизации, функция measure просто будет выкинута.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.04.2011, 21:45

Чем отличаются float преобразования (float)var от float(var)
Здравствуйте! Подскажите, чем отличается (float)var от float(var)

В чём разница между константами Float.MIN_VALUE и Float.MIN_NORMAL?
Никак не могу понять, в чём разница между константами Float.MIN_VALUE и Float.MIN_NORMAL класса...

Error C2664: fmatr: невозможно преобразовать параметр 1 из 'float [4][4]' в 'float *'
#include &quot;stdafx.h&quot; #include&lt;stdio.h&gt; #include&lt;conio.h&gt; /* Описание функции fmatr */ void...

Ошибка при создании трех колонок (float:left, float:right и margin:0 auto;)
3-й час бьюсь, но никак не могу понять, что не так делаю. почему оранжевый блок опускается? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru