Bascom - dwupunktowy pomiar temperatury + pomiar napięcia - drobny problem.


Słuchajcie, napisałem mały programik do pomiaru temperatury w dwóch miejscach za pomocą LM35 (akurat pd ręką więc szkoda nie użyć) i pomiar napięcia do 15V z naprzemiennym wyświetlaniem w górnej linii LCD 2x16 i mam drobny zgryz. Jak napięcie jest większe niż 10V to przestaje wyświetlać jedną z temperatur.

Oto kawałek kodu umieszczony w pętli głównej:

incr do_wyswietlania_temp          'umozliwia zmiane wyswietlanej temperatury
  temp_zew = getadc(0)
  Volt = temp_zew * 4
  Volt_d = Volt Mod 10             'zwraca wartosc modulo 10
  Volt = Volt / 10
 
  temp_wew = getadc(1)
  Volt1 = temp_wew * 4
  Volt_d1 = Volt1 Mod 10           'zwraca wartosc modulo 10
  Volt1 = Volt1 / 10
 
if do_wyswietlania_temp < 125 then 'jesli zmienna pomocnicza mniejsza niz 125 to
  home
  lcd "Temp zew:" ; Volt ; "," ; Volt_d ; Chr(223) ; "C" ; "  "       'wyswietla jedna temperature
else                               'a jak nie
  home
  lcd "Temp wew:" ; Volt1 ; "," ; Volt_d1 ; Chr(223) ; "C" ; "  "       'to drugą
end if
 
 
napiecie = getadc(3)               'obliczenia napiecia aku
napiecie = napiecie * 3            'bedzie dzielnik napiecia 2 do 1 wiec mnoze x3
pomocnicza_napiecia1 = napiecie / 204.6       'dziele przez ilosc jednostek przypadjacych na 1V
pomocnicza_napiecia2 = fusing(pomocnicza_napiecia1 , "#.&&")       'ucinam wszystko poza dwoma miejscami po przecinku
locate 2 , 11
lcd pomocnicza_napiecia2 ; "V" ; " "       'wyswietlam wynik

Jak napięcie jest wyższe niż 10V to wyświetla tylko Temp zew. więc wnioskuję że ponizszy kawałek kodu ma na to wpływ, ale czemu wielkość napięcia ma wpływ na wartość zmiennej o nazwie do_wyswietlania_temp ?

if do_wyswietlania_temp < 125 then 'jesli zmienna pomocnicza mniejsza niz 125 to
  home
  lcd "Temp zew:" ; Volt ; "," ; Volt_d ; Chr(223) ; "C" ; "  "       'wyswietla jedna temperature
else                               'a jak nie
  home
  lcd "Temp wew:" ; Volt1 ; "," ; Volt_d1 ; Chr(223) ; "C" ; "  "       'to drugą
end if

Nadmienię tylko że wszystko sprawdzam na płytce testowej EVBavr04 symulując napięcie wejściowe napięciem z potencjometru.




Portret użytkownika mirley

Re: Wyświetlanie

Zastąp kod:

if do_wyswietlania_temp < 125 then 'jesli zmienna pomocnicza mniejsza niz 125 to
  home
  lcd "Temp zew:" ; Volt ; "," ; Volt_d ; Chr(223) ; "C" ; "  "       'wyswietla jedna temperature
else                               'a jak nie
  home
  lcd "Temp wew:" ; Volt1 ; "," ; Volt_d1 ; Chr(223) ; "C" ; "  "       'to drugą
end if

fragmentem

if do_wyswietlania_temp < 125 then 'jesli zmienna pomocnicza mniejsza niz 125 to
  home
  lcd "Temp zew:"
else                            
  home
  lcd "Temp wew:"
end if

aby sprawdzic czy to nie wina tej złozonej istrukcji wyświetlania. Po drugie spróbuj zmienić home na odpowiedni locate x, y. Jakiego typu jest zmienna "do_wyswietlania_temp", masz gdzieś zerowanie jej wartości czy przekręcasz poprostu licznik w zmiennej bajtowej?

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika matrix

Re: Wyświetlanie

mirley wrote:
Zastąp kod:
(...)
fragmentem
(...)

nie pomogło.

mirley wrote:
spróbuj zmienić home na odpowiedni locate x, y

nie pomogło
mirley wrote:
Jakiego typu jest zmienna "do_wyswietlania_temp" masz gdzieś zerowanie jej wartości czy przekręcasz poprostu licznik w zmiennej bajtowej?

jest to zmienna typu byte i nie miałem jej zerowania bo to kolejne 3 linijki kodu, więc pomyślałem że przekręcę ją.

dodanie trzech linijek zerujących tą zmienną nic nie dało.

naprawdę nie wiem jaki wpływ ma wartość mierzonego napięcia na tą zmienną.
nadmienię tylko że jak zaREMuję linijkę

napiecie = napiecie * 3

