Float in linux

Im working with mspgcc in fedora core 4

i have allmost all working, im compiling, loading, interruptions, but i have now a little problem

my code dont recognize float

so … if you know how can i do something it wold be great …

thanks

i have allmost all working, im compiling, loading, interruptions, but i have now a little problem

my code dont recognize float

What do you mean by that? What error or problem are you getting?

[i]#include <msp430x16x.h>
#include <stdio.h>
#include <stdlib.h>
#include <float.h>
#include <signal.h>
#include <io.h>
#include <iomacros.h>
#include "display.h"
#include "adc.h"
#include "keypad.h"
#include "rxir.h"

#define MAX_TH(x)      ((190.0 * (float) x) / 200.0)
#define MIN_TH(x)      ((177.0 * (float) x) / 200.0)
#define RANGE(x)       (MAX_TH(x) - MIN_TH(x))

int min, max, avg;

int line = 0;
int sec = 0;


int pbir_code;

void Init_Osc_X2(void)
{
    // Al enceder la MSP,
    // y a XT1 en modo LF para ACLK

    BCSCTL1 &= ~XT2OFF;                            // XT2 encendido (8MHz)
    do                                             // wait in loop until crystal is stable
      IFG1 &= ~OFIFG;
    while (IFG1 & OFIFG);
    IE1 &= ~WDTIE;                                 // disable WDT int.
    IFG1 &= ~WDTIFG;                               // clear WDT int. flag

    BCSCTL2 = SELM_2 | DIVM_0 | SELS | DIVS_0 ;    // MCLK <- XT2 | MCLK = 1:1 | SMCLK <- XT2 | SMCLK = 1:1 ;

    WDTCTL = WDTPW | WDTTMSEL | WDTCNTCL | WDTIS1 ; // use WDT as timer, flag each 512 pulses from SMCLK
    while (!(IFG1 & WDTIFG));                       // count 1024 pulses from XT2
                                                    // (until XT2's amplitude is OK)
    IFG1 &= ~OFIFG;                                 // clear osc. fault int. flag
}

int key;

void main(void)
{
  Init_Osc_X2();
  _EINT();
  WDTCTL = WDTPW + WDTHOLD;

  init_display();

  CCTL0 = CCIE;               // CCR0 habilita interrupci
  CCR0 = 32768 / 1;           // 3 Hz ??

  TACTL = TASSEL_1 + MC_1;    // reloj ACLK, modo up to CCR0

  TBCCTL0 = CCIE;               // CCR0 habilita interrupci
  TBCCR0 = 32768 / 50;           // 50 Hz

  TBCTL = TASSEL_1 + MC_1;    // reloj ACLK, modo up to CCR0
  TBCCTL1 = OUTMOD_3;

  P4DIR |= BIT1;
  P4SEL |= BIT1;

  init_rxir();

  ADC_INIT_SEQ();

  //_BIS_SR(LPM0_bits + GIE);  // modo bajo consumo


  while (1)
    key=getchar();
}

#define CONV(x)     ((float) ((x) * REF) / (float) 0xfff)
#define REF         3.3

// Timer A0 rutina de servicio de interrupci
#pragma vector = TIMERA0_VECTOR
interrupt (TIMERA0_VECTOR) Timer_A(void)
{
  int pos = get_pos();
  CONV_ADC_SEQ(0, &min, &max, &avg);
  //printf("m: %3.2f M: %3.2f\np: %3.2f (%3d)", CONV(min), CONV(max), CONV(avg), key);
  printf("hola (%f)\nchao (%d)",3.14,100);
   set_pos(pos);

  TBCCR1 = MIN_TH(TBCCR0) + ((RANGE(TBCCR0) * (float) avg / (float) 0xfff));
}

#pragma vector = TIMERB0_VECTOR
interrupt (TIMERB0_VECTOR) Timer_B(void)
{

}

[/i]

Thats my main, and the float did not work

i dont know why … but this code is only de main … and the sistem works perfect, but the float no, for that reason the system thows bad results, but is working

do i explain myself??

The problem is the

printf(%f,3.14)

that line did not work

and i have the stdio.h included but i dont know, maybe i need another library

if someone knows someyhing … please help me

thanks[/i]

Oh, I see. The %f support in printf takes a lot of code space and it’s common for it to be left out of microcontroller libraries. Sometimes there’s an optional library you can link that has a more complete printf(), but I don’t think there is one for mspgcc.

Probably ‘float’ works everywhere except for printf.

If you need %f support in printf you could try [replacing your printf with something like this. Or you could just multiply the number by (say) 100 and convert to an integer before printing, if you don’t need the whole dynamic range of a floating-point number.](http://blog.gmane.org/gmane.comp.hardware.texas-instruments.msp430.gcc.user/month=20030701)