Problem z EEPROM w Bascomie


Witam,
Mam problem z wykorzystaniem pamięci wewnętrznej EEPROM w uC atmega16. Czytałem na wielu forach o tym ale w większości posty są pisane dla ludzi którzy już to umieją.
Chciałbym zrobić na płytce uniwersalnej (EvB 4.3 v2) termometr który zapisywałby temperaturę co 15 minut.
Oto program jaki dotąd napisałem:

$regfile = "m16def.dat"
$crystal = 16000000
 
 
'Podłączenie pinów LCD do mikroprocesora
' BL = PortC.1
' Rs = PortC.2
'  E = PortC.3
'Db4 = PortC.4
'Db5 = PortC.5
'Db6 = PortC.6
'Db7 = PortC.7
 
Config Lcdpin = Pin , Rs = Portc.2 , E = Portc.3 , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7
Config Lcd = 16 * 2
 
 
Config 1wire = Portb.0                                      ' termometr ds18b20
Dim I As Integer                                            'zmienne do odczytu temp.
Dim S As Single
Dim T As String * 4
 
Deflcdchar 0 , 2 , 5 , 2 , 32 , 32 , 32 , 32 , 32           ' stopien
 
Cursor Off
Cls
 
                                                   'pomiar temp.
Do
 
 
   1wreset
   1wwrite &HCC
   1wwrite &H44
   Waitms 750
 
   1wreset
   1wwrite &HCC
   1wwrite &HBE
 
   I = 1wread(2)
   S = I / 16
   T = Fusing(s , "##.#")
 
   Locate 1 , 1
   Lcd "Temp: " ; T ; Chr(0) ; "C"
 
 
 
Loop

Nie chodzi mi o gotowca tylko chociaż o naprowadzenie na procedury odczytu i zapisu temp, oraz ich przykładowe wykorzystanie.




Portret użytkownika mirley

Re: Zapis EEPROM

Nie ma z tym żadnego problemu, zakładając że odczyt temperatury działa Ci prawidłowo. Zapis wewnetrznej pamięci procesora jest banalnie proste, wystarczy wywołać funkcję:

WRITEEEPROM var , address

a do odczytu:

READEEPROM var , address

zmienna Var to zmienna którą chcesz zapisać, a address to jej adres w pamięci EEPROM uC. Jeśli zapisywana wartość jest typu Byte to możesz zapisywać każdy kolejny adres począwszy od 1 w górę (0 nie jest zalecane). Jeśli natomiast chcesz zapisywać integer'y to każdy z nich ma dwa bajty więc zapisując go pod adresem 1 automatycznie zajęte zostaną adresy 1 i 2 bo gdzieś się musi ten drugi bajt zmieścić. W takiej sytuacji zapisywać należy co drugi adres 1, 3, 5 itd

W twoim programie to będzie jakoś tak:

...
I = 1wread(2)
...
WRITEEEPROM I , N

gdzie N jest dresem który będziesz zwiększał N=N+2 po każdym zapisie temperatury. Do zapisu wykorzystaj timer który odliczy ci te potrzebne 15 min czasu i w obsłudze timera daj zapis do EEPROM. Pamiętaj że M16 ma tylko 512 bajtów EEPROM więc musisz ograniczyć N aby nie wyszło poza zakres.

-

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 Kondziu

Dziękuje bardzo. Faktycznie

Dziękuje bardzo. Faktycznie proste. Może nawet za proste :)
Myślałem żeby ograniczyć zapis do 4-ch temperatur. Tak żeby wszystkie zmieściły się na LCD 16x2.
Czy w sytuacji gdy na jakimś adresie istnieje już wartość to aby zastąpić ją inną trzeba ją najpierw skasować czy użyć tego samego adresu i zapisać nową wartość?

-

Wiem że nic nie wiem...

Portret użytkownika mirley

Re: EEPROM

Nie trzeba nic kasować, nadpisujesz jedną wartość na drugą.. Kasowanie to przecież zapis 0 więc było by to bez sensu. Pamiętaj żeby nie zapisywać zbyt często do pamięci nieulotnej bo ona ma skończoną liczbę cykli zapisu. Jeśli nie wyłączasz zasilania a chcesz pamiętać tylko 4 temperatury to wystarczy zapisywać to w dodatkowych zmiennych w programie, dołożyć jeszcze baterię do układu i w momencie braku prądu zapisać do eeprom i wyłączyć układ

-

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 gosc

Brak zasilania

Witam serdecznie! Czy po utracie zasilania dane zapisane w wewnętrznym EEPROM'ie Atmegi 8 zostaną utracone? Jak sama nazwa pamięci wskazuje, nie powinny. Lecz nie mogę sobie poradzić z zapisem do pamięci wew. jednej wartości WORD, wyłączeniem zasilania, ponownym włączeniem i odczytem tej wartości :(

Portret użytkownika mirley

Re: Eeprom

Zapis jest prosty:

Writeeeprom zmienna_word, adres

zmienna_word zostanie zapisana po adresem adres i adres +1 bo ma dwa bajty i trzeba o tym pamiętać. Odczyt jest następujący:

Readeeprom Zmienna_word, adres 

i tak samo podajesz tylko adres pierwszej komórki a czytane sa dwie kolejne komórki pamięci. Jak zapisujesz dwie kolejne wartości word to nie wolno ich zapisać np w komórkach 1 i 2 tylko np 1 i 3 bo komórka 2 zostanie automatcznie zapisana przy zapisie word pod adres 1

-

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 gosc

Eeprom

Witam

Proszę o wytłumaczenie jak to jest z nadpisywaniem danych w atmega8? Dokładniej mówiąc mam zadaną wartość początkową T1=80 i chciałbym aby po ustawieniu jej np na T1=85 było tyle ustawione jako wartość początkowa i taka wartość pojawiała się po zaniku napięcia.

Z góry dziękuję za pomoc.

Pozdrawiam

Portret użytkownika mirley

Re: EEPROM

No to nie widzę problemu. W menu gdzie ustawiasz parametry po wyjściu z menu zapisz parametry do eeprom w procku. Na początku programu odczytaj EEprom do zmiennej tymczasowej. Sprawdź warunkami if czy wartość parametru mieści się w odpowiednich granicach. Jeśli się mieści to T1=Wartosc_odczytana a jeśli się nie mieści to T1=wartosc_domyslna

-

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 gosc

Ja mam takie coś co wpisuje

Ja mam takie coś co wpisuje domyślną wartość po programowaniu układu (domyślnie komórka wypełniona samymi jedynkami czyli 255)

Readeeprom T_zad2 , 1
If T_zad2 = 255 Then
  T_zad2 = 55
  Writeeeprom T_zad2 , 1
End If