Sari la conținut
ELFORUM - Forumul electronistilor

Cum folosesti clrwdt in delay()


Postări Recomandate

  • Răspunsuri 11
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

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.

Editat de ventzel
Link spre comentariu

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 spre comentariu

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 spre comentariu

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.

Editat de ventzel
Link spre comentariu

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 spre comentariu

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!

Editat de ventzel
Link spre comentariu

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 spre comentariu

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 spre comentariu

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 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