zas nějakej rejpal…
o subi se tu nikdo nebavil…
akorát INC versus LDI+ADD
Proč ta arogance? Došly ti argumenty? Což ti nedochází, že přičíst číslo znamená odečíst opačné? Takže instrukce ADD a SUB jsou vlastně totožné. To souvisí s tím dvojkovým doplňkem, kterému zjevně nerozumíš.
OK, sry za tu nadávku, jen jsem naznačil že jsme řešili proč autor použil ldi a add, když to lze pomocí INC jednodušeji.
Ano, je mi jasné že to lze i pomocí odčítání…
Jinak kdybys mi mohl (nebo nám) vysvětlit na co je dobrý ten doplněk, přišlo by mi to vhod. s AVR začínám, a stále j co se učit…
Honza
Dvojkový doplněk je číslo opačné. Tedy A = -A. Platí pouze v rozsahu A od -127 do +127. -128 nelze, protože +128 není možné vyjádřit v byte.
Dvojkový doplněk dělá instr. NEG, která pro -128 generuje OVERFLOW.
Používá se např. pro výpočet absolutní hodnoty
sbrc R16,7 ;bit 7 je znamenko
neg R16 ;absolutní hodnota R16
Dále platí:
neg R17
add R16,R17 ;totéž co sub R16,R17
com R16 ;jedničkový doplněk = negace všech bitů
inc R16 ;totéž co neg R16
clr R17
sub R17,R16 ;R17 = -R16,
totéž co
mov R17,R16
neg R17
aha…
takže místo xorování (které jsem použil pro negaci bitu) by se dalo použít COM - prostá negace bitů…
Už jsem to tak nějak pochopil. se zápornými čísly ve spojení s kontroléry x51/AVR jsem zatím nedlal nic, proto to nechápu, tedka už ale jo. Zkusím naprogramovat kalkulačku, až bude čas Tam si to na tom procvičim
Jestli vás dobře chápu tak při příkazech neg a com se počítá s tím že v sedmém bitu registru je znaménko ?
nn, instrukcim je uplne jedno, jesli tam mas znamenko, nebo co… neg vytvari dvojkovy doplnek (Rd <- $00 - Rd) (cislo s opacnym znamenkem ulozene ve dvojkovem doplnku) a com tvori jednotkovy doplnek (Rd <- $FF - Rd).
Co se tyka 7. bitu u znamenkovych cisel, tak tam vpodstate je znamenko, ale dve opacna cisla se NELISI pouze tim 7.bitem
Zdravim,
robim v C, v ASM nie. Ale ten problem s kopirvanim bitu ma zaujal.
Nevedel som to napisat na menej ako 5 taktov procesora.
Da sa to spravit aj kratsie?
nebudem pisat spravny syntax, snad pochopite, ide o ideu a nechcem sa teraz zdrzovat kontrolou.
z portA, b0 do PortB, b5
SBIC portA, b0 1/2takty
RJMP navestie1 2takty
SBI portB, b5 2takty
RJMP navestie2 2takty
navestie1: CBI portB, b5 2takty
navesite2: bla bla bla
alebo sa to da aj kratsie?
dakujem za odpoved
Martin
Tento kód má 5 nebo 6 cyklů:
Tento má vždy 5 cyklů:
Nie som si isty, ale ja to chapen tak, ze instrukcia podmienky trva 1 cyklus, ak nemusi nacitat adresu skoku, ale pokracuje dalej. Ak je podmienka platna a skace, potom trvva 2 cykly. Potom moj priklad trva nie raz 5 a raz 6 cyklov, ale vzdy 5 cyklov. Ak sa mylim, tak ma prosim opravte.
vyhoda mojho pristupu je oproti prikladu od Anonyma v tom, ze vyuzivam instrukcie manipulacie s jednym bitom portu. Ak totizto z niektorym z bitov portu pracuje aj rutina pod prerusenim a ta by prerusila hl.slusku v miestach od in r16,PORTD a out PORTD,r16. zmenila by svoj bit, napr vystupne rele, pruser je na streche. Da sa tomu zabranit zakazanim prerusenia a potom jeho povolenim, ale to uz nemozno hovorit o dlzke trvania 5 cyklov.
Takato “jama levova” sa bude nahodne, niekedy 1x za mesiac, niekedy 10x za den, podla zosynchronizovania oboch udalosti. A hladajte prosim taku chybu. .
Martin
Zkoušel jsem v Avrstudiu a časování vychází takto:
[code] ;pinB,0=1 pinB,0=0
SBIS pinB, 0 ;2takty 1takt
RJMP navestie1 ; 2takty
SBI portD, 0 ;2takty
RJMP navestie2 ;2takty
navestie1:
CBI portD,0; 2takty
navestie2:[/code]Poznámka o přerušení je ovšem správná.
S tym casovanim mate pravdu, zle som si to zratal
Martin
Nikoli. Instrukce NEG a COM dávají smysl i pro unsigned byte. Jednoduchý příklad: Nechť je v registru R16 jas 1 bodu černobílého obrázku. 0 odpovídá černá, 255 odpovídá bílá. Potom instrukce COM R16 převede bod do negativu, v cyklu pak celý obrázek. Zato instrukce NEG v tomto příkladu nedává smysl.
Záleží na tom, jaký je význam onoho byte. Připomínám jen , že byte není číslo 0 až 255, ale je to uspořádaná osmice bitu, jejichž význam může být téměř jakýkoliv.