Jak porovnat v ASM kodu dva registry nebo registr a číslo??

Zdravím pánové, dělám program v prostředí WinAVR a snažím se sestrojit program pro ATtiny2313 (později úprava pro ATtiny13) který by měřil délku impulzu servo signálu a v závyslosti na tom sepnul např LED diodu na nějakém portu. Prostě náhrada řídící jednotky do meho rc auta pro rozsvěcování světel příp. klakson.

Impulz již dokážu změřit a jeho hodnotu mám v R31. Po přepočítání do dek. soustavy je tam hodnota 11-19. Nyní se mi však nedaří zapsat část programu kdy by se při splnění podmínky “R31<=13” nastavil bit “PORT,0” např do log0 a při splnění podmínky “R31>=17” by se nastavil bit “PORT,1” např do log0. Při splnění podmínky “R31==15” by se nastavily bity “PORT,0” a “PORT,1” do log1. Snažím se to sepsat již asi hodinu a nedaříse, kdyby někdo poradil bud velice vděčný :wink:

[code].DEVICE ATtiny2313 ; volba typu mikroprocesoru ( instrukční sada)
.LOFUSE 0B01100010
.HIFUSE 0B11010001

				; code segment - programová část

LDI R16, $FF ; do registru r16 data 255

OUT DDRB, R16 ; nastaví celý port d jako výstupní
OUT PORTB, R16 ; zapíše na port d 255 ( zhasne led )

LDI R16, 0 ; do registru r16 data 0
OUT DDRD, R16 ; nastaví celý port b jako vstupní
LDI R16, $FF ; do registru r16 data 255
OUT PORTD, R16 ; zapíše na port d 255 ( zhasne led )
;**********hlavní program *********************************************************

ZAC: SBIS PIND,0 ;preskoci nasledujci instrukci je-li na
rcall zobraz ; PIND,0 LOG 1

	SBIC	PIND,1	    ;preskoci nasledujci        instrukci je-li na
	rcall pocitej	; PIND,0 LOG 0

	rjmp zac

;podprogramy**********************************************
zobraz: OUT PORTB, R31 ;<<<< místo tohoto kodu
;porovnávání registru

   SBIS	PIND,0
rjmp zobraz
LDI	R31, 0
RET

pocitej:inc R31
RCALL DELAY
RET
delay: LDI R18,89 ;přesně [ms]: 0,1001
LDI R17,1
LDI R16,1
DEC R16
BRNE PC-1
DEC R17
BRNE PC-4
DEC R18
BRNE PC-7
RET

	.EXIT

[/code]

něco jsem našel:

ori r18,bitmask*(c1<=c2)+1 ale hlásí mi to chybu
neznámý symbol Bitmask* :frowning:

:arrow_right: administrator: přesunuto z "Programátory"

Nejsi trochu šejdrem v tématu? :wink:
To “bitmask*(c1<=c2)+1” má bejt číslo s jedničkama na místech, který se maj nastavit do 1.
ori r15, 0b00000100
Pokud by ti stačila manilulace s 1 bitem, můžeš použít sbi/cbi.
sbi PORTA, 2

tak právě to co jsi mi napsal jsem nevěděl co je ten guláš za čárkou. A ted bych měl dotaz co se stane když bude stejná hodnota v r15 jako např. ta 0b00000100 ?

Ještě to porovnání:
cpi r19,$10 ; Compare r19 with $10
brlo target ; Branch if r19 < $10 (unsigned)

subi r19,4 ; Subtract 4 from r19
brsh target ; Branch if r19 >= 4 (unsigned)

Instrukce ori provede logický součet (OR) registru a číslem. Na bitové pozici, kde bude alespoň v jednom operandu “1”, bude ve výsledku “1” také.
Např. pro R15 = 0b00000100
ori r15, 0b00100000
bude r15 = 0b00100100

tak ta instrukce ORI je mi asi naprd :frowning: zkusím to ještě nějak obejít v Cčku

ovšem že neni :wink: stačí trochu popřemejšlet…

Pokud umíš C, tak samozřejmě doporučuji dělat v něm, jesli ne, tak to nepovede k očekávanému výsledku kratší cestou.

tak když neni tak mi ukaž jak by vypadal zdrojak kde by platilo to že se na PortB.0 nastaví log0 když v R31 bude větší hodnota než 17 :slight_smile:
V tom C něco malo umím take to tam zkusim

Tak teď nevím, jeden z nás by asi potřeboval pauzu :wink:

cpi r31,18 ; porovna r31 s cislem 18 (mozna tam bude potreba dolar $18 brlo pokracuj ; skoc kdyz je mensi (kdyz ne (>=18), pokracuj -> nuluj PB0) cbi PORTB, 0 pokracuj: ; dalsi kod
Kód jsem netestoval, možná syntaktická chybka se vyskytne, ale věcně by to mělo být správně.

woou to je super, diky moc už s tím pracuju :slight_smile: jsi machr a já už můžu troubit na rc autičku :slight_smile:
kde jsi našel to “brlo pokracuj” ?

Bolo by mozno niekedy celkom fajn docitat do konca aspon zoznam instrukcii procesora a aspon zbezne prebehnut co ktora robi. :slight_smile:

Martin: Asi tak :slight_smile:

kyberbob: jednak v DS je seznam podporovaných instrukcí a dále se dá na webu atmelu stáhnout IS(instruction set) AVR…
“brlo pokracuj” jsem nenašel, vytáhl jsem to z IS (a také z toho, co jsem ti sem už napsal) a upravil do češtiny.

mám doma knížku a manual od toho winavr a ty instrukce jsem si pročítal ale už jsem nikde nevyčetl že za to porovnávání patří to BRLO, diky panové za rady moc jste mi pomohli :slight_smile:

Porovnanie nastavuje jednotlive bity v status registry
Instrukcie BRxx (za xx si dosad prislusne pismenka) riadia ci ma program odskocit niekde do daleka alebo ma pokracovat za touto instrukciou (BRxx) na zaklade nastavenia tychto bitikov. Preto je dobre si aj pozriet, ktora instrukcia (ADD, CP, CPC, …) ako tieto bitiky nastavuje. Pri kazdej z nich je to velmi podrobne rozpisane.

kludne si mozes tie bity nastavit i inym sposobom a potom na zaklade toho skakat ako sa Ti zachce/kade lahsie.