forum.mcontrollers.com - hlavní stránka forum.mcontrollers.com - fórum

 

.: fórum - hlavní stránka :.
Technology Stronghold by Rudolf Vesely
How to build Microsoft System Center hosted cloud series
FAQFAQ HledatHledat Seznam uživatelůSeznam uživatelů Uživatelské skupinyUživatelské skupiny RegistraceRegistrace
ProfilProfil StatistikaStatistika Soukromé zprávySoukromé zprávy PřihlášeníPřihlášení

 
PIC Assembler -> presun bitov medzi registrami

 
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> Microchip
 
Dybbuk
Přispěvatel
Přispěvatel


Založen: 18.3.2016
Příspěvky: 28

PříspěvekZaslal: 28 duben 2016, 11:16    Předmět: PIC Assembler -> presun bitov medzi registrami Citovat

Ahojte,
aky je najjednoduchsi sposob presunu len niektorych bitov medzi dvoma registrami (premennymi)?

Napr.: chcem presunut bity 4 a 5 registra1 do registra2 na poziciu 1 a 3, tak aby som zvysne bity v registry 2 neovplyvnil.

Momentalne to riesim pomocou BTFSS reg1,4 -> BSF reg2,1 a BTFSS reg1,5 -> BSF reg2,3, ale verim ze da sa to aj jednoduchsie. Ci?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Radius
Profesionál
Profesionál


Založen: 22.2.2013
Příspěvky: 468

PříspěvekZaslal: 28 duben 2016, 13:47    Předmět: Citovat

Mám pocit, že konstrukce:

BTFSS fx,bx
BCF fy,by
BTFSC fx,bx
BSF fy,by

je nejrychlejší možná. Pokud Tě to prudí, zabal to makra....

_________________
x51 , ARM , XILINX
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovy WWW stránky
 

 
Mahoney
Profesionál
Profesionál


Založen: 26.12.2013
Příspěvky: 104

PříspěvekZaslal: 02 květen 2016, 19:20    Předmět: Citovat

Hlavně by to chtělo zamyslet se nad tím, proč je vůbec třeba kopírovat data takto „zvláštně”, ona bude chyba asi jinde. Předpokládal bych, že to budou nějaké příznakové bity něčeho:

1. proč je vůbec kopírovat?
2. pokud je přeci jen potřeba je někde např. zálohovat, proč si jednoduše nezkopírovat celý registr?
3. co přesně je to za PICko?

Jen určité požadované bity z nějakého registru lze „jedním vrzem” načíst velmi snadno, za pomoci ANDLW a bitové masky. Otázka je „co a proč potom s nima”..?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Dybbuk
Přispěvatel
Přispěvatel


Založen: 18.3.2016
Příspěvky: 28

PříspěvekZaslal: 03 květen 2016, 21:53    Předmět: Citovat

Vdaka za odpovede, moj plan bol 10-bitovy výsledok A/D prevodu pouzit ako hodnotu pre duty cyklus PWM. A kedze horne 2 bity A/D prevodu su v ADRESH<1:0> a horne 2 bity PWM duty cyklu su v CCP1CON<5:4>, tak chcel som proste hodnotu z ADRESH prekopirovat do CCP1CON. Mozno idem na to zle, ale neviem ako sa to ma spravne robit, toto je riesenie ktore napadlo mne.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
MiloPS3
Profesionál
Profesionál


Založen: 24.12.2008
Příspěvky: 887
Bydliště: LAZNE KYNZVART

PříspěvekZaslal: 03 květen 2016, 23:09    Předmět: Citovat

kód:
movf ADRESH,w
movwf CCP1CON
+ jeste vhodne orotovat a vymaskovat treba ?
_________________
PIC,ASM / C , Mplab + CCS C Compiler
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
 

 
Dybbuk
Přispěvatel
Přispěvatel


Založen: 18.3.2016
Příspěvky: 28

PříspěvekZaslal: 04 květen 2016, 7:29    Předmět: Citovat

Mohol by si pls uviest cely kod? Lebo toto som este pred tym skusal a nejak som sa v tom zamotal.
Jeden problem mi robil Carry bit ked som to rotoval a druhy problem bol, ze aku hodnotu dat do W (a akym sposobom), aby sa mi zmenili len tie bity v CCP1CON ktore potrebujem.
Alebo teda zaujimalo by ma vseobecne riesenie, nie len pre tento konkretny priklad.
Napr:.
kód:

reg1= B'01011100'
reg2= B'11001101'

Chcem presunut (pomocou rlf rrf) reg1<5:3> do reg2<3:1> tak, aby sa zvysne bity v reg2 nijak nezmenili.
Co sa stane z reg1 na tom nezalezi.
dik.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
MiloPS3
Profesionál
Profesionál


