[ ebaketa @ 21.12.2010. 16:26 ] @
E ovako prije tri tjedna nabavio sam EasyPIC6 razvojni sustav i učim programirati u asembleru, pa me zanima može li mi tko pomoći kako točno izračunati vrijeme trajanja Loop petnje npr. ove ispod:
Code:

    movlw         0xFA
    movwf         COUNT1
    movlw         0xC8
    movwf         COUNT2
    movlw         0x0A
    movwf         COUNT3

Loop1          
    decfsz         COUNT1, 1         ;Umanji COUNT1 za 1
    goto         Loop1             ;Ako je 0 nastavi dalje
    decfsz         COUNT2, 1         ;Umanji COUNT2 za 1
    goto         Loop1             ;Ako je 0 nastavi dalje
    decfsz         COUNT3, 1         ;Umanji COUNT3 za 1
    goto         Loop1             ;Ako je 0 nastavi dalje


Mikrokontroler je PIC16F887 na 8MHz.

Unaprijed hvala.
[ foxhunter1 @ 22.12.2010. 20:22 ] @
Posto vec pises u asembleru, verujem da koristis MPLAB, kao IDE. Lepo napravis novi projekat u MPLABu, odaberes tvoj kontroler i kao simulator odaberes MPSIM. Kod njega postoji alatka 'Stop watch', sto bi mi rekli stoperica. Postavis brejkpointe tamo gde tebi odgovara i gledas proteklo vreme? To je laksi nacin, a tezi je da u setu instrukcija (postoji u data sheet-u za svaki kontroler) pogledas koliko traje izvrsenje svake instrukcije ... i malo mozganja i to je to.

Pozdrav..
[ Stojan Trifunovic @ 22.12.2010. 22:31 ] @
Pogledajte i PicLoops (nađite ga na gogle). I na www.piclist.com imate par
programčića koji sami generišu asemblerski kod za zadatu pauzu.
[ bogdan.kecman @ 23.12.2010. 03:07 ] @
picloops: http://www.biltronix.com/picloops.html
ja cesce koristim pikloops: http://pikloops.sourceforge.net/

inace, pogledaj data sheet, strana 229 pa na dalje

MOV* je 1 cycle
DECFSZ je 2 cycle
GOTO je 2 cycle

uzmes i saberes koliko imas ciklusa, znas na kojoj frekvenciji ti radi pic ..
[ zoligen @ 23.12.2010. 10:44 ] @
Code:

     LIST P=16F84, R=DEC
        INCLUDE "P16F84.INC"
#DEFINE    BANK0    BCF    STATUS,5
#DEFINE    BANK1    BSF    STATUS,5

 __CONFIG _CP_OFF & _XT_OSC & _PWRTE_ON &_WDT_OFF    ;CODE PROTECTION-OFF
                            ;OSCILATOR=XT
                            ;POWER UP TIMER-ON
                            ;WATCHDOG TIMER-OFF
    CBLOCK    0X0C
     BR0
     BR1
     BR2
     NBR0
     NBR1
     NBR2
    ENDC

    ORG 0X00
    GOTO MAIN    

MAIN: 
    BANK1
    MOVLW    B'01111'
    MOVWF    TRISA        
    MOVLW    B'00000000'
    MOVWF    TRISB
    BANK0    
    CLRF    PORTA
    CLRF    PORTB

    MOVLW    D'4'
    MOVWF    NBR2
    MOVLW    D'3'
    MOVWF    NBR1
    MOVLW    D'2'
    MOVWF    NBR0

    CALL    PAUZA

LOOP:    GOTO    LOOP

PAUZA:
        MOVF    NBR0,W
        MOVWF    BR0
P3:     MOVF    NBR1,W
        MOVWF    BR1
P2:     MOVF    NBR2,W
        MOVWF    BR2
P1:     DECFSZ    BR2,F
        GOTO    P1
        DECFSZ    BR1,F
        GOTO    P2
        DECFSZ    BR0,F
        GOTO    P3
        RETURN

    END



Ovo sam izvadio iz neke stare arhive mozda ce biti od pomoci.
registri BR0, BR1, i BR2 ne smeju imati vrednosti 0 ili 1

Broj ciklusa u rutini pauza se mogu izracunati:

6+(BR0*(BR1*((BR2-1)*3)))+(BR0*(BR1*7))-(BR0*3)+((BR0-1)*7)+2

Konkretno sa ovim vrednostima rezultat je 105

call i return nisu uracunati

Pozdrav!
[ grobokap @ 02.02.2011. 14:04 ] @
kada sam ja zapocinjao sa radom na PIC mikrokontrolerima mucio me isti problem koji sam rijesio nakon puno raspisivanja i proba i srecom imam ga arhivirano
u primjeru se radi sa instrukcijama (ti sa svojim PIC-om na 8 MHz imas 2 000 000 instrukcija u sekundi)
dakle:
recimo da imas primjer sa 2x decfsz:

movlw .12 ; npr ovo je 18-ta instrukcija
movwf 0x21
movlw .5
movwf 0x22

count
decfsz 0x21
goto count
decfsz 0x22,f
goto count
return ; onda je ovo 3135-ta instrukcija

delta = 3135 - 18 = 3117 potrošenih instrukcija
ili po izrazu:
n1 = 12
n2 =5
delta = [(n1-1)*3+2]+[(255*3+2)+3]*(n2-1)+2 = 3117 instrukcija

a ako imas primjer sa 3 decfsz-a npr:
n1 = 14
n2 = 7
n3 = 28
tada je:
delta = [(n1-1)*3+2]+[(255*3+2)+3]*(n2-1)+2+{[(255*3+2)+3]*255+2+3}*(n3-1)+2 = 5 306 250 instrukcija

radi garant, provjereno