Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Zapis zmiennej 4bajtowej do eeprom

JanWi
-
-
Posty:50
Rejestracja:7 maja 2003, o 15:44
Zapis zmiennej 4bajtowej do eeprom

Postautor: JanWi » 8 maja 2004, o 19:13

Witam wszystkich.
Czy ktorys z was przerabial moze zapis zmiennej 4bajtowej (SINGLE) do eeprom po I2C ? W jaki sposob ja rozebrac na pojedyncze bajty tak, aby potem mozna bylo je kolejno wpisac do pamieci. Z kolei jak pojedyncze bajty odczytane z pamieci poskladac tak, zeby uzyskac zmienna SINGLE.
Pozdrawiam i prosze o pomoc.

darek_l
-
-
Posty:6
Rejestracja:8 maja 2004, o 19:17
Lokalizacja:Toruń

Postautor: darek_l » 8 maja 2004, o 20:13

8) Robiłem to z 'int' w równoległym EE. Bez problemu można rozszerzyć zakres i zapisywać np. do 24C256(też mogę podesłać obsługę)

JanWi
-
-
Posty:50
Rejestracja:7 maja 2003, o 15:44

Postautor: JanWi » 8 maja 2004, o 20:22

W rownoleglym eeprom nie ma problemu. Obsluga pamieci jest niemal identyczna z zewnetrznym RAM. Mnie jednak interesuje eeprom I2C. Poprostu taki mam zaprojektowany, a jego cena jest o wiele nizsza od rownoleglego. Pozdrawiam.

darek_l
-
-
Posty:6
Rejestracja:8 maja 2004, o 19:17
Lokalizacja:Toruń

Postautor: darek_l » 8 maja 2004, o 21:10

8) Zapis 'int' w równoległym EE: zapis starszego bajtu, odczekaj xx ms, sprawdzenie poprawności zapisu, zapis młodszego bajtu, odczekaj xx ms, kontrola poprawności zapisu. Algorytm obsługi szeregowego EE taki sam.
(oczywiście sama fizyczna transmisja jest inna).
Natomiast zapis do SRAM jest inny: int_jj = 0xAA55;
// EE:zapis 'long' podobnie jak 'int'
pozdrawiam

JanWi
-
-
Posty:50
Rejestracja:7 maja 2003, o 15:44

Postautor: JanWi » 9 maja 2004, o 10:40

Oczywiscie masz racje, lecz problem dotyczy nie sposobu transmisji, lecz rozbiorki zmiennej SINGLE na pojedynczy bajty i z powrotem z pojedynczych bajtów na zmienną SINGLE. Dodam, że polecenia HIGH/HIGHW oraz LOW/LOWW w Bascomie nie dzialają na zmiennych SINGLE.

darek_l
-
-
Posty:6
Rejestracja:8 maja 2004, o 19:17
Lokalizacja:Toruń

Postautor: darek_l » 9 maja 2004, o 12:33

8)
// ====================================
unsigned char ipoke_ee( unsigned int adres, unsigned int idana )
{
volatile unsigned int itemp;
volatile unsigned char x, i, j ;

itemp = idana ;
itemp = itemp & 0x00FF; // zeruj starszy bajt
i = ( unsigned char ) itemp ; // i jest młodszy

itemp = idana;
itemp >>= 8;
itemp = itemp & 0x00FF; // zeruj starszy bajt
j = (unsigned char) itemp ; // j jest starszy


*( (unsigned char xdata*) adres ) = j ; // 'C': starszy bajt zapisujemy pod niższym adresem
pause(1000);
x=peek(adres);
if(x != j)
{
printf("--error ipoke_ee_01\n");
return(1);
}

adres++;

*( (unsigned char xdata*) adres ) = i ; // 'C': młodszy bajt zapisujemy pod wyższym adresem
pause(1000);
x=peek(adres);
if(x != i)
{
printf("--error ipoke_ee_02\n");
return(1);
}

return(0);

}

//===============... lub inaczej...==== !!! koniecznie sprawdzić poprawność funkcjonowania. Kompilatory mogą różnie umieszczać pola bitowe ===========================

struct {
unsigned lo: 8;
unsigned hi: 8;
} btx;

unsigned int *px;

px = &btx;
*px = 0x55AA;

btx.lo = 0xAA;
btx.hi=0x55;

////////////////////////////////////////////////////////////////

odczyt i składanie:

intxx = (unsigned int)peek(adres);
intxx <<= 8; // mamy starszy bajt na swoim miejscu
intyy = (unsigned int)peek(adres+1);
return(intxx+intyy);

