Sida 1 av 1
asm: Delay och decfsz
Postat: 7 januari 2007, 21:43:26
av JimmyAndersson
Jag har en delay-rutin (ursprungligen gjord av sodjan) som jag ska göra om så att den ger 1ms delay (2000 cycles på 8MHz.)
Mitt problem är nog att jag inte är säker på decfsz.
Ett radnumrerat exempel:
Kod: Markera allt
CNT2 är 0x01
1 dly_loop
2 decfsz CNT2
3 goto dly_loop
4 movlw 0x08
5 osv..
När programmet kommer till rad 2 så minskar CNT2 med 0x01 och blir då 0x00. Men blir rad 3 NOP då, eller inträffar det i nästa "varv" ?
edit: Plockade bort frågan om antalet cykler. Den delen löste sig.
Postat: 7 januari 2007, 21:49:31
av oJsan
Rad 3 _blir_ nog aldrig en NOP. decfsz betyder (om jag minns rätt) decrement file, skip if zero.
CNT2 minskas med ett och sen görs en koll om värdet är 0. Om så är fallet så hoppas nästa instruktion över (och loopen avslutast alltså).
Raderna kommer att köras i ordningen: 2,4,5..
Postat: 7 januari 2007, 21:55:37
av vfr
Precis som oJsan säger!
goto tar två cykler, dom övriga 1 cykel.
Postat: 7 januari 2007, 22:04:57
av JimmyAndersson
Oki, tackar.
Men i databladet står det:
"If the result is '0', then next instruction is discarded and an NOP is executed instead."
Så något borde väl bli NOP någongång ?
Glömde skriva att det är en PIC18F1320.
Postat: 7 januari 2007, 22:07:01
av sodjan
Rätt angående *funktionen* av DECFSZ.
GOTO tar *alltid* 2 instruktionscykler.
DECFSZ tar:
- 1 cykel om den *inte* gör skip
- 2 cykler om den gör skip, och den "skippade" instruktionen är en "one-word" instruktion. Den skippade instruktionen exekveras som en NOP.
- 3 cykler om den gör skip, och den "skippade" instruktionen är en "two-word" instruktion (GOTO, CALL, MOVFF, LFSR). Första halvan av den skippade instruktionen exekveras som en NOP. Den andra halvan av *alla* 2-word instruktioner exekveras i alla fall alltid som en NOP.
Notera att en GOTO alltid har "1111 xxxx xxxx xxxx" i *andra* halvan.
Och att en NOP är definierad som "0000 0000 0000 0000" *eller* "1111 xxxx xxxx xxxx".
Så om man av misstag hoppar till den andra halvan av en 2-word instruktion
(vilket är det som alla SKIP-instruktioner gör), så kommer den att automatiskt att exekveras som en NOP.
MOVLW är en 1 cykel instruktion.
MPSIM är utmärkt för att testa timingen i delay rutiner.
Postat: 7 januari 2007, 22:59:21
av JimmyAndersson
Nu förstår jag.
Tackar!

Postat: 7 januari 2007, 23:20:58
av sodjan
Jag vet inte om det behöver tilläggas, men allt jag skrev står
naturligtsvis också i databladet...

Postat: 7 januari 2007, 23:54:24
av JimmyAndersson
Det verkar stå mycket nyttigt i databladet. Jag borde kanske ladda ner det någon gång..
Jag läste förstås databladet, men förstod inte riktigt allt. När jag läste ditt inlägg några gånger så förstod jag. Så se det som att du är bra på att förklara.
