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

[Atmega8][C] - Problem z działaniami matematycznymi (log10)

demeus 25 Sty 2009 16:52 1718 3
  • #1 6052697
    demeus
    Poziom 18  
    Witam

    Mam problem z działaniem log10 gdy próbuję je wykonać program się nie kompiluje i wysypują się błędy. Niestety mimo wielu prób nie udało mi się samodzielnie rozwiązać problemu. Poniżej przedstawiam wycinek kodu który powoduje błędy:

    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/eeprom.h>
    #include <string.h>
    #include <math.h>		
    #include <stdio.h>
    
    #include "delay.h"
    #include "lcd.h"
    #include "sht.h"
    #include "uart.h"
    
    uint16_t	 temperatura = 0;
    uint16_t  wilgotnosc = 0;
    float	 temperatura_punktu_rosy = 0;
    uint16_t	 tmp_tab[6]={0};
    
    void inicjalizacja(void)
    {
    	asm volatile("cli");          //Wyłączenie przerwań
    	LCD_init();		//Inicjalizacja LCD
    	Sht_init();		//Inicjacja czujnika SHT11
    	MCUCR = 0x00;		//Wyczyszczenie rejestru MCU
    	GICR = 0x00;	          //Wyczyszczenie rejestru GICR
    	asm volatile("sei");  	//Włączenie przerwań
    	UART_init();
    }
    
    void Obliczenie_punktu_rosy(void)
    {
    	float wspolczynnik_wilg = 0;
    	wspolczynnik_wilg=((log10(wilgotnosc/100))-2)/0.4343 + (17.62*temperatura/100)/(243.12+temperatura/100);
    	temperatura_punktu_rosy=(243.12*wspolczynnik_wilg)/(17.62-wspolczynnik_wilg);	
    }
    
    int main(void)
    {                
    
    inicjalizacja();
    
      while(1)			
      {
      	
              Pomiar_temperatury_i_wilgotnosci_SHT11();
              Obliczenie_punktu_rosy();
              wyniki_na_lcd();
              wyniki_na_uart();
              delayms(4000);
              delayms(4000);
              delayms(1000);
      }
    }


    Z powyższego kodu wyrzuciłem zbędne funkcje. Program kompiluje za pomocą najnowszego pakietu WinAVR. Podczas kompilacji kompilator wyrzuca mi następujące błędy:
    Cytat:
    avr-gcc -mmcu=atmega8 sterownik_wentylatora.o sterownik_wentylatora.a -Wl,-Map=sterownik_wentylatora.map,--cref --output sterownik_wentylatora.elf
    c:/winavr-20081205/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr4\libc.a(floatsisf.o): In function `__floatunsisf':
    (.text.fplib+0x0): multiple definition of `__floatunsisf'
    c:/winavr-20081205/bin/../lib/gcc/avr/4.3.2/avr4\libgcc.a(_usi_to_sf.o):(.text+0x0): first defined here
    make.exe: *** [sterownik_wentylatora.elf] Error 1


    Jestem początkujący w programowaniu, także możliwe że rozwiązanie problemu dla wielu z was będzie oczywiste.

    Z góry dziękuje za wszelkie porady i sugestie.

    --
    pozdrawiam
    demeus
  • Pomocny post
    #2 6053079
    Galareta
    Poziom 23  
    Dołącz biblioteki do liczb zmienna przeciekowych;) Float coś tam w opcjach projektu chyba;) Nie mam teraz WinAVR wiec ci nie powiem gdzie dokładnie jak zainstaluje to dam edita - chyba ze znajdziesz
  • Pomocny post
    #3 6053176
    Freddie Chopin
    Specjalista - Mikrokontrolery
    do opcji linkera nalezy dodac -lm (myslnik el em) - dolaczy to do linkowania biblioteke libm.a, ktora zawiera definicje funkcji zmiennoprzecinkowych matematycznych z naglowka math.h

    niemniej jednak nie wiem czemu dolaczasz wprost biblioteki libc i libgcc - zapewne przez to masz problem (też) - usun je z makefile.

    4\/3!!
  • #4 6056715
    demeus
    Poziom 18  
    Witam

    Dzięki za pomoc, mieliście racje wystarczyło do makefile dodać linijkę:
    Cytat:
    LDFLAGS += -lm


    --
    pozdrawiam
    demeus
REKLAMA