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
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
Moja strona w powijakach
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 :DElectronic 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):
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
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.
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
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.
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
Dzięki kolego za wyjaśnienie
Dzięki kolego za wyjaśnienie trochę mnie to oświeciło. Ja coś takiego napisałem