mnożącą napięcie x3 to sytuacja nie ma miejsca.

Portret użytkownika mirley

Re: Zmienne

Wygląda na to jakby zapisywało się coś w obszar pamięci jednej zmiennej coś z drugiej zmiennej.... zrobiłem sobie też tak kiedys ale to było w eepromie a nie w ramie...... Zmień miejscami deklarację zmiennych lub dodaj nową zmienną. Może cos się przestawi. Wrzuć jeszcze fragment programu gdzie deklarujesz zmienne.... żeby można było wiedziec jakie są to typy

Może twoja wersja bascoma ma jakiś błąd, spróbuj najnowszą wersje demo ze strony producenta.

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika matrix

Re: Zmienne

mirley wrote:
Może twoja wersja bascoma ma jakiś błąd, spróbuj najnowszą wersje demo ze strony producenta.

korzystam z najnowszej (niestety) wersji demo, 1.11.9.8
mirley wrote:
Wrzuć jeszcze fragment programu gdzie deklarujesz zmienne

proszę bardzo:
dim zmienna_dla_timera1 as word 'zmienna do ktorej wpisywana jest wartosc dla timera1 (regulacja czasu miedzy przerwaniami)
Dim temp_zew As Word , volt_d As Word , Volt As Byte 'zmienne do obiczania temeratury zewnetrznej
dim temp_wew as word , volt_d1 As Word , Volt1 As Byte 'zmienne do obiczania temeratury wewnetrznej
dim led as byte 'zmienna do programowego PWM
dim ktora_dioda as byte 'zmienna dla przesuwania diody
dim licznik as byte 'zmienna dla timer0 do programowego PWM
dim zmienna_adc as word 'zmienna dla adc dla regulacji czasu przerwan timera1
dim napiecie as word 'zmienna do pomiaru napiecia
dim pomocnicza_napiecia1 as single 'zmienna pomocnicza dla obliczania napiecia akumulatora
dim pomocnicza_napiecia2 as string * 4 'zmienna poddawana funkcji fusing
dim do_wyswietlania_temp as byte 'zmienna zmieniająca wyswietlanie temperatury 
dim pamiec_zmiennej_ktora_dioda as byte 'zmienna dla pamieci tymczasowej

Portret użytkownika rafliczek22

Ja widzę że masz też inne

Ja widzę że masz też inne zmienne czyli program sięga dalej, spróbuj może najpierw to wyświetlanie adc zrobić, dla mnie ten kod jest troszkę bez sensu, np. to:

pomocnicza_napiecia1 = napiecie / 204.6       'dziele przez ilosc jednostek przypadjacych na 1V
pomocnicza_napiecia2 = fusing(pomocnicza_napiecia1 , "#.&&")

nie rozumiem po co dzielić przez 204.6, możesz dzielić przez 204 albo 205 ale zostwmy już to, po co siedzi tam fusing, jak możesz to samo zrobić na mod'ach, i będzie to i mniejsze i szybsze.

P.s. Wyświetla do 10 czy do 9.99, bo jak do 9.99 to zmieniłbym tego fusinga trochę, nie powiem jak bo jak się przyjrzysz to sam zobaczysz :D.

Portret użytkownika matrix

raficzek wrote:nie rozumiem

raficzek wrote:
nie rozumiem po co dzielić przez 204.6, możesz dzielić przez 204 albo 205

jak podzielisz zakres ADC czyli 1023 przez max co może wejść na tenże przetwornik czyli 5V żeby otrzymać ilość jednostek ADC przypadających na 1V to dostaniesz wynik 204.6, więc jeśli wynik pomiaru podzielisz przez te ileś jednostek na 1V to będziesz miał ile volt masz na wejściu przetwornika.

raficzek wrote:
po co siedzi tam fusing, jak możesz to samo zrobić na mod'ach, i będzie to i mniejsze i szybsze.

pomiar temperatur mam zrobiony na modach o tak:
temp_zew = getadc(0)
  Volt = temp_zew * 5
  Volt_d = Volt Mod 10             'zwraca wartosc modulo 10
  Volt = Volt / 10

i niestety nie zawsze działa jak należy, czasem wyświetla 3,2stC podczas gdy naprawdę jest około 20 dlatego tu zastosowałem fusing bo sprawdzony.
raficzek wrote:
Wyświetla do 10 czy do 9.99, bo jak do 9.99 to zmieniłbym tego fusinga trochę, nie powiem jak bo jak się przyjrzysz to sam zobaczysz :D.

wiem, specjalnie dałem bez zaokrąglania. wystarczyło by napisać
pomocnicza_napiecia2 = fusing(pomocnicza_napiecia1 , "#.##")

i było by bez zaokrąglania. swoją drogą, sprawdzę to.

Portret użytkownika rafliczek22

Quote: Quote: nie rozumiem po

Quote:

