Skocz do zawartości

Problem z czujnikiem temperatury ds18b20


Pomocna odpowiedź

Napisano

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

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 🙂

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

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

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.

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.

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

}

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

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.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...