Sari la conținut
ELFORUM - Forumul electronistilor

Despre rutine de delay...


BLK

Postări Recomandate

Am gasit un site interesant, mentionez ca sunt incepator, asa ca mi s-a parut interesant din multe puncte de vedere.

 

http://www.golovchenko.org/cgi-bin/delay

 

Insa nu reusesc sa inteleg in totalitate calculul numarului de cicluri ale unor anumite delay-uri. As vrea sa discutam un pic legat de asta (deocamdata pe exemplul asta, mai am un exemplu dar e ceva mai complicat, tot referitor la delay, si mai bine discutam intai pe exemplul asta mai simplu). Sa dau un exemplu calculat acolo:

 

; Delay = 1000 instruction cycles; Clock frequency = 4 MHz; Actual delay = 0.001 seconds = 1000 cycles; Error = 0 %	cblock	d1	d2	endcDelay			;993 cycles	movlw	0xC6	movwf	d1	movlw	0x01	movwf	d2Delay_0	decfsz	d1, f	goto	$+2	decfsz	d2, f	goto	Delay_0			;3 cycles	goto	$+1	nop			;4 cycles (including call)	return

Sa vedem ce am inteles... 0xC6 inseamna 198. Avem 4 instructiuni inainte de bucla. Dupa care incepem decrementarea si testarea, avem 197 de pasi in care primul decfsz nu sare, dupa calculele mele 197 de pasi cu 5 instructiuni (decfsz 1 instr, fiecare salt goto cu 2 instr). 197*5=985 cu 4 de la inceput 989, daca punem pasii finali goto cu 2 si nop cu 1 plus 2 pasi de la iesirea din functia delay plus inca 2 de la chemarea functiei delay avem 989+7=996. Mai e un pas din bucla, ultima decrementare a lui d1, care de data asta da 0 si sare la prima si ultima decrementare a lui d2. 2 saluri si deci inca 4 ceasuri. Se pare ca a dat 100, desi pe foaie m-am chinuit de 10 ori si nu dadea... Totusi, nu-mi explic ceva, de ce decfsz ia numai 2 cicluri de ceas in cazul saltului? Dupa mine 1 ciclu decrementeaza si face testul, dupa care ar trebui sa urmeze un salt din 2 cicluri (un flush si reincarcare PC cu adresa corecta) plus saltul propriuzis. In datasheet spune asa: "If the result is ?0?, the next instruction, which is already fetched, is discarded. A NOP is executed instead making it a two-cycle instruction." de unde nu prea inteleg exact, daca rezultatul e 0, deci dupa ce a decrementat, a trecut un ciclu de ceas, daca rezultatul e 0 in loc de flush si rescriere adresa corecta a PC face NOP?

 

Ma gandesc ca desi am rezolvat problema (desi nu am inteles de ce sunt 2 in loc de 3 cicluri de ceas) ar fi bine sa ramana scris, pentru ca asta mi-a dat mare bataie de cap, mai mare decat citirea datasheetului lui 16F648A, mai mare decat citirea catorva articole de inceput. Abia acum am reusit sa inteleg cat de cat. Ma gandesc ca e util pentru cine e la inceput ca mine.

 

Acum un exemplu mai bizar, acelasi calculator dar pentru ceva mai multe perioade de ceas delay:

 

; Delay = 0.5 seconds; Clock frequency = 4 MHz; Actual delay = 0.5 seconds = 500000 cycles; Error = 0 %	cblock	d1	d2	d3	endcDelay			;499994 cycles	movlw	0x03	movwf	d1	movlw	0x18	movwf	d2	movlw	0x02	movwf	d3Delay_0	decfsz	d1, f	goto	$+2	decfsz	d2, f	goto	$+2	decfsz	d3, f	goto	Delay_0			;2 cycles	goto	$+1			;4 cycles (including call)	return

Este destul de incurcat daca urmaresti, de asta ma gandeam ca poate mai dati si voi ceva exemple. Dupa cum vad eu lucrurile, la prima plecare, decrementeaza d1 de 3 ori, dupa care d2 o data, dupa care incepe si decrementeaza iar d1, care de data asta, de la 0, dupa decrementare ajunge la 255, gresesc? Dupa ce faci aceste 255 decrementari, ajunge iar la d2, apoi iar la d1. Dupa ce se plimba de 17 ori prin ciclul asta de 255 de decrementari ale lui d1 (plus cele 3 initiale) ajunge in sfarsit prima data la d3, dupa care o ia de la capat, de data asta are 255 cicluri de 255 de decrementari ale lui d1 pentru ca si d2 a ajuns la 255. Ajunge ultima data la d3 care acum e 0 si deci totul se incheie. Rationamentul e bun? Nu mai stau sa inmultesc sa vad daca ajung la 499994 de cicluri ca iar ma incurc :)

 

