zápis do porta 16f84a

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

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
ok1f
Příspěvky: 239
Registrován: 11 zář 2006, 00:00

zápis do porta 16f84a

#1 Příspěvek 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
Uživatelský avatar
kony2807
Příspěvky: 305
Registrován: 29 črc 2007, 00:00
Bydliště: Ostrava

#2 Příspěvek od kony2807 »

jsou bity 0-3 jako vstupy ?
Uživatelský avatar
kony2807
Příspěvky: 305
Registrován: 29 črc 2007, 00:00
Bydliště: Ostrava

#3 Příspěvek od kony2807 »

pokud ano , btfsc / btfss a podle toho nastavovat bity rexistruX pomocí bcf/bsf
Uživatelský avatar
kony2807
Příspěvky: 305
Registrován: 29 črc 2007, 00:00
Bydliště: Ostrava

#4 Příspěvek 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)
Naposledy upravil(a) kony2807 dne 10 lis 2007, 16:50, celkem upraveno 1 x.
Uživatelský avatar
ok1f
Příspěvky: 239
Registrován: 11 zář 2006, 00:00

#5 Příspěvek 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.
Uživatelský avatar
ok1f
Příspěvky: 239
Registrován: 11 zář 2006, 00:00

#6 Příspěvek 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
Uživatelský avatar
Banda
Příspěvky: 1170
Registrován: 22 bře 2005, 00:00
Bydliště: OV

#7 Příspěvek od Banda »

Přečti si pořádně co ti napsal kony2807. Nejdřív BTFSC, pak ten zbytek!
Uživatelský avatar
Chenzee
Příspěvky: 464
Registrován: 26 čer 2007, 00:00
Bydliště: Vysočina

#8 Příspěvek 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:
Uživatelský avatar
ok1f
Příspěvky: 239
Registrován: 11 zář 2006, 00:00

#9 Příspěvek 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.
Uživatelský avatar
ok1f
Příspěvky: 239
Registrován: 11 zář 2006, 00:00

#10 Příspěvek od ok1f »

Zdravím, Chenzee, mám radost, že jsem uvažoval správně.
Uživatelský avatar
ok1f
Příspěvky: 239
Registrován: 11 zář 2006, 00:00

#11 Příspěvek od ok1f »

A o maskování bitů čtu prvně, můžeš mi to přiblížit?
Uživatelský avatar
jankop
Příspěvky: 679
Registrován: 04 dub 2007, 00:00
Kontaktovat uživatele:

#12 Příspěvek 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
Naposledy upravil(a) jankop dne 09 lis 2007, 11:02, celkem upraveno 2 x.
Uživatelský avatar
ok1f
Příspěvky: 239
Registrován: 11 zář 2006, 00:00

#13 Příspěvek 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
Uživatelský avatar
jankop
Příspěvky: 679
Registrován: 04 dub 2007, 00:00
Kontaktovat uživatele:

#14 Příspěvek 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ě.
Uživatelský avatar
ok1f
Příspěvky: 239
Registrován: 11 zář 2006, 00:00

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

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