TomaszB
Guest
Mon Mar 06, 2006 1:18 pm
Witam
Jakis czas temu zaczalem zabawe z AVR.
Napisalem prosty programik w asemblerze i pojawil sie dziwny problem,
ktorego nie potrafie sobie wytlumaczyc.
Jest tak:
ADC dziala sobie, wynik przesuwany do lewej, czyli w w mlodszej czesci
rejestru wynikowego dostaje wynik pomiaru. Napiecie referencyjne to 5V.
Wszystko dziala Ok, na wyswietlacz segmentowy wypisuje wynik, dla 5V mam
255.
Teraz chcialem zamienic to na napiecie w V.
5V/255 daje ~0.019 V/jednostke.
Mnozac wynik pomiaru przez 0.019 powinienem miec wynik w V
jest tak:
w r16 mam wynik pomiaru
dalej mam tak:
ldi r17,q7(0.019)
fmul r16,r17
w r0 bede mial czesc po przecinku
w r1 czesc calkowita
Problem w tym, ze dla 5V napiecia mierzonego po mnozeniu dostaje w
wynikach r1 = 3 r0 = 32 (czy cos kolo tego)
Dlaczego?
Mozna to obejsc, wpisujac mnoznik 0.029 (podaje z pamieci) i wtedy dla
5V dostane 5V na wyswietlaczu.
Dzieki za jakies sugestie
Pozdrawiam
TomaszB
Mister
Guest
Mon Mar 06, 2006 1:26 pm
Quote:
w r16 mam wynik pomiaru
dalej mam tak:
ldi r17,q7(0.019)
fmul r16,r17
:-)
Od kiedy AVR operują na floatach??
Mister
Krzysztof Piecuch
Guest
Mon Mar 06, 2006 1:46 pm
TomaszB napisał(a):
Quote:
w r16 mam wynik pomiaru
dalej mam tak:
ldi r17,q7(0.019)
fmul r16,r17
Tak z ciekawości zapytam

jak Ci się udaje wpisać 0.019 do 1-go bajtu
pomijając kwestię, że jest to liczba zmiennoprzecinkowa ?

)))
Pozdrawiam
TomaszB
Guest
Mon Mar 06, 2006 1:59 pm
Krzysztof Piecuch napisał(a):
Quote:
Tak z ciekawości zapytam