Ma duc sa ma uit la TV ca e prea mult pe ziua de azi.

Link spre comentariu
  • Răspunsuri 9
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • BLK

    4

  • MirceaM

    4

  • CristianC

    1

  • lucicop

    1

Top autori în acest subiect

Simulatorul din MPLAB are un StopWatch care iti permite sa masori timpi de executie. Daca rulezi programul pas cu pas o sa vezi in fereastra StopWatch cat dureaza fiecare instructiune sau poti sa vezi cat dureaza functia Delay. Pentru ca timpul afisat sa fie corect trebuie sa setezi frecventa la care o sa lucreze PIC-ul

Link spre comentariu

O sa incerc si asta, ideea era sa inteleg, nu sa verific daca acel calculator e bun :) E util, dar nu vreau sa folosesc ceva ce nu inteleg, ca asa pot sa caut asm-uri de F84 sau F628 si sa le modific un pic sa le incarc in F648A... dar nu ma ajuta cu nimic. O sa citesc si helpul de la MPLAB, stiam eu ca era ceva ce am uitat sa fac.

Link spre comentariu

Nu mai ziceti nimic? Hai ca e vacanta acum :) Dati va rog ceva exemple de rutine de delay pe care le folositi voi, sa le discutam un pic. Eventual sub forma de macro cu parametru sa poata fi modificata rapid chiar de la chemarea ei in program.Rationamentul meu de mai sus e corect?

Link spre comentariu
  • 3 săptămâni mai târziu...

Delay.Aduc in discutie un alt aspect. Sa ne gandim ca avem un montaj cu controller, cuart de 20 MHz sau poate mai mult si ca este vorba de delay-uri "mari", de la cateva milisecunde in sus.De multe ori nu este vorba de delay pur si simplu ci trebuie ca o activitate anume sa nu inceapa decat dupa trecerea unui anumit timp. Dar alte activitati pot sa evolueze, poate sa fie chiar de dorit.Concret. Ne gandim la o intrerupere realizata cu un timer, la 100 microsec. Admitem ca este acceptabil (am precizat ca este vorba de delay-uri "mari") ca orice delay sa fie exprimat in multipli de 100 microsec. De fapt eroarea intervalului de delay este de max 100 microsec. In aceasta situatie rutina de delay va depune intr-un contor parametrul delay-ului, exprimat in multipli de 100 us si va bucla "forever" cat timp contorul este strict pozitiv. Cand contorul este 0 se paraseste bucla si rutina de delay. Handlerul de intrerupere de timer decrementeaza contorul cu o unitate, daca cumva nu a ajuns sa fie egal cu 0. Avantajul este ca alte activitati (decat cea care trebuie intarziata) pot sa fie evoluate bine mersi, de catre alte handlere de intrerupere. Cam asa...

Link spre comentariu
  • 5 săptămâni mai târziu...

Exista situatii in care vrei/trebuie sa controlezi totul, in care nu te poti da "pe mana" unui compilator sau a unui sistem de operare, oricat de "dedicat" ar fi. Situatii in care exista secvente critice, in care dedesubtul softului pe care il scrii nu se mai afla nimic, in afara de hardware. In asemenea cazuri este important a sti cum se face un delay ca lumea, eficient dar cu consum minim de resursa.

Link spre comentariu

Pai ti-am dat o idee clara.

Ceea ce ai inceput tu sa spui la inceput, contorizarea ciclilor si instructiunilor, insumarea duratelor - este valabil in absenta intreruperilor.

Cand apare o intrerupere secventa sau bucla este abandonata si se sare la rutina de tratare a intreruperii deci da peste cap socoteala.

 

Ideea, ajutorul daca vrei, consta tocmai in aceasta: a nu "da vina" pe intreruperi ci dimpotriva a te folosi de intreruperi pentru realizarea unui delay.

 

In general este bine a lucra cu intreruperi, este bine sa nu fie dezactivate/anulate.

 

O idee (o provocare) de a scrie soft (in general, fara referire la o aplicatie anume) este aceea de a executa la inceput necesarele initializari dupa care sa se execute o bucla de genul :

here:    goto here
Altfel spus NIMIC nu trebuie sa se intample decat ca raspuns la evenimente, deci TOTUL sa se faca pe intreruperi.
Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări