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.

[atmega8][c][ds18b20] jak zoptymalizowac kod

Piotr Kania 12 Lut 2009 22:12 1184 11
  • #1 12 Lut 2009 22:12
    Piotr Kania
    Poziom 15  

    Witam mam program który wyświetla temperaturę oto on

    Code:

    void temperatura(void)
    {
         ow_reset();
          ow_write_byte(0xCC);
          ow_write_byte(0x44);
          _delay_ms(100); // czas pomiaru
          ow_reset();
          ow_write_byte(0xCC);
          ow_write_byte(0xBE);
          lsb = ow_read_byte();
          msb = ow_read_byte();
         ow_reset();
         celcius =  msb << 8 | lsb ;
          celcius/=16;
          temp = ((msb<<4)|(lsb >> 4));
          unsigned char tab[6];
         lcd_xy(0,10);
          write_text(dtostrf(celcius, 3, 1, tab));
         uint8_t znak1[] = {0,14,10,14,0,0,0,0};
          LCD_DefineCharacter(0, znak1);
         lcd_xy(0,14);
         write_char(0);
         write_text("C");
    }


    write_text(dtostrf(celcius, 3, 1, tab)); to coś zabiera 20% atmegi8 :( czy ktoś zna jakiś prostszy sposób konwersji aby wyświetlić temperaturę, dodaje że ds18b20 jest ustawiony na najniższą rozdzielczość aby szybciej pomiar szedł. Proszę o jakieś fragmenty kodu, ktoś kiedyś coś mi mówił że mozna to zrobić na itoa ale nie wiem jak to zrobić.

    0 11
  • #2 12 Lut 2009 22:23
    dawid512
    Poziom 32  

    Code:
    char *itoa( int value, char *string, int radix );

    0
  • #3 12 Lut 2009 22:41
    Piotr Kania
    Poziom 15  

    ok do tego też doszedłem a jakiś przykład w c jestem początkujący

    Dodano po 10 [minuty]:

    uint8_t buffer[8];
    write_text(itoa(temp,buffer,10)); to mi działa ale dostaje taki błąd
    warning: pointer targets in passing argument 2 of 'itoa' differ in signedness

    0
  • #5 12 Lut 2009 22:57
    Piotr Kania
    Poziom 15  

    uint8_t Liczba 8 bitowa, naturalna z przedziału <0,255>

    char Liczba 8 bitowa, całkowita z przedziału <-127,128>

    0
  • #6 12 Lut 2009 23:07
    Freddie Chopin
    Specjalista - Mikrokontrolery
  • #7 12 Lut 2009 23:39
    Piotr Kania
    Poziom 15  

    pytanie ile powinien wynosić u mnie bufor ? Przeczytałem Twoją lekcje :) i wydaje mi się że 9

    0
  • #8 13 Lut 2009 07:25
    Freddie Chopin
    Specjalista - Mikrokontrolery

    maxymalna ilosc znakow (czyli ewentualny znak, czesc calkowita, kropka, czesc ulamkowa [wliczajac zera wiodace!] ) + 1. dodac nalezy, ze jesli chcesz ulamki, to musisz sobie ich obsluge zrobic sam, co nie jest takie trudne [; cala liczbe traktujesz wtedy jako przemnozona (na przyklad) przez 100 - daje ci to dwa miejsca po przecinku. czesc calkowita otrzymasz przez podzielenie calej liczby przez 100. czesc ulamkowa - przez przyciecie liczby do 100 (na przyklad jest to reszta z poprzedniego dzielenia. pamietac nalezy o zerach wiodacych. mam gdzies przyklad na dsPICa jak to zrobic, moge wrzucic (dodam moze, ze w polowie jest napisany w assemblerze, ale w tej srednio istotnej polowie chyba [; wyswietlanie jest w C, przeliczanie w assemblerze [bo to specyficzna funkcja jest, wiec sobie musi cos przeliczyc])

    4\/3!!

    0
  • #9 13 Lut 2009 13:07
    Piotr Kania
    Poziom 15  

    no spoko ja ma ustawioną rozdzielczość 9 bitów wiec temperatura zmienia się co 0,5 stopnia ale było by miło wyświetlić np 20,5 jeśli możesz udostępnić przykład takiego przeliczania to ja poproszę :)

    0
  • #10 13 Lut 2009 14:18
    Freddie Chopin
    Specjalista - Mikrokontrolery

    w takim wypadku prosciej bedzie ci napisac funkcje samodzielnie.

    czesc calkowita to wynik przesuniety o 1 w lewo, natomiast czesci ulamkowej albo nie ma (bit0 = 0), albo rowna jest .5 (bit0 = 1).

    4\/3!!

    0
  • #11 13 Lut 2009 16:24
    ralph.
    Poziom 11  

    witam

    Otrzymujesz 2 bajty z Ds-a msb oraz lsb(oznaczenie w Twoim przypadku)

    Następnie starszy bajt przesuwasz w prawo o 4 młodszy w lewo o 4 i dodajesz do siebie. Otrzymujesz w sumie 1 bajt ( o jakieś wartości dziesiętnej) no i odpowiednio dzielisz całkowicie pózniej reszta z dzielenia i tak dobierasz sie do każdej cyfry oddzielnie. Jeśli chcesz to wyswietlić na LCD nie zapomnij o dodaniu 0x30-(jak przejrzysz kody ASCII to bedziesz wiedział dlaczego). Funkcja dtostrf jest wygodna ale niestety pożera dużo pamięci co przy prockach o jej małej ilości jest niezbyt dobrym rozwiązaniem.

    pozdrawiam

    0
  • #12 15 Lut 2009 14:05
    Piotr Kania
    Poziom 15  

    tak wiem oco chodzi z tym dodanie 0x30. Musze przyjrzeć się wnikliwie tym 2 bajtom i coś wymyśle

    0
  Szukaj w 5mln produktów