HomeMade

Pełna wersja: FF bascom zagwozdka...
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
W pamięci eeprom mam zmienną typu string 15 znaków. Zanim zapiszę tam jakąkolwiek zmienną zawartość tych szesnastu bajtów to same FF.
chciałbym zrobić prostego "ifa"przy inicjalizacji procesora by sprawdzić czy jest tam już coś zapisane czy wartość jest pusta. Jednakże FF nie występuje w tej tablicy ASCII.

Wiem wiem lamerskie pytanie, ale mam dzisiaj zaćmienie umysłu.
Są tablice gdzie taki kod występuje ;-), na przykład tutaj
Nie musisz znać odpowiednika kodu FF w konkretnej tablicy aby sprawdzić czy komórka pamięci jest pusta. Po prostu odczytaj zawartość właściwej komórki pamięci i porównaj ją z wartością hexadecymalną FF lub dziesiętną 255.
Jak widać w powyższym linku, do wartości ascii FF można przypisać dowolny symbol, tu akurat jest to to litera "ÿ" w tablicy kodów ISO-8859-1. Kod ascii FF zatem istnieje i zapewne ma wiele przypisań w różnych kodach pochodnych. Dla przykładu w ISO-8859-2 kodowi FF odpowiada znak "˙"
L.J.
W bascomie jeśli definiuje zmienna to chyba nie mogę określić który konkretnie obszar pamięci zajmuje wieć odpytywanie konkretnej komórki może być kłopotliwe. Mogę sie mylić nie zgłębiałem tematu.
Cytat:Dla przykładu w ISO-8859-2 kodowi FF odpowiada znak "˙"
To chyba dobry trop Wink

Dziękuję Leszku.
Możesz Rysiu określi położenie zmiennej w pamięci.

Oczywiście trzeba być ostrożnym, i sprawdzić (bo nie wiem) czy kompilator mimo to nie przypisze sobie inne zmiennej w ten adres..
O ile dobrze Cię rozumiem chodzi Ci o pamięć eram czyli pamięć nieulotną gdzie można przechowywać dane od włączenia do włączenia zasilania.
Obsługa zmiennych w takiej pamięci z punktu widzenia bascom-a polega na:
1. Deklaracji zmiennej jako eram np: Dim Xe as ERAM Byte
2. Odczycie zmiennej z pamięci ERAM np. X=Xe
3. Zapisie zmiennej do pamięci ERAM np. Xe=X
Na zmiennej typy eram można wykonywać obliczenia choć zwykle zaleca się stosować procedurę przeniesienia wartości zmiennej eram na zwykłą zmienną. Oczywiście zmienna X musi być zadeklarowana w programie jako zwykła zmienna typu Byte (w tym przykładzie np poleceniem dim X as Byte) i można na niej dokonywać "zwykłych" manipulacji np. porównać z wartością heksadecymalną FF lub dziesiętną 255.
Ponieważ ilość zapisów do takiej pamięci wynosi ok. 10^5 razy to nie należy używać pamięci ERAM (zmiennych w tej pamięci) w pętli etc.
Jeśli mówię rzeczy oczywiste to proszę o korektę lub dokładniejsze wyjaśnienie o jaki rodzaj pamięci chodzi? :-(
L.J.
Tak dokładnie o taka zmienną chodzi Leszku. Podczas uruchamiania procesora muszę sprawdzić czy jest to pierwsze uruchomienie czy któreś kolejne i mam już tam zapisane dane.
Oczywiście można stosować jakieś zabiegi w postaci zmiennej pomocniczej, ale to raczej mało eleganckie. Poza tym na zmienne pomocnicze binarne i tak muszę zarezerwować cały jeden bajt w pamięci. No i dopisać jakiś kawałek kodu do obsługi takich przełączników.
Ok w zasadzie nie chodziło mi o podanie rozwiązania na tacy a tylko o rozmowę gdzie klarują się pomysły. Pobawię się dzisiaj i zobaczymy co z tego wyjdzie.
Paweł jeśli się nie mylę to bascom jest dość niefrasobliwy w pisaniu po pamięci.
W dobrze skonstruowanych systemach - to co w pamięci nieulotnej - jest dodatkowo zabezpieczone sumą kontrolną umieszczoną w tejże pamięci np gdzieś pod jej koniec. Bardzo łatwo wtedy wychwycić fakt 1 włączenia i kontrolować później poprawność zapisanych danych.
A dane w eeprom lubią się "pozajączkować" Smile
O ile znam bascom, to zmienne eram są jedynym rozwiązaniem Twoich potrzeb.
Kwestią elegancji jest oczywiście czy użyjesz wprost zmiennej eram do odczytu np.:
if Xe=255 then .....,
co wydaje się oczywiste, czy też będziesz używał również bezpośrednio zmiennej eram do zapisu np.:
if .... then Xe=255
nad czym bym się jednak zastanowił. Ja w tym celu używam zawsze "normalnych" zmiennych, którymi później manipuluję w programie a odczyt i zapis do eram wykonuję jako wyraźnie oddzielne polecenia i to z reguły na początku programu w celu wczytania zapamiętanych danych i na wyraźne polecenie np. w trakcie zapamiętywania ostatnio ustalonej wartości jakiegoś parametru dla zapisu do eram.
L.J.
Ewentualnie możesz użyć zapisu szesnastkowego (HEX) czyli zamiast 255 użyć &HFF.
Witam
Przy zapisie możesz podać dokładny adres gdzie chcesz zapisać dane w eeprom
np: Dim zmienna as Eram Byte At &H10
Zawsze możesz odczytać komórkę EEprom i porównać czy jest na przykład różna niż FF.


$sim
$prog &HFF , &H3F , &HD9 , &H00 ' generated. Take care that the chip supports all fuse bytes.
$regfile = "m8def.DAT" 'uc type
$crystal = 11059200 'crysal frequency
$baud = 9600
'Config Portb = Output
'*************************************************​******************************
'****************************Variables************​*****************************

Dim X As Byte
Dim Y As Eram Byte At &H10
Y = 100
X = 50
'y nie istniej w SRAM wiec nie możemy się do niej bez pośrednio odwoływać

Print X 'powinno byc 50

Readeeprom X , &H10
Print X ' powinno byc 100

If X <> 255 Then ' jeśli różne od 255
Print "rozne X= " ; X
End If
Wait 1
Y = 255
Readeeprom X , &H10
If X = 255 Then 'jelsi równe czyli zwykle FF
Print "pusta komorka X=" ; X
End If


End

Pozdrawiam
Paweł
Przekierowanie