Násobení 16-bit čísla u AVR
Moderátor: Moderátoři
- DavidChlup
- Příspěvky: 69
- Registrován: 03 zář 2019, 00:00
- Bydliště: Karlovy Vary
Násobení 16-bit čísla u AVR
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
https://www.avrfreaks.net/forum/16-x-16-bit-multiply-32-bit-result
Něco lze najít na AN200
http://ww1.microchip.com/downloads/en/AppNotes/doc0936.pdf
(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.
- DavidChlup
- Příspěvky: 69
- Registrován: 03 zář 2019, 00:00
- Bydliště: Karlovy Vary
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.
Proste to cislo z prislusnych stran o par bitu orizni a nemusis pak zdlouhave prevadet 20bitove cislo do BCD.
- DavidChlup
- Příspěvky: 69
- Registrován: 03 zář 2019, 00:00
- Bydliště: Karlovy Vary
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?
Ted jeste jak se deli na AVR...
- DavidChlup
- Příspěvky: 69
- Registrován: 03 zář 2019, 00:00
- Bydliště: Karlovy Vary
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.
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
http://www.avr-asm-tutorial.net/avr_en/ ... ml#bin2asc