jak Ci się udaje wpisać 0.019 do 1-go bajtu
pomijając kwestię, że jest to liczba zmiennoprzecinkowa ?

)))
Z tego co wyczytalem z ksiazki, to funkcja q7() mowi dla kompilatora, ze
jest to liczba zmiennoprzecinowa i odpowienio ja zamienia i miesci na
jednym bajcie.
Skoro w asm dla AVR sa przewidziane funkcje do operacji na liczbach
zmiennoprzecinkowych (np fmul - mnozenie bez znaku liczb
zmiennprzecinkowych) to chyba jest to mozliwe jak tez mozliwe jest
wpisanie do jednego bajtu liczby zmiennoprzecinkowej z pewnego zakresu.
Pozdrawiam
TomaszB
T.M.F.
Guest
Mon Mar 06, 2006 2:27 pm
Quote:
Skoro w asm dla AVR sa przewidziane funkcje do operacji na liczbach
zmiennoprzecinkowych (np fmul - mnozenie bez znaku liczb
zmiennprzecinkowych) to chyba jest to mozliwe jak tez mozliwe jest
wpisanie do jednego bajtu liczby zmiennoprzecinkowej z pewnego zakresu.
Skad ty wziales ta informacje? FMUL to mnozenie dwoch 8 bitowych liczb
bez znaku. AVR NIE POSIADA operacji na liczbach zmiennoprzecinkowych.
Prostym trickiem jest wykorzystanie liczb stalopozycyjnych. Mozesz je
normalnie mnozyc za pomoca MUL, pamietajac o odpowiednim przesunieciu
pozycji dziesietnej.
--
Inteligentny dom -
http://idom.wizzard.one.pl
Teraz takze forum dyskusyjne
Zobacz, wyslij uwagi, dolacz sie do projektu.
TomaszB
Guest
Mon Mar 06, 2006 2:45 pm
T.M.F. napisał(a):
Quote:
Skad ty wziales ta informacje? FMUL to mnozenie dwoch 8 bitowych liczb
bez znaku. AVR NIE POSIADA operacji na liczbach zmiennoprzecinkowych.
Prostym trickiem jest wykorzystanie liczb stalopozycyjnych. Mozesz je
normalnie mnozyc za pomoca MUL, pamietajac o odpowiednim przesunieciu
pozycji dziesietnej.
informacja pobrana ze strony
http://www.elektronika.priv.pl/ w dziale
mikrokontrolery -> jezyk asembler AVR -> Lista rozkazów mikrokontrolerów AVR
w tabelce z rozkazami mamy:
MUL Rd,Rs Mnożenie bez znaku zawartości rejestrów R1:R0 Rd Rs Z,C 2
MULS Rhd,Rhs Mnożenie ze znakiem zawartości rejestrów R1:R0 Rhd
Rhs Z,C 2
MULSU Rhd,Rhs Mnożenie zawartości rejestrów (jeden ze znakiem, drugi
bez znaku) R1:R0 Rhd Rhs Z,C 2
FMUL Rd,Rs Mnożenie liczb ułamkowych bez znaku R1:R0 (Rd Rs) << 1 Z,C 2
FMULS Rd,Rs Mnożenie liczb ułamkowych ze znakiem R1:R0 (Rd Rs)
<< 1 Z,C 2
FMULSU Rd,Rs Mnożenie liczby ułamkowej ze znakiem z liczbą ułamkową
bez znaku R1:R0 (Rd Rs) << 1 Z,C 2
TomaszB
Guest
Mon Mar 06, 2006 2:48 pm
T.M.F. napisał(a):
Quote:
Skad ty wziales ta informacje? FMUL to mnozenie dwoch 8 bitowych liczb
bez znaku. AVR NIE POSIADA operacji na liczbach zmiennoprzecinkowych.
Prostym trickiem jest wykorzystanie liczb stalopozycyjnych. Mozesz je
normalnie mnozyc za pomoca MUL, pamietajac o odpowiednim przesunieciu
pozycji dziesietnej.
Pomylilem pojecie, zamiast zmiennoprzecinkowa mialo byc stalopozycyjna
(zmiennoprzecinkowe to mam w C++ :/)
Tak czy inaczej, moj problem z pierwszego posta dalej jest nierozwiazany.
Pozdrawiam
TomaszB
Mister
Guest
Mon Mar 06, 2006 2:52 pm
Quote:
Zawsze sprawdzaj u źródeł:
www.atmel.com
Liczby zmienno-przecinkowe zazwyczaj są kodowane na czterech bajtach, do
sprzętowego działania na nich wymagany jest koprocesor, którego w 8 bitowych
procesorach raczej się nie stosuje.
Mister
TomaszB
Guest
Mon Mar 06, 2006 3:41 pm
Mister napisał(a):
Quote:
Zawsze sprawdzaj u źródeł:
www.atmel.com
Liczby zmienno-przecinkowe zazwyczaj są kodowane na czterech bajtach, do
sprzętowego działania na nich wymagany jest koprocesor, którego w 8 bitowych
procesorach raczej się nie stosuje.
TAk, pomylilem formaty, do czego przyznalem sie w poscie nizej. Chodzilo
o liczby ulamkowe, stalopozycyjne.
Pozdrawiam
TomaszB
Marcin Stanisz
Guest
Mon Mar 06, 2006 4:37 pm
Dnia Mon, 06 Mar 2006 14:18:10 +0100, TomaszB napisał(a):
<ciach>
Quote:
w r0 bede mial czesc po przecinku
w r1 czesc calkowita
Strona 71 dokumentu "Instruction set". FMUL operuje na nietypowym formacie
(1.7), a wynik jest w formacie (1.15), przy czym numery oznaczają liczbę
_bitów_ na część całkowitą i ułamkową.
Dokładną interpretację wyniku doczytaj, ja za bardzo nie zrozumiałem ;)
Pozdrawiam
Marcin Stanisz
--
"A lie will go round the world before the truth has got its boots on"
Terry Pratchett, "Truth"
TomaszB
Guest
Mon Mar 06, 2006 8:29 pm
Marcin Stanisz napisał(a):
Quote:
Strona 71 dokumentu "Instruction set". FMUL operuje na nietypowym formacie
(1.7), a wynik jest w formacie (1.15), przy czym numery oznaczają liczbę
_bitów_ na część całkowitą i ułamkową.
Dokładną interpretację wyniku doczytaj, ja za bardzo nie zrozumiałem
W ksiazce o AtMegach jest troszke jasniej.
Wychodzi na to, ze jak sie mnozy liczbe calkowita (8n.0q) przez liczbe
ulamkowa w formacie 1.7 (1n.7q) to w wyniku operacji fmul otrzymamy
liczbe w formacie 8n.8q czyli w dwoch rejestrach r0 i r1 beda
odpowiednio: r1-czesc calkowita, r0-czesc ulamkowa.
Dla liczb 8 bitowych jest dosc prosto, gozej z liczbami 16 bitowymi:(
ale to chyba tez da sie jakos zrozumiec;)
Pozdrawiam
TomaszB
TomaszB
Guest
Mon Mar 06, 2006 10:46 pm
Piotr Chmiel napisał(a):
Quote:
On Mon, 6 Mar 2006, TomaszB wrote:
dalej mam tak:
ldi r17,q7(0.019)
A co zwraca funcja q7(0.019)?
Zwraca 0x02 co daje 0,015625
Quote:
fmul r16,r17
Wynik działania funkcji FMUL to R1:R0 <- (Rd x Rr) << 1
Juz widze, gdzie jest blad:(
Trzeba bedzie dowiedziec sie, jak mnozyc liczbe 16 bitowa przez liczbe
1N.Q15.
Pozdrawiam
TomaszB
TomaszB
Guest
Tue Mar 07, 2006 9:27 pm
T.M.F. napisał(a):
Quote:
A moze kolega juz to przerabial i moglby podpowiedziec jak
przeprowadzic mnozenie liczby 16 bitowej przez liczbe 1n.q15?
A nie prosciej zamiast tak kombinowac wykorzystac normalny zapis
stalopozycyjny. Mnozysz wartosc ADC*19 i dla 255 masz 4845, przyjmujesz,
ze trzy ostatnie cyfry to cyfry po przecinku i juz. Potrzebujesz wieksza
precyzje to mnozysz nie *19 a razy 196 i wtedy przyjmujesz 4 ostatnie
cyfry, ze sa po przecinku. Co wazne ciagle miescisz sie na 16 bitach.
Zrobilem to inaczej i w moim przekonaniu duzo prosciej.
Ustawiam ADC na wartosc referencyjna 2,56V co daje 0,01V na jednostke.
Mnoze wartosc razy 2 i mam w wyniku r1:r0 wartosc napiecia.
Teraz tylko konwersja pesudo BCD i ustawienie kropki po pierwszej cyfrze .
Cos tylko z dokladnoscia nie za bardzo, tylko nie wiem co lepiej
pokazuje stary elektroniczny multimetr czy moj uklad.
Blad moze pojawiac sie z tego, ze dla wyniku 255 napiecie jest 2,56 a
nie jak zakladam 2,55.
Pozdrawiam
TomaszB
Marcin Stanisz
Guest
Tue Mar 07, 2006 10:11 pm
Dnia Tue, 07 Mar 2006 22:27:41 +0100, TomaszB napisał(a):
Quote:
Cos tylko z dokladnoscia nie za bardzo, tylko nie wiem co lepiej
pokazuje stary elektroniczny multimetr czy moj uklad.
Blad moze pojawiac sie z tego, ze dla wyniku 255 napiecie jest 2,56 a
nie jak zakladam 2,55.
Spójrz sobie w dokumentacji, jaką "dokładność" ma wewnętrzne źródło
napięcia. Tylko się nie przestrasz ;)
Pozdrawiam
Marcin Stanisz
--
"A lie will go round the world before the truth has got its boots on"
Terry Pratchett, "Truth"
TomaszB
Guest
Wed Mar 08, 2006 7:25 am
Marcin Stanisz napisał(a):
Quote:
Spójrz sobie w dokumentacji, jaką "dokładność" ma wewnętrzne źródło
napięcia. Tylko się nie przestrasz
Czyli lepiej bedzie podlaczyc swoje napiecie odniesienia i wysterowac ja
na najbardziej pasujaca wartosc. moze 2,55V albo 5,1
Pozdrawiam
TomaszB