Potrzebuję stworzyć procedurę wyświetlania temperatury na wyświetlaczu LCD w asemblerze, odczytaną z DS18B20. Stosowany jest tam zapis stałopozycyjny, na ułamek przeznaczone są 4 najmłodsze bity.
Wiem na czym polega zasada obliczania takiego binarnego ułamka. W skrócie jest to po prostu suma kolejnych ujemnych potęg liczby 2. W języku C nie byłoby problemu z dodatniem tych potęg. Jednak w asemblerze 8051 jest trudniej. Nie mogę wymyślić jakiejś zgrabnej procedurki, która by zmieniała ten ułamek na kod BCD. O ile w przypadku liczby całkowitej procedura taka wychodzi mi bardzo zwięzła i przetwarzanie liczby jest robione niemalże w locie, to w przypadku ułamków wychodzi mi dość niezgrabny kawałek kodu.
Proszę podzielcie się informacjami, jakie Wy stosujecie algorytmy. A może spotkaliście gdzieś na jakiejś stronie opis takiej procedury? Oczywiście interesują mnie nie tylko 4 bity ułamka, ale i większe ułamki.
Aktyw Forum
Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.
Sprawdź punkty Zarejestruj sięAsembler, DS18B20 i ułamki
Moderatorzy:Jacek Bogusz, Moderatorzy
Przepis prosty do bólu jest: weźmij część ułamkową z zapisu binarnego<Bu>, pomnóż ową przez 10 poniesione do potęgi równej liczbie miejsc znaczących które chcesz uzyskać a nastepnie podziel wynik przez 2 do potegi równej długości tej części ułamowej <Bu> w bitach. Uzyskana liczba binarna będzie miała wartość części dziesiętnej twojego ułamka. aby dostać BCD wystarczy standardowa procedura zamiany bin na BCD(ale nie jestem pewien czy rzeczywiście chodziło tobie o BCD czy raczej o binarny). W twoim przypadku aby pokazywać ostatnie mrugające "5" i "0" temperatury to trzeba : <Bu>(4 bity) pomnożyć przez 10000 i podzielić przez 0x0010 (czyli wynik przesunąć w prawo o 4 bity). wyprowadzając napis trzeba pamiętać że trzeba konwertować wynik aż do uzyskania czterech znaków (np czterech zer). To jest ogólny przepis, za każdym razem trzeba do niego dobrać odpowiednie długości słów i arytmetyki. gdy chcesz uzyskać cztery miejsca po przecinku to arytmetyka musi być na slowach co najmniej 18 bitowych. dla trzech miejsc po przecinku wystarczy arytmetyka 16 bitowa. Tyle o ogólnym algorytmie.
Ja bym raczej (dla tego prostego przypadku) po prostu stablicował wyniki/poprawki i używał części ułamkowej pomiaru jako indeksu. Można też zastosować ten algorytm do całego słowa wyniku pomiaru wtedy cały wynik jest konwertowany(skalowany) do postaci binarnej na której można wykonywać normalne operacje arytmetyczne (pamiętając że wartość wyrażona dziesiętnie ma przecinek w miejscu określonym dokładnością pierwotnej konwersji) ale wtedy arytmetyka (dla dokładności większej niś dwie cyfry dziesiętne po przecinku) musi być na słowach większych niż 16 bitów. Trochę zawile, ale może wystarczy
Bis
Ja bym raczej (dla tego prostego przypadku) po prostu stablicował wyniki/poprawki i używał części ułamkowej pomiaru jako indeksu. Można też zastosować ten algorytm do całego słowa wyniku pomiaru wtedy cały wynik jest konwertowany(skalowany) do postaci binarnej na której można wykonywać normalne operacje arytmetyczne (pamiętając że wartość wyrażona dziesiętnie ma przecinek w miejscu określonym dokładnością pierwotnej konwersji) ale wtedy arytmetyka (dla dokładności większej niś dwie cyfry dziesiętne po przecinku) musi być na słowach większych niż 16 bitów. Trochę zawile, ale może wystarczy
Bis
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 2 gości