Zapis i odczyt do eeprom


Witam serdecznie
Napisałem program do liczenia godzin pracy z tym że mam problem z zapisem do eepromu i jego odczytem.Jak narazie zapis chciałbym uzyska po naciśnięciu S2, a po włączeniu zasilania odczyt z eepromu

$regfile = "m8def.dat"                                      'informuje kompilator o pliku
$crystal = 8000000                                          'informuje kompilator
 
Config Pinc.3 = Input                                       
Config Pinc.4 = Output
Config Pind.4 = Input
'Config Pinb.4 = Input
 
Config Lcd = 16 * 2                                         'konfiguracja typu wyświetlacza LCD
 
Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portb.0 , E = Portb.2 , Rs = Portb.1
Config Timer1 = Timer , Prescale = 256                      'konfiguracja Timer1 jako timer z podziałem preskalera przez 256
 
 
Stop Timer1
On Timer1 Odmierz_1s                                        
 
Dim Sekundy As Byte                                         
Dim Minuty As Byte                                          
Dim Godziny As Byte                                         
Dim Sekundy_s As Byte
Dim Minuty_s As Byte                                       
Dim Godziny_s As Byte                                       
Dim Zmienna As Byte                                         
dim zmienna_eprom as eram byte    ' zmienna eeprom
 
Dioda Alias Portc.4
S1 Alias Pinc.3
S2 Alias Pind.4
 
Enable Interrupts                                           'odblokowanie globalnego systemu przerwań
Enable Timer1                                               'odblokowanie przerwania od przepełnienia Timer1
Counter1 = 34282                                            'wartość początkowa wpisywana do Timer1 (65535 - 31250 = 34286)
 
 
Set Portc.3                                                 
Set Portc.1                                                 
 
Cls
 
Lcd "Licznik godzin"
Lowerline
Lcd "  Wersja 1.00"
Cursor Off
 
Wait 2
 
Writeeeprom Zmienna , 3
Zmienna = Timer1
 
Waitms 100
Start Timer1
 
Do
 
 
 
 
If S2 = 0 Then
Waitms 200
Writeeeprom Zmienna , 3
Zmienna = Timer1
End If
 
 
If S1 = 0 Then
Dioda = 0
Start Timer1
End If
 
If S1 = 1 Then
Dioda = 1
Stop Timer1
 
'If S2 = 0 Then
'Sekundy = 0
'Minuty = 0
'Godziny = 0
'Sekundy_s = 0
'Minuty_s = 0
'Godziny_s = 0
 
End If
'End If
 
 
Locate 1 , 1
Lcd "    LICZNIK CZASU  "
Locate 2 , 1
  Lcd "TIMER  " ; Godziny ; Godziny_s ; ":" ; Minuty ; Minuty_s ; ":" ; Sekundy ; Sekundy_s ;
 
Loop
End                                                         'koniec programu
 
 
 
Odmierz_1s:                                                 
 Counter1 = Counter1 + 34282                                
 Incr Sekundy_s                                             
 
 If Sekundy_s = 10 Then
      Sekundy_s = 0
  Incr Sekundy
 
                   If Sekundy = 6 And Sekundy_s = 0 Then
                    Sekundy = 0
                    Sekundy_s = 0
                   Incr Minuty_s
 
 
  If Minuty_s = 10 Then
       Minuty_s = 0
   Incr Minuty
 
                  If Minuty = 6 And Minuty_s = 0 Then
                  Minuty = 0
                  Minuty_s = 0
                  Incr Godziny_s
 
 
  If Godziny_s = 10 Then
   Godziny_s = 0
   Incr Godziny
 
 
 
 
 
 
 
      End If
     End If                                                
   End If                                                   
  End If
 End If
Return                                                     




Portret użytkownika matrix

Re: Zapis i odczyt do eeprom

Napisz sobie na końcu całego programu dwa podprogramy a całość mogła by wyglądać tak

'początek programu
'deklaracje zmiennych
'konfiguracje pinów
 
Gosub Odczyt_eprom   'to odczyta Ci wartości z eepromu
Do
...
 
