Witam.
Nie bardzo mam koncepcję jak najszybciej wyznaczyć minimum i maksimum mając takie zmienne (BASCOM):
Temperatura as Byte (przechowuje wartość mierzonej temperatury)
Znak_temp as Bit (przechowuje znak mierzonej temperatury, "0" jeśli "+" i "1" jeśli "-")
przy czym maksimum i minimum może mieć zarówno znak "+" jak i znak "-", więc zmienne przechowujące te wielkości powinny być następujące (aby nie używać zmiennych Integer):
Temp_max as Byte (temperatura maksymalna)
Znak_temp_max as Bit (znak temperatury maksymalnej)
Temp_min as Byte (temperatura minimalna)
Znak_temp_min as Bit (znak temperatury minimalnej)
Proszę o pomoc bo mi w Bascomie wychodzi mnóstwo warunków generujących olbrzymi kod wynikowy. Oczywiście najprościej byłoby temperaturę odczytaną z Dallasa zapisywać w zmiennej Integer ale po pierwsze wszelkie działania z użyciem zmiennych Integer generują duży kod wynikowy w Bascomie (nawet warunki) a po drugie wyświetlenie tych zmiennych na LCD generuje także bardzo duży kod w porównaniu do zmiennych Byte. Stąd problem minimalizacji kodu, zwłaszcza, że mam 2 temperatury (wewnętrzną i zewnętrzną) i dla obu chciałbym wyznaczyć min i max. Z góry dziękuję... robiw
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ęWyznaczenie min i max w Bascomie?
Moderatorzy:Jacek Bogusz, robertw, k.pawliczak, Moderatorzy
Hmm czyżby cudowny Bascom nie obsługiwał 8 bitowej zmiennej ze znakiem? -128...+127 akurat pasuje do temperatury.
Kod C-podobny:
Jeśli chcesz dokonać tego na większej liczbie zmiennych (temperatur) to warto umiecić to w oddzielnej funkcji (?) zaoszczędzisz miejsce w pamięci.
[ Dodano: 12-03-2006, 11:48 ]
Faktycznie, 8 bitów w Bascomie jest bez znaku. Może spróbuj zastosować "przesunięcie" tzn temperaturę 0 stopni umieść w połowie zakresu zmiennej 8 bitowej, (wszelkie porównania będą działały tak samo) a przed wyswietleniem "przetransponuj" zmienną do właściwego zakresu.
PS. A może najwyższa pora przejść na C?
Kod C-podobny:
Kod: Zaznacz cały
temp_min = 127;
temp_max = -128;
while(1)
{
temp = zmierz_temp();
if(temp < temp_min)
temp_min = temp;
if(temp > temp_max)
temp_max = temp;
}
[ Dodano: 12-03-2006, 11:48 ]
Faktycznie, 8 bitów w Bascomie jest bez znaku. Może spróbuj zastosować "przesunięcie" tzn temperaturę 0 stopni umieść w połowie zakresu zmiennej 8 bitowej, (wszelkie porównania będą działały tak samo) a przed wyswietleniem "przetransponuj" zmienną do właściwego zakresu.
PS. A może najwyższa pora przejść na C?
Witaj.
Bascom nie jest zły; naprawdę można zdecydowanie zmniejszać kody generowane przez kompilator mając już pewne z nim doświadczenie. Tutaj jednak sprawa jest skomplikowana. Ja osobiście jestem bardzo przyzwyczajony do takiej składni; kiedyś programowałem sporo w Borland Pascalu, później w Delphi, a więc "przejrzysta" składnia Bascoma mnie przekonuje a te wszystkie "{", operatory wyrażeń itp. itd w C++ mnie przerażały. Piszę dość rozbudowany układ automatyki domowej (iDom) i brakuje mi już Flash'a do zaimplementowania wyznaczania "max" i "min" tzn. o ile wystarcza jeszcze pamięci na ich wyznaczenie to już brakuje w chwili wyświetlenia na LCD. "Procek" 89C4051... robiw
Bascom nie jest zły; naprawdę można zdecydowanie zmniejszać kody generowane przez kompilator mając już pewne z nim doświadczenie. Tutaj jednak sprawa jest skomplikowana. Ja osobiście jestem bardzo przyzwyczajony do takiej składni; kiedyś programowałem sporo w Borland Pascalu, później w Delphi, a więc "przejrzysta" składnia Bascoma mnie przekonuje a te wszystkie "{", operatory wyrażeń itp. itd w C++ mnie przerażały. Piszę dość rozbudowany układ automatyki domowej (iDom) i brakuje mi już Flash'a do zaimplementowania wyznaczania "max" i "min" tzn. o ile wystarcza jeszcze pamięci na ich wyznaczenie to już brakuje w chwili wyświetlenia na LCD. "Procek" 89C4051... robiw
Radzio, Twój pomysł z przeskalowaniem był prosty ale genialny, że też na to nie wpadłem. Wygląda to tak (mniej więcej).Hmm czyżby cudowny Bascom nie obsługiwał 8 bitowej zmiennej ze znakiem? -128...+127 akurat pasuje do temperatury.
Kod C-podobny:Jeśli chcesz dokonać tego na większej liczbie zmiennych (temperatur) to warto umiecić to w oddzielnej funkcji (?) zaoszczędzisz miejsce w pamięci.Kod: Zaznacz cały
temp_min = 127; temp_max = -128; while(1) { temp = zmierz_temp(); if(temp < temp_min) temp_min = temp; if(temp > temp_max) temp_max = temp; }
[ Dodano: 12-03-2006, 11:48 ]
Faktycznie, 8 bitów w Bascomie jest bez znaku. Może spróbuj zastosować "przesunięcie" tzn temperaturę 0 stopni umieść w połowie zakresu zmiennej 8 bitowej, (wszelkie porównania będą działały tak samo) a przed wyswietleniem "przetransponuj" zmienną do właściwego zakresu.
PS. A może najwyższa pora przejść na C?
Temp=1wread ' czytam temperaturkę z DS1820
Znak=1wread ' czytam znak
Shift Temp, Right, 1 ' przesuwam w prawo o jeden bit bo nie interesuje mnie pół stopnia
if Znak=0 then Temp=Temp+128 ' przeskalowuję
W ten sposób dla 0'C=128 i idzie w górę, a poniżej 0'C Dallas wysyła w kodzie U2 więc nic nie zmieniając dla -1'C będę miał 127 itd... Piszę z pamięci ale chyba się nie mylę... Robert
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 35 gości