Založen: 24.12.2008
Příspěvky: 887
Bydliště: LAZNE KYNZVART

PříspěvekZaslal: 04 květen 2016, 17:25    Předmět: Citovat

pouzi simulator,trosku se snaz,hot sem co si vymyslel,kdyz to nepude tak to pak skusime dat do kupy

http://www.8bitu.cz/clanek/serial-pic16f84-15-registr-status-maskovani/

_________________
PIC,ASM / C , Mplab + CCS C Compiler
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
 

 
Mahoney
Profesionál
Profesionál


Založen: 26.12.2013
Příspěvky: 104

PříspěvekZaslal: 04 květen 2016, 18:57    Předmět: Citovat

Dybbuk napsal:
Vdaka za odpovede, moj plan bol 10-bitovy výsledok A/D prevodu pouzit ako hodnotu pre duty cyklus PWM. A kedze horne 2 bity A/D prevodu su v ADRESH<1:0> a horne 2 bity PWM duty cyklu su v CCP1CON<5:4>, tak chcel som proste hodnotu z ADRESH prekopirovat do CCP1CON.


V tomto případě načíst, odrotovat kam je potřeba, zapsat. Žádné "co by kdyby" (tj. obecné případy) neřešíme, řešíme vždy konkrétní problém.

Myslel jsem si že to půjde jednoduše, proto jsem se na to ptal. Ač se to nezdá, tak Microchip má tu architekturu poměrně dost promyšlenou a podobné kejkle jako to s těmi bity v úvodu jsou potřeba opravdu málokdy (resp. osobně jsem to doteď nepotřeboval).

PIC máš 16F88?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Dybbuk
Přispěvatel
Přispěvatel


Založen: 18.3.2016
Příspěvky: 28

PříspěvekZaslal: 05 květen 2016, 16:39    Předmět: Citovat

Mam PIC16F690.
Ok, pokusim sa tomu povenovat, postudujem maskovanie a uvidim co z toho vyzmykam. V kazdom pripade potrva to, lebo paralelne riesim dalsie veci a k tomuto sa dostanem, ked to bude aktualne v mojom projekte a hlavne ked bude chut. Nehovoriac o tom, ze casu je malo.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
elc
Přispěvatel
Přispěvatel


Založen: 11.10.2008
Příspěvky: 22
Bydliště: Poprad-Slovensko

PříspěvekZaslal: 08 květen 2016, 15:19    Předmět: Citovat

Zdravím Dybbuka!
1.) v registri CCP1CON<5:4> nie sú dva horné, ale dva dolné bity PWM, teda bit 1 a bit 0.
2.) ak Vám stačí 8-bitové rozlíšenie PWM, tak by som v ADC použil zarovnanie do prava a v registri ADRESH máte horných 8 bitov výsledku prevodu. Potom použijete inštrukciu MOVFF (nie som si istý, či ju 16f690 má, ale všetky 18fxxxx ju majú. Ak nie skopírujete obsah ADRESH do CCPR1L pomocou inštrukcií MOVF,0 a MOVWF.
3.) skopírovať dva najnižšie bity výskledku ADC nie je tak jednoduché, ale dá sa to urobiť zopár inštrukciami. Ak bude záujem, vysvetlím neskôr.
Prajem veľa úspechov!
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
 

 
Mahoney
Profesionál
Profesionál


Založen: 26.12.2013
Příspěvky: 104

PříspěvekZaslal: 08 květen 2016, 17:06    Předmět: Citovat

MOVFF instrukci řada 16F nemá, ale taky bych si radši vzal nějakou 18F. Jsou prostě lepší.

Zkopírovat ty dva bity jde třeba takto:
kód:
MOVF CCP1CON,W
ANDLW 0x30

a případně odrotovat podle potřeby a uložit. V případě dolních bitů z ADC je to ještě jednodušší, tam stačí jen načíst registr ADRESL a odrotovat, dolní bity toho registru jsou unimplemented a čtou se jako 0 rovnou.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
elc
Přispěvatel
Přispěvatel


Založen: 11.10.2008
Příspěvky: 22
Bydliště: Poprad-Slovensko

PříspěvekZaslal: 08 květen 2016, 20:11    Předmět: Citovat

