logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATMEGA8][C] Liczby zmiennoprzecinkowe, dtostrf, sprintf

zdebel 27 Gru 2008 15:14 3726 5
REKLAMA
  • #1 5908361
    zdebel
    Poziom 15  
    Witam!
    Chciałbym się dowiedzieć jak poprawnie używać liczby zmienno przecinkowe. Korzystam z win-avr i niestety nie mogę sobie poradzić. Dodałem biblioteki printf_flt oraz m (math) i odpowiednie opcje dla linkera (zywcem wziete ze strony avr-gcc) ale niestety jakiekolwiek uzywanie floatów daje mi 0 (sprintf'uje do tablicy znakow i usartem przesylam w symulatorze na terminal). Potrzebuje to do wyświetlania pomiaru temperatury z DS18S20 :D. Czy ktoś kto już miał z tym styczność mógłby pokazać jak poradził sobie z floatami?
  • REKLAMA
  • #2 5909848
    Piotr Kania
    Poziom 15  
    oto fragment kodu
    
          celcius =  msb << 8 | lsb ; // do 4miejsca po przecinku
          celcius/=16;
          unsigned char tab[6];
    	  LCD_xy(0,0);
    	  LCD_xy(0,0);
    	  write_text("Temperatura");
    	  LCD_xy(1,0);
          write_text(dtostrf(celcius, 3, 4, tab));
    


    powinno Ci to pomóc :)

    Dodano po 2 [minuty]:

    aha jeszcze to
    char msb,lsb;
    float celcius;
  • REKLAMA
  • #3 5910055
    zdebel
    Poziom 15  
    I na terminalu pojawia mi się '0' :(. Wiem że msb i lsb są poprawnie odczytywane, natomiast wychodzi na to że floaty jako takie nie działają poprawnie. Np. deklaruję float a=4.25 i daję write_text z dtostrf i dostaje i tak 0 :/
  • REKLAMA
  • #4 6018023
    zdebel
    Poziom 15  
    Przy temperaturze można się obejść bez floatów, ale przy transformacie fouriera już gorzej będzie, czy ktoś ma pomysł dlaczego:
    
    else if(strstr(buff,"adc")){
    double bla=1234.4321;
    char x[10];
    usart_sends(dtostrf(bla,6,1,x));
    }
    


    powoduje wyświetelnie 00 na terminalu? (w zależności jak dobiore parametry otrzymuje kombinacje zer, np. 0, 00, 000,0000, 00000).
  • REKLAMA
  • #5 6018367
    zumek
    Poziom 39  
    No to zrób "eksperyment" i przekonaj się, która z funkcji zawiniła - dtostrf(), usart_sends() , czy jeszcze coś innego.
    
    else if(strstr(buff,"adc")){
    char x[10]={"1234.4321"};
    usart_sends(x);
    }
    
  • #6 6019681
    zdebel
    Poziom 15  
    Kurcze, nie dopisałem że usart_sends to sprawdzona funkcja :). Oczywiście to co napisałeś działa poprawnie i string się przesyła. Wina leży po stronie dtostrf :/
REKLAMA