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
Moderatorzy:Jacek Bogusz, robertw, k.pawliczak, Moderatorzy
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.
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.
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
(oczywiście sama fizyczna transmisja jest inna).
Natomiast zapis do SRAM jest inny: int_jj = 0xAA55;
// EE:zapis 'long' podobnie jak 'int'
pozdrawiam
// ====================================
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);
//=================================================================
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.
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.
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.
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.
Pomysł to jest napewno , tyle że do d......
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.
...
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
Piotrek
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
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
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.
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.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.
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
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
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
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 0 gości