Stránka 2 z 2
Napsal: 08 srp 2009, 18:27
od Johny_Servis
Takže:
Ten předchozí anonym je můj.
1. Vzhledem k tomu, že mám Vdd=5V, tak jednomu bitu odpovídá 4,88mV = 48*10^(-4)
2. výsledek z převodu (který je v registrech ADRESL a ADRESH) si zkopíruju do svého 16bitového registru "resu"
3. pak bych registr "resu" vynásobil konstantou 48(dekadických), při 10 bit. A/D převodníku dostanu nejvyšší číslo 49152, takže 16bit registr stačí.
4. Vydělím tenhle registr konstantou 10000(dekadických) a mám volty dále 1000(dekad) a mám desetiny voltu...
problém je v tom, že neznám instrukci na násobení a dělení - jak to mám udělat?? nevíte?
Napsal: 08 srp 2009, 18:48
od Mendor
Tady jsou rutiny pro násobení a dělení. V levo na stránce zmáčkni "Matematika".
http://www.cmail.cz/doveda/procesory/index.htm
Napsal: 08 srp 2009, 19:06
od Návštěvník
4. Vydělím tenhle registr konstantou 10000(dekadických) a mám volty dále 1000(dekad) a mám desetiny voltu...
To jsou divné počty a efektivita kódu taky mizerná. Když to číslo z převodníku posuneš o 6 bitů nahoru a vynásobíš číslem 500 a dolních 16bitů výsledku zahodíš, tak máš rovnou výsledek v setinách voltu. Pak stačí 2 dělení 10ti a máš výsledek na 3 platná čísla (tj. 0,00 až 4,99).
Napsal: 08 srp 2009, 19:51
od Johny_Servis
Anonym píše:4. Vydělím tenhle registr konstantou 10000(dekadických) a mám volty dále 1000(dekad) a mám desetiny voltu...
To jsou divné počty a efektivita kódu taky mizerná. Když to číslo z převodníku posuneš o 6 bitů nahoru a vynásobíš číslem 500 a dolních 16bitů výsledku zahodíš, tak máš rovnou výsledek v setinách voltu. Pak stačí 2 dělení 10ti a máš výsledek na 3 platná čísla (tj. 0,00 až 4,99).
Doufám že máš pravdu - já už se celkem ztratil až to bude hotové, tak napíšu jak to dopadlo
Jinak zajímal by mě tvoje mozkové pochody jak si na to přišel - zdá se to být velmi efektivní a šikovné, moje myšlení je bohužel příliš těžkopádné
Napsal: 08 srp 2009, 20:11
od Návštěvník
Po x letech programování v assembleru buď odpadneš nebo začneš i u oběda přemýšlet, do kterého registru dáš vidličku, do kterého nůž a řízek zásadně krájíš na počet kusů, který je mocninou dvou

Napsal: 08 srp 2009, 20:23
od Návštěvník
ještě by mě zajímalo jestli je nějaká prostý příkaz pro dělení v assembleru pro PIC
motorola ho měla - tady sem zatím nic nenašel
jde mi o to dělení 10 - jak jednoduše 16bitový registr vydělit 10ti?
Napsal: 08 srp 2009, 20:46
od caven
co nenaprogramuješ to není, že to motorola měla neznamená, že to budou mít všechny. 8051 o atmelu měla taky dělení v instrukční sadě a AVR už ho nemá, a musí se naprogramovat, ale je to chvilka práce ne ?
Napsal: 08 srp 2009, 20:54
od Johny_Servis
Už od toho sedím od rána a mám hlavu jako balón a blbě se mě přemýšlí

Napsal: 08 srp 2009, 20:56
od Mendor
O pár řádků nahoru jsem ti napsal odkaz na hotové rutiny pro násobení i dělení 16bit čísel ...
Napsal: 08 srp 2009, 21:04
od Johny_Servis
Mendor píše:O pár řádků nahoru jsem ti napsal odkaz na hotové rutiny pro násobení i dělení 16bit čísel ...
Ten odkaz ale nejede ani v Opeře ani v IE (i s vypnutým FW)
Napsal: 08 srp 2009, 21:06
od Johny_Servis
zpět - už to jede: Norton je prostě sfiňa s různýma nastaveníma
Napsal: 08 srp 2009, 21:20
od Maskot
Odkaz sice funguje lec viz.priloha.
Napsal: 09 srp 2009, 08:32
od socern
Napsal: 09 srp 2009, 11:50
od Johny_Servis
Mám tu teď problém
dle datasheetu PIC16F877A by mělo být na stránce 0 (bank 0) od adresy 0x20 po adresu 0x7F 96 osmibitových univerzálních registrů
tak si je tedy postupně zabírám pro své pomocné registry stylem
regA equ 0x20
regB equ 0x21
...
problém je v tom, že watch (v MPLABu) je neumí zobrazit (píše "not found"), jelikož tam mám i vícebajtové registry, rozhodl sem se to přepsat na:
cblock 0x20
regA
regB
regC:4
...
endc
stále to však watch neumí zobrazit a ani program po nahrání do PICu nechodí jak by měl. Jak to tedy s těmito registry je (upozorňuji že si pečlivě hlídám přepínání mezi jednotlivími paměťovými bankami)