logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

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

Piotr Kania 12 Lut 2009 22:12 1337 11
REKLAMA
  • #1 6141935
    Piotr Kania
    Poziom 15  
    Witam mam program który wyświetla temperaturę oto on
    
    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ć.
  • REKLAMA
  • REKLAMA
  • #3 6142044
    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
  • #5 6142227
    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>
  • REKLAMA
  • #7 6142442
    Piotr Kania
    Poziom 15  
    pytanie ile powinien wynosić u mnie bufor ? Przeczytałem Twoją lekcje :) i wydaje mi się że 9
  • #8 6142856
    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!!
  • #9 6143929
    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ę :)
  • #10 6144238
    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!!
  • REKLAMA
  • #11 6144852
    ralph.
    Poziom 12  
    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
  • #12 6153292
    Piotr Kania
    Poziom 15  
    tak wiem oco chodzi z tym dodanie 0x30. Musze przyjrzeć się wnikliwie tym 2 bajtom i coś wymyśle
REKLAMA