If przycisk = 0 then gosub Zapis_eprom   'to spowoduje skok do podprogramu zapisu do pamięci eeprom
Loop
End
 
Odczt_eprom:
 
return
 
Zapis_eprom:
Bitwait przycisk, set
 
Return

Portret użytkownika EDC

Odp. Zapis i odczyt Eeprom

Nie wiem dlaczego, bo jako tako angielski znam, ale też wpisując Readeeprom instrukcja nie podświetlała mi się na niebiesko :D
Electronic Erasable Read Only Memory = E2PROM = podwójne E
W instrukcji "Readeeprom" litery E sa dwie. (Read eeprom), a w instrukcji zapisu "Writeeeprom" trzy (Write eeprom).
Nie wiem po co Ci zapisywać wartość Timer1 jeśli nie staje on przed zapisem, bo to co zapisujesz jest już nieaktualne, zwłaszcza że czekasz 200ms przed zapisem. Nie rozumiem tego.
Trzeba zrozumieć że znak "=" to nie "równa się" tylko przypisanie czemuś wartości która "stoi" za tym znakiem.
Więc jeśli Zmienna = Timer1 to Zmienna przyjmuje wartość Timera1. Żeby Timer1 przyjął wartość Zmiennej odczytanej z Eepromu trzeba zapisać w odwrotnej kolejności : Timer1 = Zmienna

W Twoim przypadku myślę jednak że chodziło o coś takiego(pominę parę rzeczy i sobie dopiszesz):

Dim Sekundy As Byte                                         
Dim Minuty As Byte                                          
Dim Godziny As Byte                                         
Dim Sekundy_s As Byte
Dim Minuty_s As Byte                                       
Dim Godziny_s As Byte  
 
Readeeprom Sekundy ,2                                         
Readeeprom Minuty ,3                                          
Readeeprom Godziny ,4                                         
Readeeprom Sekundy_s ,5
Readeeprom Minuty_s ,6                                       
Readeeprom Godziny_s ,7  
 
Cls
Lcd " Licznik czasu "
Lowerline
Lcd "TIMER: "
 
Do
 
Locate 2, 7 
Lcd Godziny ; Godziny_s ; ":" ; Minuty ; Minuty_s ; ":" ; Sekundy ; Sekundy_s ;
 
 
If S2 = 0 Then
writeeeprom Sekundy ,2                                         
writeeeprom Minuty ,3                                          
writeeeprom Godziny ,4                                         
writeeeprom Sekundy_s ,5
writeeeprom Minuty_s ,6                                       
writeeeprom Godziny_s ,7  
waitms 50
End If 
 
Loop
(dopisz odmierzanie czasu i reszte)

Może nie do końca rozumiem Twoich zamiarów, ale tak powinien wyglądać odczyt i zapis danych do eepromu.

No i kolejność działań. Przed zapisem do Eeprom przypisujesz zmiennej wartość z Timera i dopiero zapisujesz w Eepromie zmienną. W druga stronę, najpierw czytasz zmienną z Eepromu a potem przypisujesz wartość zmiennej Timerowi...jeśli już Ci na tym zależy.

PS. Przy programowaniu pamięć Eeprom zapisywana jest FF co przy pierwszym uruchomieniu program odczyta jako 255 dla każdej z zapisanych wartości. Żeby się przed tym zabezpieczyć po odczycie Eepromu dopisz warunek że jeśli wartość większa od 254 then wartość = 0. To ustawi zera na początek, a gdy już coś będzie w pamięci będzie pominięte.

A tak już zupełnie z innej beczki ;) zauważyłem na końcu, że do wielkości typu Bajt chciałeś zapisać wartość z Timera1 która to napewno jest większa od 255 ;) Gdybyś przypadkiem chciał zapisywać Word do Eepromu pamiętaj że zajmuje on dwie komórki pamięci ;)więc o tyle odsuń kolejne dane/zmienne

-

BARTek
Moja strona

Portret użytkownika demsy1

Eeprom

Zapis eepromu zrobiłem pod przycisk żeby poćwiczyć, bo w przyszłości będę chciał to zrobić po odłączeniu zasilania, ale jeszcze nie mam pomysłu.

