mega8 nemužu rozchodit vstupní porty

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ů… :slight_smile:
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 :slight_smile: Tam si to na tom procvičim :slight_smile:

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. :slight_smile:.

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 :slight_smile:

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.