Stránka 1 z 2

zápis do porta 16f84a

Napsal: 08 lis 2007, 12:30
od ok1f
Tak regulátor, zdá se, po dlouhé době konečně funguje a já v programu pokračuji dál. Narazil jsem na další zádrhel - potřeboval bych z portu A (např. bit 0,1,2,3) snímat stav a ten ukládat někam do registru. Současně však mám na RA4 přivedeny impulsy, které čítá TMR0 a které, pokud přesouvám celý stav portu, jeho stav zkreslují. Potřeboval bych vybrat pouze ty čtyři bity. Má to vůbec řešení ??

Děkuji

Napsal: 08 lis 2007, 12:59
od kony2807
jsou bity 0-3 jako vstupy ?

Napsal: 08 lis 2007, 13:02
od kony2807
pokud ano , btfsc / btfss a podle toho nastavovat bity rexistruX pomocí bcf/bsf

Napsal: 08 lis 2007, 13:04
od kony2807
příklad:

Kód: Vybrat vše

bcf X,1
btfsc 05,1
bsf X,1


je - li bit 1 v portu A ve stavu 1 , zapíše se do registru X na bit 1 jedníčka
a opačně.

(VELICE SE OMLOUVÁM ZA CHYBU V KÓDU , PŘEDCHOZÍ VERZE BY OPRAVDU NEJELA)

Napsal: 08 lis 2007, 13:16
od ok1f
jasné, jednoduché. Děkuji.

Já jsem až doposud vždy přesouval celý obsah, tak jsem se na tuto operaci nějak podvědomě zaměřil. Dík.

Napsal: 08 lis 2007, 15:30
od ok1f
No jo, jenže ono mi to přestalo fungovat celé. Koukni se, prosím na tuto část programu, jestli je to takhle možné.

bcf RYCHLOST,0
btfsc PORTA,0
bsf RYCHLOST,0

bcf RYCHLOST,1
btfsc PORTA,1
bsf RYCHLOST,1

bcf RYCHLOST,2
btfsc PORTA,2
bsf RYCHLOST,2




movf RYCHLOST,0 ;konstanta pro odecitani
subwf tmr0,1 ;odecte od tmr0 konstantu a ulozi vysledek do tmr0

Napsal: 08 lis 2007, 23:41
od Banda
Přečti si pořádně co ti napsal kony2807. Nejdřív BTFSC, pak ten zbytek!

Napsal: 09 lis 2007, 06:18
od Chenzee
Já myslím, že to má OK1f v pořádku, udělá přednastavení bitu v registru na nulu a pokud je pinu tento stav, bit zustane v tomto stavu a pokud je tam stav opacny (v tomto pripade 1) tak se hodnota prepise na 1. Pokiud by to udelal tak jak pise kony2807, tak by nikdy nedosahl spravneho vysledku, protože pokud by tam byla nula, nulovani se neprovese a provede se stejně nastaveni (1) . Vysledek tedy bude vždy 1=chyba 8O . A co takhle maskování nepoužívaných bitů??? To by nešlo??? :opravar:

Napsal: 09 lis 2007, 06:27
od ok1f
Že jsem to napsal jinak, to vím, Kony přečte stav bitu a je-li 0, tak v X bit nastaví a je-li 1, tak vynuluje a pak nastaví. To nepotřebiji.

Já bit v RYCHLOST nuluji a pokud je na vstupu 0, tak další řádek přeskočím, pokud je na vstupu 1, dalším řádkem bit v RYCHLOST nastavím.

Nejsem si ale jist, jestli lze takto zapisovat do registru hodnotu. Pokud do RYCHLOST vložím konstantu, vše funguje, pokud tam takto měním bity, program reaguje, ale zmateně, jako by v tom registru byly úplně jiné hodnoty.

Je možné, že tím nastavováním něco měním v reg STATUS? Ten totiž v programu využívám, ale moc ho zatím neovládám.

Napsal: 09 lis 2007, 06:29
od ok1f
Zdravím, Chenzee, mám radost, že jsem uvažoval správně.

Napsal: 09 lis 2007, 06:31
od ok1f
A o maskování bitů čtu prvně, můžeš mi to přiblížit?

Napsal: 09 lis 2007, 10:19
od jankop
Samozřejmě že výše uvedené je přitažené za vlasy.
Sekvence

Kód: Vybrat vše

MASK_D3_D0  EQU  B'00001111' 
............
............
............
movlw MASK_D3_D0
andwf PORTA,W
movwf RYCHLOST
udělá totéž, rychleji a s menší potřebou programové paměti.
To je to maskování bitů!
Tvůj problém může být právě v tom, že všechny bity PORTA nepřečteš současně a ony se v průběhu zdlouhavého nastavování registru RYCHLOST stačí změnit.
Používáte opravdu pozoruhodné programovací techniky, jste placeni od řádku? :D

Napsal: 09 lis 2007, 10:50
od ok1f
Nejsem placený od řádku, ani jinak, jen se učím. A abych byl upřímný, nechápu to. Byl bys tak laskav a popsal mě funkci? Dík

Napsal: 09 lis 2007, 10:59
od jankop
Do registru W si dáš konstantu 0x0F (00001111B).
Provedeš logický součin mezi W a PORTA, který uložíš do W.
Horní čtyři bity registru W budou mít tím pádem nulovou hodnotu a dolní bity hodnotu přečtenou před tím z PORTA.
Pak prostě uložíš W kam potřebuješ tj. do RYCHLOST.
Tak jsem já pochopil tvůj původní požadavek.
To o těch řádcích nepatřilo tobě.

Napsal: 09 lis 2007, 11:24
od ok1f
Já se taky nijak nepohoršuji, uznávám, že nad tím, co už jsem vymyslel a co mě funguje, by asi někdo kroutil hlavou.

Ještě bych se chtěl zeptat na dvě věci:

- program by měl pracovat v 16f84 a v jeho instrukcích MASK není

- na porta jsou na RA4 neustále čítány impulsy ze snímače otáček. nebude vadit ono nulování?


mohl bych zaslat celý program, pokud by to bylo nutné k posouzení situace