//=================================================================

JanWi
-
-
Posty:50
Rejestracja:7 maja 2003, o 15:44

Postautor: JanWi » 9 maja 2004, o 19:28

Darek...
Pod C twoja procedurka moze dziala. Jednak pod Bqascom nic z tego. Pozostaje mi chyba tylko ingerencja w biblioteke Bascoma-a, jednak tam za bardzo nic nie widac, w jaki sposob dokladnie jest reprezentowana zmienna type SINGLE. W helpie wspominają tylko o reprezentacji 4rbajtowej, jednak jakakolwiek ingerencja w sam zapis tej zmiennej powoduje spore rozczarowanie. Nadzmienie tylko, ze do wyznaczenia tej zmiennej wykorzystuje zmienne typu string, na podstawie ktorych wyznaczam zmienna SINGLE, potrzebna w daldszych obliczeniach. Jednak w ten sposob do reprezentowania zmiennej zmiennoprzecinkowej zmuszony jestem skorzystac z pieciu bajtow (np. z zakresu XXX.X). Pozostaje mi tylko zapis zmiennej SINGLE w pamieci przez reprezentacje wlasnie tej zmiennej za pomoca znakow ASCII. Mam opracowana procedure zapisu w ten sposob, jednak jest ona pamieciozerna przy odczycie zmiennej i wyznaczeniu jej do postaci SINGLE. Zapytanie na forum zadalem myslac, ze ktos juz przerobil ten temat w Bascomie i ma opracoweana gotowa procedurke. Pozdrawiam i sorry za literowki.

JanWi
-
-
Posty:50
Rejestracja:7 maja 2003, o 15:44

Postautor: JanWi » 14 maja 2004, o 20:15

Poniewaz brak reakcji z waszej strony, postanowilem szukac gdzies indziej. Ktos zaproponowal, by odczytac zmienna SINGLE bezposrednio z RAM-u, bajt po bajcie i mamy problem z glowy.
Po kilku probach, okazalo sie, ze jest to wybitny pomysl. Po wstepnej kompilacji programu, wystarczy w raporcie odczytac adresy, pod ktorymi kompilator umiescil poszczegolne zmienne. Przy zapisie do eeprom, wystarczy odczytac poszczegolne bajty spod konkretnego adresu RAM.
Przy odczycie eeprom-u wystarczy poszczegolne bajty zapisac do RAM-u pod adresami, z ktorych zostaly wyjete. To wszystko.
Gotowa procedura zajela zaledwie kilkadziesiat bajtow, gdzie jakakolwiek proba modyfikacji zmiennej SINGLE zajmowala juz kilkaset.
Pozdrawiam.

rdt
-
-
Posty:87
Rejestracja:20 sie 2003, o 18:03
Lokalizacja:100km od Wawy

Postautor: rdt » 6 kwie 2005, o 16:54

swietny pomysl musze wyprobowac :D
moglbys wrzucic kawałek kodu bede wdzieczny
jak sie odczytuje wartosc bajtu spod konkretnego miejsca w pamieci ???

szymel
-
-
Posty:212
Rejestracja:16 sty 2005, o 16:42
Lokalizacja:Włocławek

Postautor: szymel » 6 kwie 2005, o 22:15

