byxu Napisano Marzec 9, 2011 Udostępnij Napisano Marzec 9, 2011 Witam mam problem z czujnikiem temperatury ds18b20 podpiętym do atmega8, program jest zaczerpnięty z kursu AVR-GCC cz.5 tylko że atmega zamiast pobierać temperaturę z czujnika i wypisywać ją na wyświetlaczu lcd 2x16 to wypisuje zamiast temperatury ?°C program kompilowałem i wgrywałem za pomocą avrstudio 4 bo w winavr wywalało błąd chyba przez plik Makefile : > "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 a w avrstudio 4 wszystko się ładnie kompiluje i programuje, dodam że 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. Proszę o jakąś pomoc, męczę się już z tym 3 dni i nie umiem nic zrobić, chyba coś jest nie tak z: sprintf(str,"%4.1f\xdf""C", temp); bo próbowałem zrobić coś takiego: temp = 12; sprintf(str,"%4.1f\xdf""C", temp); czyli na wyświetlaczu powinno zostać wypisane 12° C a jest ?°C Proszę o pomoc ponieważ sam sobie z tym nie poradzę i będę się użerał z tym do końca swoich dni. Poniżej w pliku folder z projektem (plik *.hex w folderze deufault). Jeszcze jedną dziwną rzecz znalazłem, otóż sprawdziłem i w folderze deufault plik temperatura.hex waży około 11,8KB a atmega8 ma pojemność pamięci flash tylko 8KB __________ Komentarz dodany przez: Treker termometer1.rar Cytuj Link do komentarza Share on other sites More sharing options...
Mateusz Marzec 9, 2011 Udostępnij Marzec 9, 2011 Ja też miałem taki problem. Chodziło o to, że był problem z liczbami zmiennoprzecinkowymi. Musisz zapisać to jako dwie liczby całkowite odzielone przecinkiem. Czyli: masz liczbę p=21.43 (typ double) dodajesz do niej 0.5 21.93 - konwertujesz do int a=21 - masz część całkowitą. teraz a odejmujesz p p-a=0.43=b - mnożysz razy 10 (dokładność do jednej cyfry po przecinku) albo 100 wtedy masz dwie cyfry po przecinku b*100=43. - zamieniasz b na int. i masz a=21 i b=43 sprintf(str,"%d,%d C", a,b); Albo w twoim przypadku jeżeli chcesz wyświetlić po prostu liczbę 12 to zamień %f na %d 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
byxu Marzec 9, 2011 Autor tematu Udostępnij Marzec 9, 2011 jeszcze raz bo się zamotałem, podmieniłem sprintf(str,"%4.1f\xdf""C", temp); na sprintf(str,"%d,%d C", a,b); i jest jakiś błąd. czy mógłbyś podać mi kod źródłowy zmodyfikowanego przez ciebie programu, tego który jest w pliku który dodałem, jeszcze raczkuję w programowaniu C/C++ Cytuj Link do komentarza Share on other sites More sharing options...
Mateusz Marzec 10, 2011 Udostępnij Marzec 10, 2011 ś int a,b; bouble c=12.40; c+=0.5; //c=12.90 a=c; //a=12 c-=a-0.5; //c=0.40 c=c*10+0.5; //c=4.5 b=c; //b=4 sprintf(str,"%d,%d C", a,b); To wyświetla liczby z dokładnością do jednego miejsca po przecinku. Gdybyś chciał dwa to musisz w czwartym kroku c pomnożyć razy 100 a przy zapisie do tablicy zrobić tak : sprintf(str,"%d,%.2d C", a,b); Komentarze dodałem żebyś widział co się dzieje ze zmiennymi. Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
byxu Marzec 10, 2011 Autor tematu Udostępnij Marzec 10, 2011 ten kod co mi dałeś to nie działa, ale przeszukałem kawałek neta i podmieniłem sprintf(str,"%4.1f\xdf""C", temp); na dtostrf(temp,1,2,str); i działa, tylko że nie wyświetla mi jednostki temperatury czyli °C niewiem co zrobić aby wyświetlało? I co oznacza 1 w tym kodzie, a co 2? Temperatura jest wyświetlana z dokładnością do 2 miejsc po przecinku, a jeśli temperatura jest mniejsza od 10, a większa od 0 to wyświetla z dokładnością trzech miejsc po przecinku. Cytuj Link do komentarza Share on other sites More sharing options...
Mateusz Marzec 10, 2011 Udostępnij Marzec 10, 2011 Mi działa ten kod co Ci napisałem. Oczywiście masz: #include No i str jako tablicę charów: char str[12] ? No i pisałem Ci że nie możesz f dawać w tym bo wtedy nie działa. Daj %d, a jeśli chcesz wyświetlać wartości zmiennoprzecinkowe zamień je na dwa int. Cytuj Link do komentarza Share on other sites More sharing options...
byxu Marzec 10, 2011 Autor tematu Udostępnij Marzec 10, 2011 oto mój kod (nie działający) /* 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' */ int a,b; bouble c=12.40; c+=0.5; //c=12.90 a=c; //a=12 c-=a-0.5; //c=0.40 c=c*10+0.5; //c=4.5 b=c; //b=4 sprintf(str,"%d,%d C", a,b); LCD_LOCATE(5,1); /* Wysyła komunikat do wyświetlacza */ lcd_puts(str); } } } Cytuj Link do komentarza Share on other sites More sharing options...
Mateusz Marzec 11, 2011 Udostępnij Marzec 11, 2011 A co Ci wyświetla ? Cytuj Link do komentarza Share on other sites More sharing options...
Harnas Marzec 11, 2011 Udostępnij Marzec 11, 2011 bouble c=12.40; Nie powinno być double? Cytuj Link do komentarza Share on other sites More sharing options...
byxu Marzec 11, 2011 Autor tematu Udostępnij Marzec 11, 2011 raport: Build started 11.3.2011 at 20:11:09 avr-gcc -mmcu=atmega8 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=1000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT main.o -MF dep/main.o.d -c ../main.c ../main.c: In function 'main': ../main.c:69: error: 'bouble' undeclared (first use in this function) ../main.c:69: error: (Each undeclared identifier is reported only once ../main.c:69: error: for each function it appears in.) ../main.c:69: error: expected ';' before 'c' ../main.c:71: error: 'c' undeclared (first use in this function) make: *** [main.o] Error 1 Build failed with 5 errors and 0 warnings... Cytuj Link do komentarza Share on other sites More sharing options...
Harnas Marzec 11, 2011 Udostępnij Marzec 11, 2011 Zmień bouble na double. Cytuj Link do komentarza Share on other sites More sharing options...
byxu Marzec 11, 2011 Autor tematu Udostępnij Marzec 11, 2011 no program się skompilował, wgrałem do uC i program nie działa czyli pokazuje chyba 12,29 C czy coś takiego i tyle temperatura się nie zmienia tylko tak stoi. Cytuj Link do komentarza Share on other sites More sharing options...
Mateusz Marzec 13, 2011 Udostępnij Marzec 13, 2011 A jak ma się zmieniać skoro do "c" przypisałeś wartość na stałe i jej nie nadpisujesz? Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!