Gosub Odczyt_eprom
If Sekundy = 255 And Minuty = 255 And Godziny = 255 And Sekundy_s = 255 And Minuty_s = 255 And Godziny_s = 255 Then
Gosub Zeruj
End If
 
do
If S3 = 0 Then Gosub Zapis_eprom
 
If S1 = 0 Then
   Dioda = 0
    Start Timer1
 End If
 
If S1 = 1 Then
  Dioda = 1
   Stop Timer1
 
   If S2 = 0 Then
   Wait 1
   If S2 = 0 Then
 
 
Sekundy = 0
Minuty = 0
Godziny = 0
Sekundy_s = 0
Minuty_s = 0
Godziny_s = 0
 
End If
 End If
End If

Zapis_eprom:
 
Writeeeprom Sekundy , 1
Writeeeprom Minuty , 2
Writeeeprom Godziny , 3
Writeeeprom Sekundy_s , 4
Writeeeprom Minuty_s , 5
Writeeeprom Godziny_s , 6
Return
 
Odczyt_eprom:
 
Readeeprom Sekundy , 1
Readeeprom Minuty , 2
Readeeprom Godziny , 3
Readeeprom Sekundy_s , 4
Readeeprom Minuty_s , 5
Readeeprom Godziny_s , 6
Return
 
Zeruj:
 
Sekundy = 0
Minuty = 0
Godziny = 0
Sekundy_s = 0
Minuty_s = 0
Godziny_s = 0
Return

Portret użytkownika EDC

Odp. Eeprom

Masz jeszcze takie klapki na oczach i nie widzisz pewnych możliwości, ale fajnie że coś piszesz bo to sie pewnie zmieni ;)
"Tylko ten co nic nie robi, niczego nie popsuje" Hahaha :D
Skoro masz Sub "Zeruj" to pod przycisk S2 po tym Wait go wpisz, żeby się nie powtarzać :F

-

BARTek
Moja strona

Portret użytkownika EDC

Zasilanie awaryjne i zapis do Eeprom

Siemanko. Dziś pada u mnie wiec miałem chwilę czasu.
Pozwoliłem sobie schemat jednego urządzenia stąd przerobić.
Podświetlanie wyświetlacza jest zasilane tylko z zasilacza. Gdy zabraknie zasilania to na PinD.0 będzie stan niski, ale procesor dalej będzie zasilany. Gdy wykryje stan niski to zatrzymuje Timer, bo przecież reszta urządzeń nie działa też bez pradu, i zapisuje zmienne jeden raz do eepromu.

Dim Sprawdz_bit as Bit
 
Do
If PinD.0 = 0 Then
 Dioda = 1
  Stop Timer1
 If Sprawdz_bit = 1 Then
    Gosub Zapis_eprom
    Sprawdz_bit = 0
 End If
Else
 Sprawdz_bit = 1      ' gdy działa zasilacz ustawia Bit=1
End If
 
Loop   

Nie każdy wie więc wytłumaczę rozwiązanie podłączenia masy Regulatora napięcia przez Diodę.
Na diodzie występuje spadek napięcia. Na jednych większe na innych mniejsze, ale na przykłądowych 1N4007 spadek jest około 0,6V. Podłączając je do 5V za dioda mielibyśmy więc 4,4V. Jeśli jednak masę Regulatora podłączymy też poprzez Diodę to podniesie on napięcie o 0,6V (na każdą diodę). To sprytny sposób jeśli potrzebujemy np.6V (masa regulatora przez dwie diody).
Diody są też przy baterii, też by obniżyć napięcie poniżej tego z zasilacza by nie czerpało z niej gdy zasilacz pracuje.

-

BARTek
Moja strona

Portret użytkownika demsy1

Dzięki kolego za wyjaśnienie

Dzięki kolego za wyjaśnienie trochę mnie to oświeciło. Ja coś takiego napisałem

If Zapis = 1 Then
Sprawdz_bit = 1
If Sprawdz_bit = 1 Then
    Gosub Zapis_eprom
    Sprawdz_bit = 0
 End If
Else
 Sprawdz_bit = 1
End If