Sari la conținut
ELFORUM - Forumul electronistilor

Arhitectura PIC 16F - Hai sa discutam despre intreruperi


Vizitator alex

Postări Recomandate

Discutia o sa o pornesc eu punand doua intrebari.1. Ce se intampla daca primesc o intrerupere cand sunt deja in rutina de intreruperi. Adica: Intrerupere>Setez din nou GIE(desi asta se seteaza la sfarsit)>Incep sa execut rutina de intreruperi>Mai vine o intrerupere. Ce va face PIC-ul? Reexecuta rutina de intrerupere, se intoarce tot in rutina de intrerupere (unde a fost intrerupt de INT2) si pe urma se intoarce in rutina originala (unde a fost intrerupt de INT1)? Sau o ia razna?2. Ce se intampla daca ii vin doua intreruperi in acelasi timp? De exemplu de pe timer1 si de pe CCP1 (sa zicem pentru 16F877)? Se seteaza amandoua flag-urile TMR1IF si CCP1IF si pe urma sare in rutina de intreruperi?

Link spre comentariu
  • Răspunsuri 4
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Zile populare

Top autori în acest subiect

Parerea mea este asa:1)Nu ar trebui sa o ia razna daca:a)Ai grija ca la fiecare intrerupere in intrerupere sa salvezi contextul curent in alta parte decat unde ai salvat la intreruperea anterioara. Asta se poate face elegant cu o stiva soft.b)Este necesar ca numarul de intreruperi si cu numarul eventualelor call-uri din intrerupere sa nu depaseasca adancimea stivei hardware, adica 8 nivele. Daca faci asa, eu nu cred ca ai probleme.2)Am lucrat recent la asa ceva, cu 3 surse independente de intrerupere. Dupa salvarea contextului in rutina de intrerupere, testam in ordine fiecare flag si executam sectiunile corespunzatoare flagurilor setate. Cirip

Link spre comentariu
Vizitator alex

Referitor la punctul 2, asta am de gand si eu sa fac. In rutina de intrerupere sa testez de unde a fost generata aceasta si sa execut codul in consecinta. Problema mea este daca vin doua intreruperi in acelasi timp, imi seteaza ambele flag-uri ca sa execute doua "ramuri" si nu doar una?

Link spre comentariu

Iti seteaza ambele flaguri, fiecare dintre ele la momentul la care a venit intreruperea corespunzatoare, dar daca nu ai autorizat intr globale cu GIE, programul (ISR-ul) isi va vedea de treaba lui. Eu am optat ca la fiecare intrerupere sa testez fiecare flag, chiar daca nu stiu de unde provine cererea de fapt.E posibil sa testezi un flag, sa-l achiti si sa iesi, fara sa mai testezi celelalte flaguri posibile. La reactivarea intreruperilor, programul va sari imediat inapoi in intrerupere. Dezavantajul e ca ca trebuie sa salveze/ restoreze contextul de fiecare data si dureaza mai mult decat un btfss/c. Asa ca, eu am preferat sa verific toate flagurile, daca tot am intrat in intrerupere. Mi s-a parut mai rapid asa.Sugestie: seteaza cele doua surse de intrerupere si simuleaza-l cu Stopwatch activat ca sa vezi cat dureaza, daca viteza e o problema.Cirip

Link spre comentariu

Flagurile se seteaza independent fiecarein momentul cind ai intrat in intrrupere picul seteaza GIE pe offin momentul cind a executat retfie reface GIE adica pe oniar daca mai este un flag activat reia subrutina de intreruperepina cind nu mai sunt flaguri activatecum zice cirip este binedaca ai intrat in intrerupere si nu resetezi flagul care a dus la intrerupere picul intra din nou pina cind il rezetezi

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