To Mahoney:
bity je nutné skopírovať z ADRES do CCP1CON. Ja by som to urobil takto (predpokladám zrovnanie do ľava, prvých 8 bitov výsledku je v ADRESH a dolné bity výsledku sú v ADRESL <7:6>):
MOVLW 0xCF
ANDWF CCP1CON,1 `vynulujeme PWM bity v CCP1CON
MOVLW 0xC0
ANDWF ADRESL,0 `vymaskujeme nezaujimave bity, vo W mame najnizsie 2 bity z ADC
ADDWF CCP1CON, 1 ` a je to!; v CCP1CON mame 2 najnizsie bity z ADRESL, bez zmeny ostatnych bitov v CCP1CON
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
 

 
Mahoney
Profesionál
Profesionál


Založen: 26.12.2013
Příspěvky: 104

PříspěvekZaslal: 08 květen 2016, 22:11    Předmět: Citovat

Lidi čtěte ty datasheety... kdybys tam nahlédl, tak bys zjistil, že vymaskovávat ADRESL je zbytečné, on už "vymaskovaný" je (alespoň tedy u zmiňovaného 16F690 to platí). Jinak to byla reakce pouze na tvůj bod 3 v předchozí odpovědi, mě to totiž nepřišlo zas tak složité.

Místo '1' a '0'na konci instrukcí (destination) používej normálně W a F (velké), v každém .inc souboru jsou tyto symboly nadefinovány (a tvůj kód se tím stane přehlednější).
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
elc
Přispěvatel
Přispěvatel


Založen: 11.10.2008
Příspěvky: 22
Bydliště: Poprad-Slovensko

PříspěvekZaslal: 09 květen 2016, 7:16    Předmět: Citovat

Zdravím,
u všetkých PIC-ov by podľa datasheetov mali byť nepoužité bity v registroch ADRESH(L) vynulované. Raz sa mi už stalo, že to tak nebolo. Dodnes neviem prečo, ale to bolo raz. Myslím, že použiť jednu inštrukciu naviac, aby som mal istotu, že progrm robí to čo má robiť nie je až také veľké "rúhanie".
A ešte som zabudol, že vo W registri pred poslednou inštrukciou ADDWF je treba 2 x zarotovať W register do prava. Pretože PIC 16-tky majú len rotáciu cez Carry bit, je nutné tento bit vynulovať inštrukciou BCF Status, Carry; Teda skrátka a dobre, medzi inštrukcie ANDWF ABRESL,0 a ADDWF CCPCON,1 je potrebné vložiť nasledujúcu sekvenciu:
BCF Status, Carry
RRF
RRF;
týmto dostaneme "zaujímavé" bity tam, kde majú byť bez zmeny ostatných bitov v CCP1CON.

K poslednej poznámke: súhlaím, že je možné použiť aj sufix W, alebo F, myslím, že je to vec zvyku. Kto píše programy v Assembleri by mal poznať HW použitého kúska kremíka. V datasheete sa pri popise inštrukcií používa sufix 0, alebo 1. MOžno je to prehľadnejšie, ja v tom rozdiel nevidím.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
 

 
Dybbuk
Přispěvatel
Přispěvatel


Založen: 18.3.2016
Příspěvky: 28

PříspěvekZaslal: 09 květen 2016, 12:42    Předmět: Citovat

Ahojte,
toto finalne riesenie je celkom pekne navrhnute aj relativne jednoduche, no ma jednu nevyhodu:
kód:
ANDWF CCP1CON,1 `vynulujeme PWM bity v CCP1CON

Je nevyhnutne vynulovanie CCP1CON. V tomto pripade to sice az taka velka tragedia nie je, ale keby som chcel napisat vseobecne riesenie (ano, viem nikdy neriesime vseobecne riesenie a zameriavame sa na konkretny pripad, ale moja povodna otazka bola ohladom presunu bitov medzi lubovolnymi registrami, nie konkretne ADRESH a CCP1CON), tak mozno v niektorych situaciach by to mohlo byt prekazkou.
Dakujem za odpovede, pomohlo mi to minimalne ziskat novy pohlad na kopirovanie pomocou ADDWF, nie vzdy byt slepo zamerany na MOVWF.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

Zobrazit příspěvky z předchozích:   
Zobrazit předchozí téma :: Zobrazit následující téma  
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> Microchip Časy uváděny v GMT + 2 hodiny
 
Strana 1 z 1
Přejdi na:  
Můžete přidat nové téma do tohoto fóra.
Můž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.
Můžete k příspěvkům připojovat soubory
Můžete stahovat a prohlížet přiložené soubory
 



Num Lock Holder - app to hold Numlock
Copyright © 2017 Rudolf Veselý, mcontrollers.com.
Je zakázáno používat části tohoto webu bez souhlasu autora. || Powered by phpBB © 2001, 2002 phpBB Group - with RedSquare DoubleJ(Jan Jaap)