BLK Postat Februarie 13, 2007 Partajează Postat Februarie 13, 2007 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
CristianC Postat Februarie 14, 2007 Partajează Postat Februarie 14, 2007 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
BLK Postat Februarie 14, 2007 Autor Partajează Postat Februarie 14, 2007 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
BLK Postat Februarie 16, 2007 Autor Partajează Postat Februarie 16, 2007 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
MirceaM Postat Martie 9, 2007 Partajează Postat Martie 9, 2007 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
lucicop Postat Martie 9, 2007 Partajează Postat Martie 9, 2007 Daca lucrati cu PIC18 folositi cu incredere un RTOS... va scuteste de multe complicatii clasice. Link spre comentariu
MirceaM Postat Aprilie 7, 2007 Partajează Postat Aprilie 7, 2007 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
BLK Postat Aprilie 9, 2007 Autor Partajează Postat Aprilie 9, 2007 pai asta stiam :)ajutor nu da nimeni? Link spre comentariu
MirceaM Postat Aprilie 9, 2007 Partajează Postat Aprilie 9, 2007 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 hereAltfel spus NIMIC nu trebuie sa se intample decat ca raspuns la evenimente, deci TOTUL sa se faca pe intreruperi. Link spre comentariu
MirceaM Postat Aprilie 9, 2007 Partajează Postat Aprilie 9, 2007 Postare dubla.Rog sa fie sters prezentul post. Link spre comentariu
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum