zápis do porta 16f84a
Moderátor: Moderátoři
zápis do porta 16f84a
Děkuji
Kód: Vybrat vše
bcf X,1
btfsc 05,1
bsf X,1je - 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)
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
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.
Sekvence
Kód: Vybrat vše
MASK_D3_D0 EQU B'00001111'
............
............
............
movlw MASK_D3_D0
andwf PORTA,W
movwf RYCHLOSTTo 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?
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ě.
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