Skocz do zawartości

Problem z czujnikiem temperatury ds18b20


byxu

Pomocna odpowiedź

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

Link do komentarza
Share on other sites

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 🙂

Link do komentarza
Share on other sites

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++

Link do komentarza
Share on other sites

ś
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.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

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

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.

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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);
   }
 }

}

Link do komentarza
Share on other sites

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...
Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.