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.

[C] Ds18b20. Jak wyświetlić dziesiętnie a nie szesnastkowo?

ostryas 20 Wrz 2007 14:42 1841 19
  • #1 20 Wrz 2007 14:42
    ostryas
    Poziom 13  

    Witam wszystkich, proszę o pomoc. Problem myśle że nie jest duży ale dla mnie jest bo wychodzą mi krzaki:D:
    Oto Program:

    Code:

    void one_wire(void){
    unsigned char  Bd[10];
    unsigned int n;
    ow_reset();
    write_byte(0xCC);
    write_byte(0x44);
    delay(43);
    ow_reset();
    write_byte(0xCC);
    write_byte(0xBE);
    for(n=0;n<9;n++)
         {
        Bd[n]=read_byte();
        printf("%02X\n",(int)Bd[n]);
        }


    temp_msb = Bd[1];                                   
    temp_lsb = Bd[0];


    I to wszystko działa tylko chodzi mi o to żeby wyświetlało w liczbach dziesiętnych, a nie szesnastkowo. I tu wychodzą mi krzaki:D. Myśle że ma ktoś jakąś funkcję w C do tego. Z góry dzięki

    Pozdrawiam Ostry



    aha i jeszcze zapomniałem rozdzielczość jest w czujniku 12 bitowa

    Poprawiłem temat - Regulamin. [c_p]

    0 19
  • #2 20 Wrz 2007 15:45
    Mad Bekon
    Poziom 23  

    Po co odczytujesz 10 bajtów?
    Przecież DS wysyła tylko dwa po zapytaniu o temperaturę.

    Spróbuj użyć czegoś takiego:

    Code:


    int tds;
    void Read_Temperature(void)
    {

    ow_reset();
    write_byte(0xCC); //Skip ROM
    write_byte(0x44); // Start Conversion
    _delay_us(51);
    ow_reset();
    write_byte(0xCC); // Skip ROM
    write_byte(0xBE); // Read Scratch Pad

    tds=(int)read_byte()<<8;
    tds|=read_byte();
    }

    char buf[6];

    void main(){

             Read_Temperature();
             itoa(tds/16,buf,10);  //temper. całkowita
             write_text("Temp: ");
             write_text(buf);
             write_text(".\0");
             itoa(abs((tds*10/16)%10),buf,10);   //części dziesiętne
             write_text(buf);
             write_text("C ");


    }


    Tylko musisz sobie zmienić write_text na printf. Buf, to łańcuch gdzie raz masz częsci dziesiętne, raz całkowite

    0
  • #3 20 Wrz 2007 16:02
    ostryas
    Poziom 13  

    Tą funkcję widziałem tylko że mam problem bo w Keilu w bibliotece STDLIB.H nie ma funkcji itoa(). :cry: także nie wiem co robić .....może jest jakaś FUNKCJA ZAMIENNA??

    0
  • #4 20 Wrz 2007 16:29
    Mad Bekon
    Poziom 23  

    A spróbuj coś takiego:

    float temp=0;

    temp|=(0b10000101<<23);
    tds|=0x07ff;
    temp|=(tds<<12);
    printf("%g",temp)-128;

    0
  • #5 20 Wrz 2007 17:10
    ostryas
    Poziom 13  

    Ale że jak?? Bo nie wiem gdzie te printfy wstawić bo mi jakieś ślaczki wychodzą...
    Pozdro!!!

    0
  • #6 20 Wrz 2007 17:12
    Mad Bekon
    Poziom 23  

    Code:
    int tds;
    
    void Read_Temperature(void)
    {

    ow_reset();
    write_byte(0xCC); //Skip ROM
    write_byte(0x44); // Start Conversion
    _delay_us(51);
    ow_reset();
    write_byte(0xCC); // Skip ROM
    write_byte(0xBE); // Read Scratch Pad

    tds=(int)read_byte()<<8;
    tds|=read_byte();
    }

    char buf[6];

    void main(){

             Read_Temperature();

    if(tds&0xf800) printf("- %u", 128-(tds&(0x07ff)>>4));
    else printf("%u",tds>>4);
       
    }

    0
  • #7 20 Wrz 2007 17:23
    ostryas
    Poziom 13  

    Wyświetla mi - 1 z tych printfów a na biegunie nie mieszkam :D natopiast bajty MSB=0x01 LSB=0x40. więc jak widać sie nie zgadza niestety, chyba że ja coś źle robie :D.

    0
  • Pomocny post
    #8 20 Wrz 2007 17:35
    Mad Bekon
    Poziom 23  

    Aj kurde dziabłem się! spróbuj:

    tds=read_byte();
    tds|=(int)read_byte()<<8;

    Ale nawet jak zadziała, to będzie tylko liczbę całkowitą pokazywać

    0
  • Pomocny post
    #9 20 Wrz 2007 17:41
    owurac
    Poziom 15  

    Cytat:
    Po co odczytujesz 10 bajtów?
    Przecież DS wysyła tylko dwa po zapytaniu o temperaturę.

    Mad Bekon, mylisz się. Nie ma czegoś takiego jak zapytanie o temperaturę. Jest komenda REED SCATCHPAD, po której można odebrać od DS'a całe 9 (nie 10) bajtów. Faktem jest, że tylko pierwsze dwa to temperatura. Poza temperaturą scratchpad zawiera również dwa bajty określające górną i dolną temperaturę alarmową, bajt konfiguracyjny, 3 bajty zarezerwowane, oraz CRC policzoną z poprzednich ośmiu bajtów. Jak więc widać jedynie odczytanie wszystkich dziewięciu bajtów umożliwia sprawdzenie CRC, a co za tym idzie gwarantuje poprawność transmisji.

    0
  • #10 20 Wrz 2007 17:43
    ostryas
    Poziom 13  

    No kapnąłem się z tym tds :D

    No nic wielkie dzięki!!!!, jak ktoś ma pomysł jak po przecinku do tego wyświetlić to proszę o pomoc!!!

    0
  • Pomocny post
    #11 20 Wrz 2007 17:44
    Mad Bekon
    Poziom 23  

    Nie REED a READ.

    A mnie w sumie chodziło o to, że nie potrzeba reszty odczytywać, ale fakt, mój błąd.

    Natomiast myślę, że najłatwiej będzie wrzucić to do floata, i wyrzucić przez printf("%g,temp);
    Tylko kurcze to jest trochę pokręcone, ale myślę, że zaraz coś wyknocę.

    0
  • #12 20 Wrz 2007 17:46
    owurac
    Poziom 15  

    Prawda READ. A co do tej konwersji to już kiedyś napisałem jak to zrobić, zaraz znajdę post.
    Znalazłem.

    Cytat:
    Jeśli temp jest zmienną zawierającą temperaturę odczytaną z ds18b20 to jest to zmienna 16 bitowa ze znakiem. W związku z tym proponuję:
    - odczytać najstarszy bit (znak) i gdzieś go zapamiętać
    - jeśli liczba jest ujemna (MSB = 1), wykonać bitową negację i dodać 1
    W tym momencie wykonanie operacji przesunięcia bitowego o 4 w prawo zwróci wartość bezwzględną części całkowitej temperatury, a bitowa koniunkcja temp & 0x0F - wartość bezwzględną części ułamkowej, jako ilość szesnastych części stopnia.

    Tyle napisałem kiedyś, powinno wystarczyć, a jak nie to jeszcze mogę coś podpowiedzieć.

    0
  • #13 20 Wrz 2007 18:01
    ostryas
    Poziom 13  

    Niemógłbyś napisać funkcji w C :D bo już mam wyłączone myślenie. Ale i tak wielkie dzięki raz jeszcze :D

    0
  • #14 20 Wrz 2007 18:01
    Mad Bekon
    Poziom 23  

    Code:
    if(tds&0xf800) printf("- %g ", (128-(tds&(0x07ff)>>4)) + (16-tds&(0x000f))/16  );
    
    else printf("%g", (tds>>4) + (tds&0x0f)/16 );


    albo

    Code:
    if(tds&0xf800) printf("- %g ", (float)(128-(tds&(0x07ff)>>4)) + (float)(16-tds&(0x000f))/16  );
    
    else printf("%g", (float)(tds>>4) + (float)(tds&0x0f)/16 );

    0
  • #15 20 Wrz 2007 18:06
    ostryas
    Poziom 13  

    Niestety z tych printfów wyświetla ciągle 0.

    0
  • #16 20 Wrz 2007 18:11
    owurac
    Poziom 15  

    Moja propozycja taka:

    Code:

    float convert_temp(unsigned int temp)
    {
       unsigned char sign = 0;
       float ret = 0;

       if(temp & 0x8000)
       {
          sign = 1;
          temp = ~temp + 1;
       }
       ret = temp & 0x0F;
       ret /= 16;
       ret += temp >> 4;
       if (sign)
          ret *= -1;
       return ret;
    }

    Jak zrobiłem jakiś błąd to poprawcie bo pisałem z głowy bez sprawdzania.

    0
  • Pomocny post
    #17 20 Wrz 2007 18:14
    Mad Bekon
    Poziom 23  

    No tak by było chyba najlepiej...

    razem z printfem:

    Code:

    printf ("%g",convert_temp(tds));


    Zdaje się, że trochę przekombinowałem... :p

    Pytanko:
    A czy to nie powinno wyglądać tak:
    Code:

    float convert_temp(unsigned int temp)
    {
       unsigned char sign = 0;
       float ret = 0;

       if(temp & 0x8000)
       {
          sign = 1;
          temp = ~temp + 1;
       }
       ret = (float) (temp & 0x0F);
       ret /= 16;
       ret += (float) (temp >> 4);
       if (sign)
          ret *= -1;
       return ret;
    }
     


    Kompilator przetrawi to bez rzutowania na typ float?

    0
  • #18 20 Wrz 2007 18:18
    ostryas
    Poziom 13  

    I o to panowie chodziło :D działa bez zarzutu pozdrawiam :D ostry
    znaczy się ten powyższy kod działa a ego niżej z floatami nie sprawdzałem.

    0
  • #19 20 Wrz 2007 18:21
    owurac
    Poziom 15  

    Nie Mad Bekon, takie rzeczy sobie sam rzutuje.

    0
  • #20 20 Wrz 2007 18:22
    Mad Bekon
    Poziom 23  

    To git. Fajna bestia z niego...
    I znów Elektroda uratowała świat...
    Pozdrawiam

    0
  Szukaj w 5mln produktów