Stránka 1 z 1

Assembler

Napsal: pát 2. dub 2004, 18:12
od kovino
Chlapi caute! Potreboval by som poradit s nasledovnym problemom. Tyka sa to programu pre procak 8051, kde mam zistit dlzku impulzu na porte P2.3. Ma to zistovat od 2 mikrosekund do 2 milisekund, z coho vyplyva, ze na ukladanie tejto dlzky musim pouzit 16-bitovy register DPTR (tento program musi byt spracovany cez casove slucky, teda neuvazujte pouzitie citacov/casovacov). Napisem to v skratke. Akonahle pride impulz na port 2.3 (log1), tak prebehne inkrementácia registra DPTR o jedna co su 2 instrukcne cykly, potom je tam este testovanie ci je impulz stale v log1 to su dalsie dva cykly, a potom ak impulz skonci (log0), tak musim hodnotu, ktorá je v registri DPTR nasobit stvormi, co su tie 4 instrukcne cykly. A toto je ten problem, lebo tu stvorku ked ulozim do 8-bitovoveho registra napr.B, tak nemozem pouzit funkciu MUL DPTRB, to je blbost lebo nemozem nasobit 16-bitovy register s 8-bitovym. Potom, neviem to urcite nefunguje ani RL DPTR, cim by som dany register posunul 1x dolava, to by som spravil este raz, lebo nasobenie styrmi je vlastne posunutie 2x dolava. Este sa to tusim da, ze by som rozdelil register DPTR na dve polovice na DPH a DPL, ale toto neviem ako oprogramovat. V jednoduchosti otazka znie: Ako vynasobit 16-bitovy register DPTR stvormi? Poprosil by som konkretne prikazy z assemblera. Dakujem za kazdu pomoc a zaroven sa ospravedlnujem za dlzku prispevku!

Napsal: pát 2. dub 2004, 18:28
od pavel.minarik
seš si jistej, že ten SHIFT LEFT nefuguje? to by bylo elegantní řešení akorát bys možná musel testovat OVERFLOW

Napsal: pát 2. dub 2004, 21:37
od Dony
pokud jsem to správně pochopil, chceš porovnávat počet instrukcí odpovídajících 2 mikrosekundám az 2 milisekundám, nebylo by jednodušší přímo porovnávat ten čtvrtinovej počet, co budeš mít v registru a zbytečně ho už neupravovat?
Instrukce pro bitové posunutí jsou myslím SHL a SHR...

Assembler

Napsal: pát 2. dub 2004, 23:00
od kovino
No to posunutie RL DPTR nefunguje na 100%. Inak ja potrebujem mat v DPTR hodnotu dlzky impulzu vynasobenu stvormi instrukcnymi cyklami, kvoli presnosti. Pozrite na tento programik, to ma teraz napadlo: Inak pri "SETB DPH.0" a vsade kde je DPH.0 alebo 1 hlasi syntax error. Tu hodnotu v DPTR berte ako nejaku dlzku impulzu. (Prosil bych o radu co je zle v tom SETB DPH.0)

ORG 4000H
MOV DPTR,#37B6H
MOV A,DPH
RL A
RL A
MOV DPH,A
MOV A,DPL
JB ACC.7,NAV1
CLR DPH.1
JMP NAV2
NAV1: SETB DPH.1
NAV2: JB ACC.6,NAV3
CLR DPH.1
JMP NAV4
NAV3: SETB DPH.1
NAV4: RL A
RL A
MOV DPL,A
END

Napsal: sob 3. dub 2004, 21:01
od PCborec
RL jde použit pouze pro A.

Když ale posuneš hodnotu 2xdoleva, tak když tam maš velke čislo tak ti to může 2x přetect.. si si toho vědom? Takže sledovat C...

A co kdybys udělal:

ORG 4000H
MOV DPTR,#37B6H
MOV A,DPH
RL A
RL A
MOV DPH,A
MOV A,DPL

JB ACC.7,NAV1

MOV A,DPH
SUBB A,#11111110B
MOV DPH,A
JMP NAV2

NAV1: MOV A,DPH
ADD A,#00000001B
MOV DPH,A

NAV2: MOV A, DPL
JB ACC.6,NAV3

MOV A,DPH
SUBB A,#11111101B
MOV DPH,A
JMP NAV4

NAV3: MOV A,DPH
ADD A,#00000010B
MOV DPH,A

NAV4:

END

Když použiješ log. součin tak kde je 0 se nastavi 0, kde je 1 zustane puvodni čislo, při log. součtu kde je 1 se nastavi 1, kde je 0 zustane puvodni čislo. 8-)

Napsal: ned 11. dub 2004, 12:32
od Dark100
nemáte někdo nějakou stránku na vyuku tady tohohle. Už se to po 3/4 roce musím naučit.

Napsal: ned 11. dub 2004, 15:07
od PCborec
zkus davat trochu v hodinách pozor. :lol:

Napsal: ned 11. dub 2004, 15:18
od Dark100
a ty zkus dávat v jiných hodinách pozor :wink: