PIC Assembler -> presun bitov medzi registrami

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?

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…

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”…?

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.

movf ADRESH,w movwf CCP1CON+ jeste vhodne orotovat a vymaskovat treba ?

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:.

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.

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

8bitu.cz/clanek/serial-pic16 … maskovani/

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?

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.

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!

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:

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.

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

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ší).

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.

Ahojte,
toto finalne riesenie je celkom pekne navrhnute aj relativne jednoduche, no ma jednu nevyhodu:

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.