Mondan Postat Aprilie 27, 2015 Partajează Postat Aprilie 27, 2015 daca ai delay 1S adica Delay_ms(1000); Cum pui in el Clrwdt, daca ai WDT pornit ? Link spre comentariu
ventzel Postat Aprilie 27, 2015 Partajează Postat Aprilie 27, 2015 (editat) 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 Aprilie 27, 2015 de ventzel Link spre comentariu
Mircea Postat Aprilie 28, 2015 Partajează Postat Aprilie 28, 2015 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
Mondan Postat Aprilie 28, 2015 Autor Partajează Postat Aprilie 28, 2015 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
ventzel Postat Aprilie 28, 2015 Partajează Postat Aprilie 28, 2015 (editat) 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 Aprilie 28, 2015 de ventzel Link spre comentariu
Mondan Postat Aprilie 28, 2015 Autor Partajează Postat Aprilie 28, 2015 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
Mircea Postat Aprilie 28, 2015 Partajează Postat Aprilie 28, 2015 @ventzel: ai dreptate, resetul vine mai rapid decat ai testa bitul 4 din Status (16F628). Clrwdt trebuie pus la sfarsitul buclei principale. Mai zic si eu prostii... Link spre comentariu
Vezi Muti Postat Aprilie 28, 2015 Partajează Postat Aprilie 28, 2015 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 spre comentariu
ventzel Postat Aprilie 28, 2015 Partajează Postat Aprilie 28, 2015 (editat) 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 Aprilie 28, 2015 de ventzel Link spre comentariu
core Postat Aprilie 28, 2015 Partajează Postat Aprilie 28, 2015 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
Vezi Muti Postat Aprilie 29, 2015 Partajează Postat Aprilie 29, 2015 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
ventzel Postat Aprilie 29, 2015 Partajează Postat Aprilie 29, 2015 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
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