Quote:
nie rozumiem po co dzielić przez 204.6, możesz dzielić przez 204 albo 205

jak podzielisz zakres ADC czyli 1023 przez max co może wejść na tenże przetwornik czyli 5V żeby otrzymać ilość jednostek ADC przypadających na 1V to dostaniesz wynik 204.6, więc jeśli wynik pomiaru podzielisz przez te ileś jednostek na 1V to będziesz miał ile volt masz na wejściu przetwornika.

Quote:


Chodziło mi o to że dzielenie przez liczbe z przecinkiem jest "długie", a w zmiennej "pomocnicza_napięcie1" wynik zawsze będzie całkowity (bez przecinka).

Co do fusingu to chodziło raczej o taki twór:
fusing(zmienna, "##.##"

P.s. pomocnicza_napiecia2 powinna być albo "goły" string albo string*6.

Portret użytkownika matrix

Re: Zmienne

raficzek wrote:
Chodziło mi o to że dzielenie przez liczbe z przecinkiem jest "długie", a w zmiennej "pomocnicza_napięcie1" wynik zawsze będzie całkowity (bez przecinka).

może i jest długie, ale z drugą częścią nie zgodzę się za bardzo ponieważ w helpie do bascoma napisano inaczej, cytuję:
Quote:

Single 4 bajty Typ Single może przechowywać dowolną liczbę stało lub zmiennoprzecinkową pojedyńczej precyzji.

(c) Zbigniew Gibek, 2002-2005 (c) MCS Electronics, 1999-2005


raficzek wrote:
Co do fusingu to chodziło raczej o taki twór:
fusing(zmienna, "##.##"

raczej ten pierwszy hush nie jest konieczny, cytat z helpa:
'Teraz sformatujemy liczbę według wzorca z zaokrąglaniem
Print Fusing(s , "#.##")             'wydrukuje 123.46
 
'A teraz to samo tylko bez zaokrąglania
Print Fusing(s , "#.&&")             'wydrukuje 123.45
 
'Maska musi rozpoczynać się od znaku #.
 
(c) Zbigniew Gibek, 2002-2005   (c) MCS Electronics, 1999-2005

szczególnie ostatni fragment czyli:
'Maska musi rozpoczynać się od znaku #.

raficzek wrote:
P.s. pomocnicza_napiecia2 powinna być albo "goły" string albo string*6.

sprawdzę to.

Portret użytkownika rafliczek22

A przepraszam nie doczytałem

A przepraszam nie doczytałem że to singiel jest.

Portret użytkownika gosc

witam!!!!!!!!!

Witam czy mogł bym dostać część kodu odpowiadającą za pomiar napięcia???

Portret użytkownika matrix

Re: Część kodu odpowiadająca za pomiar napięcia.

Mówisz i masz, ale napisane jest bardzo jasno więc dziwię się skąd Twoje pytanie?

napiecie = getadc(3)               'obliczenia napiecia aku
napiecie = napiecie * 3            'bedzie dzielnik napiecia 2 do 1 wiec mnoze x3
pomocnicza_napiecia1 = napiecie / 204.6       'dziele przez ilosc jednostek przypadjacych na 1V
pomocnicza_napiecia2 = fusing(pomocnicza_napiecia1 , "#.&&")       'ucinam wszystko poza dwoma miejscami po przecinku
locate 2 , 11
lcd pomocnicza_napiecia2 ; "V" ; " "       'wyswietlam wynik

Portret użytkownika gosc

mam problem z pomiatem temp i pomiarem napiecia zfoto rezystora

Witam
mam problem z pomiarem temp ds18b20 2 czujniki i pomiarem napiecia z fotorezystora rownoczesnie...
o co chodzi....
do atmega32 podlaczylem czujnik swiatla i temp.
po zapisaniu w programie nazwy procesora i czestotliwosc wpisuje
$include "temp"
$include "foto"
Iw takiej kolejnosci temp dziala a foto nie...
I zmiana...
foto
temp
i tu dziala foto a temp juz nie...
co robie zle?
jak to zapisac zeby działało?
Pomozcie

Portret użytkownika gosc

ptogram nie widzi temp albo napiecia

Witam.
w bascomie napisalem proram do pomiaru temp idczytu napiecia .
i mam problem z odczytem napiecia...
osobno dzialaja a razem juz nie... jak to napisac zeby dzialalo?
pomozcie

Portret użytkownika rambo12

odczyt rownoczesny temp i napiecia

Po wpisaniu kodu na temp i analogowy odczyt napiecia temperatura dziala a napiecie nie....
a wpisujac ana. Napiecie a pozniej temp to napiece dziala a temp juz nie... jak poprawnie wpisywac dwa kody do roznych czynnosci?
pomozcie

-

Same problemy

Portret użytkownika mirley

Re: Bascom

A jak wrzucisz procedury do jednego kodu to działają? (bez include)

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.