Kako izračunati točnu vrijednost Loop petlje?

Rasprava o PIC mikrokontrolerima, PIC projekti i drugo vezano za PIC-eve...

Moderators: pedja089, stojke369, [eDo], trax

Post Reply
User avatar
ebaketa
Posts: 18
Joined: 21-12-2010, 19:44
Location: Vukovar
Contact:

Kako izračunati točnu vrijednost Loop petlje?

Post by ebaketa »

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: Select all

    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
Trebala bi biti sekunda ali mi se čini da nije. Mikrokontroler je PIC16F887 na 8MHz.
User avatar
arcom
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 447
Joined: 05-03-2010, 20:47
Location: Rijeka
Contact:

Re: Kako izračunati točnu vrijednost Loop petlje?

Post by arcom »

Jednostavno! Svaka instrukcija se izvodi u jednom ili dva ciklusa. Trebas samo zbrojiti cikluse i onda izracunati ukupno vrijeme na osnovu frekvencije na kojoj radi PIC.

Npr. DECFSZ traje 1 ciklus ako je vrijednost COUNT1 varijable veca od nule ili 2 ciklusa ako je COUNT1 jednak nuli. GOTO treba 2 ciklusa.

Konkretno, za tvoj primjer:
COUNT1 = 0xFA = 250
COUNT2 = 0xC8 = 200
COUNT3 = 0x0A = 10

E sada, prvi "decfsz/goto" set ce trajati 249 puta po 3 ciklusa (1 za decfsz i 2 za goto) i 1 put po 2 ciklusa (kada je vrijednost COUNT1 nula). Drugi set ponavlja prvi 199 puta i kada je COUNT2 nula traje 2 ciklusa. Treci set ponavlja drugi 9 puta i kada je COUNT3 nula traje 2 ciklusa. Kad sve to zbrojis i pomnozis imas:
N = (((249 * 3 + 2) * 199 + 2) * 9 + 2) = 1341479 ciklusa

Na 8MHz svaki ciklus traje 500ns (frekvencija podjeljena sa 4), pomnozeno sa brojem iznad daje 670739500ns odnosno 0,671s

Jesi pohvatao sve? :)
User avatar
ebaketa
Posts: 18
Joined: 21-12-2010, 19:44
Location: Vukovar
Contact:

Re: Kako izračunati točnu vrijednost Loop petlje?

Post by ebaketa »

Malo me buni to koliko koji ciklus traje?

Al mislim da se iz tvog odgovora da prokužit.
User avatar
arcom
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 447
Joined: 05-03-2010, 20:47
Location: Rijeka
Contact:

Re: Kako izračunati točnu vrijednost Loop petlje?

Post by arcom »

Skini datasheet za taj PIC i pogledaj "Instruction Set Summary". Tamo imas pregled svih instrukcija sa pripadajucim ciklusima izvodenja i opis svake instrukcije.

Primjera radi, za DECFSZ:
Instrukcija umanjuje vrijednost zadanog registra za 1. Ako je vrijednost registra nakon te operacije razlicita od nule, izvrsava se sljedeca instrukcija u nizu (u tvom slucaju to je GOTO) i ukupno vrijeme izvodenja DECFSZ instrukcije traje 1 ciklus jer se samo smanjila vrijednost registra. Ako je vrijednost registra jednaka nuli, sljedeca naredba u nizu se preskace i umjesto nje se izvodi NOP instrukcija. U tom slucaju ukupno trajanje je 2 ciklusa jer prvo izvodi smanjivanje registra i nakon toga NOP.

Sve instrukcije koje pozivaju neku rutinu ili skacu na drugo mjesto (call, goto, return...) traju 2 ciklusa. Isto tako, sve instrukcije koje imaju uvjetovan skok (decfsz, incfsz, btfsc, btfss) traju 1 ili 2 ciklusa, ovisno o tome da li je zadovoljen uvjet za skok. Ostale instrukcije traju 1 ciklus.
User avatar
ebaketa
Posts: 18
Joined: 21-12-2010, 19:44
Location: Vukovar
Contact:

Re: Kako izračunati točnu vrijednost Loop petlje?

Post by ebaketa »

Imam knjigu isko od mikroelektronike PIC mikrokontroleri ima tamo isto popis koliko koja traje al još sam novi u asembleru pa me malo buni.
User avatar
ebaketa
Posts: 18
Joined: 21-12-2010, 19:44
Location: Vukovar
Contact:

Re: Kako izračunati točnu vrijednost Loop petlje?

Post by ebaketa »

Al evo još jedno pitanje ako može, tamo sam uneo vrijednost 250 a u formuli si napisao da se izvršava 249 puta zašto? Jel zato što se oduzima'
User avatar
arcom
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 447
Joined: 05-03-2010, 20:47
Location: Rijeka
Contact:

Re: Kako izračunati točnu vrijednost Loop petlje?

Post by arcom »

