Witam
Mam takie pytanie moze ktoś z was wie jak można zapisać liczbę zmienno przecinkową do pamięci EEprom 24cxx. Bardziej mi chodzi o to jak ją podzielić na bajty, bo bajty umię już zapisywać. A następnie jak je ze sobą połączyć?
Sorki za błędy
Pozdrawiam
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ęJak zapisać liczbę zmienno przecinkową do 24cxx
Moderatorzy:Jacek Bogusz, robertw, k.pawliczak, Moderatorzy
Może z zastosowaniem standartu IEEE754
|znak | Exponenta | Mantysta | (Przesunięcie exponenty)
pojedyncza precyzja |1 [31] | 8 [30-23] | 23 [22-00] | (127)
podwójna precyzja |1 [63] | 11 [62-52] | 52 [51-00] | (1023)
W nawiasach [] podałem liczbę kolejnych bitów. Czyli liczba pojedynczej precyzji mieści się w 4 bajtach, a podwójnej w 8 bajtach
[ Dodano: 19-10-2004, 14:47 ]
Przepraszam wymądrzam się, ja nie znam Bascoma, nie znam gotowego rozwiązania tego problemu w Bascomie.
|znak | Exponenta | Mantysta | (Przesunięcie exponenty)
pojedyncza precyzja |1 [31] | 8 [30-23] | 23 [22-00] | (127)
podwójna precyzja |1 [63] | 11 [62-52] | 52 [51-00] | (1023)
W nawiasach [] podałem liczbę kolejnych bitów. Czyli liczba pojedynczej precyzji mieści się w 4 bajtach, a podwójnej w 8 bajtach
[ Dodano: 19-10-2004, 14:47 ]
Przepraszam wymądrzam się, ja nie znam Bascoma, nie znam gotowego rozwiązania tego problemu w Bascomie.
Na pierwszy "rzut" nasuwają mi się co najmniej 3 rozwiązania .Mam takie pytanie moze ktoś z was wie jak można zapisać liczbę zmienno przecinkową do pamięci EEprom 24cxx. Bardziej mi chodzi o to jak ją podzielić na bajty, bo bajty umiem już zapisywać. A następnie jak je ze sobą połączyć?
1)Liczbę zmiennoprzecinkową pomnożyć np. przez 100, zamienić na liczbę całkowitą i bajt po bajcie wysłać do eeprom. Przy odtwarzaniu oczywiście trzeba ją odczytać a następnie podzielić przez 100. Np. tak (Bascom AVR):
zapis
dim x as single
dim y as long
dim z as byte
y = 100 * x
(czy long w Bascom ma 4 bajty? załóżmy,że tak)
for i=0 to 3
z=y and $HFF
Wyslij_do_EEPROM(z)
shift y, rigth, 8
next i
odczyt
dim x as single
dim y as long
dim z as byte
y=0
for i=0 to 3
shift y, left, 8
z=Czytaj_z_EEPROM
y=y+z
next i
x=y/100
2)Napisać wstawkę w asm i wysłać 4 bajty. Nie piszesz jakiego Bascom'a dotyczy problem, więc teraz dla odmiany '51:
wysłanie
dim x as single
$asm
mov R0,#{x}
mov A,@R0
call zapisz_ACC_do_EEPROM
inc R0
mov A,@R0
call zapisz_ACC_do_EEPROM
inc R0
mov A,@R0
call zapisz_ACC_do_EEPROM
inc R0
mov A,@R0
call zapisz_ACC_do_EEPROM
$end asm
Przy odczycie odwrotnie, tzn. czytaj_EEPROM (do akumulatora) i mov @R0,A
3)Zamiana zmiennej na string (Str) i zapis string'a do EEPROM przez podział na znaki (np. do wycinania znaków służy mid). Przy odczytcie kompletacja łańcucha i zmiana go na liczbę (Val).
Najbardziej efektywny sposób: nauczyć się wreszcie qrcze programowania w C, zostawić tego .... Bascoma, i zrobić sobie np. konwersję przez unię!
Maybe
PS
Mam nadzieję, że nie nawrzucałem byków. Pora już późna nieco i skojarzenia mam nie takie....
Witam. Proponuje zajrzec w raport kompilacji. Nastepnie odnalezc interesujaca nas zmienna i odczytac adres pod ktorym kompilator ja umiescil. Nastepnie wystarczy prosta procedurka, ktora spod tego adresu (chodzi o RAM) wyciagnie cztery kolejne bajty i zapisze je do eeprom. Tyle na temat zapisu. Aby zmienna odczytac z eeprom, wystarczy kolejne bajty wyjmowac z eeprom i zapisac je do RAM pod znany juz wczesniej adres. Jest to sposob pewny i u mnie dziala na 100%. Pozdrawiam.
[ Dodano: 22-10-2004, 16:23 ]
Oto przykład.
Dim Zmienna_single As Single 'wiemy ze ma 4bajty
Dim Adres_ram As Byte ' chodzi o ram wewnetrzny max 256bajtow
Dim Adres_bazowy_eeprom As Byte ' chodzi o eeprom max 256bajtow
Dim Adres_eeprom As Byte
Dim Dane_eeprom As Byte
Dim Licznik As Byte 'licznik bajtow
Declare Sub Zapisz_w_eeprom 'procedura zapisu z ram do eeprom
Declare Sub Odczytaj_z_eeprom 'procedura odczytu z eeprom do ram
Zmienna_single = 100.50 'teraz zmienna_single ma 100.5
Adres_ram = &H33 'wiemy ze jest po adr &H33 w ram
Adres_eeprom = &H00 'chcemy zapisac do eeprom pod adr &H00
Call Zapisz_w_eeprom 'wiec zapisujemy
..........
Zmienna_single = 0 ' zerujemy zmienna
..........
Call Odczytaj_z_eeprom 'odczytujemy zmienna z eeprom
Print Zmienna_single 'sprawdzamy czy dziala
Do
Loop
End
Sub Zapisz_w_eeprom
For Licznik = 1 To 4
Dane_eeprom = Peek(adres_ram)
I2cstart
I2cwbyte Adres_bazowy_eeprom
I2cwbyte Adres_eeprom
I2cwbyte Dane_eeprom
I2cstop
Waitms 10
Incr Adres_eeprom
Incr Adres_ram
Next
End Sub
Sub Odczytaj_z_eeprom
For Licznik = 1 To 4
I2cstart
I2cwbyte Adres_bazowy_eeprom
I2cwbyte Adres_eeprom
I2cstart
I2cwbyte Adres_bazowy_eeprom
I2crbyte Dane_eeprom , Nack
I2cstop
Poke Adres_ram , Dane_eeprom
Incr Adres_eeprom
Incr Adres_ram
Next
End Sub
Wynik kompilacji (raport).
--------------------------------------------------------------------------------
Variable Type Address(hex) Address(dec)
--------------------------------------------------------------------------------
ERR Bit 20.4
ADRES_BAZOWY_EEPROM Byte 0038 56
ADRES_EEPROM Byte 0039 57
ADRES_RAM Byte 0037 55
DANE_EEPROM Byte 003A 58
LICZNIK Byte 003B 59
ZMIENNA_SINGLE Single 0033 51 !!!! ten adres nas interesuje
[ Dodano: 22-10-2004, 16:23 ]
Oto przykład.
Dim Zmienna_single As Single 'wiemy ze ma 4bajty
Dim Adres_ram As Byte ' chodzi o ram wewnetrzny max 256bajtow
Dim Adres_bazowy_eeprom As Byte ' chodzi o eeprom max 256bajtow
Dim Adres_eeprom As Byte
Dim Dane_eeprom As Byte
Dim Licznik As Byte 'licznik bajtow
Declare Sub Zapisz_w_eeprom 'procedura zapisu z ram do eeprom
Declare Sub Odczytaj_z_eeprom 'procedura odczytu z eeprom do ram
Zmienna_single = 100.50 'teraz zmienna_single ma 100.5
Adres_ram = &H33 'wiemy ze jest po adr &H33 w ram
Adres_eeprom = &H00 'chcemy zapisac do eeprom pod adr &H00
Call Zapisz_w_eeprom 'wiec zapisujemy
..........
Zmienna_single = 0 ' zerujemy zmienna
..........
Call Odczytaj_z_eeprom 'odczytujemy zmienna z eeprom
Print Zmienna_single 'sprawdzamy czy dziala
Do
Loop
End
Sub Zapisz_w_eeprom
For Licznik = 1 To 4
Dane_eeprom = Peek(adres_ram)
I2cstart
I2cwbyte Adres_bazowy_eeprom
I2cwbyte Adres_eeprom
I2cwbyte Dane_eeprom
I2cstop
Waitms 10
Incr Adres_eeprom
Incr Adres_ram
Next
End Sub
Sub Odczytaj_z_eeprom
For Licznik = 1 To 4
I2cstart
I2cwbyte Adres_bazowy_eeprom
I2cwbyte Adres_eeprom
I2cstart
I2cwbyte Adres_bazowy_eeprom
I2crbyte Dane_eeprom , Nack
I2cstop
Poke Adres_ram , Dane_eeprom
Incr Adres_eeprom
Incr Adres_ram
Next
End Sub
Wynik kompilacji (raport).
--------------------------------------------------------------------------------
Variable Type Address(hex) Address(dec)
--------------------------------------------------------------------------------
ERR Bit 20.4
ADRES_BAZOWY_EEPROM Byte 0038 56
ADRES_EEPROM Byte 0039 57
ADRES_RAM Byte 0037 55
DANE_EEPROM Byte 003A 58
LICZNIK Byte 003B 59
ZMIENNA_SINGLE Single 0033 51 !!!! ten adres nas interesuje
Parametr opcjonalny AT pozwala na umieszczenie zmiennej w ściśle określonej komórce pamięci. Gdyby pod podanym adresem znajdowała się już jakaś zmienna, zmiennej definiowanej zostanie przydzielony pierwszy wolny adres.
Parametr OVERLAY powoduje, że zmienna umieszczona pod wskazanym adresem wykorzystuje bajty zajmowane przez inną zmienną, która także została umieszczona arbitralnie pod podanym adresem. Dla takiej zmiennej tworzony jest wskaźnik. Wyjaśnia to przykład:
Dim x As Long At $60 'używa adresów 60,61,62 i 63 w SRAM
Dim b1 As Byte At $60 OVERLAY
Dim b2 As Byte At $61 OVERLAY
Zmienne B1 oraz B2 nie są tutaj prawdziwymi zmiennymi! Ich nazwy tylko wskazują określony bajt w pamięci. W tym wypadku &H60 i &H61. Zapisując coś pod adres wskazywany przez B1, tak naprawdę dane trafiają do przestrzeni zajmowanej przez zmienną X. Można oczywiście także odczytać zawartość bajtu wskazywanego przez B1:
Print B1
Wydrukowana wartość znajduje się pod adresem &H60. Używając wskaźników można manipulować danymi umieszczonymi w prawdziwych zmiennych.
Jeszcze inny przykład:
Dim L As Long At &H60
Dim W As Word At &H62 OVERLAY
W wskazuje tutaj na dwa bajty starszego słowa zmiennej typu Long.
Parametr OVERLAY powoduje, że zmienna umieszczona pod wskazanym adresem wykorzystuje bajty zajmowane przez inną zmienną, która także została umieszczona arbitralnie pod podanym adresem. Dla takiej zmiennej tworzony jest wskaźnik. Wyjaśnia to przykład:
Dim x As Long At $60 'używa adresów 60,61,62 i 63 w SRAM
Dim b1 As Byte At $60 OVERLAY
Dim b2 As Byte At $61 OVERLAY
Zmienne B1 oraz B2 nie są tutaj prawdziwymi zmiennymi! Ich nazwy tylko wskazują określony bajt w pamięci. W tym wypadku &H60 i &H61. Zapisując coś pod adres wskazywany przez B1, tak naprawdę dane trafiają do przestrzeni zajmowanej przez zmienną X. Można oczywiście także odczytać zawartość bajtu wskazywanego przez B1:
Print B1
Wydrukowana wartość znajduje się pod adresem &H60. Używając wskaźników można manipulować danymi umieszczonymi w prawdziwych zmiennych.
Jeszcze inny przykład:
Dim L As Long At &H60
Dim W As Word At &H62 OVERLAY
W wskazuje tutaj na dwa bajty starszego słowa zmiennej typu Long.
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 24 gości