Sari la conținut
ELFORUM - Forumul electronistilor

Problema cu interrupt


Romica_t

Postări Recomandate

Va salut, incerc sa stapanesc utilizarea intreruperilor catre CPU si ma tot lovesc de aceeasi problema. O data intrata, executia functiei pentru interrupt, procesorul nu se mai intoarce la codul initial, de unde a plecat ci ruleaza o bucla infinita. Am incercat cu ADC1 si Timer3, uC este PIC24HJ128GP504.

 

unsigned int k;

void __attribute__((interrupt, no_auto_psv)) _T3Interrupt(void)

{

 

if(k%2==0)

FillRectangle(200,10+k*20,206,10+k*20+6,GREEN);

else

FillRectangle(200,10+k*20,206,10+k*20+6,RED);

//am pus aceste functii de desenare ca sa vad pe ecran ca sa intra in functia de inerrupt si se executa

k++;

IFS0bits.T3IF==0;//steagul de interrupt il pun la 0

return(0); //optional, am incercat cu acest return dar nimic nu s-a schimbat

}

 

In functia main:

 

T3CON=0x0010;//timer pe 16 biti, sursa fiind oscilatorul CPU

TMR3 = 0x0000;

PR3 = 10000; // pasul cand genereaza interrupt

 

SRbits.IPL=7;//am dezactivat toate intreruperile

IPC2bits.T3IP=4;//am setat prioritatea timerului 3 la 4

SRbits.IPL=3;//am readus prioritatea CPU la 3

 

IFS0bits.T3IF = 0; // timer 3 interrupt flag

IEC0bits.T3IE = 1; // timer 3 interrupt enable

T3CONbits.TON = 1; //Start Timer3

 

FillRectangle(10,80,60,120,MAGENTA);//deseneaza o parte din dreptunghi, pana sa apara primul interrupt si nu mai revine

T3CONbits.TON = 0;

FillRectangle(70,80,100,120,MAGENTA);

 

Apreciez orice sfat, va multumesc.

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

Top autori în acest subiect

  • Romica_t

    2

  • Mikrosha

    1

Zile populare

Top autori în acest subiect

E posibil ca timpul de execuţie a unei funcţii FillRectange(..) să fie prea lung, şi să apară o altă întrerupere înainte să termine execuţia ISR? Şi aşa, practic execuţia ISR să nu si finalizeze niciodată?LE: Pe lîngă asta, cînd resetezi flagul de întrerupere.... Atribuirea în C se face cu = nu cu == .

Link spre comentariu

LE: Pe lîngă asta, cînd resetezi flagul de întrerupere.... Atribuirea în C se face cu = nu cu == .

Multumesc, pana la urma era, asa cum ai zis, atribuirea facuta gresit. In loc de == am pus doar = si a mers. Chestii marunte care la compilare nu dau erori dar dau totul peste cap.
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