Перейти к содержанию

преобразхование Float


svinz

Рекомендуемые сообщения

"#include <iostream.h>"- без использования подобных библиотек надо, так я и сам могу)))))))))))))))

LPC1768- это не скромный, а CORTEX M3))))))))))))

Плюнул на все, написал вставку на асме-криво, но работает, отлажу-выложу))))))))))))))))))))))

"Ну, вот. Теперь xct знает, что на форуме целых 2 программиста, bbden175 и svin*"- да, мы такие)))))))))))))))))

 

 

Пусть xct оценит следующее(да и не только он, всем будет полезно))))))))))))))))))))))

 

Так решал в MPLAB для ПИК18, с LPCXpresso-не работает

 

 

"

float arg;

 

*(((BYTE*)&arg) + 0 )

*(((BYTE*)&arg) + 1 )

*(((BYTE*)&arg) + 2 )

*(((BYTE*)&arg) + 3 )

"

 

 

в си нет типа byte, в стандарте -char (по сути-одно и тоже)

 

svin, спасибо за реакцию)))))))))))))))))

Ссылка на комментарий
Поделиться на другие сайты

У меня ограничение исходника в 128к, а туда еще нужно засунуть много чего, вплоть до RTC, отсюда и ограничение в плане библиотек стандартных, те про include-надо забыть)))))

Ссылка на комментарий
Поделиться на другие сайты

Возможно, я действительно странный))))))

Но то, что работает у тебя на PC, не работает на МК, вот в чем суть)))))))))))))))))

Мля, ну реально не работает.(((((((((((((((((((

C я практически не знаю, об этом писал, мне асм ближе, так что чем разбираться в твоем коде, проще мне свой написать)))))))))))))))))

мне float в четыре байта отдельных надо)))))))))))))))))))))))) Код я привел, но он тока в Микросях работает, у меня-почемуто нет( лыжи не едут), Дай мне пинок в нужном направлении, буду благодарен))))))

Народ объединения использует, только не могу понять как это реализовать в С.

Ссылка на комментарий
Поделиться на другие сайты

cout у меня без строки #include <stdio.h> тож не работает.

Суть в том, что в режиме Semihosting C все работает, но это режим отладки, те с компом платка соединена.

