instrukce btfss a btfsc

Zdravím,

mohl by mě prosím někdo vysvětlit jak fungují tyto instrukce?

btfsc flags1 ;když flags1 = 0 jump nekam2, jinak jump nekam1
goto nekam1
call nekam2

obracene je to u btfss

Tuto instrukci kde je flags1,flags2 nechapu a poprosil bych o objasneni a prosim neukamenovat me… diky moc

btfsc flags1,flags2
goto nekam1
call nekam2

jedná se o bitově orientované instrukce kterýma se zjištuje jestli testovaný bit je 1 nebo 0.

např:

btfss portb,0 ; PORTB,0 = 1 ?
goto nekam1 ; ne, na PORTB,0 není 1, skoč na nekam1
goto nekam2 ; ano, na PORTB,0 je 1, skoč na nekam 2

nebo

btfsc portb,0 ; PORTB,0 = 0 ?
goto nekam1 ; ne, na PORTB,0 není 0, skoč na nekam1
goto nekam2 ; ano, na PORTB,0 je 0, skoč na nekam 2

Možná jsi z těch zápisů nepochopil skutečný tvar instrukce.
Obecně je to:
btfss , <číslo bitu>. Musí mít tedy vždy dva paramertry.
Instrukce btfsc flags1 má smysl pouze tehdy, pokud je předtím provedena definice #define ,<čislo bitu>. Bez toho překladač ohlásí chybu, protože chybí druhý parametr.
A ten zápis btfsc flags1,flags2 znamená pouze to, že flags1 je adresa registru a flags2 číslo bitu, který se v registru bude testovat.

zapoměl jsem napsat že instrukce
btfsc flags1
kde flags1 mam jak pises nadefinovany port… :slight_smile:

diky za vysvetleni, vyzkousim si to v simulatoru

tak jsem to zkousel a nevim si rady :frowning: ,

mam napsane

btfss flag1,bit_flag1
goto $-1
goto ven

kde bit_flag1 mam = 0x00
kde flag1 = 0x01 a melo by to vyjit ven ale nejak mi to nefunguje v simulatoru…
zkousel jsme flag1 zvysovat 0x02, 0x03 ale na nastaveni 0x04 to skoci ven, stejne tak i vyssi bity 0x05, 0x06 atd

jestli mas nadefinovanej nakej port tak skus misto definici pouzit nejdriv cisla : btfss 06,0 , je li bit 0 na adrese 06 (PORTB) jedna preskoc, a

pokud pouzijes flag1 jako pomocnej registr tak mu mmusis nadefinovat volnou adresu , mimo precovni registry procesoru 0x00 az 0x1F pro 1 stranku,staci nad 0x20

skus si odsimulovat todle

FLAG1	EQU	0X20      ;priradi definici numerickou hodnotu


START	BTFSS	FLAG1,0	;REGISTR FLAG1 / BIT 0
	GOTO	PLUS	; JE 0  , pricti
	GOTO	MINUS	; JE 1  , odecti


PLUS	INCF 	FLAG1,F
	GOTO	START

MINUS	DECF	FLAG1,F
	GOTO	START


	END

HOT SEM CELEJ TVUJ KOD :bulb:

Jsi velký experimentátor :smiley:
0x00 je obvykle INDF, čtený vždy jako nula
0x01 TMR0
0x02 PCL
0x03 STATUS
Pohybuješ se v něšťastné oblasi SFR, kde se zrovna nic moc testovat nedá. Pracuj s promněnnou, kterou si defunuješ sám.

to co pise MiloPS3 tak tomu rozumim…

zkusim to tu napsat cele…

flagy1 equ 41H
flagy2 equ 42H

btfss	flagy1,flagy2		
goto	$-1

end

jak to tak zkousim tak mi pri zadani hodnoty flagy1 vice jak 4 tak to vzdy projde ale pritom flagy2 mam treba 0x00. asi jsem natvrdlej ale nerozumim tomu.

preci by to melo byt jak popisoval Jankop tedy:

flagy1 je registr, flagy2 je cidlo bitu ktery se ma testovat
tzn pokud mam flagy 2 nastaveno na 0x04 tak chci testovat 4 bit v registru Flagy1. Pokud tedy nastavim flagy1 na 0x04 tak to projde jinak ne. Pokud to chapu sptatne tak su pujdu zastrelit :frowning:

btfss flagy1,0 - 7!!!! goto $-1
A nebo si v flagy2 pojmenuj jednotlivé bity

#define "nazev" flagy2,0 #define "nazev" flagy2,1 atd #define "nazev" flagy2,7

A nebo příklad

[code]clrf flagy1 ;vynulovani registu
incf flagy1 ;+1

btfss flagy1,7 ;je v registru cislo 128?
goto $-2 ;NE,tak pricti 1
Je cislo 128,tak program pojede dál[/code]

Cislo 128 je b’10000000’ a testuje se 7 bit na 1, přičte se 1, otestuje se bit atd… a až je číslo 128,tedy b’10000000’ tak program otestuje 7 bit,zjistí že je v 1 a přeskočí goto $-2,tak program pokračuje dál.

udelam to jak pises, nadefinuju si jednotlive bity a hotovo, tak to funguje.diky za trpelivost!

za flagy2 musis dosadit cislo od 0 do 7 pro 8bitu, ty adresujes 66 bit (42 hex = 66 decimal)

flagy1  equ  .6  ; portb
flagy2  equ  .0  ; bit 0
flagy3  equ  .1  ; bit 1
.
.
flagy9  equ  .7  ; bit 7

btfss  flagy1,flagy2  ; testujes 0 bit
.
.

btfss  flagy1,flagy3  ; testujes 1 bit