uživatelské znaky na LCD (HD44780) pomocí PIC

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

Moderátor: Moderátoři

Zpráva
Autor
Johny_Servis

#16 Příspěvek 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?
Uživatelský avatar
Mendor
Příspěvky: 223
Registrován: 16 dub 2008, 00:00
Bydliště: Kladno

#17 Příspěvek 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
Návštěvník

#18 Příspěvek 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).
Johny_Servis

#19 Příspěvek 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é
Návštěvník

#20 Příspěvek 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 :D
Návštěvník

#21 Příspěvek 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?
Uživatelský avatar
caven
Příspěvky: 417
Registrován: 15 srp 2006, 00:00

#22 Příspěvek 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 ?
Johny_Servis

#23 Příspěvek 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í :-)
Uživatelský avatar
Mendor
Příspěvky: 223
Registrován: 16 dub 2008, 00:00
Bydliště: Kladno

#24 Příspěvek od Mendor »

O pár řádků nahoru jsem ti napsal odkaz na hotové rutiny pro násobení i dělení 16bit čísel ...
Johny_Servis

#25 Příspěvek 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)
Johny_Servis

#26 Příspěvek od Johny_Servis »

zpět - už to jede: Norton je prostě sfiňa s různýma nastaveníma
Uživatelský avatar
Maskot
Příspěvky: 1772
Registrován: 19 lis 2004, 00:00
Bydliště: Wien

#27 Příspěvek od Maskot »

Odkaz sice funguje lec viz.priloha.
Přílohy
snímek2.png
(121.76 KiB) Staženo 125 x
Uživatelský avatar
socern
Příspěvky: 1
Registrován: 09 srp 2009, 00:00
Bydliště: nedaleko ČK

#28 Příspěvek od socern »

Také zde jsou matematické rutiny:
www.s-o.webnode.cz/matematika-pro-pic
Johny_Servis

#29 Příspěvek 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)
Odpovědět

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