Sari la conținut
ELFORUM - Forumul electronistilor

coduri intercalate..?


a_sorien

Postări Recomandate

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
  • Răspunsuri 8
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • a_sorien

    5

  • 10vid

    2

  • Liviu M

    1

  • Sica001

    1

Top autori în acest subiect

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

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

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

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

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

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

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

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