Stránka 1 z 1
Násobení 16-bit čísla u AVR
Napsal: 22 zář 2019, 18:49
od DavidChlup
Ahoj,
lze nějak v AVR (např atmega 32) násobit 16-ti bitová čísla? Konkrétně potřebuji násobit dva ADC mezi sebou, kde bude max rozlišení 10 bitů, takže se budou násobiít 10-bitová čísla, ale hádám, že to bude totéž, co 16-bitové.
Z každého ADC budu mít dec hodnotu 0-999, takže max decimální hodnota bude 998001, kterou potřebuji nasledně zobrazit na displej (třeba 7seg), ale předpokládám, že s takovýma číslama atmega neumí vůbec pracovat.
Existuje tedy nějaký fígl, jak s těmi čísli pracovat i v 8bit registrech?
Píšu to v ASM.
Děkuji
Napsal: 22 zář 2019, 19:25
od frpr666
Napsal: 22 zář 2019, 20:03
od termit256
Na 8bitu to vypocitas to uplne jednoduse, kdyz si uvedomis ze plati
(256*cislo1_High + cislo1_Low)*(256*cislo2_High + cislo2_Low).
Kdyz si to zapises v pouzitelnejsim tvaru
65536*(cislo1_High *cislo2_High ) + 256(cislo1_High *cislo2_Low + cislo2_High *cislo1_Low) + cislo1_Low*cislo2_Low
tak uz to jednoduse a rychle pronasobis i na 8bitu.
Napsal: 22 zář 2019, 20:25
od DavidChlup
Něco jsem našel i na stránkách microchipu. Ale tak, jak to říká termit256 je celkem jednoduché.
https://www.microchip.com/webdoc/avrass ... MULSU.html
Teď už mi zbývá celé číslo (v mém případě jen 3 byty) nějak nahodit na displej.
u 8-bitového čísla je to jasný, tam odečítám stovky, desítky, a počet odečtení pak zobrazím na displej. Ale ja mám odečítat 3 bytové číslo nevím
Pro ukojení zvědavosti je to na měření proudu a napětí a následně přepočet na výkon. Na netu jsou nějaký hotový projekty, ale našel jsem jen v C a tomu nerozumím. A navíc si to chci napsat sám, abych zase s těma AVRkama někam pokročil a sám se něco naučil.
Napsal: 22 zář 2019, 20:43
od nokijec
Na převod číselných soustav se používá hornerovo schema.
Napsal: 22 zář 2019, 20:45
od termit256
Opravdu potrebujes 3bajtove rozliseni? Pokud je to nejaky vysledek vypocitavy z mizerneho 10bitoveho AD prevodniku ATmegy, nema zadny vyznam zobrazovat vic jak 10 bitu, spis min protoze na 1-2 LSB bude stejne jen nejaky sum.
Proste to cislo z prislusnych stran o par bitu orizni a nemusis pak zdlouhave prevadet 20bitove cislo do BCD.
Napsal: 22 zář 2019, 21:12
od DavidChlup
Uvažoval jsem ještě o externím ADC třeba 12bit nebo pak 16bit. Poslední dvě čísla stejnak měla být desetiná a setinná, ty bych mohl vynechat. Takže bych výsledek posunul doleva a počítal jen s horním bytem každého AD...?
Jenže já chtěl, aby výsledek max dec1000 byl úměrný 100V. Jak převedu 100V na 255 (8bit). Jedině že bych to ještě násobil 4ma... Tam mi ale může vzniknout chyba měření, nebo se pletu?
Napsal: 22 zář 2019, 21:42
od termit256
99,9 odpovida tak akorat tomu 10 bitovemu rozliseni AD prevodniku. Tu hodnotu z AD prevodniku si musis pronasobit tak, aby cislo odpovidalo tomu co chces zobrazit na displeji jeste pred prevodem do BCD, v tvem pripade 0-999. V BCD uz nic nenasob. Pokud ti bude stacit tech 99,9V prevadis do BCD jen stovky, desitky a jednotky - cislo vydelis stem, zbytek desiti a co zbyde jsou jednotky.
Ted jeste jak se deli na AVR...

Napsal: 22 zář 2019, 22:09
od DavidChlup
To ano, Ale tak když říkáš, že tam bude stejnak jen šum, tak nevím aby to mělo smysl. Ale já to nejdřív zkusím a uvidím jak se to bude chovat.
Já ale potřebuji ty předodníky mezi sebou násobit a pak převod na BCD. S tím už se snad nějak poperu.
V AVR se nedělí, ale odčítaj se stovky a počet odečtení se zapisuje do registru. Když je to třeba 520, tak se odečítaj stovky dokud výsledek nebude menší než 100 a jelikož se odečetlo celkem 5x, tak hodnota v reg bude 5 a ta se pak pošle na displej jako první cifra.
Napsal: 22 zář 2019, 22:17
od termit256
JJ, deleni je opruz. Zlata x51, jedna instrukce a za 4 cykly je hotovo.
Kdyz cisla vynasobis k obrazu svemu, tak vem pro prevod do BCD jen nejvyssich 10 bitu maximalni hodnoty cisla, zbytek nema zadny vyznam prevadet.
Napsal: 22 zář 2019, 22:29
od lesana87
Dělení se dělá pomocí posunů a odečitání.
Příklad dělení 24bitového čísla 8bitovým:
Kód: Vybrat vše
;------------------------------------------------------------------------------
; Deleni 24bit / 8bit = 16bit
; Dlnc1:Dlnc0 = Dlnc2:Dlnc0 / Dltl0, Dlnc2 = Dlnc2:Dlnc0 mod Dltl0
D24_8: cp Dlnc2,Dltl0 ; 1
brcs d28_0 ; 2
clr Dlnc0
com Dlnc0
mov Dlnc1,Dlnc0
mov Dlnc2,Dlnc0
sec ; Preteceni
rjmp d28_r ;
d28_0: push R16 ; 2
ldi R16,16 ; 1
d28_1: rol Dlnc0 ; 1
rol Dlnc1 ; 1
rol Dlnc2 ; 1
brcs d28_1a ; 2/1
cp Dlnc2,Dltl0 ; 1
brcs d28_2 ; 2/1
d28_1a: sub Dlnc2,Dltl0 ; 1
clc ; 1
d28_2: dec R16 ; 1
brne d28_1 ; 2/1
; 16 * 10/11 = 160-176
pop R16 ; 2
rol Dlnc0 ; 1
rol Dlnc1 ; 1
com Dlnc0 ; 1
com Dlnc1 ; 1
clc ; 1 OK
; 172-188
d28_r: ret
Napsal: 23 zář 2019, 10:01
od AB1
Pro zobrazení se podívej tady na rutinu "From binary to ASCII"
http://www.avr-asm-tutorial.net/avr_en/ ... ml#bin2asc