А мне надо автономно чтоб работала. А она виснет((((((((((((((((((((. В симуляторе пашет, в железе-нет.

Пичалька((((((((((((((((((((((

Ссылка на комментарий
Поделиться на другие сайты

Я тя ваще не понимаю, ты мыслишь не как программист,

а что-то в стиле "Я один", если ты знаешь этого человека.

Я не телепат, "у меня что-то не работает",

а что именно ? моя процедура void ftocp (float* f, char* c)

у тебя не работает или что ?

 

ps: есть у нас на работе один чел, тоже что-то кодит на С

под микроконтроллеры. когда увидел его код - у меня

щетина дыбом встала.

вы, ребята, помойму кодите методом - а переберу-ка

я случайные последовательности операторов - а вдруг

получится программа, которая делает как раз то, что мне надо,

но я сам толком не знаю, что мне надо.

Ссылка на комментарий
Поделиться на другие сайты

Да, ты чертовски прав, я не программер, а электронщик

У меня ругается на строку #include <iostream.h> со всеми вытекающими......

 

Да, согласен, Мы кодим именно так ,как ты описал, но у Нас все работает, в отличие от Вас.

Если Тебя не затруднит, прокомментируй пост № 6.........

Если я не прав , укажи, плз

Заранее Благодарен))))))))

 

CMSIS есть у нас...................

И это реально радует........................

Ссылка на комментарий
Поделиться на другие сайты

Да, ты чертовски прав, я не программер, а электронщик

У меня ругается на строку #include <iostream.h> со всеми вытекающими......

Да, согласен, Мы кодим именно так ,как ты описал, но у Нас все работает, в отличие от Вас.

Если Тебя не затруднит, прокомментируй пост № 6.........

Если я не прав , укажи, плз

Заранее Благодарен))))))))

CMSIS есть у нас...................

И это реально радует........................

 

Вот и прекрасно, что работает.

Значит никакая помощь вам и не нужна.

 

Знаю я этих электронщиков, они весь день сидят, матерятся,

дымят своими паяльниками, припаивают и отпаивают проводки,

они и схемы-то свои собирают методом случайного перебора

вариантов соединения радиодеталей до тех пор, пока не заработает

как надо, при том, опять же, сами точно не знают, "как надо".

Нахера всё это ? А им "сам процесс нравится".

Ну вас в жопу. Я так не могу, меня такой подход к работе бесит.

Давай, до свиданья.

Ссылка на комментарий
Поделиться на другие сайты

  • 2 weeks later...

ладно, восстановим:

 

typedef unsigned long int ui32;

const ui32 hbit = 0x80000000 ;

 

void ftocp (float& f, char* c)

{ ui32 n=*(ui32*)&f ;

int z = n>>31 ; if (z) *c++='-'; else *c++='+';

int p = int( (n>>23) & 0xFF )-127 ;

ui32 m = n<<9 ;

ui32 cel, drob, ves;

if (p==-127){ *c++='0'; *c=0; return; };

if (p>31) { *c++='i'; *c=0; return; };

if (p<-32) { *c++='s'; *c=0; return; };

if (p== 0) { cel=1; drob=m; };

if (p< 0 ) { cel=0; drob=(hbit|(m>>1)) >> (-p-1) ; };

if (p> 0) { cel= (hbit|(m>>1)) >> (31-p); drob= m<<p; };

ves= 1000000000 ;

do { unsigned char k=0; while (cel>=ves) { k++; cel-=ves; };

*c++ = k+'0'; ves /= 10; } while (ves>0);

*c++ ='.';

ves= 429496729 ;

do { unsigned char k=0; while (drob>=ves) { k++; drob-=ves; };

*c++ = k+'0'; ves /= 10; } while (ves>0);

*c= 0 ;

}

 

Пример использования:

char t[22]; float z=-1.0/3.0 ; ftocp (z, t);

результат в t[] : "-0000000000.333333348"

 

Как работает: разбираем float на знак, порядок и мантиссу (z,p,m)

согласно описания формата http://en.wikipedia.org/wiki/Single_precision

далее сдвигом переводим в формат с фиксированной точкой,

где бинарные целая и дробная части (cel,drob) имеют размер 32 бита.

Отсюда точность вывода (по модулю) - минимум 2^-32, т.е. ~ 1e-9,

максимум почти 2^32, т.е. ~ 4.29e9.

Если число выходит за пределы, то пишем i (infinity) или s (singularity).

Максимальный вывод составляет 22 байта, включая нуль-байт, заканчивающий строку.

Ссылка на комментарий
Поделиться на другие сайты

  • 2 months later...

Фишка в том, что в компиляторе галочку в настройках(ну не разобрался) не установил, установил когда, все заработало

Ссылка на комментарий
Поделиться на другие сайты

Вот исходник:

 

===============================================================================

Name : main.c

Author : $(author)

Version :

Copyright : $(copyright)

Description : main definition

===============================================================================

*/

 

#ifdef __USE_CMSIS

#include "LPC17xx.h"

#endif

//********************************************************************************

**********************

#include <cr_section_macros.h>

#include <NXP/crp.h>

//********************************************************************************

******************

// Variable to store CRP value in. Will be placed automatically

// by the linker when "Enable Code Read Protect" selected.

// See crp.h header for more information

__CRP const unsigned int CRP_WORD = CRP_NO_CRP ;

//********************************************************************************

*******************

#include "dma.h"

#include "small_systick.h"

#include "type.h"

#include "adc.h"

#include "GPIO.h"

#include "timer.h"

#include "dac.h"

#include <stdio.h>

//********************************************************************************

***********************

extern volatile uint32_t ADC0Value[ADC_NUM];

extern volatile uint32_t ADC0IntDone;

//********************************************************************************

************************

#define ADC_COUNT_MAX 4095

#define SUPPLY_VOLTAGE 3.30

#define JOYSTICK_LEFT (LPC_GPIO2->FIOPIN & (1<<13) )

#define JOYSTICK_RIGHT (LPC_GPIO0->FIOPIN & (1<<27) )

#define JOYSTICK_CENTER (LPC_GPIO0->FIOPIN & (1<<28) )

#define TONE_TO_DIVISOR(toneFreq) (10000000/(toneFreq*8*TABLE_ELEMENTS))

#define Q16_MIN (1<<14)

#define Q16_MAX (1<<19)

#define Q16_INIT (1<<16)

#define Q16_STEP (1<<9)

//********************************************************************************

****************************

volatile uint32_t msTicks; /* counts 1ms timeTicks */

/*----------------------------------------------------------------------------

SysTick_Handler

*----------------------------------------------------------------------------*/

void SysTick_Handler(void) {

msTicks++; /* increment counter necessary in Delay() */

}

/*------------------------------------------------------------------------------

delays number of tick

*------------------------------------------------------------------------------*/

__INLINE static void systick_delay (uint32_t dlyTicks) {

uint32_t curTicks;

 

curTicks = msTicks;

while ((msTicks - curTicks) < dlyTicks);

}

//********************************************************************************

******************************

static void initDAC(void)

{

LPC_PINCON->PINSEL1 = 0x2<<20; //Select AOUT function on pin

 

LPC_SC->PCLKSEL0 |= 0x3 << 22; //DAC Clocked at CCLK/8

LPC_DAC->DACCNTVAL = TONE_TO_DIVISOR(440); //Timer rate = 100MHz/(8*444) => Timer/64samples = Waveform freq ~= 440Hz

LPC_DAC->DACCTRL = 1<<2 | 1<<3; //Enable counter and DMA requests

}

 

//********************************************************************************

***********************

void InitTIM3 (void)

{ LPC_SC->PCONP |= (1<<23); // Timer2 power on

LPC_SC->PCLKSEL1 |= (1 << 14); // Divide CCLK by 1 for Timer3

LPC_TIM3->TC = 0; // clear timer counter

LPC_TIM3->PC = 0; // clear prescale counter

LPC_TIM3->PR = 0; // clear prescale register

LPC_TIM3->TCR |= (1 << 1); // reset timer

LPC_TIM3->TCR &= ~(1 << 1); // release reset

LPC_TIM3->CTCR = 0x00; // timer mode

LPC_TIM3->PR = 99; // <resolution> uS accuracy @ CCLK/4 Peripheral Clock

LPC_TIM3->MCR |= (1 << 1);

 

NVIC_EnableIRQ(TIMER0_IRQn);//reset counter on match

}

//********************************************************************************

**************************

void DELAY_us(unsigned int us)

{ LPC_TIM3->MCR = 0; // disable timer

LPC_TIM3->MR0 = us; // interrupt event on overrun

LPC_TIM3->TC = 0; // reset counter

LPC_TIM3->MCR |= (1 << 1); //reset counter on match

LPC_TIM3->TCR |= (1 << 0); // start Timer2

while (LPC_TIM3->TC);

return;

}

//********************************************************************************

****************************

void init_port (void)

{

// Set P2_ to 00 - GPIO 7<<20

LPC_PINCON->PINSEL4 &= (~(7<<20)|(255<<0));//

// Set GPIO - P2_ - to be output

LPC_GPIO2->FIODIR |= (7<<10);

LPC_GPIO2->FIODIR |= (255<<0);//

}

//********************************************************************************

****************************

void LCD_com(unsigned char P)

{

LPC_GPIO2->FIOCLR = (1<<12);LPC_GPIO4->FIOCLR = (1<<11);

LPC_GPIO2->FIOCLR = (1<<10);

LPC_GPIO2->FIOPIN0 = P;//DELAY_us(1000);

LPC_GPIO2->FIOSET=(1<<10); //EN=1

DELAY_us(100);

LPC_GPIO2->FIOCLR = (1<<10); //EN=0

//DELAY_us(1000);

LPC_GPIO2->FIOPIN0 = 0xFF;

DELAY_us(100);

}

//********************************************************************************

****************************

void LCD_dat(unsigned char P)

{

LPC_GPIO2->FIOSET = (1<<12);

LPC_GPIO2->FIOPIN0 = P;

LPC_GPIO2->FIOSET = (1<<10);

DELAY_us(100);

LPC_GPIO2->FIOCLR = (1<<10); //EN=0

DELAY_us(100);

LPC_GPIO2->FIOPIN0 = 0xFF;

DELAY_us(100);

}

//********************************************************************************

*****************************

void LCD_init(void)

{systick_delay(30);

LCD_com(0x08);

DELAY_us(200);

LCD_com(0x38);

DELAY_us(200);

LCD_com(0x38);

DELAY_us(200);

LCD_com(0x38);

DELAY_us(200);

LCD_com(0x38);

DELAY_us(200);

LCD_com(0x01);

DELAY_us(2000);

LCD_com(0x06);

DELAY_us(2000);

LCD_com(0x0D);

DELAY_us(200);

 

}

//********************************************************************************

*******************************

void LCD_string (char *s)

{

while (*s) {LCD_dat(*s++); }

}

 

//********************************************************************************

*******************************

//********************************************************************************

***************************

static void joystickToPhase(unsigned long int *stepDeltaQ16)

{

unsigned long int localDelta = *stepDeltaQ16;

//Update waveforms on Joystick

if ( 0 == JOYSTICK_RIGHT )

{

P022_on();LCD_string("+");

localDelta += Q16_STEP; //+= Q16(1/128)

}

//cannot assert two positions on joystick at once

else if (0 == JOYSTICK_LEFT)

{

P022_on();LCD_string("-");

localDelta -= Q16_STEP; //-= Q16(1/128)

}

else if ( 0 == JOYSTICK_CENTER)

{

P022_on();LCD_string("ok");

//Reset

localDelta = Q16_INIT;

}

*stepDeltaQ16 = BOUND(Q16_MIN,localDelta,Q16_MAX);

return;

}

//********************************************************************************

**************************

__attribute__ ((section(".ahb_ram")))

static unsigned long int dma_buff_ping[64]; //Having DMA buffers in RAM allows them to be filled with arbitrary waveforms

__attribute__ ((section(".ahb_ram")))

static unsigned long int dma_buff_pong[64]; //if an application only needs fixed waveforms, simply update LLI's to point to const arrays

__attribute__ ((section(".ahb_ram")))

static dmaLinkedListNode dmaList[2]; //Array of nodes, both will be set to point to each other creating a looping "list"

 

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

+++++++++++++++++++++++++++++++

int main(void)

{

char s0[4];

float ADCVolts;

unsigned char i;

 

unsigned long int stepDeltaQ16 = Q16_INIT; //Initial value: 1.0

unsigned short* pSrc;

dmaLinkedListNode* pNodePing = &dmaList[0];

dmaLinkedListNode* pNodePong = &dmaList[1];

//SysTick_Config(SystemCoreClock / 1000); // настройка таймера на период 1мс

InitSysTick(100);

initDAC();

initDMA(pNodePing);

 

pSrc = (unsigned short*) &sine_buff[0];

for (i=0; i<TABLE_ELEMENTS; i++)

{

dma_buff_ping = pSrc;

dma_buff_pong = pSrc;

}

 

pNodePing->sourceAddr = (unsigned long int) &dma_buff_ping[0];

pNodePing->destAddr = (unsigned long int) &LPC_DAC->DACR;

pNodePing->nextNode = (unsigned long int) pNodePong; //bounce between double buffers forever

//Size is 64 buffer elements, 32bits each

//Transferred into DAC peripheral as 32 bits

//Increment source address, but not destination

pNodePing->dmaControl = TABLE_ELEMENTS | 0x2<<18 | 0x2<<21 | 1<<26;

 

//Different sourceAddr for 2nd LLI node, but otherwise the same

pNodePong->sourceAddr = (unsigned long int) &dma_buff_pong[0];

pNodePong->destAddr = (unsigned long int) &LPC_DAC->DACR;

pNodePong->nextNode = (unsigned long int) pNodePing; //bounce between double buffers forever

pNodePong->dmaControl = TABLE_ELEMENTS | 0x2<<18 | 0x2<<21 | 1<<26;

 

InitSysTick(100);

P022init_as_output();

P020init_as_output();

initDAC();

initDMA(pNodePing);

/* Инициализация ADC */

ADCInit( ADC_CLK );

systick_delay(25);

InitTIM3();

init_port();

LCD_init();

//DAC_Init(); P020_on();

P022_on();

//LCD_string(" Denis Surkov !");

//------------------------------------------------------------------------------------------------------

while(1)

{initDAC();

joystickToPhase(&stepDeltaQ16);

updateBuffer(pSrc,stepDeltaQ16);

updateBuffer(pSrc,stepDeltaQ16);

LCD_init();

P020_on();

P022_on();

{ADC0Read( 5 );

while ( !ADC0IntDone );

ADC0IntDone = 0;}

 

ADCVolts=((ADC0Value[5]*SUPPLY_VOLTAGE))/ADC_COUNT_MAX;

sprintf(s0,"%3.4f",ADCVolts);

LCD_string("ADC data ");

LCD_string(s0);

LCD_string("V");

printf(s0);

printf("\n");

P020_off();

P022_off();

}

return 0 ;

}

Ссылка на комментарий
Поделиться на другие сайты

Чушка, попробуй разобраться, этот код работает в железе уже 2 недели.

Так кто из нас программер крутой?))))))))))))))))))))))))))))))))))0

Ссылка на комментарий
Поделиться на другие сайты

Заархивировано

Эта тема находится в архиве и закрыта для дальнейших ответов.

×
×
  • Создать...