Bascom - parę pytań


Witam,

Robię właśnie swój pierwszy "poważny" układ :) i programuję w BASCOMie. Wszystko idzie jak po maśle, za wyjątkiem dwóch rzeczy:

1) Nie mogę sobie poradzić z zapisem i odczytem liczby typu single z eepromu. No, może nie do końca - już wyjaśniam w czym rzecz.

Otóż fragment:

Dim E_temp_alarm As Eram Single
Dim Temp_alarm As Single
 
E_temp_alarm = 123.45
Temp_alarm = E_temp_alarm  

działa poprawnie - natomiast zmienna E_temp_alarm musi być w moim przypadku przechowywana w eepromie cały czas (ponieważ wartość ta się zmienia, a po resecie/braku zasilania potrzebuję skorzystać z ostatnich ustawień), więc na początku programu dopisałem:

If Temp_alarm = 255 Then
Temp_alarm = 20
End If

Czyli warunek który powinien zostać spełniony tylko przy pierwszym uruchomieniu programu, aby zapobiec porównań w programie do FF :) I tu jest problem - o ile takie sprawdzanie działa idealnie przy zmiennych Byte, o tyle z Single mam kłopot... Wygląda na to, że ten warunek nie zostaje spełniony, bo pod Temp_alarm pojawia się liczba -0.0. Podejrzewam, że jest to błąd w odczycie - liczba Single jest zapisywana na 4 bajtach, wiec jej wartość początkowa w eepromie to FFFF FFFF - tylko jak teraz napisać ten warunek sprawdzający?

2) Przerwania :)Czy mógłbym prosić o przykład (może być pseudo-kod) zastosowania? Generalnie potrzebuję COŚ zrobić, abym mógł swobodnie sprawdzać na bieżąco stan tact-switchy (w tej chwili odczyt temperatury mam co 750ms, i w tym czasie oczywiście nie mogę monitorować stanu przycisków, a ciężko się wstrzelić w "otwartą linię" ;)

Z góry dziękuję za pomoc

pozdrawiam!




Portret użytkownika mirley

RE: Bascom

Szczerze mówiąc to nigdy w ten sposób nie zapisywałem nic do eeprom, zawsze robię to za pomocą writeeeprom. Do ilu miejsc po przecinku potrzebujesz tego Singla, nie można poprostu zrobić z niego liczby całkowitej mnożąc przez np 1000 (do 3 miejsc po przecinku)?

Co do obsługi klawiatury podczas pomiaru temperatury Ds18B20 (bo zakładam że tym mierzysz) nie potrzeba żadnego przerwania zewnętrznego, wystarczy timer z określonym interwałem czasu. Popatrz w moich projektach, prawie wszystkie mają klawiatury.

a tak w ogóle to co to będzie za układ i do czego będzie służył?

-

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 belialek

Dzięki za zainteresowanie. Z

Dzięki za zainteresowanie.

Z tego co czytałem, to każda zmienna deklarowana jako Eram, jest zapisywana identycznie jak przy użyciu writeeeprom - z tym ułatwieniem, że wystarczy później przypisać do tej zmiennej dowolną wartość, i w tym momencie zostanie wpisana do eepromu pod komórkę wskazaną przy deklaracji.

Dim E_temp_alarm As Eram Single At 3

O, to "At 3" mówi o tym, gdzie zapisywać ;). Zmienna single jest potrzebna z dokładnością do 1 cyfry po przecinku, przechowuję w niej ustawienie programowego termostatu - musi to być typ single, gdyż jak wiadomo nie mogę porównywać zmiennych dwóch różnych typów.

Co do obsługi klawiatury - zaraz zajrzę do Twoich źródeł, i spróbuję zrobić w analogiczny sposób.

Doszedłem do wniosku, że najlepiej zacząć zabawę z elektroniką mając nakreślony konkretny cel do zrealizowania - wybrałem przyjemne z pożytecznym, i postanowiłem zrobić układ zarządzający mała szklarnią u taty na działce (kontrola otwarcia okna, włączanie/wyłączanie zraszaczy, prowadzenie statystyk średnich temperatur [ds18b20] z ostatnich dni a kiedyś kiedyś kontrola wilgotności podłoża - póki co nie wiem jak się za to zabrać od strony elektroniki :D). Generalnie na tym etapie mam tylko te dwa problemy - sam układ polutowany i chyba działa :D

Pozdrawiam!

EDIT: problem z single rozwiązany - faktycznie nie pomyślałem o dzieleniu i mnożeniu przez 10 :).

EDIT 2: jednak dalej nie mogę dojść do ładu z przerwaniami... Patrzyłem w kody, i szczerze niewiele rozumiem z tych przerwań. Tak właściwie to co ja powinienem umieścić w timerze/przerwaniu? Odczyt i konwersje temperatury, czy samą obsługę przycisków? Coś czuję, że bez przykładu nie dam rady... :)

Portret użytkownika mlassota

Przepraszam że dokopuje temat

Przepraszam że dokopuje temat ale wczoraj ze 6h wlaczyłem z tym problememi nic...
Czy może którys z kolegów "łopatologicznie" napisac jak zapisać zmienną Single do pamięci
deklaracje wyglądaja tak:

Dim Sr1twys As Single
Dim Sr1twys1 As Eram Single
dim Dt As Byte
Dim Dzientyg As Eram Byte

W programie przed pętlą głowna robie odczyt:

Dt = Dzientyg 
Sr1twys = Sr1twys1

a w programie głównym raz na dobę ( w pętli funkcji if) dokonuje zapisu obu zmiennych do eeprom:

Sr1twys1 = Sr1twys
Dzientyg = Dt

Dla zmiennej Dt/Dzientyg wszystko jest w porządku - zarówno zapis ja i odczyt jest poprawny natomiast zmienna Sr1twys/Sr1twys1 bądz nie zapisuje się bądz nie oczytuje (zwraca wartość 0.0) Co robie nie tak?

Portret użytkownika mirley

Re: Zapis do EEPROM

Wnioskuję że chodzi o zapis do eeprom. ja bym to zrobił tak:

Dim Sr1twys As Single
 
'odczyt
Readeeprom Sr1twys, 1
 
 
Do
 
'jakieś instrukcje
 
'zapis
Writeeeprom Sr1twys, 1
 
 
Loop

-

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 mlassota

Dzieki Działa i działał ...

Dzieki
Działa i działał ... problem tkwił w czymś innym... Zmienna była wynikiem diałania które jest normalnie wykonywane w programie (wyliczanie sredniej)
Jako, że zapsuję tylko średnią a po restarcie skladowe tej średniej były zerowe więc program ponownie wyliczał srednią "zastępując" oczytaną wartość zerem... Problem rozwiązałem dodojąc do wyliczeń sredniej linijki:

If n<> 0 then
...wywliczam średnią
end if
Dzięki za zainteresowanie
Pozdrawiam
M