Sari la conținut
ELFORUM - Forumul electronistilor

intreruperi pic 16F876XA


bogdanovich

Postări Recomandate

mai baieti lamuriti-ma si pe mine va rog frumos ca innebunesc aci si nu-i dau de capat. Vreau sa folosesc intreruperea externa pe care am pus un senzor de prezenta, ideea e ca nu vreau tot timpul sa am activata intreruperea. Am sa va dau codul in C pe care l-am facut ptr intrerupere:

if(INTF) //intrerupere generata de pinul extern{       nr_tureefectuate++;        INTF=0;}
iar in main am scris:

                GIE=1; //enable all interrupt, enable TMR1 overflow	// enable external interrupt	INTEDG=1; // intrerupere externa activata pe front cresc	INTE=1;
bine, mai mult de atat dar astea is instructiunile pe care le folosesc ptr initializarea intreruperii externe. Ideea e ca in program vreau sa dezactivez intreruperea ptr o bucata de cod si scriu INTE=0; insa degeaba ca variabila nr_tureefectuate se incrementeaza indiferent daca activez sau nu intreruperea. Va rog sa-mi spuneti unde gresesc sau ce trebuie sa mai fac

multumesc frumos anticipat

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

Top autori în acest subiect

  • bogdanovich

    4

  • Abram Burel

    3

  • puiu

    2

Top autori în acest subiect

Pai, parca flagul se seteaza indiferent daca ai sau nu activata intreruperea. Deci daca pe peioada "interzisa" ai avut un eveniment pe pinul de intrerupere externa, flagul se va seta si cand reactivezi intreruperea, aceasta va fi servita.Daca vrei sa scapi complet, sterge INTF inainte sa dai drumul la intrerupere din zona "interzisa".

Link spre comentariu

nu prea inteleg ce vrei sa spui flagul INTF este pus pe 1 de microcontrolere la generarea intreruperii daca intreruperea este activata si trebuie resetat software ceea ce fac si eu in program. Flagul de dezactivare/activare a intreruperii este INTE, faza ca la mine intreruperea externa este activata indiferent daca INTE e setat pe 0 sau 1 si asta nu inteleg de ce.:(Nu e chiar ce spui tu daca am inteles eu bine, daca e asa cum spui tu, ar trebui ca atunci cand activez la mine intreruperea sa mai incrementeze cel mult odata variabila aia insa ea se incrementeaza ori de cate ori am treceri din 1 in 0 la pinul extern pe perioada interzisa, deci indiferent daca tzin pe INTE in 0 sau 1 intreruperea se activeaza:(

Link spre comentariu

Am vrut sa spun ca INTF va fi setat de procesor in cazul in care ai un eveniment INDIFERENT de starea lui INTE. Deosebirea este ca pe perioada cat INTE este 0, nu se va apela rutina de intrerupere, dar o va face imediat ce i se da voie. Nu stiu daca e problema pe care o semnalezi, dar poate avea legatura.

Link spre comentariu

pai am spus ca nu e asta problema, sa pp ca ar mai face inca incrementare in plus dupa ce ash activa intreruperea, dar faza e ca intreruperea e mereu activata ptr ca variabila aia se incrementeaza ori de cate ori, in perioada in care nu vreau ca senzorul sa-mi numere apar treceri din 1 in 0 pe pinul extern de intrerupere, deci intreruperea e activa indiferent daca setez sau nu INTE.Si in plus am mai aruncat un ochi pe doc si n-ar trebuie sa fie asa cum spui tu. merci oricum de rasp.

Link spre comentariu

1.Cred ca ar trebui sa spui prima data pe ce tip de PIC lucrezi.2.Intreruperile externe sunt un aspect al problemei si al aspect il ridica PIC-ul care accepta si intreruperi datorate modificarilor starilor de pe intrarea portului B de obicei biturile 4,5,6,7. Deci sunt doua tipuri de intreruperi.3.De regula la PIC pentru setarea intreruperilor ai doua tipuri de bituri si anume: a) cele care se termina cu E ca de exemplu INT1IE sau RBIE care definesc daca tipul de intrerupere este activ sau nu si b) cele care se termina cu F ca de exemplu INT1IF sau RBIF care trebuie sterse (puse pe zero prin soft), iar in momentul in care au generat intreruperea se pun pe 1 de catre procesor. Activarea intreruperii duce la intrarea in procedura de intreruperi deci daca lucrezi cu asa ceva trebuie sa activezi IE, daca nu lucrezi pe intreruperi, atunci trebuie sa testezi ciclic IF ca sa vezi ca ai intrerupere pe pinul respectiv. Eu lucrez in ASM asa ca nu pot sa spun prea multe de codul tau in C, decat dupa ce stiu ce PIC folosesti.Cu stima,

Link spre comentariu

Eu zic ca singura posibilitate este ca... nu treci de fapt prin secventa aia de cod cu "protectie" la INT.Referitor la "dreptate" (nu ca as muri daca n-o am, dar poate conta in aplicatie:- INTF se genereaza in functie de starea pinului care accepta INT si de logica de Edge aleasa.- INTE se stocheaza in registrul corespunzator- ulterior cele doua semnale intra intr-o "poarta" si determina una din conditiile de intrerupere- vezi schema 14.10 Interrupt Logic din foaia lui 16F876Apuiu, scrie in titlul topicului tipul de pic.Late edit:Ar mei fi o posibilitate, dar mi se pare cel putin improbabila: programul principal sa includa... rutina de intrerupere. Admitand o astfel de situatie si faptul ca main-ul ar fi o bucla fara sfarsit, atunci s-ar intampla minunea.

Link spre comentariu

Pentru Abram:In topic scrie 16F876XA, un tip de pic de care eu nu am auzit, de aceea am intrebat. Era alceva daca era 16PIC87XA. Dar si eu fac greseli asa ca nu este un capt de tara. Nu am fost sigur la ce sa refera mai ales ca mai nou abunda documentatiile de X-uri.

Link spre comentariu

merci baietzi ca incercati sa ma ajutati, dar al naibii eu tot nu rezolv problema.

void interrupt int_function (void)  // functia de intrerupere{	if(INTF) //intrerupere generata de pinul extern	{		nr_tureefectuate++;                               INF=0;                }....//tratarea altor intreruperi}
iar in main pe langa ce-am spus mai sus, intradevar, dupa initializari am o bucla infinita, in care testez daca o tasta apasata, citita pe timer initial este tasta pe care o vreau (tEnter), dupa care, in if-ul asta scriu INTE=1 si testez daca s-au modificat nr_tureefectuate si daca da rescriu noua valoarea pe lcd.

Daca tasta apasata este tStop atunci fac INTE=0. Tastele merg sigur, ca am dat sa-mi mai afiseze pe lcd alte balarii cand apas tasta ca am crezut ca aci e problema, deci sigur cand apas tStop imi intra pe if-ul cu INTE=0.

faza asta e, eu daca apas tStop si trec prin fatza senzorului de mai multe ori, dupa ce apas tEnter constat cu surprindere ca si aceste treceri sunt numarate.

Faza e ca am incercat si altceva, intradevar daca nu fac niciodata INTE=1 intreruperea nu se activeaza, dar daca o activez, dupa aia nu se mai dezactiveaza pot sa stau eu in cap.

In fine multumesc frumos tare ptr rasp, am crezut ca poate mai este si altceva de selectat/deselecatatspecific pic-urilor, de asta am pus intrebarea pe forum, asa imi prind urechile tare tare

 

edit: PIC16F87XA este microcontrolerul meu, are o sg intrerupere externa

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