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][BASCOM AVR] - zakrąglenie (skrócenie) zmiennej

tomaszek_b 12 Lis 2008 17:34 2592 7
REKLAMA
  • #1 5730516
    tomaszek_b
    Poziom 2  
    Witam.
    Jestem nowy (no powiedzmy przedszkole, nie żłobek) w dziedzine programowania, jak i na tym forum.

    W ramach początków nauki na warsztat wziołem procek AVR i oklepany na wszelkie tematy termometr Ds18B20.
    Na szczęscie z komunkacją i odczyten temeratur nie ma problemów i tym nie będę zawracał głowy. Nie jeden powie uff. Choć może nie do końca, na końcu zadam jedno małe pytanko :)

    Sprawa wygląda tak: Powiedzmy w zmiennej XT mam wartośc temperatury (już przeliczonej i obrobionej - z 12bit) daj my na to 23.34775643... Czyli tyle stopni celcjusza.
    No i własnie jest bardzo dużo tych drobnych po przecinku w tej zmiennej.
    A powiedzmy zależało by mi na ograniczeniu jej do 3 miejsc po przecinku, tak aby zuyskać 23.347.
    Założenie maski dzięki proceduże Fusing nie przejdze, gdyż to zformatuje jedynie wynik dla wyświetlenia stringu, a ja potrzebuję wykonywać jeszcze działania na tym wyniku.

    Więc pytanie zasadnicze. Jak zaokrąglić otrzymany wynik zmiennoprzecinkowy w bascomie AVR?

    I pytanie odnośnie Dallasa.
    Czy odczekiwanie owych 750ms na konwersję odczytu jest również potrzebne przy trzy żyłowym zasilaniu (+,-,IO)? Czy jedynie przy 2 żyłowym?
    Kiedyś spotkałem się gdześ z opinią iż ten czas tyczy się jedynie 2 żyłowego podłaczenia Dallasa, gdyż ten czas potrzebny jest na zgromadzienie zapasu energii dla konwersji. Ale jakoś teraz nie mogę znaleźć tego potwierdzenia.


    Pozdrawiam i mam nadzieję że pomożeci mi rozwiązać ten problem.
    Tomek...
  • REKLAMA
  • Pomocny post
    #2 5730771
    Samuraj
    Poziom 35  
    Jeśli chodzi o oczekiwanie na pomiar to przy podłączeniu 3 przewodowym (+5V, masa i sygnał) to nie ma potrzeby oczekiwać na pomiar.
    Jest on dostępny od razu po wykonaniu komendy ow_write_byte(DS18B20_CMD_CONVERT);
  • REKLAMA
  • #3 5730790
    ZbeeGin
    Poziom 39  
    tomaszek_b napisał:
    Sprawa wygląda tak: Powiedzmy w zmiennej XT mam wartośc temperatury (już przeliczonej i obrobionej - z 12bit) daj my na to 23.34775643... Czyli tyle stopni celcjusza.
    No i własnie jest bardzo dużo tych drobnych po przecinku w tej zmiennej.
    A powiedzmy zależało by mi na ograniczeniu jej do 3 miejsc po przecinku, tak aby zuyskać 23.347.
    Założenie maski dzięki proceduże Fusing nie przejdze, gdyż to zformatuje jedynie wynik dla wyświetlenia stringu, a ja potrzebuję wykonywać jeszcze działania na tym wyniku.

    Zatem najpierw wykonaj wszystkie niezbędne działania, a potem FUSING.
  • REKLAMA
  • #4 5730856
    rafcio363
    Poziom 30  
    Czyli np :

    Wartosc_wyswietlana = Fusing(Wartosc_do_zaokraglenia , "#.&&")

    lub #.## z zaokrągleniem ostatniego miejsca.
  • #5 5731037
    Pituś Bajtuś
    Poziom 28  
    tomaszek_b napisał:
    Więc pytanie zasadnicze. Jak zaokrąglić otrzymany wynik zmiennoprzecinkowy w bascomie AVR?

    Wykorzystywanie liczb zmiennoprzecinkowych do odczytu temperatury z DS18B20 jest lekko mówiąc mało rozsądne, zwłaszcza że "po przecinku" może być tylko 16 różnych wartości. Takie rzeczy to się zaokrągla na etapie pisania programu, który potem operuje wyłącznie na liczbach całkowitych. Okropnie oszczędza się pamięć.
  • #6 5732418
    tomaszek_b
    Poziom 2  
    Samuraj Dzięki za upewnienie mnie w tym fakcie. Znacznie zaoszczędzi mi to czasu na odczekiwanie.

    ZbeeGin Owszem można i tak. Ale głwnym pytaniem jest jak zaokrąglić (o ile da się w ogóle da?) zmienną zniennoprzecinkową i to jest sednem tego pytania.

    rafcio363 Dzęiki tobie też za porade, znam składnię "Fusowania" i wiem żę można wynik skopiowac do innej zmiennej i ją wyświetlić. Ale jak wyżej, nie rozwiązuje to pytania.

    Nie mniej dzięki Wam za chęć pomocy.

    Pituś Bajtuś Na pewno można to zrobić na 100 róznych sposobów, ale jak pisałem na wsępie sa to moje pierwsze kroki w programowaniu procesorów i nie zabardzo jestem w stanie tak to zptymalizować.
    Jakieś tam procedurki się psiało ale bardziej na zasadzie zapalania jakiś diodek w modelach czy załacanie równych żeczy (przekaźniki itp.).
    Opiero wkraczam w bardziej rozbudowane programy.

    Jak narazie jak czytam o przesuwaniu bitów itd, to zamąca mi to w głowie niesamowicie i mało z tego kleje.

    Jak mógł byś bliżej naświetlić i pomóc zrozumieć jak można by to zrobić był bym wdzięczy.
    Domyślam się iż chodzi tu o rozbicie odczytanego wyniku na dwie zmienne typu Byte lub Long. W pierwszej zmiennej mamy część całkowitą wyniku, a w drugiej część po przecinku.
    Ale jak to zrobić nie zabardzo wiem.
    I czy nie pozostanie tutaj ponownie problem ze zformatowaniem części przecinkowej?


    Bardzo prosze o pomoc.
    Tomek
  • REKLAMA
  • #7 5732894
    Samuraj
    Poziom 35  
    NIe mam przed sobą pdf'a DS18B20 ale z tego co pamiętam wyglądało to tak:
    odczytujesz dwa bajty z czujnika LSB i MSB.
    Z pierwszego bierzesz 4 starsze bity (czyli 4 młodsze pomijasz), przesuwasz o 4 miejsca w prawo i dodajesz do całości drugi bit.
    Nie wiem jak to będzie wyglądać w BASCOMIE ale powinieneś dać sobie radę.
    W tych wszystkich obliczeniach chodzi o to aby już na etapie odczytywania wartości z czujnika uformować tak sobie wynik aby potem nie trzeba było go dzielić, mnożyć itp.
    Przecinek jest umowny i można go zawsze wyświetlić w dowolnym miejscu.
    Nie rozbijaj wyniku na część całą i po przecinku i bo się potem nie połapiesz i rezultat będzie taki że znowu będziesz musiał coś tam dzielić albo mnożyć.
  • #8 5733038
    Pituś Bajtuś
    Poziom 28  
    tomaszek_b napisał:
    Jak mógł byś bliżej naświetlić i pomóc zrozumieć jak można by to zrobić był bym wdzięczy.
    Domyślam się iż chodzi tu o rozbicie odczytanego wyniku na dwie zmienne typu Byte lub Long. W pierwszej zmiennej mamy część całkowitą wyniku, a w drugiej część po przecinku.

    Można i tak. Można też wpakować cały wynik do zmiennej całkowitej tak, aby znajdowała się w nim wartość temperatura*10 (przy oczekiwanej dokładności wyświetlania do 1 miejsca po przecinku - naprawde nie potrzeba więcej). Wszelkie operacje na liczbach całkowitych (nawet duzych) są szybsze i zużywają mniej pamięci niż operacje na liczbach zmiennoprzecinkowych.

    tomaszek_b napisał:
    I czy nie pozostanie tutaj ponownie problem ze zformatowaniem części przecinkowej?

    Do formatowania części przecinkowej przygotuj sobie tablicę 16 stałych wartości, które sformatujesz sobie w pamięci chociażby. W każdej komórce tej tablicy będzie przechowywana wartość ułamkowa po zaokrągleniu czy sformatowaniu.
    I teraz jeśli rozbijasz wynik na dwie zmienne (całkowitą i ułamkową) to do ułamkowej ładujesz po prostu wartość z tablicy wskazaną przez 4 najmłodsze bity wyniku. Jesli natomiast chcesz mieć wszystko w jednej zmiennej (dla obliczen, porównań itp) to część całkowitą mnożysz razy 10 i dodajesz odczytaną z tablicy wartość 'ułamkową'. Jeśli nawet przy wyświetleniu wyniku będzie trzeba go rozbić i dokonać dzielenia, to będzie to bardziej efektywne niż wszystkie operacje nia liczbach zmiennoprzecinkowych. Roboty trochę jest i wiem że jest to sprzeczne z ideologią Bascoma ale przynajmniej nie będzie później płaczu, że nic więcej oprócz termometru do pamięci procesora się nie mieści.
REKLAMA