a_sorien Postat Martie 7, 2013 Partajează Postat Martie 7, 2013 Salutare ! Am o dilema ! Am un pic 16f628 , pe portb am 5 leduri si un anumit joc de limini in bucla infinita , iar pe a0 porta vreau sa fac un led care sa-si creasca/scada luminozitatea la un interval de o secunda ( fading ) , tot in bucla infinita . Cum intercalez codurile celor doua porturi? Sa zicem ca fac ledurile sa se aprinda secvential pe portul b , cum fac in acelasi timp pe a0 porta sa se porduca efectul fading independent de ce se intampla pe portb ?Multumesc..! Link spre comentariu
a_sorien Postat Martie 8, 2013 Autor Partajează Postat Martie 8, 2013 Mentionez ca nu folosesc facilitati PWM ale procesorului , generez soft pusurile cu factor de umplere reglabil..! Link spre comentariu
10vid Postat Martie 8, 2013 Partajează Postat Martie 8, 2013 Cel mai simplu, bagi ambele procese (jocul de lumini pe PORTB si PWM-ul pe PORTA) intr-o singura bucla infinita. Si mai bagi si un delay, ca sa nu se execute prea repede. Link spre comentariu
a_sorien Postat Martie 8, 2013 Autor Partajează Postat Martie 8, 2013 Ok, in regula dar timpii difera , la jocul de lumini cu cel de la fading . Ma refer ca dupa ce pun o instructiune pentru portb ar trebui sa pun una pentru porta , si tot asa...insa la un moment dat cele pentru porta se termina si mai sant alea pentru port b . Aici cum fac...o iau de la capat cu instructiunile pentru porta , pana cand le termin p-alea de pe portb ? Link spre comentariu
Liviu M Postat Martie 8, 2013 Partajează Postat Martie 8, 2013 Eu as defini o 'unitate de timp' comuna (probabil cel mai bine ar merge cu timere si intreruperi, da' nu cred ca e obligatoriu) si la fiecare 'tact' nou as vedea daca si ce e de rezolvat pe fiecare port in parte. Link spre comentariu
a_sorien Postat Martie 9, 2013 Autor Partajează Postat Martie 9, 2013 Mda , deci scriu intructiunea pentru portb , apoi imediat cea pentru porta , si tot asa pana ajung la "goto start" . In felul asta ele se executa simultan in bucla infinita . La partea cu intreruperi , mi-e frica sa ma apuc , desi stiu cum...sa scriu un cod . Sint totusi un incepator Link spre comentariu
10vid Postat Martie 11, 2013 Partajează Postat Martie 11, 2013 Nu e vorba de intercalarea (intreteserea) instructiunilor de la cele doua procese. Desi posibila in unele cazuri, nu se face din simplul motiv ca nu s-ar mai intelege nimic din acel cod. Un exemplu de "multitasking" ar fi acesta: main call proces_1 call proces_2 .... ........ call proces_n call delay_20ms goto mainO rutina (joc de lumini etc.) care ruleaza multitasking va arata diferit de aceeasi rutina care ruleaza monotasking in sensul ca odata ce a primit controlul nu intra prin enshpe mii de loop-uri, ci incrementeaza doar variabila contor din loop-ul cel mai intern (cu procesarile aferente: update porturi sau alte variabile) si iese. Daca eventual variabila contor din loop-ul cel mai din mijloc a ajuns la limita stabilita, se trece la incrementarea variabilei contor din loop-ul urmator, (exterior primului), si doar apoi se iese. Cu alte cuvinte, rutinele monotasking sunt o serie de bucle imbrincate (unele in altele); la cele multitasking buclele sunt deschise, adica se intra in bucla cea mai din interior, iar goto-urile la bucle sunt inlocuite cu return-uri. Asta impune ca toate variabilele aferente acelei rutine sa fie deja initializate la inceputul programului. Astfel, se pierde un timp infim cu fiecare rutina, de obicei 99.99% din timp este petrecut in rutina delay, care nu e o rutina multitasking, si pentru ca diferenta de timp intre executia rutinelor e de ordinul microsecundelor, practic se vor executa simultan. Link spre comentariu
a_sorien Postat Martie 14, 2013 Autor Partajează Postat Martie 14, 2013 Ok, am inteles , dara daca rutina de pe port A dureaza 10 s iar cea pe de port B doar 1 s ?!ma refer la o singura parcurgere main-goto mainprocess 1=10 sproces 2 = 1 s Nu inteleg ce face proces 2 pana termina proces 1 ?!Oricum multam ca ma luminezi..! Link spre comentariu
Sica001 Postat Martie 14, 2013 Partajează Postat Martie 14, 2013 Din cate stiu eu (dar s-ar putea sa gresesc ) PIC-ul nu este multitasking. In problema asta eu vad doua varinate : 1.Calculezi astfel incat la un ciclu sa cuprinda ambele sarcini si intercalezi instructiunile ca atare.2. Folosesti PWM-ul hardware implemetat in PIC. Dupa ce l-ai setat la acesta trebuie doar sa scrii valoarea factorului de umplere si el va rula independent de codul tau la valoarea respectiva. Asta insemna sa scrii din cand in cand cate o valoare in registrul PWM- personal mi se pare mult mai simplu. Marius 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