Jump to content
ELFORUM - Forumul electronistilor
Mondan

Cum folosesti clrwdt in delay()

Recommended Posts

Ar fi preferabil sa nu folosesti delay asa mare. In timpu asta de 1s programu poate face alte operatii utile daca ii gandit bine.

Daca totusi vrei 1s delay si clrwdt, poti alege un controller la care sa ii poti seta postscaleru pentru WDT pana la 2 minute, de exemplu asta, pagina 260.

Alta solutie ar fi o bucla for in care sa ai clrwdt si un delay mai mic decat timpu de resetare prin WDT, repetata de un numar de ori sa-ti dea 1s sau cat vrei.

Edited by ventzel
Link to comment
Share on other sites

Clrwdt() se pune in rutina de intreruperi, unde testezi starea bit-ului (flag) cand se depaseste durata (overflow). Cand s-a setat bit-ul ii dai un clear.Care iti e teama, Dane, ca se incurca controllerul la numaratoare si nu mai iese din Delay_ms()?

Link to comment
Share on other sites

Alta solutie ar fi o bucla for in care sa ai clrwdt si un delay mai mic decat timpu de resetare prin WDT, repetata de un numar de ori sa-ti dea 1s sau cat vrei.

Asta e ideea. Dar daca faci asa incerci memoria flash inutil.

 

Sau faci o procedura numita Delay, si  doar secifici durata ei prin Delay (durata)..

Dar daca faci tu procedura delay nu mai e C.....

 

Sunt multe Delay-uri de durate diferite presarate in  program incusiv debounce la butoane, diferenta intre push scurt si push lung.

Link to comment
Share on other sites

Clrwdt() se pune in rutina de intreruperi, unde testezi starea bit-ului (flag) cand se depaseste durata (overflow). Cand s-a setat bit-ul ii dai un clear. 

clrwdt pui in bucla principala de program sau intr-o subrutina critica care ii musai sa stii ca se executa periodic, de exemplu una in care setezi/resetezi comanda catre un actuator. In cazu in care programu ramane blocat in alta zona intr-o bucla infinita neprevazuta actuatoru tau ar ramane actionat pe ultima setare timp nedeterminat. Daca ai WDT activat si nu trece pana la depasirea contorului printr-un clrwdt ai reset si daca controlleru ii in SLEEP in loc de reset ai trezire si continuarea progremului imediat dupa instructiunea SLEEP.

Nu inteleg bine ce ai vrut sa zici da WDT nu genereaza nici o conditie de intrerupere pe PIC12/16/18 si la overflow da reset la controller mai repede decat poti sa-i dai clrwdt.   

 

@Mondan: daca ii vorba cumva de Mikroc la fiecare apelare a functiei delay compilatoru genereaza defapt o sectiune de asm corespunzatoare cu durata dorita. Daca ai mai multe apelari chiar cu aceeasi durata, programu creste in dimensiune. Io foloseam in lipsa de spatiu un artificiu: imi stabileam o baza pentru delay, sa zicem 1ms si imi faceam o functie in genu asta: 

void del(char i){ while (i>0)  {Delay_ms(1);   i--;  }}

poti include un asm clrwdt; imediat dupa Delay_ms(1);

Chiar asta ii unu din rolurile unui compilator: sa-ti poti scrie functii si proceduri, nu sa le folosesti neaparat pe alea incluse.

Edited by ventzel
Link to comment
Share on other sites

Vrea sa spuna, cred, de un delay realizat ceva mai sofisticat.

 

Sare periodic in rutina de inrerupere dupa ce se "da peste cap" un timmer.

Acolo e un contor care numara de cate ori s-a intrat in rutina de intrerupere, adica de cate ori s-a 'dat peste cap" timmerul.

 

In felul asta se face un Delay.  

Link to comment
Share on other sites

Poti incerca SWDTEN daca nu-ti vine alta idee.

 

Nu cred ca este ok sa pui clrwdt intro intrerupre. este chiar dubios :)

Sau sa spargi un delay_100ms intrun loop de 100 de delay_1 ms + clrwdt.

(va dura cu mult mai mult de 100ms si nici nu mai are legatura cu programarea)

Link to comment
Share on other sites

Sau sa spargi un delay_100ms intrun loop de 100 de delay_1 ms + clrwdt.

(va dura cu mult mai mult de 100ms si nici nu mai are legatura cu programarea)

Enorm pentru ce vrea Mondan sa faca cu delayu asta, sigur! Cam 1ms in plus la delay de 100ms pe un 12f675 @4Mhz.

Daca am numarat corect in asm is 9 cicluri in plus, +3 pe conditia de iesire din functie  si  un call catre functie. Daca pui delay_us(991) ar fi mai aproape da nici asa nu-i exact.

Daca are si ceva intreruperi in program oare la cat ajunge eroarea si cum o mai calculam atunci? Asta da problema de programare!

Edited by ventzel
Link to comment
Share on other sites

daca ai codul functiei Delay_ms, modifici codul sa iti puna clrwdt si ajustezi numaratorul intern sa refaci delay-ul corect, daca nu ai codul functiei (e de biblioteca), faci o functie "wrapper" care apeleaza funcita Delay_ms la rezolutie mai mica, si ajusteaza timpii.

mai este si solutia cu intrerupere, cu un alt timer liber, activata temporar inainte de apelul Delay_ms(1000) si dezactivata dupa, care face clrwdt din intrerupere, insa e posibil sa primesti reset daca ai cel putin o intrerupere care "dureaza".

ar mai si si solutia de delay cu watchdg :),  apelezi clrwdt, pui in bucla sleep de cate ori ai nevoie sa faci grosier timpul, apoi de restul apelezi Delay_ms :)

Link to comment
Share on other sites

Enorm pentru ce vrea Mondan sa faca cu delayu asta, sigur! Cam 1ms in plus la delay de 100ms pe un 12f675 @4Mhz.

Daca am numarat corect in asm is 9 cicluri in plus, +3 pe conditia de iesire din functie  si  un call catre functie. Daca pui delay_us(991) ar fi mai aproape da nici asa nu-i exact.

Daca are si ceva intreruperi in program oare la cat ajunge eroarea si cum o mai calculam atunci? Asta da problema de programare!

Daca ai intreruperi multe in program si vrei sa ai delay-uri corecte,te folosesti de un timer nu de wait-uri cu delay().

Link to comment
Share on other sites

Daca ai intreruperi multe in program si vrei sa ai delay-uri corecte,te folosesti de un timer nu de wait-uri cu delay().

Era o intrebare retorica defapt.

Daca ai intreruperi si vrei sa folosesti un timer ca baza de timp pentru delay ar trebui sa initializezi timeru/contoru in programu principal si imediat sa intri intr-o bucla in care sa astepti setarea unui flag din intrerupere sau overflow de la timer dupa caz. Chiar si asa daca ai o intrerupere care in anumite conditii presupune executia a 200 instructiuni si contoru pentru delay ii la ultima unitate, o sa ai un plus pe minim 800us la 4Mhz. Nu cred ca are rost sa mai despic firu in 4 fara un program complet.

Am vrut defapt sa-ti desenez ca eroarea din primu exemplu ii de +1% la 4Mhz, ii posibil sa fie scazuta si daca ne zice Mondan pentru ce asteapta 1s o sa ne lamurim cat ii de critic sa fie 1s si nu 1010ms sau 990ms sa zicem.   

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines