Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

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

 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
DavidChlup



Založen: Sep 03, 2019
Příspěvky: 69
Bydliště: Karlovy Vary

PříspěvekZaslal: ne září 22 2019, 17:49    Předmět: Násobení 16-bit čísla u AVR Citovat

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
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frpr666



Založen: Dec 28, 2009
Příspěvky: 1051

PříspěvekZaslal: ne září 22 2019, 18:25    Předmět: Citovat

Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
termit256



Založen: Dec 06, 2007
Příspěvky: 10335

PříspěvekZaslal: ne září 22 2019, 19:03    Předmět: Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
DavidChlup



Založen: Sep 03, 2019
Příspěvky: 69
Bydliště: Karlovy Vary

PříspěvekZaslal: ne září 22 2019, 19:25    Předmět: Citovat

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/avrassembler/avrassembler.wb_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 Very Happy

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nokijec



Založen: Feb 01, 2011
Příspěvky: 317

PříspěvekZaslal: ne září 22 2019, 19:43    Předmět: Citovat

Na převod číselných soustav se používá hornerovo schema.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
termit256



Založen: Dec 06, 2007
Příspěvky: 10335

PříspěvekZaslal: ne září 22 2019, 19:45    Předmět: Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
DavidChlup



Založen: Sep 03, 2019
Příspěvky: 69
Bydliště: Karlovy Vary

PříspěvekZaslal: ne září 22 2019, 20:12    Předmět: Citovat

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?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
termit256



Založen: Dec 06, 2007
Příspěvky: 10335

PříspěvekZaslal: ne září 22 2019, 20:42    Předmět: Citovat

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... Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
DavidChlup



Založen: Sep 03, 2019
Příspěvky: 69
Bydliště: Karlovy Vary

PříspěvekZaslal: ne září 22 2019, 21:09    Předmět: Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
termit256



Založen: Dec 06, 2007
Příspěvky: 10335

PříspěvekZaslal: ne září 22 2019, 21:17    Předmět: Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
lesana87



Založen: Sep 20, 2014
Příspěvky: 3409

PříspěvekZaslal: ne září 22 2019, 21:29    Předmět: Citovat

Dělení se dělá pomocí posunů a odečitání.
Příklad dělení 24bitového čísla 8bitovým:
kód:
;------------------------------------------------------------------------------
; 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
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
AB1



Založen: Nov 23, 2009
Příspěvky: 312

PříspěvekZaslal: po září 23 2019, 9:01    Předmět: Citovat

Pro zobrazení se podívej tady na rutinu "From binary to ASCII"
http://www.avr-asm-tutorial.net/avr_en/calc/CONVERT.html#bin2asc
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra.
Nemůžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Nemůžete připojovat soubory k příspěvkům
Můžete stahovat a prohlížet přiložené soubory

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.18 sekund