...
Po kilku probach, okazalo sie, ze jest to wybitny pomysl. Po wstepnej kompilacji programu, wystarczy w raporcie odczytac adresy, pod ktorymi kompilator umiescil poszczegolne zmienne. Przy zapisie do eeprom, wystarczy odczytac poszczegolne bajty spod konkretnego adresu RAM.
...
Pomysł to jest napewno , tyle że do d... :(
Słyszałeś kiedyś o takich instrukcjach jak: VARPTR,PEEK,POKE :?:
Pewnie nie :( . Bo gdybyś słyszał , to nie musiał byś zaglądać do Raportu.

Mały przykładzik:

Kod: Zaznacz cały

Dim Sg1 As Single , Sg2 As Single 'zmienna typu SINGLE Dim Tablica(10) As Byte 'zmienna typu BYTE (może być również WORD) Dim Btmp As Byte , Adres As Byte , I As Byte , Lenght As Byte , Ptr As Byte Declare Sub Eeprom_to_byte(adres As Byte , Lenght As Byte) Declare Sub Byte_to_eeprom(adres As Byte , Lenght As Byte) Sg1 = -1.576 : Sg2 = 0 Tablica(1) = 170 Do Ptr = Varptr(sg1) Call Byte_to_eeprom(ptr , 4) 'single do eeprom Ptr = Varptr(sg2) Call Eeprom_to_Byte(ptr , 4) 'z eeprom do 2-giej single 'okrężną drogą - poprzez eeprom - skopiowaliśmy wartość z Sg1 do Sg2 Ptr = Varptr(tablica(1)) Call Byte_to_eeprom(ptr , 10) 'cala tablica do eeprom 'itd,itp ;) Loop Sub Byte_to_eeprom(adres As Byte , Lenght As Byte) For I = 1 To Lenght Btmp = Peek(adres) Incr Adres Rem write_eeprom_i2c(btmp) 'procedura zapisująca bajt do eeprom-u Next I End Sub Sub Eeprom_to_Byte(adres, Lenght As Byte) For I = 0 To 3 Rem Read_eeprom_i2c() 'wczytanie bajtu z pamięci eeprom do zmiennej (np.btemp) Poke Adres , Btmp Incr Adres Next I End Sub
I nie muszę się martwić , pod jakim adresem znajduje się którakolwiek z uzytych zmiennych czy tablic.Bascom sam mi to powie jak go grzecznie poproszę :wink:

Piotrek

rdt
-
-
Posty:87
Rejestracja:20 sie 2003, o 18:03
Lokalizacja:100km od Wawy

Postautor: rdt » 9 kwie 2005, o 11:42

Piotrek a czy adresy sa przydzielane jakos w dynamiczny sposob ???
bo jesli nie to Twoj zapis jest jak najbardziej sluszny ale czy nie wydluza kodu ???
potrzebujesz przeciez jeszcze dodatkowej zmiennej do ktorej przypisujesz ten adres czy tak??
od razu mowie ze ja tylko pytam a nie przychylam sie do jednej lub drugiej wypowiedzi

JanWi
-
-
Posty:50
Rejestracja:7 maja 2003, o 15:44

Postautor: JanWi » 9 kwie 2005, o 16:20

Kol SZYMEL

Wydaje mi się, że to twój pomysł jest do du.. .
Zrozumiałbyś ideę pomysłu, a nie się wymądrzał, jeśli miałbyś
do dyspozycji 1 kb pamięci ROM i 256 bajtów eeprom.
Życzę powodzenia przy wyznaczaniu adresów.
Ciekawe tylko, czy prościej jest wymienić procek (na większy), czy zajrzeć do raportu.

Pozdrawiam.

szymel
-
-
Posty:212
Rejestracja:16 sty 2005, o 16:42
Lokalizacja:Włocławek

Postautor: szymel » 10 kwie 2005, o 17:22

Kol SZYMEL

Wydaje mi się, że to twój pomysł jest do du.. .
Zrozumiałbyś ideę pomysłu, a nie się wymądrzał, jeśli miałbyś
do dyspozycji 1 kb pamięci ROM i 256 bajtów eeprom.
Życzę powodzenia przy wyznaczaniu adresów.
Ciekawe tylko, czy prościej jest wymienić procek (na większy), czy zajrzeć do raportu.

Pozdrawiam.
Jeśli poczułeś się obrażony - PRZEPRASZAM.
Jakoś nie doczytałem się w tym wątku , że mówimy o 1kb ROM i 256 bajtów eeprom bo faktycznie VARPTR jest bardziej pamięciożerna niż np. Address=XX.Jest tylko mały problem , bo jak zapisać w eeprom I2C wartość zmiennej lokalnej :?: .W raporcie informacji o jej adresie nie uświadczysz :( .

Pozdrawiam serdecznie.
Piotrek

rdt
-
-
Posty:87
Rejestracja:20 sie 2003, o 18:03
Lokalizacja:100km od Wawy

Postautor: rdt » 12 kwie 2005, o 21:01

hmm zmienna lokalna ma ustalona wartosc tylko w obrebie jednej etykiety czy tak ?
i jesli chcemy przekazac zmienna lokalna to powinnismy uzywac skoku call a nie goto lub gosub - czy tak ??
sorki moze cos pokrecilem (ale tak wlasnie mi sie wydaje ) ze nie ma problemu chyba z tym poniewaz wystarczy w obrebie tej samej etykiety wyslac dane


mialem kiedys malutki problemik (co prawda dpiero zaczynam z bascomem ale mi sie to podoba) i rozwiazalem go wlasnie w ten sposob ze wysylalem do eeproma zmienna tuz po tym jak ustalała sie wartosc zmiennej ktora mnie interesowała

Wróć do „Projektowanie PCB, programy EDA, CAD, narzędziowe”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 30 gości