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?

robiw
-
-
Posty: 34
Rejestracja: 21 wrz 2005, o 12:36
Lokalizacja: Gniezno

Wyznaczenie min i max w Bascomie?

Postautor: robiw » 12 mar 2006, o 11:19

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

radzio
Moderator
Moderator
Posty: 965
Rejestracja: 13 maja 2003, o 10:33
Lokalizacja: Sosnowiec
Kontaktowanie:

Postautor: radzio » 12 mar 2006, o 11:35

Hmm czyżby cudowny Bascom nie obsługiwał 8 bitowej zmiennej ze znakiem? -128...+127 akurat pasuje do temperatury.
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; }
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?

robiw
-
-
Posty: 34
Rejestracja: 21 wrz 2005, o 12:36
Lokalizacja: Gniezno

Postautor: robiw » 12 mar 2006, o 12:25

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

radzio
Moderator
Moderator
Posty: 965
Rejestracja: 13 maja 2003, o 10:33
Lokalizacja: Sosnowiec
Kontaktowanie:

Postautor: radzio » 12 mar 2006, o 12:28

No to może lepszym wyjściem byłoby oddzielenie wyświetlacza? Osobny procek np 2051 sterowałby wyswietlaczem, dane przyjmowałby po RS (albo po czym tam komunikujesz się w tym systemie).

robiw
-
-
Posty: 34
Rejestracja: 21 wrz 2005, o 12:36
Lokalizacja: Gniezno

Postautor: robiw » 15 mar 2006, o 22:19

Hmm czyżby cudowny Bascom nie obsługiwał 8 bitowej zmiennej ze znakiem? -128...+127 akurat pasuje do temperatury.
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; }
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?
Radzio, Twój pomysł z przeskalowaniem był prosty ale genialny, że też na to nie wpadłem. Wygląda to tak (mniej więcej).

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

Wróć do „Projektowanie PCB, programy EDA, CAD, narzędziowe”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 14 gości