Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

ds18b20 kłopot z kompilacją programu

byxu 07 Mar 2011 20:03 3412 31
  • #1 07 Mar 2011 20:03
    byxu
    Poziom 15  

    Witam po raz kolejny, ponieważ mam taki problem ze zkompilowaniem kodu, otóż chciałem sobie zrobić termometr który wyświetla temperaturę na wyświetlaczu lcd 2x16, czujnik to ds18b20, posiadam odpowiednie instrukcje do obsługi tegoż czujnika, chyba problem tkwi w pliku makefile,

    oto błąd:

    Code:
    > "make.exe" all
    
    avr-gcc -g -Wall -Os -mmcu=atmega8  -DF_CPU=1000000 -Wl,-Map,main.map -o main.elf main.o hd44780.o
    main.o: In function `main':
    C:\termometr cyfrowy/main.c:44: undefined reference to `ds18b20_ConvertT'
    C:\termometr cyfrowy/main.c:53: undefined reference to `ds18b20_Read'
    make.exe: *** [main.elf] Error 1

    > Process Exit Code: 2
    > Time Taken: 00:00


    kod źródłowy nie jest mojego autorstwa poniżej dodaję plik do pobrania w którym jest folder z projektem. Błąd jest chyba w pliku "ds18b20" utworzonym w programie makefile, niewiem jak to rozwiązać, jeśli byłby ktoś tak uprzejmy to proszę podesłać mi odpowiednie pliki i powiedzieć co było nie tak. Z góry dziękuję

    0 29
  • #2 08 Mar 2011 11:01
    duke_luke
    Poziom 15  

    Kompilator wyraźnie mówi Ci w czym jest problem :

    C:\termometr cyfrowy/main.c:44: undefined reference to `ds18b20_ConvertT'
    C:\termometr cyfrowy/main.c:53: undefined reference to `ds18b20_Read'

    Nie rozpoznawane są funkcje ds18b20_ConvertT oraz ds18b20_Read, musiałeś gdzieś przegapić ich definicję, po południu zerknę w pliki które zamieściłeś i postaram się coś Ci pomóc.

    0
  • #3 08 Mar 2011 15:42
    dondu
    Moderator Mikrokontrolery Projektowanie

    W moim AVR Studio Twój projekt skompilował się prawidłowo dla Atmega8.

    Cytat:

    rm -rf ds18b20.o hd44780.o main.o temperatura.elf dep/* temperatura.hex temperatura.eep temperatura.lss temperatura.map
    Build succeeded with 0 Warnings...
    avr-gcc -mmcu=atmega8 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT ds18b20.o -MF dep/ds18b20.o.d -c ../ds18b20.c
    avr-gcc -mmcu=atmega8 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT hd44780.o -MF dep/hd44780.o.d -c ../hd44780.c
    avr-gcc -mmcu=atmega8 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT main.o -MF dep/main.o.d -c ../main.c
    avr-gcc -mmcu=atmega8 -Wl,-Map=temperatura.map ds18b20.o hd44780.o main.o -o temperatura.elf
    avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature temperatura.elf temperatura.hex
    avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ihex temperatura.elf temperatura.eep || exit 0
    avr-objdump -h -S temperatura.elf > temperatura.lss

    AVR Memory Usage
    ----------------
    Device: atmega8

    Program: 4338 bytes (53.0% Full)
    (.text + .data + .bootloader)

    Data: 290 bytes (28.3% Full)
    (.data + .bss + .noinit)

    Build succeeded with 0 Warnings...


    Domyślam się, że nie używasz AVR Studio męcząc się tworząc Makefile własnoręcznie.
    Niestety nie wiem, co może być przyczyną Twojego problemu - może to właśnie plik Makefile?
    I przejdź na AVR Studio 4 póki wersja 5 nie będzie dopracowana (bo na razie wersja Beta).

    0
  • #4 08 Mar 2011 18:34
    byxu
    Poziom 15  

    tylko jak przez avr studio odtworzyć te pliki z foledru z projektem bo avr sudio ich nie widzi ??

    0
  • #6 08 Mar 2011 18:53
    byxu
    Poziom 15  

    no dobra to ten projekt to czym odtworzyć winavr czy avrstudio bo mam dwa programy i w avrstudio co kliknąć aby wgrać do uC program, a co kliknąć aby skompilować? bo 5 min temu avrstudio zainstalowałem i nie ogarniam troche

    0
  • #7 08 Mar 2011 19:00
    dondu
    Moderator Mikrokontrolery Projektowanie

    Nie żądaj ode mnie tłumaczenia Tobie tak podstawowych rzeczy.
    Od tego są odpowiednie funkcje w menu programu, o którym pisałem.
    A jeżeli będziesz miał problem, to od tak oczywistych spraw jest Help, a w ostateczności zrzut ekranu i pytanie na forum.

    Trochę własnej inicjatywy kolego i będzie efekt - my będziemy mieć spokój, a Ty wiedzę :)

    0
  • #8 08 Mar 2011 19:33
    byxu
    Poziom 15  

    a więc uruchamiam avrstudio w okienku odtwarzania pliku daje all files i odtwarzam plik main.c, puźniej klikam build i nic, jak uruchomie plik temperatura.asm to nie ma kodu źródłowego tylko jakieś bzdety w tym okienku, niewiem bo w winavr w pliku main.c brało się Tools/MakeAll i elgancko kompilowało, puźniej Tools/Program i wpajało do uC plik main.hex, a tu połączyłem się już z uC tylko nie wiem jak skompilować, szukałem w help, to pisało że w build menu jest puste czy coś takiego, może mała podpowiedź?

    0
  • #9 08 Mar 2011 20:03
    dondu
    Moderator Mikrokontrolery Projektowanie

    Z menu project wybierz Project Wizard i on ciebie poprowadzi.
    Gdy nie będziesz czegoś wiedział z danego ekranu napisz lub załącz screen.

    Dodano po 26 [minuty]:

    byxu napisał:
    No dobra jest takie coś tylko w tym folderze z projektem nigdzie nie ma pliku main.hex

    Code:
    avr-gcc  -mmcu=atmega8 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT main.o -MF dep/main.o.d  -c  ../main.c
    


    Build succeeded with 0 Warnings...


    W katalogu w którym umieściłeś projekt utworzony został zapewne folder DEFAULT. Tam znajdziesz plik hex.

    0
  • #12 08 Mar 2011 20:17
    byxu
    Poziom 15  

    ok to może jak ci się uda i byłbyś tak uprzejmy to powiedziałbyś co moze być nie tak z tym moim programem, dodam że program nie jest mój tylko z kursu Link część 5

    uC pracuje z częstotliwością fabrycznie ustawioną czyli 1MHz, nie chcę jej przestawiać narazie bo nie chcę sobie zablokować procesora tymi fusebitami

    PS. Dopiero sprawdzałem to w avrstudio pisze że jest 4MHz.

    0
  • #14 08 Mar 2011 23:19
    byxu
    Poziom 15  

    Na wyświetlaczu lcd 2x16 w pierszej lini powinien być napis "Temperatura" i jest, a w drugiej lini na środku powinna być temperatura odczytywana z czujnika, natomiast w drugiej lini nic nie ma, puste pole, nawet nie pisze 0°C tylko puste pole.

    Zrobiłem tak jak muwiłeś czyli zmieniłem na 1000000Hz i na 0s tylko że teraz w drugiej lini gdzie ma być temperatura jest ?°C

    0
  • #16 08 Mar 2011 23:24
    byxu
    Poziom 15  

    no masz rację pomyliłem się tylko jak z tym odczytem ?

    0
  • #17 08 Mar 2011 23:32
    dondu
    Moderator Mikrokontrolery Projektowanie

    byxu napisał:
    ... tylko że teraz w drugiej lini gdzie ma być temperatura jest ?°C

    Czyli postęp jest, daj mi chwilę na zastanowienie się , a za ten czas popraw pisownię.

    Dodano po 7 [minuty]:

    Zróbmy eksperyment:

    przed linijką: sprintf(str,"%4.1f\xdf""C", temp);
    dodaj: temp = 12;

    czyli tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    i zobacz czy wyświetli ją prawidłowo.

    i jeszcze raz popraw posta: https://www.elektroda.pl/rtvforum/viewtopic.php?p=9253023#9253023
    używając przycisku PISOWNIA.

    0
  • #18 08 Mar 2011 23:37
    byxu
    Poziom 15  

    żadnej zmiany, dalej ?°C a może błąd jest w tych makrodefinicjach do obsługi czujnika czyli w plikach ds18b20.h lub ds18b20.c

    oto co pisało w kursie skąd pochodzą te kody źródłowe, może pomoże.

    0
  • #19 08 Mar 2011 23:41
    dondu
    Moderator Mikrokontrolery Projektowanie

    byxu napisał:
    żadnej zmiany, dalej ?°C a może błąd jest w tych makrodefinicjach do obsługi czujnika czyli w plikach ds18b20.h lub ds18b20.c

    Skoro temp ma wartość 12 wprowadzoną przed konwersją na ciąg znaków przez SPRINTF, to znaczy, że prawdopodobnie SPRINTF... działa nieprawidłowo i tym musimy się zająć.

    0
  • #20 08 Mar 2011 23:43
    byxu
    Poziom 15  

    może podłoże tego błędu leży w w/w makrodefinicjach

    0
  • #22 08 Mar 2011 23:46
    byxu
    Poziom 15  

    oto co napisał autor kursu skąd zaczerpnięte są te kody źródłowe:

    "Celem tego przykładu jest pokazanie sposobu użycia funkcji sprintf. W skrócie program działa w następujący sposób: Najpierw następuje odczyt wartości temperatury z czujnika DS18B20. Aktualna wartość temperatury przechowywana jest w zmiennej rzeczywistej (typ double) o nazwie 'temp'. Następnie funkcja standardowa sprintf zmienia wartość liczbową w zmiennej 'temp', na ciąg znaków i formuje w tablicy 'str' komunikat tekstowy. Dalej komunikat w tablicy 'str' wysyłany jest do wyświetlacza LCD. Odczyt temperatury i wyświetlenie wyniku wykonuje się w głównej pętli programu."

    0
  • #24 08 Mar 2011 23:49
    byxu
    Poziom 15  

    oryginał:

    Code:
    /*
    
       Plik "main.c"

       KURS AVR-GCC cz.5
       (xyz.isgreat.org)

       Termometr cyfrowy, przykład nr. 3
       (schemat i opis działania w artykule)
       atmega16 (1MHz)
    */

    #include <stdio.h>
    #include <avr/io.h>
    #include <util/delay.h>
    #include "hd44780.h"
    #include "ds18b20.h"

    /* W tablicy będą formowane komunikaty tekstowe
       wysyłane do wyświetlacza */
    char str[17]="   Termometr    ";

    int main(void)
    {
      /* Zmienna przechowuje aktualną wartość temperatury */       
      double temp;
      /* W tablicy zapisywane będą dane odczytane z układu ds18b20 */
      unsigned char ds18b20_pad[9];
     
      /* Funkcja inicjalizuje wyświetlacz */
      lcd_init();
      /* Włącza wyświetlanie */
      LCD_DISPLAY(LCDDISPLAY); 
      /* Czyści  ekran */
      LCD_CLEAR;           
     
      /* Wyświetla tytuł */ 
      LCD_LOCATE(0,0);
      lcd_puts(str);

      while(1)
      {
        /* Funkcja 'ds18b20_ConvertT' wysyła do układu ds18b20
           polecenie pomiaru */     
         if(ds18b20_ConvertT())
        {

           /* 750ms - czas konwersji */
           _delay_ms(750);

          /* Odczyt z układu ds18b20, dane zapisywane są w tablicy ds18b20_pad.
             Dwie pierwsze pozycje w tablicy to kolejno mniej znaczący bajt i bardziej
         znaczący bajt wartość zmierzonej temperatury */           
           ds18b20_Read(ds18b20_pad);
             
          /* Składa dwa bajty wyniku pomiaru w całość. Cztery pierwsze bity mniej
             znaczącego bajtu to część ułamkowa wartości temperatury, więc całość
             dzielona jest przez 16 */       
           temp = ((ds18b20_pad[1] << 8) + ds18b20_pad[0]) / 16.0 ;
         
          /* Formułuje komunikat w tablicy 'str' */
           sprintf(str,"%4.1f\xdf""C", temp);

           LCD_LOCATE(5,1);
          /* Wysyła komunikat do wyświetlacza */
           lcd_puts(str);
        }
      }
    }

    0
  • #26 08 Mar 2011 23:57
    byxu
    Poziom 15  

    wszystkie kody zaczerpnięte są stąd Link więc jak ktoś pisze kurs to raczej testuje to, niewiem, a ty robiłeś kiedyś jakiś program z takiem czujnikiem?

    0
  • #27 09 Mar 2011 00:01
    dondu
    Moderator Mikrokontrolery Projektowanie

    Tak jak napisałem wcześniej moim zdaniem problem leży w przekształcaniu liczby na ciąg znaków za pomocą sprintf ponieważ wykonując

    Kod: c
    Zaloguj się, aby zobaczyć kod

    powinieneś otrzymać na wyświetlaczu: 12.0°C , a nie otrzymujesz.

    Dodano po 1 [minuty]:

    Zrób jeszcze tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #28 09 Mar 2011 00:04
    byxu
    Poziom 15  

    no właśnie, a może jest jakaś komenda zastępująca sprintf?

    0
  • #30 09 Mar 2011 00:07
    byxu
    Poziom 15  

    dondu napisał:


    Zrób jeszcze tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    próbowałem zamiast "?°C" wyświetla sam "?"

    I co ma ktoś jakiś pomysł co z tym zrobić?

    aha i zauważyłem pewne zjawisko, otóż gdy czujnik jest podłączony do uC pisze "?°C", a gdy odłącze czujnik od uC i wcisne reset to napis "?°C" znika i pojawia się puste pole, gdy w czasie działania uC podłącze znów czujnik to wtedy pojawia się napis "?°C". Jeszcze jedną dziwną rzecz znalazłem, otóż sprawdziłem i w folderze deufault plik temperatura.hex warzy około 11,8KB a atmega8 ma pojemność pamięci flash tylko 8KB, Dlaczego nikt nic nie pisze?

    0