Ne ne, krivo si shvatio. Izvrsava se 250 puta, samo sto 249 puta traje 1 ciklus, a zadnji put (kada je registar nula) 2 ciklusa. GOTO koji je poslije toga se izvrsava samo 249 puta jer ga se posljednji put preskace.
User avatar
ebaketa
Posts: 18
Joined: 21-12-2010, 19:44
Location: Vukovar
Contact:

Re: Kako izračunati točnu vrijednost Loop petlje?

Post by ebaketa »

E sad je jasnije. Hvala na odgovorima.

Mislim da je sad sve puno jasnije. :D
User avatar
ebaketa
Posts: 18
Joined: 21-12-2010, 19:44
Location: Vukovar
Contact:

Re: Kako izračunati točnu vrijednost Loop petlje?

Post by ebaketa »

Ako netko ima volje da malo pojasni izračunavanje ovakve Delay petlje:

Code: Select all

; Delay = 1 seconds
; Clock frequency = 12 MHz

; Actual delay = 1 seconds = 3000000 cycles
; Error = 0 %

	cblock
	d1
	d2
	d3
	endc

Delay
			;2999995 cycles
	movlw	0x1A
	movwf	d1
	movlw	0x8B
	movwf	d2
	movlw	0x07
	movwf	d3
Delay_0
	decfsz	d1, f
	goto	$+2
	decfsz	d2, f
	goto	$+2
	decfsz	d3, f
	goto	Delay_0

			;1 cycle
	nop

			;4 cycles (including call)
	return
Šta bi značila naredba:

Code: Select all

goto	$+2
User avatar
arcom
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 447
Joined: 05-03-2010, 20:47
Location: Rijeka
Contact:

Re: Kako izračunati točnu vrijednost Loop petlje?

Post by arcom »

Princip ti je isti kao u prethodnom primjeru, samo treba slijedit izvrsavanje instrukcija. Cak je i petlja identicna po funkcionalnosti...

GOTO $+2 ti skace za 2 instrukcije prema naprijed. GOTO $-2 ti skace za 2 instrukcije unatrag.
Konkretno za tvoj primjer prvi "goto $+2" skace na drugi, a drugi na "goto Delay_0" koji onda ide na pocetak petlje.
User avatar
arcom
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 447
Joined: 05-03-2010, 20:47
Location: Rijeka
Contact:

Re: Kako izračunati točnu vrijednost Loop petlje?

Post by arcom »

E da, ima jedan detalj koji sam ti zaboravio spomenuti, a to je da kada vrijednost registra (u ovom slucaju 8-bitni) dode na nulu i izvrsi se operacija umanjivanja za 1, vrijednost registra postaje 255. Vrijedi i obrnuto - 8-bitni registar vrijednosti 255 uvecan za 1 postaje 0. Ovo je vrlo bitno jer utjece na vrijeme izvrsavanja petlje. To sam previdio i u prvom primjeru :oops:
User avatar
ebaketa
Posts: 18
Joined: 21-12-2010, 19:44
Location: Vukovar
Contact:

Re: Kako izračunati točnu vrijednost Loop petlje?

Post by ebaketa »

Hvala kolega na odgovoru.

Vidio sam neki dan da imaš dobru stranicu, samo tako nastavi!
User avatar
ebaketa
Posts: 18
Joined: 21-12-2010, 19:44
Location: Vukovar
Contact:

Re: Kako izračunati točnu vrijednost Loop petlje?

Post by ebaketa »

arcom wrote:E da, ima jedan detalj koji sam ti zaboravio spomenuti, a to je da kada vrijednost registra (u ovom slucaju 8-bitni) dode na nulu i izvrsi se operacija umanjivanja za 1, vrijednost registra postaje 255. Vrijedi i obrnuto - 8-bitni registar vrijednosti 255 uvecan za 1 postaje 0. Ovo je vrlo bitno jer utjece na vrijeme izvrsavanja petlje. To sam previdio i u prvom primjeru :oops:
To bi značilo da u stvari odbroji 255 puta umjesto 256 ili?
User avatar
arcom
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 447
Joined: 05-03-2010, 20:47
Location: Rijeka
Contact:

Re: Kako izračunati točnu vrijednost Loop petlje?

Post by arcom »

Da, stvari se malo zakompliciraju :)

Pocetni uvjeti: d1 = 0x1A = 26; d2 = 0x8B = 139; d3 = 0x07 = 7
E sada...kada petlja krene, onda 26 puta umanji d1 i nakon toga je d2 = 138 i d1 = 0.
U sljedecoj iteraciji d1 se smanjuje 256 puta nakon cega je d2 = 137 i d1 = 0.
I to se tako ponavlja sve dok d2 ne postane 0 (dakle, ukupno 138 puta) i tada se d3 smanji za 1 i postaje 6; d2 = 0 i d1 = 0. Krece nova iteracija s time da se d1 smanjuje 256 puta i d2 isto tako 256 puta, a to se sve ponavlja 6 puta odnosno dok d3 ne dode na nulu i petlja je gotova.

Uf...izgubio sam se i sam u ovome dok sam pisao :D
Post Reply