Násobení 16-bit čísla u AVR

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
DavidChlup
Příspěvky: 69
Registrován: 03 zář 2019, 00:00
Bydliště: Karlovy Vary

Násobení 16-bit čísla u AVR

#1 Příspěvek 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
Uživatelský avatar
frpr666
Příspěvky: 1051
Registrován: 28 pro 2009, 00:00

#2 Příspěvek od frpr666 »

termit256
Příspěvky: 10029
Registrován: 06 pro 2007, 00:00

#3 Příspěvek 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.
Uživatelský avatar
DavidChlup
Příspěvky: 69
Registrován: 03 zář 2019, 00:00
Bydliště: Karlovy Vary

#4 Příspěvek 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 :D

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.
Uživatelský avatar
nokijec
Příspěvky: 315
Registrován: 01 úno 2011, 00:00

#5 Příspěvek od nokijec »

Na převod číselných soustav se používá hornerovo schema.
termit256
Příspěvky: 10029
Registrován: 06 pro 2007, 00:00

#6 Příspěvek 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.
Uživatelský avatar
DavidChlup
Příspěvky: 69
Registrován: 03 zář 2019, 00:00
Bydliště: Karlovy Vary

#7 Příspěvek 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?
termit256
Příspěvky: 10029
Registrován: 06 pro 2007, 00:00

#8 Příspěvek 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... :-)
Uživatelský avatar
DavidChlup
Příspěvky: 69
Registrován: 03 zář 2019, 00:00
Bydliště: Karlovy Vary

#9 Příspěvek 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.
termit256
Příspěvky: 10029
Registrován: 06 pro 2007, 00:00

#10 Příspěvek 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.
Uživatelský avatar
lesana87
Příspěvky: 4395
Registrován: 20 zář 2014, 00:00

#11 Příspěvek 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
Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 00:00

#12 Příspěvek od AB1 »

Pro zobrazení se podívej tady na rutinu "From binary to ASCII"
http://www.avr-asm-tutorial.net/avr_en/ ... ml#bin2asc
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“