RTV forum PL | NewsGroups PL

[AVR] AtMega8 i ADC: Mnożenie wyniku pomiaru, dlaczego nie zgadza się z oczekiwaniami?

[AVR]AtMega8 i ADC, dlaczego tak?

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - [AVR] AtMega8 i ADC: Mnożenie wyniku pomiaru, dlaczego nie zgadza się z oczekiwaniami?

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 Wink jak Ci się udaje wpisać 0.019 do 1-go bajtu
pomijając kwestię, że jest to liczba zmiennoprzecinkowa ? Wink)))

Pozdrawiam

TomaszB
Guest

Mon Mar 06, 2006 1:59 pm   



Krzysztof Piecuch napisał(a):
Quote:
Tak z ciekawości zapytam Wink jak Ci się udaje wpisać 0.019 do 1-go bajtu
pomijając kwestię, że jest to liczba zmiennoprzecinkowa ? Wink)))

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:

informacja pobrana ze strony http://www.elektronika.priv.pl/ w dziale
mikrokontrolery -> jezyk asembler AVR -> Lista rozkazów mikrokontrolerów
AVR


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 Wink

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 Wink

Czyli lepiej bedzie podlaczyc swoje napiecie odniesienia i wysterowac ja
na najbardziej pasujaca wartosc. moze 2,55V albo 5,1 Wink
Pozdrawiam
TomaszB

elektroda NewsGroups Forum Index - Elektronika Polska - [AVR] AtMega8 i ADC: Mnożenie wyniku pomiaru, dlaczego nie zgadza się z oczekiwaniami?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map