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

slawcio
-
-
Posty:48
Rejestracja:28 lip 2004, o 13:10
Lokalizacja:Sławatycze
Kontaktowanie:
Jak zapisać liczbę zmienno przecinkową do 24cxx

Postautor: slawcio » 19 paź 2004, o 11:24

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

Guru
-
-
Posty:250
Rejestracja:30 cze 2003, o 13:26
Lokalizacja:Kraków

Postautor: Guru » 19 paź 2004, o 13:40

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. :506:

Awatar użytkownika
Maybe
-
-
Posty:63
Rejestracja:19 wrz 2004, o 19:58
Lokalizacja:Dziebieszyce
Kontaktowanie:

Postautor: Maybe » 21 paź 2004, o 23:40

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ć?
Na pierwszy "rzut" nasuwają mi się co najmniej 3 rozwiązania :wink: .
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....

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

Postautor: JanWi » 22 paź 2004, o 14:51

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

Luki
-
-
Posty:15
Rejestracja:22 lip 2004, o 18:39

Postautor: Luki » 23 paź 2004, o 20:47

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.

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 12 gości